@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
@@ -0,0 +1,1215 @@
1
+ "use client";
2
+ import { createContext, useState, useEffect, useContext } from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { Box, Grid, TextField, Tooltip, IconButton, Button, CircularProgress, Dialog, DialogTitle, DialogContent, DialogActions, Card, CardContent, Typography, FormControl, InputLabel, Select, MenuItem, Chip, LinearProgress } from '@mui/material';
5
+ import DeleteIcon from '@mui/icons-material/Delete';
6
+ import EditIcon from '@mui/icons-material/Edit';
7
+ import AddIcon from '@mui/icons-material/Add';
8
+ import ColorizeIcon from '@mui/icons-material/Colorize';
9
+ import CancelIcon from '@mui/icons-material/Cancel';
10
+ import CheckCircleIcon from '@mui/icons-material/CheckCircle';
11
+ import Box2 from '@mui/material/Box';
12
+ import Grid5 from '@mui/material/Grid';
13
+ import Card4 from '@mui/material/Card';
14
+ import CardContent4 from '@mui/material/CardContent';
15
+ import CardHeader from '@mui/material/CardHeader';
16
+ import Divider from '@mui/material/Divider';
17
+ import Avatar from '@mui/material/Avatar';
18
+ import CasinoIcon from '@mui/icons-material/Casino';
19
+ import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
20
+ import LocationOnIcon from '@mui/icons-material/LocationOn';
21
+ import EventIcon from '@mui/icons-material/Event';
22
+
23
+ // src/components/EventPage/editMode/EventBannerEdit.tsx
24
+ var defaultValue = {
25
+ isOwner: false,
26
+ updateEvent: async () => false,
27
+ updateImages: () => {
28
+ },
29
+ event: null
30
+ };
31
+ var EventEditContext = createContext(defaultValue);
32
+ function EventEditProvider({
33
+ value,
34
+ initialEvent,
35
+ children
36
+ }) {
37
+ const [event, setEvent] = useState(initialEvent);
38
+ useEffect(() => {
39
+ setEvent(initialEvent);
40
+ }, [initialEvent]);
41
+ const handleUpdateEvent = async (patch) => {
42
+ if (value == null ? void 0 : value.updateEvent) {
43
+ const result = value.updateEvent(patch);
44
+ if (result instanceof Promise) {
45
+ const success = await result;
46
+ if (success) {
47
+ setEvent((prev) => ({ ...prev, ...patch }));
48
+ }
49
+ return success;
50
+ } else {
51
+ const success = result === false ? false : true;
52
+ if (success) {
53
+ setEvent((prev) => ({ ...prev, ...patch }));
54
+ }
55
+ return success;
56
+ }
57
+ }
58
+ return false;
59
+ };
60
+ const mergedValue = {
61
+ ...defaultValue,
62
+ ...value,
63
+ event,
64
+ updateEvent: handleUpdateEvent
65
+ };
66
+ return /* @__PURE__ */ jsx(EventEditContext.Provider, { value: mergedValue, children });
67
+ }
68
+ function useEventEdit() {
69
+ const context = useContext(EventEditContext);
70
+ if (!context) {
71
+ throw new Error("useEventEdit must be used within an EventEditProvider");
72
+ }
73
+ return context;
74
+ }
75
+ function generateTagsDisplay(tag) {
76
+ return /* @__PURE__ */ jsx(
77
+ "span",
78
+ {
79
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
80
+ style: {
81
+ marginTop: "6px",
82
+ marginRight: "6px",
83
+ marginBottom: "6px",
84
+ background: tag.color || "#bfbcbb",
85
+ color: "white",
86
+ textShadow: "black 0.2em 0.2em 0.4em"
87
+ },
88
+ children: tag.label
89
+ },
90
+ tag.id
91
+ );
92
+ }
93
+ function EventBannerEdit({
94
+ initialValue,
95
+ onCancel,
96
+ onSave
97
+ }) {
98
+ const { updateImages } = useEventEdit();
99
+ const [title, setTitle] = useState(initialValue.title);
100
+ const [bannerColor, setBannerColor] = useState(initialValue.bannerColor || "");
101
+ const [desktopBanner, setDesktopBanner] = useState(initialValue.bannerUrl.desktop);
102
+ const [mobileBanner, setMobileBanner] = useState(initialValue.bannerUrl.mobile || "");
103
+ const [links, setLinks] = useState(initialValue.links);
104
+ const [linkToEdit, setLinkToEdit] = useState(null);
105
+ const [isSaving, setIsSaving] = useState(false);
106
+ const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
107
+ const handleSave = async () => {
108
+ setIsSaving(true);
109
+ try {
110
+ const patch = {};
111
+ if (title !== initialValue.title) {
112
+ patch.title = title;
113
+ }
114
+ const currentBannerColor = bannerColor || void 0;
115
+ const initialBannerColor = initialValue.bannerColor || void 0;
116
+ if (currentBannerColor !== initialBannerColor) {
117
+ patch.bannerColor = currentBannerColor;
118
+ }
119
+ const currentMobile = mobileBanner || void 0;
120
+ const initialMobile = initialValue.bannerUrl.mobile || void 0;
121
+ if (desktopBanner !== initialValue.bannerUrl.desktop || currentMobile !== initialMobile) {
122
+ patch.bannerUrl = {
123
+ desktop: desktopBanner,
124
+ mobile: currentMobile
125
+ };
126
+ }
127
+ if (JSON.stringify(links) !== JSON.stringify(initialValue.links)) {
128
+ patch.links = links;
129
+ }
130
+ if (Object.keys(patch).length > 0) {
131
+ await onSave(patch);
132
+ } else {
133
+ onCancel();
134
+ }
135
+ } catch (error) {
136
+ console.error("Failed to save banner changes", error);
137
+ } finally {
138
+ setIsSaving(false);
139
+ }
140
+ };
141
+ const removeLink = (index) => {
142
+ setLinks(links.filter((_, i) => i !== index));
143
+ };
144
+ const openEditLink = (index) => {
145
+ setLinkToEdit({
146
+ index,
147
+ text: links[index].text,
148
+ url: links[index].url
149
+ });
150
+ };
151
+ const saveEditedLink = () => {
152
+ if (linkToEdit) {
153
+ const newLinks = [...links];
154
+ if (linkToEdit.index === -1) {
155
+ newLinks.push({ text: linkToEdit.text, url: linkToEdit.url });
156
+ } else {
157
+ newLinks[linkToEdit.index] = { text: linkToEdit.text, url: linkToEdit.url };
158
+ }
159
+ setLinks(newLinks);
160
+ setLinkToEdit(null);
161
+ }
162
+ };
163
+ const handleEyeDropper = async () => {
164
+ if (!window.EyeDropper) {
165
+ alert("EyeDropper API is not supported in this browser");
166
+ return;
167
+ }
168
+ const eyeDropper = new window.EyeDropper();
169
+ try {
170
+ const result = await eyeDropper.open();
171
+ setBannerColor(result.sRGBHex);
172
+ } catch (e) {
173
+ console.log("EyeDropper cancelled or failed", e);
174
+ }
175
+ };
176
+ return /* @__PURE__ */ jsxs(Box, { sx: { position: "relative", width: "100%" }, children: [
177
+ /* @__PURE__ */ jsxs(
178
+ Grid,
179
+ {
180
+ sx: {
181
+ background: backgroundColor,
182
+ paddingTop: "8px",
183
+ position: "relative",
184
+ border: "2px dashed rgba(255,255,255,0.5)",
185
+ borderRadius: 1
186
+ },
187
+ children: [
188
+ /* @__PURE__ */ jsxs(Box, { sx: {
189
+ position: "absolute",
190
+ top: 8,
191
+ left: 8,
192
+ zIndex: 10,
193
+ display: "flex",
194
+ flexDirection: "column",
195
+ gap: 1,
196
+ bgcolor: "rgba(0,0,0,0.5)",
197
+ p: 1,
198
+ borderRadius: 1,
199
+ width: "300px"
200
+ }, children: [
201
+ /* @__PURE__ */ jsx(
202
+ TextField,
203
+ {
204
+ label: "Title",
205
+ variant: "outlined",
206
+ size: "small",
207
+ value: title,
208
+ onChange: (e) => setTitle(e.target.value),
209
+ sx: { input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
210
+ }
211
+ ),
212
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
213
+ /* @__PURE__ */ jsx(
214
+ TextField,
215
+ {
216
+ label: "Banner Color",
217
+ variant: "outlined",
218
+ size: "small",
219
+ value: bannerColor,
220
+ onChange: (e) => setBannerColor(e.target.value),
221
+ placeholder: "#HEX or linear-gradient(...)",
222
+ sx: { flex: 1, input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
223
+ }
224
+ ),
225
+ /* @__PURE__ */ jsx(Tooltip, { title: "Eye Dropper", children: /* @__PURE__ */ jsx(
226
+ IconButton,
227
+ {
228
+ size: "small",
229
+ onClick: handleEyeDropper,
230
+ sx: { color: "white", bgcolor: "rgba(255,255,255,0.1)", "&:hover": { bgcolor: "rgba(255,255,255,0.2)" } },
231
+ children: /* @__PURE__ */ jsx(ColorizeIcon, { fontSize: "small" })
232
+ }
233
+ ) }),
234
+ /* @__PURE__ */ jsx(
235
+ "input",
236
+ {
237
+ type: "color",
238
+ value: bannerColor.startsWith("#") ? bannerColor : "#1976d2",
239
+ onChange: (e) => setBannerColor(e.target.value),
240
+ style: { width: "40px", height: "40px", padding: 0, border: "none", background: "transparent", cursor: "pointer" }
241
+ }
242
+ )
243
+ ] }),
244
+ /* @__PURE__ */ jsx(Box, { sx: { display: "flex", gap: 1 }, children: /* @__PURE__ */ jsx(
245
+ Button,
246
+ {
247
+ variant: "contained",
248
+ size: "small",
249
+ fullWidth: true,
250
+ onClick: updateImages,
251
+ children: "Update Images"
252
+ }
253
+ ) })
254
+ ] }),
255
+ /* @__PURE__ */ jsx(
256
+ Box,
257
+ {
258
+ sx: {
259
+ width: "100%",
260
+ height: "auto",
261
+ maxHeight: "250px",
262
+ overflow: "hidden",
263
+ display: "flex",
264
+ justifyContent: "center",
265
+ opacity: 0.8
266
+ },
267
+ children: /* @__PURE__ */ jsx(
268
+ Box,
269
+ {
270
+ component: "img",
271
+ src: desktopBanner,
272
+ alt: title,
273
+ sx: {
274
+ width: "100%",
275
+ height: "auto",
276
+ objectFit: "contain"
277
+ }
278
+ }
279
+ )
280
+ }
281
+ ),
282
+ /* @__PURE__ */ jsxs(
283
+ Grid,
284
+ {
285
+ display: "flex",
286
+ justifyContent: "center",
287
+ alignItems: "center",
288
+ paddingTop: "3px",
289
+ paddingBottom: "3px",
290
+ sx: { gap: 1.5, flexWrap: "wrap" },
291
+ children: [
292
+ /* @__PURE__ */ jsx(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" }),
293
+ generateTagsDisplay(initialValue.eventTag),
294
+ links.map((link, index) => /* @__PURE__ */ jsxs(
295
+ Box,
296
+ {
297
+ sx: {
298
+ position: "relative",
299
+ display: "flex",
300
+ alignItems: "center",
301
+ px: 1.5,
302
+ py: 0.5,
303
+ color: "#fff",
304
+ bgcolor: "rgba(0,0,0,0.7)",
305
+ borderRadius: 2,
306
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
307
+ border: "1px solid rgba(255,255,255,0.25)",
308
+ backdropFilter: "blur(6px)",
309
+ fontWeight: 700,
310
+ letterSpacing: 0.2
311
+ },
312
+ children: [
313
+ link.text,
314
+ /* @__PURE__ */ jsxs(Box, { sx: { ml: 1, display: "flex" }, children: [
315
+ /* @__PURE__ */ jsx(Tooltip, { title: "Edit Link", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => openEditLink(index), sx: { color: "white", p: 0.2 }, children: /* @__PURE__ */ jsx(EditIcon, { fontSize: "inherit" }) }) }),
316
+ /* @__PURE__ */ jsx(Tooltip, { title: "Remove Link", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => removeLink(index), sx: { color: "error.light", p: 0.2 }, children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "inherit" }) }) })
317
+ ] })
318
+ ]
319
+ },
320
+ index
321
+ )),
322
+ /* @__PURE__ */ jsx(
323
+ Button,
324
+ {
325
+ variant: "outlined",
326
+ size: "small",
327
+ startIcon: /* @__PURE__ */ jsx(AddIcon, {}),
328
+ onClick: () => setLinkToEdit({ index: -1, text: "", url: "" }),
329
+ sx: {
330
+ color: "white",
331
+ borderColor: "rgba(255,255,255,0.5)",
332
+ borderRadius: 2,
333
+ "&:hover": { borderColor: "white", bgcolor: "rgba(255,255,255,0.1)" }
334
+ },
335
+ children: "Add Link"
336
+ }
337
+ )
338
+ ]
339
+ }
340
+ )
341
+ ]
342
+ }
343
+ ),
344
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "flex-end", gap: 2, mt: 2 }, children: [
345
+ /* @__PURE__ */ jsx(Button, { onClick: onCancel, color: "inherit", disabled: isSaving, children: "Cancel" }),
346
+ /* @__PURE__ */ jsx(
347
+ Button,
348
+ {
349
+ onClick: handleSave,
350
+ variant: "contained",
351
+ color: "primary",
352
+ disabled: isSaving,
353
+ startIcon: isSaving ? /* @__PURE__ */ jsx(CircularProgress, { size: 20, color: "inherit" }) : null,
354
+ children: isSaving ? "Saving..." : "Save Changes"
355
+ }
356
+ )
357
+ ] }),
358
+ /* @__PURE__ */ jsxs(Dialog, { open: linkToEdit !== null, onClose: () => setLinkToEdit(null), children: [
359
+ /* @__PURE__ */ jsx(DialogTitle, { children: (linkToEdit == null ? void 0 : linkToEdit.index) === -1 ? "Add Link" : "Edit Link" }),
360
+ /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", flexDirection: "column", gap: 2, pt: 1, width: "400px" }, children: [
361
+ /* @__PURE__ */ jsx(
362
+ TextField,
363
+ {
364
+ label: "Link Text",
365
+ fullWidth: true,
366
+ value: (linkToEdit == null ? void 0 : linkToEdit.text) || "",
367
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, text: e.target.value } : null)
368
+ }
369
+ ),
370
+ /* @__PURE__ */ jsx(
371
+ TextField,
372
+ {
373
+ label: "Link URL",
374
+ fullWidth: true,
375
+ value: (linkToEdit == null ? void 0 : linkToEdit.url) || "",
376
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, url: e.target.value } : null)
377
+ }
378
+ )
379
+ ] }) }),
380
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
381
+ /* @__PURE__ */ jsx(Button, { onClick: () => setLinkToEdit(null), children: "Cancel" }),
382
+ /* @__PURE__ */ jsx(Button, { onClick: saveEditedLink, variant: "contained", children: "Confirm" })
383
+ ] })
384
+ ] })
385
+ ] });
386
+ }
387
+ var CANDIDATE_TIMEZONES = [
388
+ "America/New_York",
389
+ "America/Chicago",
390
+ "America/Denver",
391
+ "America/Los_Angeles",
392
+ "America/Anchorage",
393
+ "America/Adak",
394
+ "Pacific/Honolulu",
395
+ "UTC"
396
+ ];
397
+ function EventBasicInfo(props) {
398
+ var _a, _b, _c, _d, _e, _f, _g, _h;
399
+ const { isOwner, updateEvent, event } = useEventEdit();
400
+ const [isEditing, setIsEditing] = useState(false);
401
+ const description = (_b = (_a = props.description) != null ? _a : event == null ? void 0 : event.description) != null ? _b : "";
402
+ const startingDate = (_c = props.startingDate) != null ? _c : event == null ? void 0 : event.startingDate;
403
+ const endingDate = (_d = props.endingDate) != null ? _d : event == null ? void 0 : event.endingDate;
404
+ const timeInfo = (_f = (_e = props.timeInfo) != null ? _e : event == null ? void 0 : event.date) != null ? _f : "";
405
+ const timezone = (_h = (_g = props.timezone) != null ? _g : event == null ? void 0 : event.timezone) != null ? _h : "UTC";
406
+ if (isEditing) {
407
+ return /* @__PURE__ */ jsx(
408
+ EventBasicInfoEdit,
409
+ {
410
+ initialValue: {
411
+ description,
412
+ startingDate: typeof startingDate === "string" ? startingDate : startingDate == null ? void 0 : startingDate.toISOString(),
413
+ endingDate: typeof endingDate === "string" ? endingDate : endingDate == null ? void 0 : endingDate.toISOString(),
414
+ date: timeInfo,
415
+ timezone
416
+ },
417
+ onCancel: () => setIsEditing(false),
418
+ onSave: async (payload) => {
419
+ const success = await updateEvent(payload);
420
+ if (success) {
421
+ setIsEditing(false);
422
+ }
423
+ }
424
+ }
425
+ );
426
+ }
427
+ return /* @__PURE__ */ jsx(
428
+ EventBasicInfoView,
429
+ {
430
+ ...props,
431
+ description,
432
+ startingDate,
433
+ endingDate,
434
+ timeInfo,
435
+ timezone,
436
+ isOwner,
437
+ onEdit: () => setIsEditing(true)
438
+ }
439
+ );
440
+ }
441
+ function EventBasicInfoView({ description, locationId, startingDate, endingDate, timeInfo, timezone, isOwner, onEdit }) {
442
+ return /* @__PURE__ */ jsx(Grid5, { sx: { position: "relative" }, children: /* @__PURE__ */ jsx(Card, { style: {
443
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
444
+ background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))"
445
+ }, children: /* @__PURE__ */ jsxs(CardContent, { children: [
446
+ isOwner && /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsx(Button, { size: "small", onClick: onEdit, variant: "outlined", children: "Edit" }) }),
447
+ generateTimeInfo(timeInfo, timezone || "UTC", startingDate, endingDate),
448
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", paddingTop: 2, children: "About:" }),
449
+ /* @__PURE__ */ jsx(Typography, { sx: { whiteSpace: "pre-wrap" }, paddingTop: 1, children: description }),
450
+ getLocation()
451
+ ] }) }) });
452
+ }
453
+ var generateTimeInfo = function(timeInfo, timezone, startingDate, endingDate) {
454
+ const formatDateTime = (dateInput) => {
455
+ const d = typeof dateInput === "string" ? new Date(dateInput) : dateInput;
456
+ if (!d || isNaN(d.getTime())) return "";
457
+ try {
458
+ return new Intl.DateTimeFormat("en-US", {
459
+ month: "short",
460
+ day: "numeric",
461
+ year: "numeric",
462
+ hour: "numeric",
463
+ minute: "2-digit",
464
+ hour12: true,
465
+ timeZone: timezone,
466
+ timeZoneName: "shortGeneric"
467
+ }).format(d).replace(",", " @");
468
+ } catch (e) {
469
+ return d.toUTCString();
470
+ }
471
+ };
472
+ let rangeText = null;
473
+ if (startingDate && endingDate) {
474
+ rangeText = `From ${formatDateTime(startingDate)}
475
+ Until ${formatDateTime(endingDate)}`;
476
+ } else if (startingDate) {
477
+ rangeText = `starting ${formatDateTime(startingDate)}`;
478
+ } else if (endingDate) {
479
+ rangeText = `until ${formatDateTime(endingDate)}`;
480
+ }
481
+ return /* @__PURE__ */ jsxs(Box2, { sx: { mt: 2 }, children: [
482
+ rangeText && /* @__PURE__ */ jsx(Typography, { variant: "body1", fontSize: "x-large", fontWeight: "bold", sx: { whiteSpace: "pre-wrap" }, children: rangeText }),
483
+ timeInfo && /* @__PURE__ */ jsxs(Box2, { sx: { mt: 1 }, children: [
484
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: "Hours of Operation:" }),
485
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", sx: { whiteSpace: "pre-wrap" }, children: timeInfo })
486
+ ] })
487
+ ] });
488
+ };
489
+ var getLocation = function(locationId) {
490
+ return /* @__PURE__ */ jsx(Box2, { sx: {
491
+ width: "100%",
492
+ p: 1.5,
493
+ borderRadius: 2,
494
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
495
+ background: "linear-gradient(135deg, rgba(180, 180,180, 1), rgba(225, 225, 225, 0.8))",
496
+ mt: 2
497
+ }, children: "Location Data goes here" });
498
+ };
499
+ function EventBasicInfoEdit({
500
+ initialValue,
501
+ onCancel,
502
+ onSave
503
+ }) {
504
+ const toWallTimeISO = (dateInput, timeZone) => {
505
+ if (!dateInput) return "";
506
+ const d = new Date(dateInput);
507
+ if (isNaN(d.getTime())) return "";
508
+ const parts = new Intl.DateTimeFormat("en-US", {
509
+ year: "numeric",
510
+ month: "2-digit",
511
+ day: "2-digit",
512
+ hour: "2-digit",
513
+ minute: "2-digit",
514
+ hour12: false,
515
+ timeZone
516
+ }).formatToParts(d);
517
+ const f = (type) => {
518
+ var _a;
519
+ return (_a = parts.find((p) => p.type === type)) == null ? void 0 : _a.value;
520
+ };
521
+ const year = f("year");
522
+ const month = f("month");
523
+ const day = f("day");
524
+ let hour = f("hour");
525
+ if (hour === "24") hour = "00";
526
+ const minute = f("minute");
527
+ return `${year}-${month}-${day}T${hour}:${minute}`;
528
+ };
529
+ const toUTCISOString = (wallTime, timeZone) => {
530
+ var _a;
531
+ if (!wallTime) return void 0;
532
+ const d = /* @__PURE__ */ new Date(wallTime + ":00Z");
533
+ const parts = new Intl.DateTimeFormat("en-US", {
534
+ timeZone,
535
+ timeZoneName: "longOffset"
536
+ }).formatToParts(d);
537
+ const offsetPart = ((_a = parts.find((p) => p.type === "timeZoneName")) == null ? void 0 : _a.value) || "GMT";
538
+ const offset = offsetPart.replace("GMT", "");
539
+ const isoWithOffset = `${wallTime}:00${offset || "+00:00"}`;
540
+ return new Date(isoWithOffset).toISOString();
541
+ };
542
+ const [description, setDescription] = useState(initialValue.description);
543
+ const [timezone, setTimezone] = useState(initialValue.timezone);
544
+ const [startingDate, setStartingDate] = useState(toWallTimeISO(initialValue.startingDate, initialValue.timezone));
545
+ const [endingDate, setEndingDate] = useState(toWallTimeISO(initialValue.endingDate, initialValue.timezone));
546
+ const [timeInfo, setTimeInfo] = useState(initialValue.date);
547
+ const [isSaving, setIsSaving] = useState(false);
548
+ const handleSave = async () => {
549
+ setIsSaving(true);
550
+ try {
551
+ const patch = {};
552
+ if (description !== initialValue.description) patch.description = description;
553
+ if (timeInfo !== initialValue.date) patch.date = timeInfo;
554
+ if (timezone !== initialValue.timezone) patch.timezone = timezone;
555
+ if (startingDate !== toWallTimeISO(initialValue.startingDate, timezone) || timezone !== initialValue.timezone) {
556
+ patch.startingDate = toUTCISOString(startingDate, timezone);
557
+ }
558
+ if (endingDate !== toWallTimeISO(initialValue.endingDate, timezone) || timezone !== initialValue.timezone) {
559
+ patch.endingDate = toUTCISOString(endingDate, timezone);
560
+ }
561
+ if (Object.keys(patch).length > 0) {
562
+ await onSave(patch);
563
+ } else {
564
+ onCancel();
565
+ }
566
+ } catch (error) {
567
+ console.error("Failed to save basic info changes", error);
568
+ } finally {
569
+ setIsSaving(false);
570
+ }
571
+ };
572
+ return /* @__PURE__ */ jsx(Card, { sx: {
573
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
574
+ background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))",
575
+ border: "2px dashed rgba(25,118,210,0.5)",
576
+ width: "100%"
577
+ }, children: /* @__PURE__ */ jsxs(CardContent, { sx: { position: "relative" }, children: [
578
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "flex-end", mb: 1, gap: 1 }, children: [
579
+ /* @__PURE__ */ jsx(Tooltip, { title: "Cancel", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: onCancel, color: "error", disabled: isSaving, children: /* @__PURE__ */ jsx(CancelIcon, {}) }) }),
580
+ /* @__PURE__ */ jsx(Tooltip, { title: "Apply Changes", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: handleSave, color: "primary", disabled: isSaving, children: isSaving ? /* @__PURE__ */ jsx(CircularProgress, { size: 24 }) : /* @__PURE__ */ jsx(CheckCircleIcon, {}) }) })
581
+ ] }),
582
+ /* @__PURE__ */ jsxs(Box, { sx: { mt: 2 }, children: [
583
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", fontSize: "x-large", fontWeight: "bold", sx: { mb: 1 }, children: "Event Dates & Times:" }),
584
+ /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
585
+ /* @__PURE__ */ jsx(Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsx(
586
+ TextField,
587
+ {
588
+ fullWidth: true,
589
+ label: "Starting Date",
590
+ type: "datetime-local",
591
+ size: "small",
592
+ value: startingDate,
593
+ onChange: (e) => setStartingDate(e.target.value),
594
+ InputLabelProps: { shrink: true }
595
+ }
596
+ ) }),
597
+ /* @__PURE__ */ jsx(Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsx(
598
+ TextField,
599
+ {
600
+ fullWidth: true,
601
+ label: "Ending Date",
602
+ type: "datetime-local",
603
+ size: "small",
604
+ value: endingDate,
605
+ onChange: (e) => setEndingDate(e.target.value),
606
+ InputLabelProps: { shrink: true }
607
+ }
608
+ ) }),
609
+ /* @__PURE__ */ jsx(Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxs(FormControl, { fullWidth: true, size: "small", children: [
610
+ /* @__PURE__ */ jsx(InputLabel, { children: "Display Timezone" }),
611
+ /* @__PURE__ */ jsx(
612
+ Select,
613
+ {
614
+ label: "Display Timezone",
615
+ value: timezone,
616
+ onChange: (e) => setTimezone(e.target.value),
617
+ children: CANDIDATE_TIMEZONES.map((tz) => /* @__PURE__ */ jsx(MenuItem, { value: tz, children: tz }, tz))
618
+ }
619
+ )
620
+ ] }) })
621
+ ] }),
622
+ /* @__PURE__ */ jsxs(Box, { sx: { mt: 2 }, children: [
623
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", children: "Hours of Operation:" }),
624
+ /* @__PURE__ */ jsx(
625
+ TextField,
626
+ {
627
+ fullWidth: true,
628
+ multiline: true,
629
+ variant: "standard",
630
+ placeholder: "e.g. Mon-Fri 9am-5pm",
631
+ value: timeInfo,
632
+ onChange: (e) => setTimeInfo(e.target.value),
633
+ sx: { mt: 1 }
634
+ }
635
+ )
636
+ ] })
637
+ ] }),
638
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", paddingTop: 2, children: "About:" }),
639
+ /* @__PURE__ */ jsx(
640
+ TextField,
641
+ {
642
+ fullWidth: true,
643
+ multiline: true,
644
+ variant: "standard",
645
+ value: description,
646
+ onChange: (e) => setDescription(e.target.value),
647
+ sx: {
648
+ paddingTop: 1,
649
+ "& .MuiInputBase-root": {
650
+ lineHeight: 1.5,
651
+ whiteSpace: "pre-wrap"
652
+ }
653
+ }
654
+ }
655
+ ),
656
+ /* @__PURE__ */ jsx(Box, { sx: {
657
+ mt: 2,
658
+ width: "100%",
659
+ p: 1.5,
660
+ borderRadius: 2,
661
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
662
+ background: "linear-gradient(135deg, rgba(180, 180,180, 1), rgba(225, 225, 225, 0.8))",
663
+ color: "rgba(0,0,0,0.5)",
664
+ border: "1px dashed rgba(0,0,0,0.2)"
665
+ }, children: "Location Data (Not Editable)" })
666
+ ] }) });
667
+ }
668
+ function EventBanner(props) {
669
+ const { isOwner, updateEvent, event } = useEventEdit();
670
+ const [isEditing, setIsEditing] = useState(false);
671
+ if (!event && !props.bannerUrl) return null;
672
+ const bannerUrl = props.bannerUrl || (event == null ? void 0 : event.bannerUrl);
673
+ const links = props.links || (event == null ? void 0 : event.links) || [];
674
+ const title = props.title || (event == null ? void 0 : event.title) || "";
675
+ const eventTag = props.eventTag || (event == null ? void 0 : event.eventTag);
676
+ const bannerColor = props.bannerColor || (event == null ? void 0 : event.bannerColor);
677
+ if (!bannerUrl || !eventTag) return null;
678
+ if (isEditing) {
679
+ return /* @__PURE__ */ jsx(
680
+ EventBannerEdit,
681
+ {
682
+ initialValue: {
683
+ bannerUrl,
684
+ bannerColor,
685
+ links,
686
+ title,
687
+ eventTag
688
+ },
689
+ onCancel: () => setIsEditing(false),
690
+ onSave: async (payload) => {
691
+ const success = await updateEvent(payload);
692
+ if (success) {
693
+ setIsEditing(false);
694
+ }
695
+ }
696
+ }
697
+ );
698
+ }
699
+ return /* @__PURE__ */ jsx(
700
+ EventBannerView,
701
+ {
702
+ ...props,
703
+ bannerUrl,
704
+ links,
705
+ title,
706
+ eventTag,
707
+ bannerColor,
708
+ isOwner,
709
+ onEdit: () => setIsEditing(true)
710
+ }
711
+ );
712
+ }
713
+ function EventBannerView({
714
+ bannerUrl,
715
+ links,
716
+ bannerColor,
717
+ title,
718
+ eventTag,
719
+ attendees,
720
+ numGames,
721
+ isOwner,
722
+ onEdit
723
+ }) {
724
+ const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
725
+ return /* @__PURE__ */ jsxs(
726
+ Grid5,
727
+ {
728
+ sx: {
729
+ background: backgroundColor,
730
+ paddingTop: "8px",
731
+ position: "relative"
732
+ },
733
+ children: [
734
+ /* @__PURE__ */ jsxs(Grid5, { children: [
735
+ /* @__PURE__ */ jsxs(
736
+ Box,
737
+ {
738
+ sx: {
739
+ width: "100%",
740
+ height: "auto",
741
+ maxHeight: "250px",
742
+ overflow: "hidden",
743
+ display: "flex",
744
+ justifyContent: "center"
745
+ },
746
+ children: [
747
+ /* @__PURE__ */ jsx(
748
+ Box,
749
+ {
750
+ component: "img",
751
+ src: bannerUrl.desktop,
752
+ alt: title,
753
+ sx: {
754
+ width: "100%",
755
+ height: "auto",
756
+ objectFit: "contain",
757
+ display: { xs: "none", md: "block" }
758
+ }
759
+ }
760
+ ),
761
+ bannerUrl.mobile && /* @__PURE__ */ jsx(
762
+ Box,
763
+ {
764
+ component: "img",
765
+ src: bannerUrl.mobile,
766
+ alt: title,
767
+ sx: {
768
+ width: "100%",
769
+ height: "auto",
770
+ objectFit: "contain",
771
+ display: { xs: "block", md: "none" }
772
+ }
773
+ }
774
+ ),
775
+ !bannerUrl.mobile && /* @__PURE__ */ jsx(
776
+ Box,
777
+ {
778
+ component: "img",
779
+ src: bannerUrl.desktop,
780
+ alt: title,
781
+ sx: {
782
+ width: "100%",
783
+ height: "auto",
784
+ objectFit: "contain",
785
+ display: { xs: "block", md: "none" }
786
+ }
787
+ }
788
+ )
789
+ ]
790
+ }
791
+ ),
792
+ /* @__PURE__ */ jsxs(
793
+ Grid5,
794
+ {
795
+ display: "flex",
796
+ justifyContent: "center",
797
+ alignItems: "center",
798
+ paddingTop: "3px",
799
+ paddingBottom: "3px",
800
+ sx: { gap: 1.5, flexWrap: "wrap" },
801
+ children: [
802
+ /* @__PURE__ */ jsx(
803
+ Box,
804
+ {
805
+ sx: {
806
+ px: 1.5,
807
+ py: 0.5,
808
+ color: "#fff",
809
+ bgcolor: "rgba(0,0,0,0.7)",
810
+ borderRadius: 2,
811
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
812
+ border: "1px solid rgba(255,255,255,0.25)",
813
+ backdropFilter: "blur(6px)",
814
+ fontWeight: 700,
815
+ letterSpacing: 0.2,
816
+ alignItems: "center",
817
+ justifyContent: "center"
818
+ },
819
+ children: `${attendees} Players`
820
+ }
821
+ ),
822
+ /* @__PURE__ */ jsx(
823
+ Box,
824
+ {
825
+ sx: {
826
+ px: 1.5,
827
+ py: 0.5,
828
+ color: "#fff",
829
+ bgcolor: "rgba(0,0,0,0.7)",
830
+ borderRadius: 2,
831
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
832
+ border: "1px solid rgba(255,255,255,0.25)",
833
+ backdropFilter: "blur(6px)",
834
+ fontWeight: 700,
835
+ letterSpacing: 0.2,
836
+ alignItems: "center",
837
+ justifyContent: "center"
838
+ },
839
+ children: `${numGames} tables`
840
+ }
841
+ ),
842
+ generateTagsDisplay(eventTag),
843
+ links.map((link) => generateLink(link))
844
+ ]
845
+ }
846
+ )
847
+ ] }),
848
+ isOwner && /* @__PURE__ */ jsx(
849
+ Button,
850
+ {
851
+ variant: "contained",
852
+ onClick: onEdit,
853
+ sx: {
854
+ position: "absolute",
855
+ top: 16,
856
+ right: 16,
857
+ bgcolor: "rgba(255, 255, 255, 0.9)",
858
+ color: "primary.main",
859
+ "&:hover": {
860
+ bgcolor: "white"
861
+ }
862
+ },
863
+ children: "Edit"
864
+ }
865
+ )
866
+ ]
867
+ }
868
+ );
869
+ }
870
+ var generateLink = function(link) {
871
+ return /* @__PURE__ */ jsx(
872
+ Box,
873
+ {
874
+ component: "a",
875
+ href: link.url,
876
+ target: "_blank",
877
+ rel: "noopener noreferrer",
878
+ sx: {
879
+ px: 1.5,
880
+ py: 0.5,
881
+ color: "#fff",
882
+ bgcolor: "rgba(0,0,0,0.7)",
883
+ borderRadius: 2,
884
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
885
+ border: "1px solid rgba(255,255,255,0.25)",
886
+ backdropFilter: "blur(6px)",
887
+ fontWeight: 700,
888
+ letterSpacing: 0.2,
889
+ alignItems: "center",
890
+ justifyContent: "center",
891
+ textDecoration: "none",
892
+ "&:hover": {
893
+ bgcolor: "rgba(255,255,255,0.1)"
894
+ }
895
+ },
896
+ children: link.text
897
+ },
898
+ link.text
899
+ );
900
+ };
901
+ var BaseSearchResultCard = ({
902
+ result,
903
+ onClick,
904
+ children,
905
+ icon,
906
+ tags
907
+ }) => {
908
+ const handleClick = () => {
909
+ if (onClick) {
910
+ onClick(result.id);
911
+ }
912
+ };
913
+ return /* @__PURE__ */ jsx(
914
+ Card,
915
+ {
916
+ elevation: 6,
917
+ sx: {
918
+ width: "100%",
919
+ cursor: onClick ? "pointer" : "default",
920
+ boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
921
+ transition: "box-shadow 0.3s ease-in-out",
922
+ "&:hover": {
923
+ boxShadow: "0px 12px 28px rgba(0, 0, 0, 0.2)"
924
+ },
925
+ marginBottom: 2
926
+ },
927
+ onClick: handleClick,
928
+ children: /* @__PURE__ */ jsxs(CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
929
+ icon && /* @__PURE__ */ jsx(Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
930
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1 }, children: [
931
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
932
+ children,
933
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", children: result.description }),
934
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsx(Box, { sx: {
935
+ display: "block",
936
+ whiteSpace: "nowrap",
937
+ overflow: "hidden",
938
+ textOverflow: "clip",
939
+ pl: 0.5
940
+ // Add some padding to prevent clipping of the leftmost tag
941
+ }, children: (() => {
942
+ const MAX_VISIBLE = 5;
943
+ const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
944
+ const visible = tagObjs.slice(0, MAX_VISIBLE);
945
+ const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
946
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
947
+ visible.map((tag) => generateTagsDisplay(tag)),
948
+ hiddenCount > 0 && /* @__PURE__ */ jsxs(
949
+ "span",
950
+ {
951
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
952
+ style: {
953
+ marginTop: "6px",
954
+ marginRight: "6px",
955
+ marginBottom: "6px",
956
+ background: "#9e9e9e",
957
+ color: "white",
958
+ textShadow: "black 0.2em 0.2em 0.4em"
959
+ },
960
+ children: [
961
+ "+",
962
+ hiddenCount,
963
+ " more"
964
+ ]
965
+ }
966
+ )
967
+ ] });
968
+ })() }) })
969
+ ] })
970
+ ] })
971
+ }
972
+ );
973
+ };
974
+ var BaseSearchResultCard_default = BaseSearchResultCard;
975
+ var PlayerResultCard = ({
976
+ result,
977
+ onClick,
978
+ tags
979
+ }) => {
980
+ const firstLetter = result.title.charAt(0).toUpperCase();
981
+ const getAvatarColor = (name) => {
982
+ const colors = [
983
+ "#F44336",
984
+ "#E91E63",
985
+ "#9C27B0",
986
+ "#673AB7",
987
+ "#3F51B5",
988
+ "#2196F3",
989
+ "#03A9F4",
990
+ "#00BCD4",
991
+ "#009688",
992
+ "#4CAF50",
993
+ "#8BC34A",
994
+ "#CDDC39",
995
+ "#FFEB3B",
996
+ "#FFC107",
997
+ "#FF9800",
998
+ "#FF5722"
999
+ ];
1000
+ let hash = 0;
1001
+ for (let i = 0; i < name.length; i++) {
1002
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
1003
+ }
1004
+ return colors[Math.abs(hash) % colors.length];
1005
+ };
1006
+ const avatarColor = getAvatarColor(result.title);
1007
+ const playerIcon = /* @__PURE__ */ jsx(
1008
+ Avatar,
1009
+ {
1010
+ src: result.imageUrl,
1011
+ alt: result.title,
1012
+ sx: {
1013
+ width: 40,
1014
+ height: 40,
1015
+ bgcolor: !result.imageUrl ? avatarColor : void 0
1016
+ },
1017
+ children: !result.imageUrl && firstLetter
1018
+ }
1019
+ );
1020
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1021
+ };
1022
+ var PlayerResultCard_default = PlayerResultCard;
1023
+ var TableResultCard = ({ result, tags, onClick }) => {
1024
+ const capacity = result.capacity || 1;
1025
+ const numPlayers = result.numPlayers || 0;
1026
+ const occupancy = numPlayers / capacity * 100;
1027
+ return /* @__PURE__ */ jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsx(CasinoIcon, { color: "primary" }), children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
1028
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
1029
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
1030
+ "Players: ",
1031
+ numPlayers,
1032
+ " / ",
1033
+ capacity
1034
+ ] }),
1035
+ result.dungeonMaster ? /* @__PURE__ */ jsx(Chip, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsx(Chip, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
1036
+ ] }),
1037
+ /* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1038
+ ] }) });
1039
+ };
1040
+ var TableResultCard_default = TableResultCard;
1041
+ var EventResultCard = ({
1042
+ result,
1043
+ onClick,
1044
+ tags
1045
+ }) => {
1046
+ const formatDate = (dateString) => {
1047
+ const options = {
1048
+ weekday: "long",
1049
+ year: "numeric",
1050
+ month: "long",
1051
+ day: "numeric"
1052
+ };
1053
+ try {
1054
+ const date = new Date(dateString);
1055
+ return date.toLocaleDateString("en-US", options);
1056
+ } catch {
1057
+ return dateString;
1058
+ }
1059
+ };
1060
+ const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1061
+ const location = result.location || "Location TBD";
1062
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsx(EventIcon, { color: "primary" }), tags, children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
1063
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
1064
+ /* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1065
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
1066
+ ] }),
1067
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1068
+ /* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1069
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: location })
1070
+ ] })
1071
+ ] }) });
1072
+ };
1073
+ var EventResultCard_default = EventResultCard;
1074
+ var ResultsContainer = ({
1075
+ results,
1076
+ onResultClick,
1077
+ tags
1078
+ }) => {
1079
+ if (results.length === 0 || !results.map) {
1080
+ return /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1081
+ }
1082
+ const onPlayerClick = (id) => {
1083
+ onResultClick == null ? void 0 : onResultClick(id, "player");
1084
+ };
1085
+ const onTableClick = (id) => {
1086
+ onResultClick == null ? void 0 : onResultClick(id, "table");
1087
+ };
1088
+ const onEventClick = (id) => {
1089
+ onResultClick == null ? void 0 : onResultClick(id, "event");
1090
+ };
1091
+ return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
1092
+ switch (result.type) {
1093
+ case "player":
1094
+ return /* @__PURE__ */ jsx(
1095
+ PlayerResultCard_default,
1096
+ {
1097
+ result,
1098
+ onClick: onPlayerClick,
1099
+ tags
1100
+ },
1101
+ result.id
1102
+ );
1103
+ case "table":
1104
+ return /* @__PURE__ */ jsx(
1105
+ TableResultCard_default,
1106
+ {
1107
+ result,
1108
+ onClick: onTableClick,
1109
+ tags
1110
+ },
1111
+ result.id
1112
+ );
1113
+ case "event":
1114
+ return /* @__PURE__ */ jsx(
1115
+ EventResultCard_default,
1116
+ {
1117
+ result,
1118
+ onClick: onEventClick,
1119
+ tags
1120
+ },
1121
+ result.id
1122
+ );
1123
+ default:
1124
+ console.error(`Unknown result type: ${result.type}`);
1125
+ return null;
1126
+ }
1127
+ }) });
1128
+ };
1129
+ var ResultsContainer_default = ResultsContainer;
1130
+ var ScrollableResultsList = ({
1131
+ results,
1132
+ tags,
1133
+ maxHeight = 400,
1134
+ onResultClick,
1135
+ emptyText
1136
+ }) => {
1137
+ const hasResults = Array.isArray(results) && results.length > 0;
1138
+ return /* @__PURE__ */ jsx(Box2, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsx(ResultsContainer_default, { results, onResultClick, tags }) : /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
1139
+ };
1140
+ var ScrollableResultsList_default = ScrollableResultsList;
1141
+ var TablesScrollableList = ({
1142
+ results,
1143
+ tags,
1144
+ maxHeight,
1145
+ onResultClick,
1146
+ sortBy = "availability"
1147
+ }) => {
1148
+ const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1149
+ const getAvailableSlots = (r) => {
1150
+ const capacity = typeof r.capacity === "number" ? r.capacity : 0;
1151
+ const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
1152
+ return Math.max(capacity - playersCount, 0);
1153
+ };
1154
+ const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
1155
+ const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1156
+ return /* @__PURE__ */ jsx(
1157
+ ScrollableResultsList_default,
1158
+ {
1159
+ results: sortedTables,
1160
+ tags,
1161
+ maxHeight,
1162
+ onResultClick: (id, type) => {
1163
+ if (type === "table") handleClick(id);
1164
+ }
1165
+ }
1166
+ );
1167
+ };
1168
+ var TablesScrollableList_default = TablesScrollableList;
1169
+ var EventTablesCard = ({
1170
+ tables,
1171
+ tags,
1172
+ maxHeight = 450,
1173
+ onTableClick
1174
+ }) => {
1175
+ return /* @__PURE__ */ jsxs(Card4, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1176
+ /* @__PURE__ */ jsx(CardHeader, { title: "Tables" }),
1177
+ /* @__PURE__ */ jsx(Divider, {}),
1178
+ /* @__PURE__ */ jsx(CardContent4, { children: /* @__PURE__ */ jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick, sortBy: "availability" }) })
1179
+ ] });
1180
+ };
1181
+ var EventTablesCard_default = EventTablesCard;
1182
+ function EventPageLayout({
1183
+ mergedEvent,
1184
+ isOwner,
1185
+ updateEvent,
1186
+ updateImages,
1187
+ attendees,
1188
+ numGames,
1189
+ tables,
1190
+ allTags
1191
+ }) {
1192
+ return /* @__PURE__ */ jsx(Grid5, { container: true, flexDirection: "column", children: /* @__PURE__ */ jsxs(EventEditProvider, { initialEvent: mergedEvent, value: { isOwner, updateEvent, updateImages }, children: [
1193
+ /* @__PURE__ */ jsx(Grid5, { children: /* @__PURE__ */ jsx(
1194
+ EventBanner,
1195
+ {
1196
+ attendees,
1197
+ numGames
1198
+ }
1199
+ ) }),
1200
+ /* @__PURE__ */ jsxs(Grid5, { container: true, flexDirection: "row", spacing: 3, size: { xs: 12, md: 12 }, children: [
1201
+ /* @__PURE__ */ jsx(Grid5, { size: { xs: 12, md: 4 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsx(
1202
+ EventBasicInfo,
1203
+ {
1204
+ locationId: mergedEvent.location || "0"
1205
+ }
1206
+ ) }),
1207
+ /* @__PURE__ */ jsx(Grid5, { size: { xs: 12, md: 8 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsx(EventTablesCard_default, { tables, tags: allTags }) })
1208
+ ] }),
1209
+ /* @__PURE__ */ jsx(Grid5, {})
1210
+ ] }) });
1211
+ }
1212
+
1213
+ export { CANDIDATE_TIMEZONES, EventBanner, EventBannerEdit, EventBasicInfo, EventBasicInfoEdit, EventEditProvider, EventPageLayout, EventTablesCard_default as EventTablesCard, useEventEdit };
1214
+ //# sourceMappingURL=index.mjs.map
1215
+ //# sourceMappingURL=index.mjs.map