@mbpockets/shared-ui 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/LICENSE +681 -0
  2. package/README.md +85 -0
  3. package/dist/EventPage/editMode/index.cjs +573 -0
  4. package/dist/EventPage/editMode/index.cjs.map +1 -0
  5. package/dist/EventPage/editMode/index.d.cts +5 -0
  6. package/dist/EventPage/editMode/index.d.ts +5 -0
  7. package/dist/EventPage/editMode/index.mjs +559 -0
  8. package/dist/EventPage/editMode/index.mjs.map +1 -0
  9. package/dist/EventPage/editMode.cjs +573 -0
  10. package/dist/EventPage/editMode.cjs.map +1 -0
  11. package/dist/EventPage/editMode.d.cts +5 -0
  12. package/dist/EventPage/editMode.d.ts +5 -0
  13. package/dist/EventPage/editMode.mjs +559 -0
  14. package/dist/EventPage/editMode.mjs.map +1 -0
  15. package/dist/EventPage/index.cjs +1245 -0
  16. package/dist/EventPage/index.cjs.map +1 -0
  17. package/dist/EventPage/index.d.cts +6 -0
  18. package/dist/EventPage/index.d.ts +6 -0
  19. package/dist/EventPage/index.mjs +1215 -0
  20. package/dist/EventPage/index.mjs.map +1 -0
  21. package/dist/EventPage.cjs +1245 -0
  22. package/dist/EventPage.cjs.map +1 -0
  23. package/dist/EventPage.d.cts +42 -0
  24. package/dist/EventPage.d.ts +42 -0
  25. package/dist/EventPage.mjs +1215 -0
  26. package/dist/EventPage.mjs.map +1 -0
  27. package/dist/PlayerPage/index.cjs +370 -0
  28. package/dist/PlayerPage/index.cjs.map +1 -0
  29. package/dist/PlayerPage/index.d.cts +4 -0
  30. package/dist/PlayerPage/index.d.ts +4 -0
  31. package/dist/PlayerPage/index.mjs +358 -0
  32. package/dist/PlayerPage/index.mjs.map +1 -0
  33. package/dist/PlayerPage.cjs +370 -0
  34. package/dist/PlayerPage.cjs.map +1 -0
  35. package/dist/PlayerPage.d.cts +32 -0
  36. package/dist/PlayerPage.d.ts +32 -0
  37. package/dist/PlayerPage.mjs +358 -0
  38. package/dist/PlayerPage.mjs.map +1 -0
  39. package/dist/ProfilePage/index.cjs +136 -0
  40. package/dist/ProfilePage/index.cjs.map +1 -0
  41. package/dist/ProfilePage/index.d.cts +3 -0
  42. package/dist/ProfilePage/index.d.ts +3 -0
  43. package/dist/ProfilePage/index.mjs +124 -0
  44. package/dist/ProfilePage/index.mjs.map +1 -0
  45. package/dist/ProfilePage.cjs +136 -0
  46. package/dist/ProfilePage.cjs.map +1 -0
  47. package/dist/ProfilePage.d.cts +10 -0
  48. package/dist/ProfilePage.d.ts +10 -0
  49. package/dist/ProfilePage.mjs +124 -0
  50. package/dist/ProfilePage.mjs.map +1 -0
  51. package/dist/SearchPage/Filters/index.cjs +270 -0
  52. package/dist/SearchPage/Filters/index.cjs.map +1 -0
  53. package/dist/SearchPage/Filters/index.d.cts +4 -0
  54. package/dist/SearchPage/Filters/index.d.ts +4 -0
  55. package/dist/SearchPage/Filters/index.mjs +250 -0
  56. package/dist/SearchPage/Filters/index.mjs.map +1 -0
  57. package/dist/SearchPage/Filters.cjs +270 -0
  58. package/dist/SearchPage/Filters.cjs.map +1 -0
  59. package/dist/SearchPage/Filters.d.cts +31 -0
  60. package/dist/SearchPage/Filters.d.ts +31 -0
  61. package/dist/SearchPage/Filters.mjs +250 -0
  62. package/dist/SearchPage/Filters.mjs.map +1 -0
  63. package/dist/SearchPage/Results/index.cjs +226 -0
  64. package/dist/SearchPage/Results/index.cjs.map +1 -0
  65. package/dist/SearchPage/Results/index.d.cts +4 -0
  66. package/dist/SearchPage/Results/index.d.ts +4 -0
  67. package/dist/SearchPage/Results/index.mjs +212 -0
  68. package/dist/SearchPage/Results/index.mjs.map +1 -0
  69. package/dist/SearchPage/Results.cjs +226 -0
  70. package/dist/SearchPage/Results.cjs.map +1 -0
  71. package/dist/SearchPage/Results.d.cts +53 -0
  72. package/dist/SearchPage/Results.d.ts +53 -0
  73. package/dist/SearchPage/Results.mjs +212 -0
  74. package/dist/SearchPage/Results.mjs.map +1 -0
  75. package/dist/SearchPage/index.cjs +737 -0
  76. package/dist/SearchPage/index.cjs.map +1 -0
  77. package/dist/SearchPage/index.d.cts +7 -0
  78. package/dist/SearchPage/index.d.ts +7 -0
  79. package/dist/SearchPage/index.mjs +695 -0
  80. package/dist/SearchPage/index.mjs.map +1 -0
  81. package/dist/SearchPage.cjs +737 -0
  82. package/dist/SearchPage.cjs.map +1 -0
  83. package/dist/SearchPage.d.cts +110 -0
  84. package/dist/SearchPage.d.ts +110 -0
  85. package/dist/SearchPage.mjs +695 -0
  86. package/dist/SearchPage.mjs.map +1 -0
  87. package/dist/TablePage/GameTableProvider/index.cjs +26 -0
  88. package/dist/TablePage/GameTableProvider/index.cjs.map +1 -0
  89. package/dist/TablePage/GameTableProvider/index.d.cts +4 -0
  90. package/dist/TablePage/GameTableProvider/index.d.ts +4 -0
  91. package/dist/TablePage/GameTableProvider/index.mjs +19 -0
  92. package/dist/TablePage/GameTableProvider/index.mjs.map +1 -0
  93. package/dist/TablePage/GameTableProvider.cjs +26 -0
  94. package/dist/TablePage/GameTableProvider.cjs.map +1 -0
  95. package/dist/TablePage/GameTableProvider.d.cts +15 -0
  96. package/dist/TablePage/GameTableProvider.d.ts +15 -0
  97. package/dist/TablePage/GameTableProvider.mjs +19 -0
  98. package/dist/TablePage/GameTableProvider.mjs.map +1 -0
  99. package/dist/TablePage/ModalProvider/index.cjs +83 -0
  100. package/dist/TablePage/ModalProvider/index.cjs.map +1 -0
  101. package/dist/TablePage/ModalProvider/index.css +49 -0
  102. package/dist/TablePage/ModalProvider/index.css.map +1 -0
  103. package/dist/TablePage/ModalProvider/index.d.cts +3 -0
  104. package/dist/TablePage/ModalProvider/index.d.ts +3 -0
  105. package/dist/TablePage/ModalProvider/index.mjs +79 -0
  106. package/dist/TablePage/ModalProvider/index.mjs.map +1 -0
  107. package/dist/TablePage/ModalProvider.cjs +83 -0
  108. package/dist/TablePage/ModalProvider.cjs.map +1 -0
  109. package/dist/TablePage/ModalProvider.css +49 -0
  110. package/dist/TablePage/ModalProvider.css.map +1 -0
  111. package/dist/TablePage/ModalProvider.d.cts +17 -0
  112. package/dist/TablePage/ModalProvider.d.ts +17 -0
  113. package/dist/TablePage/ModalProvider.mjs +79 -0
  114. package/dist/TablePage/ModalProvider.mjs.map +1 -0
  115. package/dist/TablePage/index.cjs +606 -0
  116. package/dist/TablePage/index.cjs.map +1 -0
  117. package/dist/TablePage/index.css +49 -0
  118. package/dist/TablePage/index.css.map +1 -0
  119. package/dist/TablePage/index.d.cts +10 -0
  120. package/dist/TablePage/index.d.ts +10 -0
  121. package/dist/TablePage/index.mjs +579 -0
  122. package/dist/TablePage/index.mjs.map +1 -0
  123. package/dist/TablePage/players/index.cjs +85 -0
  124. package/dist/TablePage/players/index.cjs.map +1 -0
  125. package/dist/TablePage/players/index.d.cts +4 -0
  126. package/dist/TablePage/players/index.d.ts +4 -0
  127. package/dist/TablePage/players/index.mjs +76 -0
  128. package/dist/TablePage/players/index.mjs.map +1 -0
  129. package/dist/TablePage/players.cjs +85 -0
  130. package/dist/TablePage/players.cjs.map +1 -0
  131. package/dist/TablePage/players.d.cts +22 -0
  132. package/dist/TablePage/players.d.ts +22 -0
  133. package/dist/TablePage/players.mjs +76 -0
  134. package/dist/TablePage/players.mjs.map +1 -0
  135. package/dist/TablePage.cjs +606 -0
  136. package/dist/TablePage.cjs.map +1 -0
  137. package/dist/TablePage.css +49 -0
  138. package/dist/TablePage.css.map +1 -0
  139. package/dist/TablePage.d.cts +54 -0
  140. package/dist/TablePage.d.ts +54 -0
  141. package/dist/TablePage.mjs +579 -0
  142. package/dist/TablePage.mjs.map +1 -0
  143. package/dist/common/Modal/index.cjs +64 -0
  144. package/dist/common/Modal/index.cjs.map +1 -0
  145. package/dist/common/Modal/index.css +49 -0
  146. package/dist/common/Modal/index.css.map +1 -0
  147. package/dist/common/Modal/index.d.cts +2 -0
  148. package/dist/common/Modal/index.d.ts +2 -0
  149. package/dist/common/Modal/index.mjs +62 -0
  150. package/dist/common/Modal/index.mjs.map +1 -0
  151. package/dist/common/Modal.cjs +64 -0
  152. package/dist/common/Modal.cjs.map +1 -0
  153. package/dist/common/Modal.css +49 -0
  154. package/dist/common/Modal.css.map +1 -0
  155. package/dist/common/Modal.d.cts +9 -0
  156. package/dist/common/Modal.d.ts +9 -0
  157. package/dist/common/Modal.mjs +62 -0
  158. package/dist/common/Modal.mjs.map +1 -0
  159. package/dist/common/index.cjs +210 -0
  160. package/dist/common/index.cjs.map +1 -0
  161. package/dist/common/index.css +49 -0
  162. package/dist/common/index.css.map +1 -0
  163. package/dist/common/index.d.cts +4 -0
  164. package/dist/common/index.d.ts +4 -0
  165. package/dist/common/index.mjs +194 -0
  166. package/dist/common/index.mjs.map +1 -0
  167. package/dist/common.cjs +210 -0
  168. package/dist/common.cjs.map +1 -0
  169. package/dist/common.css +49 -0
  170. package/dist/common.css.map +1 -0
  171. package/dist/common.d.cts +28 -0
  172. package/dist/common.d.ts +28 -0
  173. package/dist/common.mjs +194 -0
  174. package/dist/common.mjs.map +1 -0
  175. package/dist/index-D7WHhl3Q.d.ts +64 -0
  176. package/dist/index-DC0kK3aC.d.cts +64 -0
  177. package/dist/index.cjs +2608 -0
  178. package/dist/index.cjs.map +1 -0
  179. package/dist/index.css +49 -0
  180. package/dist/index.css.map +1 -0
  181. package/dist/index.d.cts +20 -0
  182. package/dist/index.d.ts +20 -0
  183. package/dist/index.mjs +2529 -0
  184. package/dist/index.mjs.map +1 -0
  185. package/dist/mocks/EventDB.cjs +171 -0
  186. package/dist/mocks/EventDB.cjs.map +1 -0
  187. package/dist/mocks/EventDB.d.cts +6 -0
  188. package/dist/mocks/EventDB.d.ts +6 -0
  189. package/dist/mocks/EventDB.mjs +169 -0
  190. package/dist/mocks/EventDB.mjs.map +1 -0
  191. package/dist/mocks/Events.cjs +59 -0
  192. package/dist/mocks/Events.cjs.map +1 -0
  193. package/dist/mocks/Events.d.cts +13 -0
  194. package/dist/mocks/Events.d.ts +13 -0
  195. package/dist/mocks/Events.mjs +57 -0
  196. package/dist/mocks/Events.mjs.map +1 -0
  197. package/dist/mocks/Players.cjs +75 -0
  198. package/dist/mocks/Players.cjs.map +1 -0
  199. package/dist/mocks/Players.d.cts +15 -0
  200. package/dist/mocks/Players.d.ts +15 -0
  201. package/dist/mocks/Players.mjs +73 -0
  202. package/dist/mocks/Players.mjs.map +1 -0
  203. package/dist/mocks/SearchResults.cjs +143 -0
  204. package/dist/mocks/SearchResults.cjs.map +1 -0
  205. package/dist/mocks/SearchResults.d.cts +30 -0
  206. package/dist/mocks/SearchResults.d.ts +30 -0
  207. package/dist/mocks/SearchResults.mjs +137 -0
  208. package/dist/mocks/SearchResults.mjs.map +1 -0
  209. package/dist/mocks/Tables.cjs +133 -0
  210. package/dist/mocks/Tables.cjs.map +1 -0
  211. package/dist/mocks/Tables.d.cts +38 -0
  212. package/dist/mocks/Tables.d.ts +38 -0
  213. package/dist/mocks/Tables.mjs +131 -0
  214. package/dist/mocks/Tables.mjs.map +1 -0
  215. package/dist/mocks/Tags.cjs +142 -0
  216. package/dist/mocks/Tags.cjs.map +1 -0
  217. package/dist/mocks/Tags.d.cts +5 -0
  218. package/dist/mocks/Tags.d.ts +5 -0
  219. package/dist/mocks/Tags.mjs +140 -0
  220. package/dist/mocks/Tags.mjs.map +1 -0
  221. package/dist/mocks/index.cjs +566 -0
  222. package/dist/mocks/index.cjs.map +1 -0
  223. package/dist/mocks/index.d.cts +8 -0
  224. package/dist/mocks/index.d.ts +8 -0
  225. package/dist/mocks/index.mjs +555 -0
  226. package/dist/mocks/index.mjs.map +1 -0
  227. package/dist/mocks.cjs +566 -0
  228. package/dist/mocks.cjs.map +1 -0
  229. package/dist/mocks.d.cts +8 -0
  230. package/dist/mocks.d.ts +8 -0
  231. package/dist/mocks.mjs +555 -0
  232. package/dist/mocks.mjs.map +1 -0
  233. package/dist/types/event.cjs +4 -0
  234. package/dist/types/event.cjs.map +1 -0
  235. package/dist/types/event.d.cts +37 -0
  236. package/dist/types/event.d.ts +37 -0
  237. package/dist/types/event.mjs +3 -0
  238. package/dist/types/event.mjs.map +1 -0
  239. package/dist/types/index.cjs +4 -0
  240. package/dist/types/index.cjs.map +1 -0
  241. package/dist/types/index.d.cts +6 -0
  242. package/dist/types/index.d.ts +6 -0
  243. package/dist/types/index.mjs +3 -0
  244. package/dist/types/index.mjs.map +1 -0
  245. package/dist/types/player.cjs +4 -0
  246. package/dist/types/player.cjs.map +1 -0
  247. package/dist/types/player.d.cts +20 -0
  248. package/dist/types/player.d.ts +20 -0
  249. package/dist/types/player.mjs +3 -0
  250. package/dist/types/player.mjs.map +1 -0
  251. package/dist/types/search.cjs +4 -0
  252. package/dist/types/search.cjs.map +1 -0
  253. package/dist/types/search.d.cts +20 -0
  254. package/dist/types/search.d.ts +20 -0
  255. package/dist/types/search.mjs +3 -0
  256. package/dist/types/search.mjs.map +1 -0
  257. package/dist/types/table.cjs +4 -0
  258. package/dist/types/table.cjs.map +1 -0
  259. package/dist/types/table.d.cts +21 -0
  260. package/dist/types/table.d.ts +21 -0
  261. package/dist/types/table.mjs +3 -0
  262. package/dist/types/table.mjs.map +1 -0
  263. package/dist/types/tables.cjs +4 -0
  264. package/dist/types/tables.cjs.map +1 -0
  265. package/dist/types/tables.d.cts +21 -0
  266. package/dist/types/tables.d.ts +21 -0
  267. package/dist/types/tables.mjs +3 -0
  268. package/dist/types/tables.mjs.map +1 -0
  269. package/dist/types/tag.cjs +4 -0
  270. package/dist/types/tag.cjs.map +1 -0
  271. package/dist/types/tag.d.cts +14 -0
  272. package/dist/types/tag.d.ts +14 -0
  273. package/dist/types/tag.mjs +3 -0
  274. package/dist/types/tag.mjs.map +1 -0
  275. package/dist/types.cjs +4 -0
  276. package/dist/types.cjs.map +1 -0
  277. package/dist/types.d.cts +6 -0
  278. package/dist/types.d.ts +6 -0
  279. package/dist/types.mjs +3 -0
  280. package/dist/types.mjs.map +1 -0
  281. package/package.json +117 -0
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @pockets/shared-ui
2
+
3
+ A shareable UI library of React/Next components and supporting code (components, mocks, etc.). This package is published as a tarball attached to a GitHub Release and can be installed directly from the release URL.
4
+
5
+ ## How to publish a new release
6
+
7
+ Prerequisites:
8
+ - EITHER: GitHub CLI installed and authenticated (`gh auth status`)
9
+ - OR: Set an environment token `GITHUB_TOKEN` (or `GH_TOKEN`) with repo scope
10
+ - Clean working tree (no uncommitted changes).
11
+ - Node.js 20+.
12
+
13
+ If you don't have gh installed, set a token and run locally:
14
+ - PowerShell (Windows): $env:GITHUB_TOKEN = "<your-token>"
15
+ - bash/zsh (macOS/Linux): export GITHUB_TOKEN="<your-token>"
16
+
17
+ The release script will use gh when available; otherwise it will use the GitHub REST API with the token.
18
+
19
+ Local release:
20
+
21
+ - patch bump (default):
22
+ npm run publish:web
23
+
24
+ - minor or major bump:
25
+ node scripts/release.mjs minor
26
+ node scripts/release.mjs major
27
+
28
+ The script will:
29
+ - Bump the version in package.json via `npm version <type>` (commit + tag)
30
+ - Build the package (`tsup`)
31
+ - Create a tarball via `npm pack`
32
+ - Push commit and tag
33
+ - Create a GitHub Release and upload the tarball asset
34
+
35
+ GitHub Action alternative:
36
+ - Use the Release workflow manually (workflow_dispatch) and pass input `bump` as `patch|minor|major`.
37
+
38
+ ## How to consume
39
+
40
+ Install from a GitHub Release (replace <ORG>/<REPO> and version):
41
+
42
+ npm i https://github.com/<ORG>/<REPO>/releases/download/vX.Y.Z/pockets-shared-ui-X.Y.Z.tgz
43
+
44
+ In your Next.js app’s next.config.mjs (or next.config.ts), add:
45
+
46
+ import { defineConfig } from 'next/config';
47
+
48
+ export default {
49
+ experimental: {
50
+ // Ensure the package is transpiled by Next
51
+ transpilePackages: ["@pockets/shared-ui"],
52
+ },
53
+ };
54
+
55
+ Peer dependencies expected from the consuming app:
56
+ - react ^19
57
+ - react-dom ^19
58
+ - next ^15
59
+ - @mui/material ^7 (required if you use components that rely on MUI)
60
+ - @mui/icons-material ^7 (optional; only if you use components that render icons)
61
+ - @mui/joy ^5.0.0-beta (optional)
62
+ - @emotion/react ^11 and @emotion/styled ^11
63
+
64
+ ### MUI version alignment note
65
+
66
+ If your app uses @mui/icons-material, ensure its minor version matches your installed @mui/material minor version. For example:
67
+ - If you have @mui/material@7.1.x, use @mui/icons-material@~7.1.0
68
+ - If you upgrade to @mui/material@7.3.x, then use @mui/icons-material@^7.3.0
69
+
70
+ NPM may otherwise attempt to install the latest @mui/icons-material (e.g., 7.3.x) which requires @mui/material^7.3.x and can cause ERESOLVE in projects pinned to @mui/material 7.1.x.
71
+
72
+ ## Package entry points
73
+
74
+ This package ships ESM and CJS builds with type declarations. The main barrel is `src/index.ts` which re-exports from:
75
+ - components
76
+ - mocks
77
+ - data (placeholder)
78
+ - hooks (placeholder)
79
+ - utils (placeholder)
80
+
81
+ You can import like:
82
+
83
+ import { SearchPageLayout, Tags, Players } from "@pockets/shared-ui";
84
+
85
+ Or deep-import specific modules if desired (paths are preserved in the build).
@@ -0,0 +1,573 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var material = require('@mui/material');
7
+ var DeleteIcon = require('@mui/icons-material/Delete');
8
+ var EditIcon = require('@mui/icons-material/Edit');
9
+ var AddIcon = require('@mui/icons-material/Add');
10
+ var ColorizeIcon = require('@mui/icons-material/Colorize');
11
+ var CancelIcon = require('@mui/icons-material/Cancel');
12
+ var CheckCircleIcon = require('@mui/icons-material/CheckCircle');
13
+ require('@mui/material/Box');
14
+ require('@mui/material/Grid');
15
+
16
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
+
18
+ var DeleteIcon__default = /*#__PURE__*/_interopDefault(DeleteIcon);
19
+ var EditIcon__default = /*#__PURE__*/_interopDefault(EditIcon);
20
+ var AddIcon__default = /*#__PURE__*/_interopDefault(AddIcon);
21
+ var ColorizeIcon__default = /*#__PURE__*/_interopDefault(ColorizeIcon);
22
+ var CancelIcon__default = /*#__PURE__*/_interopDefault(CancelIcon);
23
+ var CheckCircleIcon__default = /*#__PURE__*/_interopDefault(CheckCircleIcon);
24
+
25
+ var defaultValue = {
26
+ isOwner: false,
27
+ updateEvent: async () => false,
28
+ updateImages: () => {
29
+ },
30
+ event: null
31
+ };
32
+ var EventEditContext = react.createContext(defaultValue);
33
+ function EventEditProvider({
34
+ value,
35
+ initialEvent,
36
+ children
37
+ }) {
38
+ const [event, setEvent] = react.useState(initialEvent);
39
+ react.useEffect(() => {
40
+ setEvent(initialEvent);
41
+ }, [initialEvent]);
42
+ const handleUpdateEvent = async (patch) => {
43
+ if (value == null ? void 0 : value.updateEvent) {
44
+ const result = value.updateEvent(patch);
45
+ if (result instanceof Promise) {
46
+ const success = await result;
47
+ if (success) {
48
+ setEvent((prev) => ({ ...prev, ...patch }));
49
+ }
50
+ return success;
51
+ } else {
52
+ const success = result === false ? false : true;
53
+ if (success) {
54
+ setEvent((prev) => ({ ...prev, ...patch }));
55
+ }
56
+ return success;
57
+ }
58
+ }
59
+ return false;
60
+ };
61
+ const mergedValue = {
62
+ ...defaultValue,
63
+ ...value,
64
+ event,
65
+ updateEvent: handleUpdateEvent
66
+ };
67
+ return /* @__PURE__ */ jsxRuntime.jsx(EventEditContext.Provider, { value: mergedValue, children });
68
+ }
69
+ function useEventEdit() {
70
+ const context = react.useContext(EventEditContext);
71
+ if (!context) {
72
+ throw new Error("useEventEdit must be used within an EventEditProvider");
73
+ }
74
+ return context;
75
+ }
76
+ function generateTagsDisplay(tag) {
77
+ return /* @__PURE__ */ jsxRuntime.jsx(
78
+ "span",
79
+ {
80
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
81
+ style: {
82
+ marginTop: "6px",
83
+ marginRight: "6px",
84
+ marginBottom: "6px",
85
+ background: tag.color || "#bfbcbb",
86
+ color: "white",
87
+ textShadow: "black 0.2em 0.2em 0.4em"
88
+ },
89
+ children: tag.label
90
+ },
91
+ tag.id
92
+ );
93
+ }
94
+ function EventBannerEdit({
95
+ initialValue,
96
+ onCancel,
97
+ onSave
98
+ }) {
99
+ const { updateImages } = useEventEdit();
100
+ const [title, setTitle] = react.useState(initialValue.title);
101
+ const [bannerColor, setBannerColor] = react.useState(initialValue.bannerColor || "");
102
+ const [desktopBanner, setDesktopBanner] = react.useState(initialValue.bannerUrl.desktop);
103
+ const [mobileBanner, setMobileBanner] = react.useState(initialValue.bannerUrl.mobile || "");
104
+ const [links, setLinks] = react.useState(initialValue.links);
105
+ const [linkToEdit, setLinkToEdit] = react.useState(null);
106
+ const [isSaving, setIsSaving] = react.useState(false);
107
+ const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
108
+ const handleSave = async () => {
109
+ setIsSaving(true);
110
+ try {
111
+ const patch = {};
112
+ if (title !== initialValue.title) {
113
+ patch.title = title;
114
+ }
115
+ const currentBannerColor = bannerColor || void 0;
116
+ const initialBannerColor = initialValue.bannerColor || void 0;
117
+ if (currentBannerColor !== initialBannerColor) {
118
+ patch.bannerColor = currentBannerColor;
119
+ }
120
+ const currentMobile = mobileBanner || void 0;
121
+ const initialMobile = initialValue.bannerUrl.mobile || void 0;
122
+ if (desktopBanner !== initialValue.bannerUrl.desktop || currentMobile !== initialMobile) {
123
+ patch.bannerUrl = {
124
+ desktop: desktopBanner,
125
+ mobile: currentMobile
126
+ };
127
+ }
128
+ if (JSON.stringify(links) !== JSON.stringify(initialValue.links)) {
129
+ patch.links = links;
130
+ }
131
+ if (Object.keys(patch).length > 0) {
132
+ await onSave(patch);
133
+ } else {
134
+ onCancel();
135
+ }
136
+ } catch (error) {
137
+ console.error("Failed to save banner changes", error);
138
+ } finally {
139
+ setIsSaving(false);
140
+ }
141
+ };
142
+ const removeLink = (index) => {
143
+ setLinks(links.filter((_, i) => i !== index));
144
+ };
145
+ const openEditLink = (index) => {
146
+ setLinkToEdit({
147
+ index,
148
+ text: links[index].text,
149
+ url: links[index].url
150
+ });
151
+ };
152
+ const saveEditedLink = () => {
153
+ if (linkToEdit) {
154
+ const newLinks = [...links];
155
+ if (linkToEdit.index === -1) {
156
+ newLinks.push({ text: linkToEdit.text, url: linkToEdit.url });
157
+ } else {
158
+ newLinks[linkToEdit.index] = { text: linkToEdit.text, url: linkToEdit.url };
159
+ }
160
+ setLinks(newLinks);
161
+ setLinkToEdit(null);
162
+ }
163
+ };
164
+ const handleEyeDropper = async () => {
165
+ if (!window.EyeDropper) {
166
+ alert("EyeDropper API is not supported in this browser");
167
+ return;
168
+ }
169
+ const eyeDropper = new window.EyeDropper();
170
+ try {
171
+ const result = await eyeDropper.open();
172
+ setBannerColor(result.sRGBHex);
173
+ } catch (e) {
174
+ console.log("EyeDropper cancelled or failed", e);
175
+ }
176
+ };
177
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { position: "relative", width: "100%" }, children: [
178
+ /* @__PURE__ */ jsxRuntime.jsxs(
179
+ material.Grid,
180
+ {
181
+ sx: {
182
+ background: backgroundColor,
183
+ paddingTop: "8px",
184
+ position: "relative",
185
+ border: "2px dashed rgba(255,255,255,0.5)",
186
+ borderRadius: 1
187
+ },
188
+ children: [
189
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: {
190
+ position: "absolute",
191
+ top: 8,
192
+ left: 8,
193
+ zIndex: 10,
194
+ display: "flex",
195
+ flexDirection: "column",
196
+ gap: 1,
197
+ bgcolor: "rgba(0,0,0,0.5)",
198
+ p: 1,
199
+ borderRadius: 1,
200
+ width: "300px"
201
+ }, children: [
202
+ /* @__PURE__ */ jsxRuntime.jsx(
203
+ material.TextField,
204
+ {
205
+ label: "Title",
206
+ variant: "outlined",
207
+ size: "small",
208
+ value: title,
209
+ onChange: (e) => setTitle(e.target.value),
210
+ sx: { input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
214
+ /* @__PURE__ */ jsxRuntime.jsx(
215
+ material.TextField,
216
+ {
217
+ label: "Banner Color",
218
+ variant: "outlined",
219
+ size: "small",
220
+ value: bannerColor,
221
+ onChange: (e) => setBannerColor(e.target.value),
222
+ placeholder: "#HEX or linear-gradient(...)",
223
+ sx: { flex: 1, input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
224
+ }
225
+ ),
226
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Eye Dropper", children: /* @__PURE__ */ jsxRuntime.jsx(
227
+ material.IconButton,
228
+ {
229
+ size: "small",
230
+ onClick: handleEyeDropper,
231
+ sx: { color: "white", bgcolor: "rgba(255,255,255,0.1)", "&:hover": { bgcolor: "rgba(255,255,255,0.2)" } },
232
+ children: /* @__PURE__ */ jsxRuntime.jsx(ColorizeIcon__default.default, { fontSize: "small" })
233
+ }
234
+ ) }),
235
+ /* @__PURE__ */ jsxRuntime.jsx(
236
+ "input",
237
+ {
238
+ type: "color",
239
+ value: bannerColor.startsWith("#") ? bannerColor : "#1976d2",
240
+ onChange: (e) => setBannerColor(e.target.value),
241
+ style: { width: "40px", height: "40px", padding: 0, border: "none", background: "transparent", cursor: "pointer" }
242
+ }
243
+ )
244
+ ] }),
245
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", gap: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(
246
+ material.Button,
247
+ {
248
+ variant: "contained",
249
+ size: "small",
250
+ fullWidth: true,
251
+ onClick: updateImages,
252
+ children: "Update Images"
253
+ }
254
+ ) })
255
+ ] }),
256
+ /* @__PURE__ */ jsxRuntime.jsx(
257
+ material.Box,
258
+ {
259
+ sx: {
260
+ width: "100%",
261
+ height: "auto",
262
+ maxHeight: "250px",
263
+ overflow: "hidden",
264
+ display: "flex",
265
+ justifyContent: "center",
266
+ opacity: 0.8
267
+ },
268
+ children: /* @__PURE__ */ jsxRuntime.jsx(
269
+ material.Box,
270
+ {
271
+ component: "img",
272
+ src: desktopBanner,
273
+ alt: title,
274
+ sx: {
275
+ width: "100%",
276
+ height: "auto",
277
+ objectFit: "contain"
278
+ }
279
+ }
280
+ )
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsxRuntime.jsxs(
284
+ material.Grid,
285
+ {
286
+ display: "flex",
287
+ justifyContent: "center",
288
+ alignItems: "center",
289
+ paddingTop: "3px",
290
+ paddingBottom: "3px",
291
+ sx: { gap: 1.5, flexWrap: "wrap" },
292
+ children: [
293
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { px: 1.5, py: 0.5, color: "rgba(255,255,255,0.5)", bgcolor: "rgba(0,0,0,0.4)", borderRadius: 2, border: "1px dashed rgba(255,255,255,0.2)" }, children: "Stats Placeholder" }),
294
+ generateTagsDisplay(initialValue.eventTag),
295
+ links.map((link, index) => /* @__PURE__ */ jsxRuntime.jsxs(
296
+ material.Box,
297
+ {
298
+ sx: {
299
+ position: "relative",
300
+ display: "flex",
301
+ alignItems: "center",
302
+ px: 1.5,
303
+ py: 0.5,
304
+ color: "#fff",
305
+ bgcolor: "rgba(0,0,0,0.7)",
306
+ borderRadius: 2,
307
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
308
+ border: "1px solid rgba(255,255,255,0.25)",
309
+ backdropFilter: "blur(6px)",
310
+ fontWeight: 700,
311
+ letterSpacing: 0.2
312
+ },
313
+ children: [
314
+ link.text,
315
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { ml: 1, display: "flex" }, children: [
316
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Edit Link", children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: () => openEditLink(index), sx: { color: "white", p: 0.2 }, children: /* @__PURE__ */ jsxRuntime.jsx(EditIcon__default.default, { fontSize: "inherit" }) }) }),
317
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Remove Link", children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: () => removeLink(index), sx: { color: "error.light", p: 0.2 }, children: /* @__PURE__ */ jsxRuntime.jsx(DeleteIcon__default.default, { fontSize: "inherit" }) }) })
318
+ ] })
319
+ ]
320
+ },
321
+ index
322
+ )),
323
+ /* @__PURE__ */ jsxRuntime.jsx(
324
+ material.Button,
325
+ {
326
+ variant: "outlined",
327
+ size: "small",
328
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(AddIcon__default.default, {}),
329
+ onClick: () => setLinkToEdit({ index: -1, text: "", url: "" }),
330
+ sx: {
331
+ color: "white",
332
+ borderColor: "rgba(255,255,255,0.5)",
333
+ borderRadius: 2,
334
+ "&:hover": { borderColor: "white", bgcolor: "rgba(255,255,255,0.1)" }
335
+ },
336
+ children: "Add Link"
337
+ }
338
+ )
339
+ ]
340
+ }
341
+ )
342
+ ]
343
+ }
344
+ ),
345
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "flex-end", gap: 2, mt: 2 }, children: [
346
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: onCancel, color: "inherit", disabled: isSaving, children: "Cancel" }),
347
+ /* @__PURE__ */ jsxRuntime.jsx(
348
+ material.Button,
349
+ {
350
+ onClick: handleSave,
351
+ variant: "contained",
352
+ color: "primary",
353
+ disabled: isSaving,
354
+ startIcon: isSaving ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 20, color: "inherit" }) : null,
355
+ children: isSaving ? "Saving..." : "Save Changes"
356
+ }
357
+ )
358
+ ] }),
359
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Dialog, { open: linkToEdit !== null, onClose: () => setLinkToEdit(null), children: [
360
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogTitle, { children: (linkToEdit == null ? void 0 : linkToEdit.index) === -1 ? "Add Link" : "Edit Link" }),
361
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", flexDirection: "column", gap: 2, pt: 1, width: "400px" }, children: [
362
+ /* @__PURE__ */ jsxRuntime.jsx(
363
+ material.TextField,
364
+ {
365
+ label: "Link Text",
366
+ fullWidth: true,
367
+ value: (linkToEdit == null ? void 0 : linkToEdit.text) || "",
368
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, text: e.target.value } : null)
369
+ }
370
+ ),
371
+ /* @__PURE__ */ jsxRuntime.jsx(
372
+ material.TextField,
373
+ {
374
+ label: "Link URL",
375
+ fullWidth: true,
376
+ value: (linkToEdit == null ? void 0 : linkToEdit.url) || "",
377
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, url: e.target.value } : null)
378
+ }
379
+ )
380
+ ] }) }),
381
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogActions, { children: [
382
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: () => setLinkToEdit(null), children: "Cancel" }),
383
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: saveEditedLink, variant: "contained", children: "Confirm" })
384
+ ] })
385
+ ] })
386
+ ] });
387
+ }
388
+ var CANDIDATE_TIMEZONES = [
389
+ "America/New_York",
390
+ "America/Chicago",
391
+ "America/Denver",
392
+ "America/Los_Angeles",
393
+ "America/Anchorage",
394
+ "America/Adak",
395
+ "Pacific/Honolulu",
396
+ "UTC"
397
+ ];
398
+ function EventBasicInfoEdit({
399
+ initialValue,
400
+ onCancel,
401
+ onSave
402
+ }) {
403
+ const toWallTimeISO = (dateInput, timeZone) => {
404
+ if (!dateInput) return "";
405
+ const d = new Date(dateInput);
406
+ if (isNaN(d.getTime())) return "";
407
+ const parts = new Intl.DateTimeFormat("en-US", {
408
+ year: "numeric",
409
+ month: "2-digit",
410
+ day: "2-digit",
411
+ hour: "2-digit",
412
+ minute: "2-digit",
413
+ hour12: false,
414
+ timeZone
415
+ }).formatToParts(d);
416
+ const f = (type) => {
417
+ var _a;
418
+ return (_a = parts.find((p) => p.type === type)) == null ? void 0 : _a.value;
419
+ };
420
+ const year = f("year");
421
+ const month = f("month");
422
+ const day = f("day");
423
+ let hour = f("hour");
424
+ if (hour === "24") hour = "00";
425
+ const minute = f("minute");
426
+ return `${year}-${month}-${day}T${hour}:${minute}`;
427
+ };
428
+ const toUTCISOString = (wallTime, timeZone) => {
429
+ var _a;
430
+ if (!wallTime) return void 0;
431
+ const d = /* @__PURE__ */ new Date(wallTime + ":00Z");
432
+ const parts = new Intl.DateTimeFormat("en-US", {
433
+ timeZone,
434
+ timeZoneName: "longOffset"
435
+ }).formatToParts(d);
436
+ const offsetPart = ((_a = parts.find((p) => p.type === "timeZoneName")) == null ? void 0 : _a.value) || "GMT";
437
+ const offset = offsetPart.replace("GMT", "");
438
+ const isoWithOffset = `${wallTime}:00${offset || "+00:00"}`;
439
+ return new Date(isoWithOffset).toISOString();
440
+ };
441
+ const [description, setDescription] = react.useState(initialValue.description);
442
+ const [timezone, setTimezone] = react.useState(initialValue.timezone);
443
+ const [startingDate, setStartingDate] = react.useState(toWallTimeISO(initialValue.startingDate, initialValue.timezone));
444
+ const [endingDate, setEndingDate] = react.useState(toWallTimeISO(initialValue.endingDate, initialValue.timezone));
445
+ const [timeInfo, setTimeInfo] = react.useState(initialValue.date);
446
+ const [isSaving, setIsSaving] = react.useState(false);
447
+ const handleSave = async () => {
448
+ setIsSaving(true);
449
+ try {
450
+ const patch = {};
451
+ if (description !== initialValue.description) patch.description = description;
452
+ if (timeInfo !== initialValue.date) patch.date = timeInfo;
453
+ if (timezone !== initialValue.timezone) patch.timezone = timezone;
454
+ if (startingDate !== toWallTimeISO(initialValue.startingDate, timezone) || timezone !== initialValue.timezone) {
455
+ patch.startingDate = toUTCISOString(startingDate, timezone);
456
+ }
457
+ if (endingDate !== toWallTimeISO(initialValue.endingDate, timezone) || timezone !== initialValue.timezone) {
458
+ patch.endingDate = toUTCISOString(endingDate, timezone);
459
+ }
460
+ if (Object.keys(patch).length > 0) {
461
+ await onSave(patch);
462
+ } else {
463
+ onCancel();
464
+ }
465
+ } catch (error) {
466
+ console.error("Failed to save basic info changes", error);
467
+ } finally {
468
+ setIsSaving(false);
469
+ }
470
+ };
471
+ return /* @__PURE__ */ jsxRuntime.jsx(material.Card, { sx: {
472
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
473
+ background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))",
474
+ border: "2px dashed rgba(25,118,210,0.5)",
475
+ width: "100%"
476
+ }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { position: "relative" }, children: [
477
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "flex-end", mb: 1, gap: 1 }, children: [
478
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Cancel", children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: onCancel, color: "error", disabled: isSaving, children: /* @__PURE__ */ jsxRuntime.jsx(CancelIcon__default.default, {}) }) }),
479
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Apply Changes", children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: handleSave, color: "primary", disabled: isSaving, children: isSaving ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 24 }) : /* @__PURE__ */ jsxRuntime.jsx(CheckCircleIcon__default.default, {}) }) })
480
+ ] }),
481
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mt: 2 }, children: [
482
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", fontSize: "x-large", fontWeight: "bold", sx: { mb: 1 }, children: "Event Dates & Times:" }),
483
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [
484
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
485
+ material.TextField,
486
+ {
487
+ fullWidth: true,
488
+ label: "Starting Date",
489
+ type: "datetime-local",
490
+ size: "small",
491
+ value: startingDate,
492
+ onChange: (e) => setStartingDate(e.target.value),
493
+ InputLabelProps: { shrink: true }
494
+ }
495
+ ) }),
496
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
497
+ material.TextField,
498
+ {
499
+ fullWidth: true,
500
+ label: "Ending Date",
501
+ type: "datetime-local",
502
+ size: "small",
503
+ value: endingDate,
504
+ onChange: (e) => setEndingDate(e.target.value),
505
+ InputLabelProps: { shrink: true }
506
+ }
507
+ ) }),
508
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.FormControl, { fullWidth: true, size: "small", children: [
509
+ /* @__PURE__ */ jsxRuntime.jsx(material.InputLabel, { children: "Display Timezone" }),
510
+ /* @__PURE__ */ jsxRuntime.jsx(
511
+ material.Select,
512
+ {
513
+ label: "Display Timezone",
514
+ value: timezone,
515
+ onChange: (e) => setTimezone(e.target.value),
516
+ children: CANDIDATE_TIMEZONES.map((tz) => /* @__PURE__ */ jsxRuntime.jsx(material.MenuItem, { value: tz, children: tz }, tz))
517
+ }
518
+ )
519
+ ] }) })
520
+ ] }),
521
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mt: 2 }, children: [
522
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: "Hours of Operation:" }),
523
+ /* @__PURE__ */ jsxRuntime.jsx(
524
+ material.TextField,
525
+ {
526
+ fullWidth: true,
527
+ multiline: true,
528
+ variant: "standard",
529
+ placeholder: "e.g. Mon-Fri 9am-5pm",
530
+ value: timeInfo,
531
+ onChange: (e) => setTimeInfo(e.target.value),
532
+ sx: { mt: 1 }
533
+ }
534
+ )
535
+ ] })
536
+ ] }),
537
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", paddingTop: 2, children: "About:" }),
538
+ /* @__PURE__ */ jsxRuntime.jsx(
539
+ material.TextField,
540
+ {
541
+ fullWidth: true,
542
+ multiline: true,
543
+ variant: "standard",
544
+ value: description,
545
+ onChange: (e) => setDescription(e.target.value),
546
+ sx: {
547
+ paddingTop: 1,
548
+ "& .MuiInputBase-root": {
549
+ lineHeight: 1.5,
550
+ whiteSpace: "pre-wrap"
551
+ }
552
+ }
553
+ }
554
+ ),
555
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
556
+ mt: 2,
557
+ width: "100%",
558
+ p: 1.5,
559
+ borderRadius: 2,
560
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
561
+ background: "linear-gradient(135deg, rgba(180, 180,180, 1), rgba(225, 225, 225, 0.8))",
562
+ color: "rgba(0,0,0,0.5)",
563
+ border: "1px dashed rgba(0,0,0,0.2)"
564
+ }, children: "Location Data (Not Editable)" })
565
+ ] }) });
566
+ }
567
+
568
+ exports.EventBannerEdit = EventBannerEdit;
569
+ exports.EventBasicInfoEdit = EventBasicInfoEdit;
570
+ exports.EventEditProvider = EventEditProvider;
571
+ exports.useEventEdit = useEventEdit;
572
+ //# sourceMappingURL=index.cjs.map
573
+ //# sourceMappingURL=index.cjs.map