@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/dist/index.cjs ADDED
@@ -0,0 +1,2608 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React7 = 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
+ var Box2 = require('@mui/material/Box');
14
+ var Grid9 = require('@mui/material/Grid');
15
+ var Card10 = require('@mui/material/Card');
16
+ var CardContent10 = require('@mui/material/CardContent');
17
+ var CardHeader4 = require('@mui/material/CardHeader');
18
+ var Divider2 = require('@mui/material/Divider');
19
+ var Avatar = require('@mui/material/Avatar');
20
+ var CasinoIcon = require('@mui/icons-material/Casino');
21
+ var CalendarTodayIcon = require('@mui/icons-material/CalendarToday');
22
+ var LocationOnIcon = require('@mui/icons-material/LocationOn');
23
+ var EventIcon = require('@mui/icons-material/Event');
24
+ var Autocomplete = require('@mui/material/Autocomplete');
25
+ var Popper = require('@mui/material/Popper');
26
+ var TextField3 = require('@mui/material/TextField');
27
+ var Typography10 = require('@mui/material/Typography');
28
+ var FormControl2 = require('@mui/material/FormControl');
29
+ var RadioGroup = require('@mui/material/RadioGroup');
30
+ var FormControlLabel = require('@mui/material/FormControlLabel');
31
+ var Radio = require('@mui/material/Radio');
32
+ var FormGroup = require('@mui/material/FormGroup');
33
+ var Checkbox = require('@mui/material/Checkbox');
34
+ var Button7 = require('@mui/material/Button');
35
+ var SearchIcon = require('@mui/icons-material/Search');
36
+ var Image2 = require('next/image');
37
+ var ListIcon = require('@mui/icons-material/List');
38
+ var SaveIcon = require('@mui/icons-material/Save');
39
+
40
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
41
+
42
+ var React7__default = /*#__PURE__*/_interopDefault(React7);
43
+ var DeleteIcon__default = /*#__PURE__*/_interopDefault(DeleteIcon);
44
+ var EditIcon__default = /*#__PURE__*/_interopDefault(EditIcon);
45
+ var AddIcon__default = /*#__PURE__*/_interopDefault(AddIcon);
46
+ var ColorizeIcon__default = /*#__PURE__*/_interopDefault(ColorizeIcon);
47
+ var CancelIcon__default = /*#__PURE__*/_interopDefault(CancelIcon);
48
+ var CheckCircleIcon__default = /*#__PURE__*/_interopDefault(CheckCircleIcon);
49
+ var Box2__default = /*#__PURE__*/_interopDefault(Box2);
50
+ var Grid9__default = /*#__PURE__*/_interopDefault(Grid9);
51
+ var Card10__default = /*#__PURE__*/_interopDefault(Card10);
52
+ var CardContent10__default = /*#__PURE__*/_interopDefault(CardContent10);
53
+ var CardHeader4__default = /*#__PURE__*/_interopDefault(CardHeader4);
54
+ var Divider2__default = /*#__PURE__*/_interopDefault(Divider2);
55
+ var Avatar__default = /*#__PURE__*/_interopDefault(Avatar);
56
+ var CasinoIcon__default = /*#__PURE__*/_interopDefault(CasinoIcon);
57
+ var CalendarTodayIcon__default = /*#__PURE__*/_interopDefault(CalendarTodayIcon);
58
+ var LocationOnIcon__default = /*#__PURE__*/_interopDefault(LocationOnIcon);
59
+ var EventIcon__default = /*#__PURE__*/_interopDefault(EventIcon);
60
+ var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
61
+ var Popper__default = /*#__PURE__*/_interopDefault(Popper);
62
+ var TextField3__default = /*#__PURE__*/_interopDefault(TextField3);
63
+ var Typography10__default = /*#__PURE__*/_interopDefault(Typography10);
64
+ var FormControl2__default = /*#__PURE__*/_interopDefault(FormControl2);
65
+ var RadioGroup__default = /*#__PURE__*/_interopDefault(RadioGroup);
66
+ var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
67
+ var Radio__default = /*#__PURE__*/_interopDefault(Radio);
68
+ var FormGroup__default = /*#__PURE__*/_interopDefault(FormGroup);
69
+ var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
70
+ var Button7__default = /*#__PURE__*/_interopDefault(Button7);
71
+ var SearchIcon__default = /*#__PURE__*/_interopDefault(SearchIcon);
72
+ var Image2__default = /*#__PURE__*/_interopDefault(Image2);
73
+ var ListIcon__default = /*#__PURE__*/_interopDefault(ListIcon);
74
+ var SaveIcon__default = /*#__PURE__*/_interopDefault(SaveIcon);
75
+
76
+ // src/components/EventPage/editMode/EventBannerEdit.tsx
77
+ var defaultValue = {
78
+ isOwner: false,
79
+ updateEvent: async () => false,
80
+ updateImages: () => {
81
+ },
82
+ event: null
83
+ };
84
+ var EventEditContext = React7.createContext(defaultValue);
85
+ function EventEditProvider({
86
+ value,
87
+ initialEvent,
88
+ children
89
+ }) {
90
+ const [event, setEvent] = React7.useState(initialEvent);
91
+ React7.useEffect(() => {
92
+ setEvent(initialEvent);
93
+ }, [initialEvent]);
94
+ const handleUpdateEvent = async (patch) => {
95
+ if (value == null ? void 0 : value.updateEvent) {
96
+ const result = value.updateEvent(patch);
97
+ if (result instanceof Promise) {
98
+ const success = await result;
99
+ if (success) {
100
+ setEvent((prev) => ({ ...prev, ...patch }));
101
+ }
102
+ return success;
103
+ } else {
104
+ const success = result === false ? false : true;
105
+ if (success) {
106
+ setEvent((prev) => ({ ...prev, ...patch }));
107
+ }
108
+ return success;
109
+ }
110
+ }
111
+ return false;
112
+ };
113
+ const mergedValue = {
114
+ ...defaultValue,
115
+ ...value,
116
+ event,
117
+ updateEvent: handleUpdateEvent
118
+ };
119
+ return /* @__PURE__ */ jsxRuntime.jsx(EventEditContext.Provider, { value: mergedValue, children });
120
+ }
121
+ function useEventEdit() {
122
+ const context = React7.useContext(EventEditContext);
123
+ if (!context) {
124
+ throw new Error("useEventEdit must be used within an EventEditProvider");
125
+ }
126
+ return context;
127
+ }
128
+ function generateTagsDisplay(tag) {
129
+ return /* @__PURE__ */ jsxRuntime.jsx(
130
+ "span",
131
+ {
132
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
133
+ style: {
134
+ marginTop: "6px",
135
+ marginRight: "6px",
136
+ marginBottom: "6px",
137
+ background: tag.color || "#bfbcbb",
138
+ color: "white",
139
+ textShadow: "black 0.2em 0.2em 0.4em"
140
+ },
141
+ children: tag.label
142
+ },
143
+ tag.id
144
+ );
145
+ }
146
+ function renderTagsFromIds(ids, legalTags) {
147
+ if (!ids || !legalTags || legalTags.length === 0) {
148
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
149
+ }
150
+ const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
151
+ return validTags.map((tag) => generateTagsDisplay(tag));
152
+ }
153
+ function EventBannerEdit({
154
+ initialValue,
155
+ onCancel,
156
+ onSave
157
+ }) {
158
+ const { updateImages } = useEventEdit();
159
+ const [title, setTitle] = React7.useState(initialValue.title);
160
+ const [bannerColor, setBannerColor] = React7.useState(initialValue.bannerColor || "");
161
+ const [desktopBanner, setDesktopBanner] = React7.useState(initialValue.bannerUrl.desktop);
162
+ const [mobileBanner, setMobileBanner] = React7.useState(initialValue.bannerUrl.mobile || "");
163
+ const [links, setLinks] = React7.useState(initialValue.links);
164
+ const [linkToEdit, setLinkToEdit] = React7.useState(null);
165
+ const [isSaving, setIsSaving] = React7.useState(false);
166
+ const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
167
+ const handleSave = async () => {
168
+ setIsSaving(true);
169
+ try {
170
+ const patch = {};
171
+ if (title !== initialValue.title) {
172
+ patch.title = title;
173
+ }
174
+ const currentBannerColor = bannerColor || void 0;
175
+ const initialBannerColor = initialValue.bannerColor || void 0;
176
+ if (currentBannerColor !== initialBannerColor) {
177
+ patch.bannerColor = currentBannerColor;
178
+ }
179
+ const currentMobile = mobileBanner || void 0;
180
+ const initialMobile = initialValue.bannerUrl.mobile || void 0;
181
+ if (desktopBanner !== initialValue.bannerUrl.desktop || currentMobile !== initialMobile) {
182
+ patch.bannerUrl = {
183
+ desktop: desktopBanner,
184
+ mobile: currentMobile
185
+ };
186
+ }
187
+ if (JSON.stringify(links) !== JSON.stringify(initialValue.links)) {
188
+ patch.links = links;
189
+ }
190
+ if (Object.keys(patch).length > 0) {
191
+ await onSave(patch);
192
+ } else {
193
+ onCancel();
194
+ }
195
+ } catch (error) {
196
+ console.error("Failed to save banner changes", error);
197
+ } finally {
198
+ setIsSaving(false);
199
+ }
200
+ };
201
+ const removeLink = (index) => {
202
+ setLinks(links.filter((_, i) => i !== index));
203
+ };
204
+ const openEditLink = (index) => {
205
+ setLinkToEdit({
206
+ index,
207
+ text: links[index].text,
208
+ url: links[index].url
209
+ });
210
+ };
211
+ const saveEditedLink = () => {
212
+ if (linkToEdit) {
213
+ const newLinks = [...links];
214
+ if (linkToEdit.index === -1) {
215
+ newLinks.push({ text: linkToEdit.text, url: linkToEdit.url });
216
+ } else {
217
+ newLinks[linkToEdit.index] = { text: linkToEdit.text, url: linkToEdit.url };
218
+ }
219
+ setLinks(newLinks);
220
+ setLinkToEdit(null);
221
+ }
222
+ };
223
+ const handleEyeDropper = async () => {
224
+ if (!window.EyeDropper) {
225
+ alert("EyeDropper API is not supported in this browser");
226
+ return;
227
+ }
228
+ const eyeDropper = new window.EyeDropper();
229
+ try {
230
+ const result = await eyeDropper.open();
231
+ setBannerColor(result.sRGBHex);
232
+ } catch (e) {
233
+ console.log("EyeDropper cancelled or failed", e);
234
+ }
235
+ };
236
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { position: "relative", width: "100%" }, children: [
237
+ /* @__PURE__ */ jsxRuntime.jsxs(
238
+ material.Grid,
239
+ {
240
+ sx: {
241
+ background: backgroundColor,
242
+ paddingTop: "8px",
243
+ position: "relative",
244
+ border: "2px dashed rgba(255,255,255,0.5)",
245
+ borderRadius: 1
246
+ },
247
+ children: [
248
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: {
249
+ position: "absolute",
250
+ top: 8,
251
+ left: 8,
252
+ zIndex: 10,
253
+ display: "flex",
254
+ flexDirection: "column",
255
+ gap: 1,
256
+ bgcolor: "rgba(0,0,0,0.5)",
257
+ p: 1,
258
+ borderRadius: 1,
259
+ width: "300px"
260
+ }, children: [
261
+ /* @__PURE__ */ jsxRuntime.jsx(
262
+ material.TextField,
263
+ {
264
+ label: "Title",
265
+ variant: "outlined",
266
+ size: "small",
267
+ value: title,
268
+ onChange: (e) => setTitle(e.target.value),
269
+ sx: { input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
270
+ }
271
+ ),
272
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
273
+ /* @__PURE__ */ jsxRuntime.jsx(
274
+ material.TextField,
275
+ {
276
+ label: "Banner Color",
277
+ variant: "outlined",
278
+ size: "small",
279
+ value: bannerColor,
280
+ onChange: (e) => setBannerColor(e.target.value),
281
+ placeholder: "#HEX or linear-gradient(...)",
282
+ sx: { flex: 1, input: { color: "white" }, label: { color: "rgba(255,255,255,0.7)" }, "& .MuiOutlinedInput-root": { "& fieldset": { borderColor: "rgba(255,255,255,0.3)" } } }
283
+ }
284
+ ),
285
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Eye Dropper", children: /* @__PURE__ */ jsxRuntime.jsx(
286
+ material.IconButton,
287
+ {
288
+ size: "small",
289
+ onClick: handleEyeDropper,
290
+ sx: { color: "white", bgcolor: "rgba(255,255,255,0.1)", "&:hover": { bgcolor: "rgba(255,255,255,0.2)" } },
291
+ children: /* @__PURE__ */ jsxRuntime.jsx(ColorizeIcon__default.default, { fontSize: "small" })
292
+ }
293
+ ) }),
294
+ /* @__PURE__ */ jsxRuntime.jsx(
295
+ "input",
296
+ {
297
+ type: "color",
298
+ value: bannerColor.startsWith("#") ? bannerColor : "#1976d2",
299
+ onChange: (e) => setBannerColor(e.target.value),
300
+ style: { width: "40px", height: "40px", padding: 0, border: "none", background: "transparent", cursor: "pointer" }
301
+ }
302
+ )
303
+ ] }),
304
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", gap: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(
305
+ material.Button,
306
+ {
307
+ variant: "contained",
308
+ size: "small",
309
+ fullWidth: true,
310
+ onClick: updateImages,
311
+ children: "Update Images"
312
+ }
313
+ ) })
314
+ ] }),
315
+ /* @__PURE__ */ jsxRuntime.jsx(
316
+ material.Box,
317
+ {
318
+ sx: {
319
+ width: "100%",
320
+ height: "auto",
321
+ maxHeight: "250px",
322
+ overflow: "hidden",
323
+ display: "flex",
324
+ justifyContent: "center",
325
+ opacity: 0.8
326
+ },
327
+ children: /* @__PURE__ */ jsxRuntime.jsx(
328
+ material.Box,
329
+ {
330
+ component: "img",
331
+ src: desktopBanner,
332
+ alt: title,
333
+ sx: {
334
+ width: "100%",
335
+ height: "auto",
336
+ objectFit: "contain"
337
+ }
338
+ }
339
+ )
340
+ }
341
+ ),
342
+ /* @__PURE__ */ jsxRuntime.jsxs(
343
+ material.Grid,
344
+ {
345
+ display: "flex",
346
+ justifyContent: "center",
347
+ alignItems: "center",
348
+ paddingTop: "3px",
349
+ paddingBottom: "3px",
350
+ sx: { gap: 1.5, flexWrap: "wrap" },
351
+ children: [
352
+ /* @__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" }),
353
+ generateTagsDisplay(initialValue.eventTag),
354
+ links.map((link, index) => /* @__PURE__ */ jsxRuntime.jsxs(
355
+ material.Box,
356
+ {
357
+ sx: {
358
+ position: "relative",
359
+ display: "flex",
360
+ alignItems: "center",
361
+ px: 1.5,
362
+ py: 0.5,
363
+ color: "#fff",
364
+ bgcolor: "rgba(0,0,0,0.7)",
365
+ borderRadius: 2,
366
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
367
+ border: "1px solid rgba(255,255,255,0.25)",
368
+ backdropFilter: "blur(6px)",
369
+ fontWeight: 700,
370
+ letterSpacing: 0.2
371
+ },
372
+ children: [
373
+ link.text,
374
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { ml: 1, display: "flex" }, children: [
375
+ /* @__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" }) }) }),
376
+ /* @__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" }) }) })
377
+ ] })
378
+ ]
379
+ },
380
+ index
381
+ )),
382
+ /* @__PURE__ */ jsxRuntime.jsx(
383
+ material.Button,
384
+ {
385
+ variant: "outlined",
386
+ size: "small",
387
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(AddIcon__default.default, {}),
388
+ onClick: () => setLinkToEdit({ index: -1, text: "", url: "" }),
389
+ sx: {
390
+ color: "white",
391
+ borderColor: "rgba(255,255,255,0.5)",
392
+ borderRadius: 2,
393
+ "&:hover": { borderColor: "white", bgcolor: "rgba(255,255,255,0.1)" }
394
+ },
395
+ children: "Add Link"
396
+ }
397
+ )
398
+ ]
399
+ }
400
+ )
401
+ ]
402
+ }
403
+ ),
404
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "flex-end", gap: 2, mt: 2 }, children: [
405
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: onCancel, color: "inherit", disabled: isSaving, children: "Cancel" }),
406
+ /* @__PURE__ */ jsxRuntime.jsx(
407
+ material.Button,
408
+ {
409
+ onClick: handleSave,
410
+ variant: "contained",
411
+ color: "primary",
412
+ disabled: isSaving,
413
+ startIcon: isSaving ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 20, color: "inherit" }) : null,
414
+ children: isSaving ? "Saving..." : "Save Changes"
415
+ }
416
+ )
417
+ ] }),
418
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Dialog, { open: linkToEdit !== null, onClose: () => setLinkToEdit(null), children: [
419
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogTitle, { children: (linkToEdit == null ? void 0 : linkToEdit.index) === -1 ? "Add Link" : "Edit Link" }),
420
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", flexDirection: "column", gap: 2, pt: 1, width: "400px" }, children: [
421
+ /* @__PURE__ */ jsxRuntime.jsx(
422
+ material.TextField,
423
+ {
424
+ label: "Link Text",
425
+ fullWidth: true,
426
+ value: (linkToEdit == null ? void 0 : linkToEdit.text) || "",
427
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, text: e.target.value } : null)
428
+ }
429
+ ),
430
+ /* @__PURE__ */ jsxRuntime.jsx(
431
+ material.TextField,
432
+ {
433
+ label: "Link URL",
434
+ fullWidth: true,
435
+ value: (linkToEdit == null ? void 0 : linkToEdit.url) || "",
436
+ onChange: (e) => setLinkToEdit((prev) => prev ? { ...prev, url: e.target.value } : null)
437
+ }
438
+ )
439
+ ] }) }),
440
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogActions, { children: [
441
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: () => setLinkToEdit(null), children: "Cancel" }),
442
+ /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: saveEditedLink, variant: "contained", children: "Confirm" })
443
+ ] })
444
+ ] })
445
+ ] });
446
+ }
447
+ var CANDIDATE_TIMEZONES = [
448
+ "America/New_York",
449
+ "America/Chicago",
450
+ "America/Denver",
451
+ "America/Los_Angeles",
452
+ "America/Anchorage",
453
+ "America/Adak",
454
+ "Pacific/Honolulu",
455
+ "UTC"
456
+ ];
457
+ function EventBasicInfo(props) {
458
+ var _a, _b, _c, _d, _e, _f, _g, _h;
459
+ const { isOwner, updateEvent, event } = useEventEdit();
460
+ const [isEditing, setIsEditing] = React7.useState(false);
461
+ const description = (_b = (_a = props.description) != null ? _a : event == null ? void 0 : event.description) != null ? _b : "";
462
+ const startingDate = (_c = props.startingDate) != null ? _c : event == null ? void 0 : event.startingDate;
463
+ const endingDate = (_d = props.endingDate) != null ? _d : event == null ? void 0 : event.endingDate;
464
+ const timeInfo = (_f = (_e = props.timeInfo) != null ? _e : event == null ? void 0 : event.date) != null ? _f : "";
465
+ const timezone = (_h = (_g = props.timezone) != null ? _g : event == null ? void 0 : event.timezone) != null ? _h : "UTC";
466
+ if (isEditing) {
467
+ return /* @__PURE__ */ jsxRuntime.jsx(
468
+ EventBasicInfoEdit,
469
+ {
470
+ initialValue: {
471
+ description,
472
+ startingDate: typeof startingDate === "string" ? startingDate : startingDate == null ? void 0 : startingDate.toISOString(),
473
+ endingDate: typeof endingDate === "string" ? endingDate : endingDate == null ? void 0 : endingDate.toISOString(),
474
+ date: timeInfo,
475
+ timezone
476
+ },
477
+ onCancel: () => setIsEditing(false),
478
+ onSave: async (payload) => {
479
+ const success = await updateEvent(payload);
480
+ if (success) {
481
+ setIsEditing(false);
482
+ }
483
+ }
484
+ }
485
+ );
486
+ }
487
+ return /* @__PURE__ */ jsxRuntime.jsx(
488
+ EventBasicInfoView,
489
+ {
490
+ ...props,
491
+ description,
492
+ startingDate,
493
+ endingDate,
494
+ timeInfo,
495
+ timezone,
496
+ isOwner,
497
+ onEdit: () => setIsEditing(true)
498
+ }
499
+ );
500
+ }
501
+ function EventBasicInfoView({ description, locationId, startingDate, endingDate, timeInfo, timezone, isOwner, onEdit }) {
502
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { sx: { position: "relative" }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Card, { style: {
503
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
504
+ background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))"
505
+ }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { children: [
506
+ isOwner && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Button, { size: "small", onClick: onEdit, variant: "outlined", children: "Edit" }) }),
507
+ generateTimeInfo(timeInfo, timezone || "UTC", startingDate, endingDate),
508
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", paddingTop: 2, children: "About:" }),
509
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { whiteSpace: "pre-wrap" }, paddingTop: 1, children: description }),
510
+ getLocation()
511
+ ] }) }) });
512
+ }
513
+ var generateTimeInfo = function(timeInfo, timezone, startingDate, endingDate) {
514
+ const formatDateTime = (dateInput) => {
515
+ const d = typeof dateInput === "string" ? new Date(dateInput) : dateInput;
516
+ if (!d || isNaN(d.getTime())) return "";
517
+ try {
518
+ return new Intl.DateTimeFormat("en-US", {
519
+ month: "short",
520
+ day: "numeric",
521
+ year: "numeric",
522
+ hour: "numeric",
523
+ minute: "2-digit",
524
+ hour12: true,
525
+ timeZone: timezone,
526
+ timeZoneName: "shortGeneric"
527
+ }).format(d).replace(",", " @");
528
+ } catch (e) {
529
+ return d.toUTCString();
530
+ }
531
+ };
532
+ let rangeText = null;
533
+ if (startingDate && endingDate) {
534
+ rangeText = `From ${formatDateTime(startingDate)}
535
+ Until ${formatDateTime(endingDate)}`;
536
+ } else if (startingDate) {
537
+ rangeText = `starting ${formatDateTime(startingDate)}`;
538
+ } else if (endingDate) {
539
+ rangeText = `until ${formatDateTime(endingDate)}`;
540
+ }
541
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mt: 2 }, children: [
542
+ rangeText && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", fontSize: "x-large", fontWeight: "bold", sx: { whiteSpace: "pre-wrap" }, children: rangeText }),
543
+ timeInfo && /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mt: 1 }, children: [
544
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: "Hours of Operation:" }),
545
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", sx: { whiteSpace: "pre-wrap" }, children: timeInfo })
546
+ ] })
547
+ ] });
548
+ };
549
+ var getLocation = function(locationId) {
550
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: {
551
+ width: "100%",
552
+ p: 1.5,
553
+ borderRadius: 2,
554
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
555
+ background: "linear-gradient(135deg, rgba(180, 180,180, 1), rgba(225, 225, 225, 0.8))",
556
+ mt: 2
557
+ }, children: "Location Data goes here" });
558
+ };
559
+ function EventBasicInfoEdit({
560
+ initialValue,
561
+ onCancel,
562
+ onSave
563
+ }) {
564
+ const toWallTimeISO = (dateInput, timeZone) => {
565
+ if (!dateInput) return "";
566
+ const d = new Date(dateInput);
567
+ if (isNaN(d.getTime())) return "";
568
+ const parts = new Intl.DateTimeFormat("en-US", {
569
+ year: "numeric",
570
+ month: "2-digit",
571
+ day: "2-digit",
572
+ hour: "2-digit",
573
+ minute: "2-digit",
574
+ hour12: false,
575
+ timeZone
576
+ }).formatToParts(d);
577
+ const f = (type) => {
578
+ var _a;
579
+ return (_a = parts.find((p) => p.type === type)) == null ? void 0 : _a.value;
580
+ };
581
+ const year = f("year");
582
+ const month = f("month");
583
+ const day = f("day");
584
+ let hour = f("hour");
585
+ if (hour === "24") hour = "00";
586
+ const minute = f("minute");
587
+ return `${year}-${month}-${day}T${hour}:${minute}`;
588
+ };
589
+ const toUTCISOString = (wallTime, timeZone) => {
590
+ var _a;
591
+ if (!wallTime) return void 0;
592
+ const d = /* @__PURE__ */ new Date(wallTime + ":00Z");
593
+ const parts = new Intl.DateTimeFormat("en-US", {
594
+ timeZone,
595
+ timeZoneName: "longOffset"
596
+ }).formatToParts(d);
597
+ const offsetPart = ((_a = parts.find((p) => p.type === "timeZoneName")) == null ? void 0 : _a.value) || "GMT";
598
+ const offset = offsetPart.replace("GMT", "");
599
+ const isoWithOffset = `${wallTime}:00${offset || "+00:00"}`;
600
+ return new Date(isoWithOffset).toISOString();
601
+ };
602
+ const [description, setDescription] = React7.useState(initialValue.description);
603
+ const [timezone, setTimezone] = React7.useState(initialValue.timezone);
604
+ const [startingDate, setStartingDate] = React7.useState(toWallTimeISO(initialValue.startingDate, initialValue.timezone));
605
+ const [endingDate, setEndingDate] = React7.useState(toWallTimeISO(initialValue.endingDate, initialValue.timezone));
606
+ const [timeInfo, setTimeInfo] = React7.useState(initialValue.date);
607
+ const [isSaving, setIsSaving] = React7.useState(false);
608
+ const handleSave = async () => {
609
+ setIsSaving(true);
610
+ try {
611
+ const patch = {};
612
+ if (description !== initialValue.description) patch.description = description;
613
+ if (timeInfo !== initialValue.date) patch.date = timeInfo;
614
+ if (timezone !== initialValue.timezone) patch.timezone = timezone;
615
+ if (startingDate !== toWallTimeISO(initialValue.startingDate, timezone) || timezone !== initialValue.timezone) {
616
+ patch.startingDate = toUTCISOString(startingDate, timezone);
617
+ }
618
+ if (endingDate !== toWallTimeISO(initialValue.endingDate, timezone) || timezone !== initialValue.timezone) {
619
+ patch.endingDate = toUTCISOString(endingDate, timezone);
620
+ }
621
+ if (Object.keys(patch).length > 0) {
622
+ await onSave(patch);
623
+ } else {
624
+ onCancel();
625
+ }
626
+ } catch (error) {
627
+ console.error("Failed to save basic info changes", error);
628
+ } finally {
629
+ setIsSaving(false);
630
+ }
631
+ };
632
+ return /* @__PURE__ */ jsxRuntime.jsx(material.Card, { sx: {
633
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
634
+ background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))",
635
+ border: "2px dashed rgba(25,118,210,0.5)",
636
+ width: "100%"
637
+ }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { position: "relative" }, children: [
638
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "flex-end", mb: 1, gap: 1 }, children: [
639
+ /* @__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, {}) }) }),
640
+ /* @__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, {}) }) })
641
+ ] }),
642
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mt: 2 }, children: [
643
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", fontSize: "x-large", fontWeight: "bold", sx: { mb: 1 }, children: "Event Dates & Times:" }),
644
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [
645
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
646
+ material.TextField,
647
+ {
648
+ fullWidth: true,
649
+ label: "Starting Date",
650
+ type: "datetime-local",
651
+ size: "small",
652
+ value: startingDate,
653
+ onChange: (e) => setStartingDate(e.target.value),
654
+ InputLabelProps: { shrink: true }
655
+ }
656
+ ) }),
657
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsx(
658
+ material.TextField,
659
+ {
660
+ fullWidth: true,
661
+ label: "Ending Date",
662
+ type: "datetime-local",
663
+ size: "small",
664
+ value: endingDate,
665
+ onChange: (e) => setEndingDate(e.target.value),
666
+ InputLabelProps: { shrink: true }
667
+ }
668
+ ) }),
669
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { size: { xs: 12, sm: 4 }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.FormControl, { fullWidth: true, size: "small", children: [
670
+ /* @__PURE__ */ jsxRuntime.jsx(material.InputLabel, { children: "Display Timezone" }),
671
+ /* @__PURE__ */ jsxRuntime.jsx(
672
+ material.Select,
673
+ {
674
+ label: "Display Timezone",
675
+ value: timezone,
676
+ onChange: (e) => setTimezone(e.target.value),
677
+ children: CANDIDATE_TIMEZONES.map((tz) => /* @__PURE__ */ jsxRuntime.jsx(material.MenuItem, { value: tz, children: tz }, tz))
678
+ }
679
+ )
680
+ ] }) })
681
+ ] }),
682
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mt: 2 }, children: [
683
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: "Hours of Operation:" }),
684
+ /* @__PURE__ */ jsxRuntime.jsx(
685
+ material.TextField,
686
+ {
687
+ fullWidth: true,
688
+ multiline: true,
689
+ variant: "standard",
690
+ placeholder: "e.g. Mon-Fri 9am-5pm",
691
+ value: timeInfo,
692
+ onChange: (e) => setTimeInfo(e.target.value),
693
+ sx: { mt: 1 }
694
+ }
695
+ )
696
+ ] })
697
+ ] }),
698
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", paddingTop: 2, children: "About:" }),
699
+ /* @__PURE__ */ jsxRuntime.jsx(
700
+ material.TextField,
701
+ {
702
+ fullWidth: true,
703
+ multiline: true,
704
+ variant: "standard",
705
+ value: description,
706
+ onChange: (e) => setDescription(e.target.value),
707
+ sx: {
708
+ paddingTop: 1,
709
+ "& .MuiInputBase-root": {
710
+ lineHeight: 1.5,
711
+ whiteSpace: "pre-wrap"
712
+ }
713
+ }
714
+ }
715
+ ),
716
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
717
+ mt: 2,
718
+ width: "100%",
719
+ p: 1.5,
720
+ borderRadius: 2,
721
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
722
+ background: "linear-gradient(135deg, rgba(180, 180,180, 1), rgba(225, 225, 225, 0.8))",
723
+ color: "rgba(0,0,0,0.5)",
724
+ border: "1px dashed rgba(0,0,0,0.2)"
725
+ }, children: "Location Data (Not Editable)" })
726
+ ] }) });
727
+ }
728
+ function EventBanner(props) {
729
+ const { isOwner, updateEvent, event } = useEventEdit();
730
+ const [isEditing, setIsEditing] = React7.useState(false);
731
+ if (!event && !props.bannerUrl) return null;
732
+ const bannerUrl = props.bannerUrl || (event == null ? void 0 : event.bannerUrl);
733
+ const links = props.links || (event == null ? void 0 : event.links) || [];
734
+ const title = props.title || (event == null ? void 0 : event.title) || "";
735
+ const eventTag = props.eventTag || (event == null ? void 0 : event.eventTag);
736
+ const bannerColor = props.bannerColor || (event == null ? void 0 : event.bannerColor);
737
+ if (!bannerUrl || !eventTag) return null;
738
+ if (isEditing) {
739
+ return /* @__PURE__ */ jsxRuntime.jsx(
740
+ EventBannerEdit,
741
+ {
742
+ initialValue: {
743
+ bannerUrl,
744
+ bannerColor,
745
+ links,
746
+ title,
747
+ eventTag
748
+ },
749
+ onCancel: () => setIsEditing(false),
750
+ onSave: async (payload) => {
751
+ const success = await updateEvent(payload);
752
+ if (success) {
753
+ setIsEditing(false);
754
+ }
755
+ }
756
+ }
757
+ );
758
+ }
759
+ return /* @__PURE__ */ jsxRuntime.jsx(
760
+ EventBannerView,
761
+ {
762
+ ...props,
763
+ bannerUrl,
764
+ links,
765
+ title,
766
+ eventTag,
767
+ bannerColor,
768
+ isOwner,
769
+ onEdit: () => setIsEditing(true)
770
+ }
771
+ );
772
+ }
773
+ function EventBannerView({
774
+ bannerUrl,
775
+ links,
776
+ bannerColor,
777
+ title,
778
+ eventTag,
779
+ attendees,
780
+ numGames,
781
+ isOwner,
782
+ onEdit
783
+ }) {
784
+ const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
785
+ return /* @__PURE__ */ jsxRuntime.jsxs(
786
+ Grid9__default.default,
787
+ {
788
+ sx: {
789
+ background: backgroundColor,
790
+ paddingTop: "8px",
791
+ position: "relative"
792
+ },
793
+ children: [
794
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { children: [
795
+ /* @__PURE__ */ jsxRuntime.jsxs(
796
+ material.Box,
797
+ {
798
+ sx: {
799
+ width: "100%",
800
+ height: "auto",
801
+ maxHeight: "250px",
802
+ overflow: "hidden",
803
+ display: "flex",
804
+ justifyContent: "center"
805
+ },
806
+ children: [
807
+ /* @__PURE__ */ jsxRuntime.jsx(
808
+ material.Box,
809
+ {
810
+ component: "img",
811
+ src: bannerUrl.desktop,
812
+ alt: title,
813
+ sx: {
814
+ width: "100%",
815
+ height: "auto",
816
+ objectFit: "contain",
817
+ display: { xs: "none", md: "block" }
818
+ }
819
+ }
820
+ ),
821
+ bannerUrl.mobile && /* @__PURE__ */ jsxRuntime.jsx(
822
+ material.Box,
823
+ {
824
+ component: "img",
825
+ src: bannerUrl.mobile,
826
+ alt: title,
827
+ sx: {
828
+ width: "100%",
829
+ height: "auto",
830
+ objectFit: "contain",
831
+ display: { xs: "block", md: "none" }
832
+ }
833
+ }
834
+ ),
835
+ !bannerUrl.mobile && /* @__PURE__ */ jsxRuntime.jsx(
836
+ material.Box,
837
+ {
838
+ component: "img",
839
+ src: bannerUrl.desktop,
840
+ alt: title,
841
+ sx: {
842
+ width: "100%",
843
+ height: "auto",
844
+ objectFit: "contain",
845
+ display: { xs: "block", md: "none" }
846
+ }
847
+ }
848
+ )
849
+ ]
850
+ }
851
+ ),
852
+ /* @__PURE__ */ jsxRuntime.jsxs(
853
+ Grid9__default.default,
854
+ {
855
+ display: "flex",
856
+ justifyContent: "center",
857
+ alignItems: "center",
858
+ paddingTop: "3px",
859
+ paddingBottom: "3px",
860
+ sx: { gap: 1.5, flexWrap: "wrap" },
861
+ children: [
862
+ /* @__PURE__ */ jsxRuntime.jsx(
863
+ material.Box,
864
+ {
865
+ sx: {
866
+ px: 1.5,
867
+ py: 0.5,
868
+ color: "#fff",
869
+ bgcolor: "rgba(0,0,0,0.7)",
870
+ borderRadius: 2,
871
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
872
+ border: "1px solid rgba(255,255,255,0.25)",
873
+ backdropFilter: "blur(6px)",
874
+ fontWeight: 700,
875
+ letterSpacing: 0.2,
876
+ alignItems: "center",
877
+ justifyContent: "center"
878
+ },
879
+ children: `${attendees} Players`
880
+ }
881
+ ),
882
+ /* @__PURE__ */ jsxRuntime.jsx(
883
+ material.Box,
884
+ {
885
+ sx: {
886
+ px: 1.5,
887
+ py: 0.5,
888
+ color: "#fff",
889
+ bgcolor: "rgba(0,0,0,0.7)",
890
+ borderRadius: 2,
891
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
892
+ border: "1px solid rgba(255,255,255,0.25)",
893
+ backdropFilter: "blur(6px)",
894
+ fontWeight: 700,
895
+ letterSpacing: 0.2,
896
+ alignItems: "center",
897
+ justifyContent: "center"
898
+ },
899
+ children: `${numGames} tables`
900
+ }
901
+ ),
902
+ generateTagsDisplay(eventTag),
903
+ links.map((link) => generateLink(link))
904
+ ]
905
+ }
906
+ )
907
+ ] }),
908
+ isOwner && /* @__PURE__ */ jsxRuntime.jsx(
909
+ material.Button,
910
+ {
911
+ variant: "contained",
912
+ onClick: onEdit,
913
+ sx: {
914
+ position: "absolute",
915
+ top: 16,
916
+ right: 16,
917
+ bgcolor: "rgba(255, 255, 255, 0.9)",
918
+ color: "primary.main",
919
+ "&:hover": {
920
+ bgcolor: "white"
921
+ }
922
+ },
923
+ children: "Edit"
924
+ }
925
+ )
926
+ ]
927
+ }
928
+ );
929
+ }
930
+ var generateLink = function(link) {
931
+ return /* @__PURE__ */ jsxRuntime.jsx(
932
+ material.Box,
933
+ {
934
+ component: "a",
935
+ href: link.url,
936
+ target: "_blank",
937
+ rel: "noopener noreferrer",
938
+ sx: {
939
+ px: 1.5,
940
+ py: 0.5,
941
+ color: "#fff",
942
+ bgcolor: "rgba(0,0,0,0.7)",
943
+ borderRadius: 2,
944
+ boxShadow: "0 8px 16px rgba(0,0,0,0.25), 0 2px 4px rgba(0,0,0,0.15)",
945
+ border: "1px solid rgba(255,255,255,0.25)",
946
+ backdropFilter: "blur(6px)",
947
+ fontWeight: 700,
948
+ letterSpacing: 0.2,
949
+ alignItems: "center",
950
+ justifyContent: "center",
951
+ textDecoration: "none",
952
+ "&:hover": {
953
+ bgcolor: "rgba(255,255,255,0.1)"
954
+ }
955
+ },
956
+ children: link.text
957
+ },
958
+ link.text
959
+ );
960
+ };
961
+ var BaseSearchResultCard = ({
962
+ result,
963
+ onClick,
964
+ children,
965
+ icon,
966
+ tags
967
+ }) => {
968
+ const handleClick = () => {
969
+ if (onClick) {
970
+ onClick(result.id);
971
+ }
972
+ };
973
+ return /* @__PURE__ */ jsxRuntime.jsx(
974
+ material.Card,
975
+ {
976
+ elevation: 6,
977
+ sx: {
978
+ width: "100%",
979
+ cursor: onClick ? "pointer" : "default",
980
+ boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
981
+ transition: "box-shadow 0.3s ease-in-out",
982
+ "&:hover": {
983
+ boxShadow: "0px 12px 28px rgba(0, 0, 0, 0.2)"
984
+ },
985
+ marginBottom: 2
986
+ },
987
+ onClick: handleClick,
988
+ children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
989
+ icon && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
990
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { flex: 1 }, children: [
991
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
992
+ children,
993
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", children: result.description }),
994
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: {
995
+ display: "block",
996
+ whiteSpace: "nowrap",
997
+ overflow: "hidden",
998
+ textOverflow: "clip",
999
+ pl: 0.5
1000
+ // Add some padding to prevent clipping of the leftmost tag
1001
+ }, children: (() => {
1002
+ const MAX_VISIBLE = 5;
1003
+ const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
1004
+ const visible = tagObjs.slice(0, MAX_VISIBLE);
1005
+ const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
1006
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1007
+ visible.map((tag) => generateTagsDisplay(tag)),
1008
+ hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
1009
+ "span",
1010
+ {
1011
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1012
+ style: {
1013
+ marginTop: "6px",
1014
+ marginRight: "6px",
1015
+ marginBottom: "6px",
1016
+ background: "#9e9e9e",
1017
+ color: "white",
1018
+ textShadow: "black 0.2em 0.2em 0.4em"
1019
+ },
1020
+ children: [
1021
+ "+",
1022
+ hiddenCount,
1023
+ " more"
1024
+ ]
1025
+ }
1026
+ )
1027
+ ] });
1028
+ })() }) })
1029
+ ] })
1030
+ ] })
1031
+ }
1032
+ );
1033
+ };
1034
+ var BaseSearchResultCard_default = BaseSearchResultCard;
1035
+ var PlayerResultCard = ({
1036
+ result,
1037
+ onClick,
1038
+ tags
1039
+ }) => {
1040
+ const firstLetter = result.title.charAt(0).toUpperCase();
1041
+ const getAvatarColor = (name) => {
1042
+ const colors = [
1043
+ "#F44336",
1044
+ "#E91E63",
1045
+ "#9C27B0",
1046
+ "#673AB7",
1047
+ "#3F51B5",
1048
+ "#2196F3",
1049
+ "#03A9F4",
1050
+ "#00BCD4",
1051
+ "#009688",
1052
+ "#4CAF50",
1053
+ "#8BC34A",
1054
+ "#CDDC39",
1055
+ "#FFEB3B",
1056
+ "#FFC107",
1057
+ "#FF9800",
1058
+ "#FF5722"
1059
+ ];
1060
+ let hash = 0;
1061
+ for (let i = 0; i < name.length; i++) {
1062
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
1063
+ }
1064
+ return colors[Math.abs(hash) % colors.length];
1065
+ };
1066
+ const avatarColor = getAvatarColor(result.title);
1067
+ const playerIcon = /* @__PURE__ */ jsxRuntime.jsx(
1068
+ Avatar__default.default,
1069
+ {
1070
+ src: result.imageUrl,
1071
+ alt: result.title,
1072
+ sx: {
1073
+ width: 40,
1074
+ height: 40,
1075
+ bgcolor: !result.imageUrl ? avatarColor : void 0
1076
+ },
1077
+ children: !result.imageUrl && firstLetter
1078
+ }
1079
+ );
1080
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
1081
+ };
1082
+ var PlayerResultCard_default = PlayerResultCard;
1083
+ var TableResultCard = ({ result, tags, onClick }) => {
1084
+ const capacity = result.capacity || 1;
1085
+ const numPlayers = result.numPlayers || 0;
1086
+ const occupancy = numPlayers / capacity * 100;
1087
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsxRuntime.jsx(CasinoIcon__default.default, { color: "primary" }), children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mb: 1 }, children: [
1088
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
1089
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "text.secondary", children: [
1090
+ "Players: ",
1091
+ numPlayers,
1092
+ " / ",
1093
+ capacity
1094
+ ] }),
1095
+ result.dungeonMaster ? /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
1096
+ ] }),
1097
+ /* @__PURE__ */ jsxRuntime.jsx(material.LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
1098
+ ] }) });
1099
+ };
1100
+ var TableResultCard_default = TableResultCard;
1101
+ var EventResultCard = ({
1102
+ result,
1103
+ onClick,
1104
+ tags
1105
+ }) => {
1106
+ const formatDate = (dateString) => {
1107
+ const options = {
1108
+ weekday: "long",
1109
+ year: "numeric",
1110
+ month: "long",
1111
+ day: "numeric"
1112
+ };
1113
+ try {
1114
+ const date = new Date(dateString);
1115
+ return date.toLocaleDateString("en-US", options);
1116
+ } catch {
1117
+ return dateString;
1118
+ }
1119
+ };
1120
+ const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
1121
+ const location = result.location || "Location TBD";
1122
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsxRuntime.jsx(EventIcon__default.default, { color: "primary" }), tags, children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mb: 1 }, children: [
1123
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
1124
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarTodayIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1125
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
1126
+ ] }),
1127
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
1128
+ /* @__PURE__ */ jsxRuntime.jsx(LocationOnIcon__default.default, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
1129
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", color: "text.secondary", children: location })
1130
+ ] })
1131
+ ] }) });
1132
+ };
1133
+ var EventResultCard_default = EventResultCard;
1134
+ var ResultsContainer = ({
1135
+ results,
1136
+ onResultClick,
1137
+ tags
1138
+ }) => {
1139
+ if (results.length === 0 || !results.map) {
1140
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1141
+ }
1142
+ const onPlayerClick = (id) => {
1143
+ onResultClick == null ? void 0 : onResultClick(id, "player");
1144
+ };
1145
+ const onTableClick = (id) => {
1146
+ onResultClick == null ? void 0 : onResultClick(id, "table");
1147
+ };
1148
+ const onEventClick = (id) => {
1149
+ onResultClick == null ? void 0 : onResultClick(id, "event");
1150
+ };
1151
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
1152
+ switch (result.type) {
1153
+ case "player":
1154
+ return /* @__PURE__ */ jsxRuntime.jsx(
1155
+ PlayerResultCard_default,
1156
+ {
1157
+ result,
1158
+ onClick: onPlayerClick,
1159
+ tags
1160
+ },
1161
+ result.id
1162
+ );
1163
+ case "table":
1164
+ return /* @__PURE__ */ jsxRuntime.jsx(
1165
+ TableResultCard_default,
1166
+ {
1167
+ result,
1168
+ onClick: onTableClick,
1169
+ tags
1170
+ },
1171
+ result.id
1172
+ );
1173
+ case "event":
1174
+ return /* @__PURE__ */ jsxRuntime.jsx(
1175
+ EventResultCard_default,
1176
+ {
1177
+ result,
1178
+ onClick: onEventClick,
1179
+ tags
1180
+ },
1181
+ result.id
1182
+ );
1183
+ default:
1184
+ console.error(`Unknown result type: ${result.type}`);
1185
+ return null;
1186
+ }
1187
+ }) });
1188
+ };
1189
+ var ResultsContainer_default = ResultsContainer;
1190
+ var ScrollableResultsList = ({
1191
+ results,
1192
+ tags,
1193
+ maxHeight = 400,
1194
+ onResultClick,
1195
+ emptyText
1196
+ }) => {
1197
+ const hasResults = Array.isArray(results) && results.length > 0;
1198
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsxRuntime.jsx(ResultsContainer_default, { results, onResultClick, tags }) : /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
1199
+ };
1200
+ var ScrollableResultsList_default = ScrollableResultsList;
1201
+ var TablesScrollableList = ({
1202
+ results,
1203
+ tags,
1204
+ maxHeight,
1205
+ onResultClick,
1206
+ sortBy = "availability"
1207
+ }) => {
1208
+ const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1209
+ const getAvailableSlots = (r) => {
1210
+ const capacity = typeof r.capacity === "number" ? r.capacity : 0;
1211
+ const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
1212
+ return Math.max(capacity - playersCount, 0);
1213
+ };
1214
+ const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
1215
+ const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
1216
+ return /* @__PURE__ */ jsxRuntime.jsx(
1217
+ ScrollableResultsList_default,
1218
+ {
1219
+ results: sortedTables,
1220
+ tags,
1221
+ maxHeight,
1222
+ onResultClick: (id, type) => {
1223
+ if (type === "table") handleClick(id);
1224
+ }
1225
+ }
1226
+ );
1227
+ };
1228
+ var TablesScrollableList_default = TablesScrollableList;
1229
+ var EventTablesCard = ({
1230
+ tables,
1231
+ tags,
1232
+ maxHeight = 450,
1233
+ onTableClick
1234
+ }) => {
1235
+ return /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { elevation: 6, sx: { width: "100%", boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)" }, children: [
1236
+ /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { title: "Tables" }),
1237
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, {}),
1238
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TablesScrollableList_default, { results: tables, tags, maxHeight, onResultClick: onTableClick, sortBy: "availability" }) })
1239
+ ] });
1240
+ };
1241
+ var EventTablesCard_default = EventTablesCard;
1242
+ function EventPageLayout({
1243
+ mergedEvent,
1244
+ isOwner,
1245
+ updateEvent,
1246
+ updateImages,
1247
+ attendees,
1248
+ numGames,
1249
+ tables,
1250
+ allTags
1251
+ }) {
1252
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, flexDirection: "column", children: /* @__PURE__ */ jsxRuntime.jsxs(EventEditProvider, { initialEvent: mergedEvent, value: { isOwner, updateEvent, updateImages }, children: [
1253
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
1254
+ EventBanner,
1255
+ {
1256
+ attendees,
1257
+ numGames
1258
+ }
1259
+ ) }),
1260
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, flexDirection: "row", spacing: 3, size: { xs: 12, md: 12 }, children: [
1261
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 4 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(
1262
+ EventBasicInfo,
1263
+ {
1264
+ locationId: mergedEvent.location || "0"
1265
+ }
1266
+ ) }),
1267
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 8 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(EventTablesCard_default, { tables, tags: allTags }) })
1268
+ ] }),
1269
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, {})
1270
+ ] }) });
1271
+ }
1272
+ var PlayerDetails = ({
1273
+ age,
1274
+ yearsPlaying,
1275
+ discordUsername,
1276
+ preferredGames
1277
+ }) => {
1278
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1279
+ material.Card,
1280
+ {
1281
+ sx: {
1282
+ margin: "1rem",
1283
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1284
+ // Primary Blue Gradient
1285
+ boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)",
1286
+ // Deep shadow based on the color
1287
+ borderRadius: "12px",
1288
+ // Rounded corners
1289
+ color: "#FFFFFF",
1290
+ // White as the base text color for contrast
1291
+ position: "relative",
1292
+ overflow: "hidden"
1293
+ // Ensures clean edges
1294
+ },
1295
+ className: "transition duration-300 transform hover:scale-105 hover:shadow-2xl",
1296
+ children: [
1297
+ /* @__PURE__ */ jsxRuntime.jsx(
1298
+ "div",
1299
+ {
1300
+ className: "absolute inset-0 bg-gradient-to-t from-white/10 to-transparent opacity-60",
1301
+ "aria-hidden": "true"
1302
+ }
1303
+ ),
1304
+ /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { className: "relative p-6", children: [
1305
+ /* @__PURE__ */ jsxRuntime.jsx(
1306
+ material.Typography,
1307
+ {
1308
+ variant: "h5",
1309
+ className: "font-bold uppercase text-center tracking-wide mb-4",
1310
+ sx: {
1311
+ color: "#FFFFFF",
1312
+ // Bright white for high contrast
1313
+ textShadow: "0px 4px 8px rgba(0, 0, 0, 0.5)",
1314
+ // Stronger shadow for bold presence
1315
+ fontSize: "1.5rem"
1316
+ // Slightly larger title size
1317
+ },
1318
+ children: "Player Details"
1319
+ }
1320
+ ),
1321
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1322
+ age !== null && /* @__PURE__ */ jsxRuntime.jsxs(
1323
+ material.Typography,
1324
+ {
1325
+ variant: "body2",
1326
+ className: "text-sm font-medium",
1327
+ sx: {
1328
+ color: "#FFFFFF",
1329
+ textShadow: "0px 2px 6px rgba(0, 0, 0, 0.5)",
1330
+ fontWeight: "bold"
1331
+ },
1332
+ children: [
1333
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-extrabold text-cyan-300", children: "Age:" }),
1334
+ " ",
1335
+ age
1336
+ ]
1337
+ }
1338
+ ),
1339
+ yearsPlaying !== null && /* @__PURE__ */ jsxRuntime.jsxs(
1340
+ material.Typography,
1341
+ {
1342
+ variant: "body2",
1343
+ className: "text-sm font-medium",
1344
+ sx: {
1345
+ color: "#FFFFFF",
1346
+ textShadow: "0px 2px 6px rgba(0, 0, 0, 0.5)",
1347
+ fontWeight: "bold"
1348
+ },
1349
+ children: [
1350
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-extrabold text-cyan-300", children: "Years Playing:" }),
1351
+ " ",
1352
+ yearsPlaying
1353
+ ]
1354
+ }
1355
+ ),
1356
+ discordUsername && /* @__PURE__ */ jsxRuntime.jsxs(
1357
+ material.Typography,
1358
+ {
1359
+ variant: "body2",
1360
+ className: "text-sm font-medium",
1361
+ sx: {
1362
+ color: "#FFFFFF",
1363
+ textShadow: "0px 2px 6px rgba(0, 0, 0, 0.5)",
1364
+ fontWeight: "bold"
1365
+ },
1366
+ children: [
1367
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-extrabold text-cyan-300", children: "Discord Username:" }),
1368
+ " ",
1369
+ discordUsername
1370
+ ]
1371
+ }
1372
+ ),
1373
+ preferredGames && preferredGames.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
1374
+ material.Typography,
1375
+ {
1376
+ variant: "body2",
1377
+ className: "text-sm font-medium",
1378
+ sx: {
1379
+ color: "#FFFFFF",
1380
+ textShadow: "0px 2px 6px rgba(0, 0, 0, 0.5)",
1381
+ fontWeight: "bold"
1382
+ },
1383
+ children: [
1384
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-extrabold text-cyan-300", children: "Preferred Games:" }),
1385
+ " ",
1386
+ preferredGames.join(", ")
1387
+ ]
1388
+ }
1389
+ )
1390
+ ] }),
1391
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 text-center", children: /* @__PURE__ */ jsxRuntime.jsx(
1392
+ material.Typography,
1393
+ {
1394
+ variant: "caption",
1395
+ className: "text-xs italic",
1396
+ sx: {
1397
+ color: "#BBDEFB",
1398
+ // Subtle light blue for footer text
1399
+ textShadow: "0px 1px 3px rgba(0, 0, 0, 0.2)"
1400
+ },
1401
+ children: "All information is player-submitted."
1402
+ }
1403
+ ) })
1404
+ ] })
1405
+ ]
1406
+ }
1407
+ );
1408
+ };
1409
+ var PlayerDetailsCard_default = PlayerDetails;
1410
+
1411
+ // src/data/values.tsx
1412
+ var ProfilePictureSettings = {
1413
+ aspectRatio: 4 / 5};
1414
+ var { aspectRatio } = ProfilePictureSettings;
1415
+ var PlayerDisplayCard = ({
1416
+ profilePicture,
1417
+ username,
1418
+ bio,
1419
+ preferredPronouns
1420
+ }) => {
1421
+ const [imageSrc, setImageSrc] = React7.useState("/man-walking-silhouette-clipart.jpg");
1422
+ React7.useEffect(() => {
1423
+ async function validateImage() {
1424
+ const newImage = profilePicture || "/man-walking-silhouette-clipart.jpg";
1425
+ if (!profilePicture) {
1426
+ setImageSrc("/man-walking-silhouette-clipart.jpg");
1427
+ return;
1428
+ }
1429
+ const img = new Image();
1430
+ img.src = newImage;
1431
+ img.onload = () => {
1432
+ setImageSrc(newImage);
1433
+ };
1434
+ img.onerror = () => {
1435
+ setImageSrc("/man-walking-silhouette-clipart.jpg");
1436
+ };
1437
+ }
1438
+ validateImage();
1439
+ }, [profilePicture]);
1440
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1441
+ material.Card,
1442
+ {
1443
+ sx: {
1444
+ margin: "1rem",
1445
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1446
+ // Vibrant blue gradient
1447
+ boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)",
1448
+ // Blue shadow to add depth
1449
+ borderRadius: "12px",
1450
+ // Smooth rounded corners
1451
+ color: "#FFFFFF",
1452
+ // White text for high contrast
1453
+ overflow: "hidden"
1454
+ // Clean edges
1455
+ },
1456
+ className: "transition duration-300 transform hover:scale-105 hover:shadow-2xl",
1457
+ children: [
1458
+ /* @__PURE__ */ jsxRuntime.jsx(
1459
+ material.CardMedia,
1460
+ {
1461
+ component: "img",
1462
+ image: imageSrc,
1463
+ alt: `${username}'s Profile Picture`,
1464
+ sx: {
1465
+ aspectRatio,
1466
+ height: "auto",
1467
+ // Updates to maintain aspect ratio and fill space nicely
1468
+ width: "100%",
1469
+ objectFit: "scale-down"
1470
+ }
1471
+ }
1472
+ ),
1473
+ /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { className: "relative p-6", children: [
1474
+ /* @__PURE__ */ jsxRuntime.jsx(
1475
+ material.Typography,
1476
+ {
1477
+ variant: "h5",
1478
+ component: "div",
1479
+ className: "font-bold text-lg uppercase text-center tracking-wide mb-2",
1480
+ sx: {
1481
+ color: "#FFFFFF",
1482
+ // Pure white for username
1483
+ fontSize: "1.5rem",
1484
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
1485
+ // Strong shadow for visibility
1486
+ },
1487
+ children: username
1488
+ }
1489
+ ),
1490
+ preferredPronouns && /* @__PURE__ */ jsxRuntime.jsx(
1491
+ material.Typography,
1492
+ {
1493
+ variant: "body2",
1494
+ className: "text-sm font-medium",
1495
+ sx: {
1496
+ color: "#E3F2FD",
1497
+ textShadow: "0px 2px 4px rgba(0, 0, 0, 0.3)",
1498
+ // Subtle shadow for readability
1499
+ fontWeight: "bold",
1500
+ // Emphasize key details
1501
+ marginBottom: "1rem"
1502
+ },
1503
+ children: preferredPronouns
1504
+ }
1505
+ ),
1506
+ bio && /* @__PURE__ */ jsxRuntime.jsx(
1507
+ material.Typography,
1508
+ {
1509
+ variant: "body2",
1510
+ className: "text-sm font-light",
1511
+ sx: {
1512
+ color: "#E3F2FD",
1513
+ // Softer muted tone for secondary text
1514
+ textShadow: "0px 2px 4px rgba(0, 0, 0, 0.3)",
1515
+ // Subtle shadow for readability
1516
+ fontStyle: "italic"
1517
+ // Distinguish bio visually
1518
+ },
1519
+ children: bio
1520
+ }
1521
+ )
1522
+ ] })
1523
+ ]
1524
+ }
1525
+ );
1526
+ };
1527
+ var PlayerDisplayCard_default = PlayerDisplayCard;
1528
+ var PlayerPromptCard = ({ title, description }) => {
1529
+ return /* @__PURE__ */ jsxRuntime.jsx(
1530
+ material.Card,
1531
+ {
1532
+ sx: {
1533
+ margin: "1rem",
1534
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1535
+ // Gradient color scheme
1536
+ boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)",
1537
+ // Card shadow
1538
+ borderRadius: "12px",
1539
+ // Rounded corners
1540
+ color: "#FFFFFF",
1541
+ // Text contrast with the background
1542
+ overflow: "hidden"
1543
+ // Keeps consistent and clean card shape
1544
+ },
1545
+ className: "transition duration-300 transform hover:scale-105 hover:shadow-2xl",
1546
+ children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { className: "p-6", children: [
1547
+ title && /* @__PURE__ */ jsxRuntime.jsx(
1548
+ material.Typography,
1549
+ {
1550
+ variant: "h5",
1551
+ className: "font-bold text-lg uppercase text-center tracking-wide mb-4",
1552
+ sx: {
1553
+ color: "#FFFFFF",
1554
+ // Bright white for high visibility
1555
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)",
1556
+ // Strong text shadow for contrast
1557
+ fontSize: "1.5rem"
1558
+ },
1559
+ children: title
1560
+ }
1561
+ ),
1562
+ description && /* @__PURE__ */ jsxRuntime.jsx(
1563
+ material.Typography,
1564
+ {
1565
+ variant: "body2",
1566
+ className: "text-sm font-medium text-center",
1567
+ sx: {
1568
+ color: "#E3F2FD",
1569
+ // Softer light blue for description
1570
+ textShadow: "0px 2px 4px rgba(0, 0, 0, 0.3)",
1571
+ // Subtle shadow
1572
+ lineHeight: 1.6,
1573
+ marginTop: "1rem"
1574
+ },
1575
+ children: description
1576
+ }
1577
+ )
1578
+ ] })
1579
+ }
1580
+ );
1581
+ };
1582
+ var PlayerPromptCard_default = PlayerPromptCard;
1583
+ function PlayerTagsCard(props) {
1584
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 3 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
1585
+ /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { title: "Player Tags", style: {
1586
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1587
+ color: "#FFFFFF",
1588
+ // Pure white for username
1589
+ fontSize: "1.5rem",
1590
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
1591
+ // Strong shadow for visibility
1592
+ } }),
1593
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: renderLabels(props.PlayerTags) })
1594
+ ] }) }) });
1595
+ }
1596
+ var renderLabels = (tags) => {
1597
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: tags.map((tag) => generateLabel(tag)) });
1598
+ };
1599
+ var generateLabel = (tag) => {
1600
+ let color = "#bfbcbb";
1601
+ if (tag.color) color = tag.color;
1602
+ return /* @__PURE__ */ jsxRuntime.jsx(
1603
+ "span",
1604
+ {
1605
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1606
+ style: {
1607
+ background: color,
1608
+ color: "white",
1609
+ textShadow: "black 0.2em 0.2em 0.4em"
1610
+ },
1611
+ children: tag.label
1612
+ },
1613
+ tag.id
1614
+ );
1615
+ };
1616
+ function TagEditor({
1617
+ title = "Tags",
1618
+ selectedTags,
1619
+ possibleTags,
1620
+ onToggleTag
1621
+ }) {
1622
+ const [inputValue, setInputValue] = React7.useState("");
1623
+ const selectedIds = React7.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
1624
+ const options = React7.useMemo(
1625
+ () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
1626
+ [possibleTags]
1627
+ );
1628
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
1629
+ /* @__PURE__ */ jsxRuntime.jsx(
1630
+ CardHeader4__default.default,
1631
+ {
1632
+ title,
1633
+ style: {
1634
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1635
+ color: "#FFFFFF",
1636
+ fontSize: "1.5rem",
1637
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
1638
+ }
1639
+ }
1640
+ ),
1641
+ /* @__PURE__ */ jsxRuntime.jsxs(CardContent10__default.default, { children: [
1642
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
1643
+ "span",
1644
+ {
1645
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1646
+ style: {
1647
+ background: tag.color || "#bfbcbb",
1648
+ color: "white",
1649
+ textShadow: "black 0.2em 0.2em 0.4em"
1650
+ },
1651
+ children: [
1652
+ tag.label,
1653
+ /* @__PURE__ */ jsxRuntime.jsx(
1654
+ "button",
1655
+ {
1656
+ type: "button",
1657
+ onClick: () => onToggleTag(tag.id),
1658
+ className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
1659
+ children: "\xD7"
1660
+ }
1661
+ )
1662
+ ]
1663
+ },
1664
+ tag.id
1665
+ )) }),
1666
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
1667
+ Autocomplete__default.default,
1668
+ {
1669
+ options,
1670
+ filterOptions: (availableOptions, state) => availableOptions.filter(
1671
+ (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
1672
+ ).slice(0, 3),
1673
+ value: null,
1674
+ inputValue,
1675
+ onInputChange: (event, newInputValue) => {
1676
+ if (event && event.type === "change") {
1677
+ setInputValue(newInputValue);
1678
+ }
1679
+ },
1680
+ onChange: (event, newValue) => {
1681
+ if (newValue) {
1682
+ onToggleTag(newValue.value);
1683
+ }
1684
+ setInputValue("");
1685
+ },
1686
+ slots: { popper: CustomPopper },
1687
+ renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField3__default.default, { ...params, label: "Select Tags" })
1688
+ },
1689
+ selectedIds.join("-")
1690
+ ) }) })
1691
+ ] })
1692
+ ] }) }) });
1693
+ }
1694
+ var CustomPopper = (props) => {
1695
+ return /* @__PURE__ */ jsxRuntime.jsx(
1696
+ Popper__default.default,
1697
+ {
1698
+ ...props,
1699
+ modifiers: [
1700
+ {
1701
+ name: "preventOverflow",
1702
+ options: { boundary: "viewport" }
1703
+ },
1704
+ {
1705
+ name: "offset",
1706
+ options: { offset: [0, -10] }
1707
+ }
1708
+ ],
1709
+ placement: "top-start"
1710
+ }
1711
+ );
1712
+ };
1713
+ function PlayerTagsEdit(props) {
1714
+ return /* @__PURE__ */ jsxRuntime.jsx(
1715
+ TagEditor,
1716
+ {
1717
+ title: "Player Tags",
1718
+ selectedTags: props.PlayerTags,
1719
+ possibleTags: props.possibleTags,
1720
+ onToggleTag: props.updatePlayerTags
1721
+ }
1722
+ );
1723
+ }
1724
+ var SORT_OPTIONS = [
1725
+ { id: "relevance", label: "Relevance" },
1726
+ { id: "newest", label: "Newest" },
1727
+ { id: "popular", label: "Most Popular" }
1728
+ ];
1729
+ var SortOptions = ({
1730
+ defaultValue: defaultValue2 = "relevance",
1731
+ onChange
1732
+ }) => {
1733
+ const handleSortChange = (event) => {
1734
+ onChange == null ? void 0 : onChange(event.target.value);
1735
+ };
1736
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1737
+ /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Sort By" }),
1738
+ /* @__PURE__ */ jsxRuntime.jsx(FormControl2__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroup__default.default, { defaultValue: defaultValue2, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
1739
+ FormControlLabel__default.default,
1740
+ {
1741
+ value: option.id,
1742
+ control: /* @__PURE__ */ jsxRuntime.jsx(Radio__default.default, {}),
1743
+ label: option.label
1744
+ },
1745
+ option.id
1746
+ )) }) })
1747
+ ] });
1748
+ };
1749
+ var SortOptions_default = SortOptions;
1750
+ var TagsFilter = ({
1751
+ onChange,
1752
+ tags: Tags = []
1753
+ }) => {
1754
+ const [mustHaveTags, setMustHaveTags] = React7__default.default.useState([]);
1755
+ const [mustNotHaveTags, setMustNotHaveTags] = React7__default.default.useState([]);
1756
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React7__default.default.useState([]);
1757
+ Tags = !!Tags ? Tags : [];
1758
+ const [inputValues, setInputValues] = React7__default.default.useState({
1759
+ mustHave: "",
1760
+ mustNotHave: "",
1761
+ shouldHaveAtLeastOne: ""
1762
+ });
1763
+ const tagOptions = React7__default.default.useMemo(() => {
1764
+ console.log("available tags: " + JSON.stringify(Tags));
1765
+ console.log(!Tags);
1766
+ if (!Tags || Tags.length == 0 || !Tags.map) return [];
1767
+ return Tags.map((tag) => ({
1768
+ value: tag.id,
1769
+ label: tag.label
1770
+ }));
1771
+ }, [Tags]);
1772
+ const handleTagChange = (tagId, category) => {
1773
+ let newTags = [];
1774
+ switch (category) {
1775
+ case "mustHave":
1776
+ newTags = mustHaveTags.includes(tagId) ? mustHaveTags.filter((id) => id !== tagId) : [...mustHaveTags, tagId];
1777
+ setMustHaveTags(newTags);
1778
+ break;
1779
+ case "mustNotHave":
1780
+ newTags = mustNotHaveTags.includes(tagId) ? mustNotHaveTags.filter((id) => id !== tagId) : [...mustNotHaveTags, tagId];
1781
+ setMustNotHaveTags(newTags);
1782
+ break;
1783
+ case "shouldHaveAtLeastOne":
1784
+ newTags = shouldHaveAtLeastOneTags.includes(tagId) ? shouldHaveAtLeastOneTags.filter((id) => id !== tagId) : [...shouldHaveAtLeastOneTags, tagId];
1785
+ setShouldHaveAtLeastOneTags(newTags);
1786
+ break;
1787
+ }
1788
+ if (onChange) {
1789
+ onChange({
1790
+ mustHave: category === "mustHave" ? newTags : mustHaveTags,
1791
+ mustNotHave: category === "mustNotHave" ? newTags : mustNotHaveTags,
1792
+ shouldHaveAtLeastOne: category === "shouldHaveAtLeastOne" ? newTags : shouldHaveAtLeastOneTags
1793
+ });
1794
+ }
1795
+ };
1796
+ const renderSelectedTags = (selectedTags, category) => {
1797
+ const tagValues = [];
1798
+ if (!Tags || Tags.length == 0 || !Tags.map) return null;
1799
+ Tags.forEach((tag) => {
1800
+ if (selectedTags.includes(tag.id)) {
1801
+ tagValues.push(tag);
1802
+ }
1803
+ });
1804
+ if (tagValues.length === 0) {
1805
+ return null;
1806
+ }
1807
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxRuntime.jsxs(
1808
+ "span",
1809
+ {
1810
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
1811
+ style: {
1812
+ background: tag.color || "#bfbcbb",
1813
+ color: "white",
1814
+ textShadow: "black 0.2em 0.2em 0.4em"
1815
+ },
1816
+ children: [
1817
+ tag.label,
1818
+ /* @__PURE__ */ jsxRuntime.jsx(
1819
+ "button",
1820
+ {
1821
+ type: "button",
1822
+ onClick: () => handleTagChange(tag.id, category),
1823
+ className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
1824
+ children: "\xD7"
1825
+ }
1826
+ )
1827
+ ]
1828
+ },
1829
+ tag.id
1830
+ )) });
1831
+ };
1832
+ const createTagSelector = (category, label) => {
1833
+ const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
1834
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1835
+ /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
1836
+ renderSelectedTags(selectedTags, category),
1837
+ /* @__PURE__ */ jsxRuntime.jsx(
1838
+ Autocomplete__default.default,
1839
+ {
1840
+ options: tagOptions,
1841
+ filterOptions: (options, state) => {
1842
+ const tagsToExclude = /* @__PURE__ */ new Set();
1843
+ selectedTags.forEach((id) => tagsToExclude.add(id));
1844
+ if (category !== "mustHave") {
1845
+ mustHaveTags.forEach((id) => tagsToExclude.add(id));
1846
+ }
1847
+ if (category !== "mustNotHave") {
1848
+ mustNotHaveTags.forEach((id) => tagsToExclude.add(id));
1849
+ }
1850
+ if (category !== "shouldHaveAtLeastOne") {
1851
+ shouldHaveAtLeastOneTags.forEach((id) => tagsToExclude.add(id));
1852
+ }
1853
+ return options.filter(
1854
+ (option) => (
1855
+ // Exclude options already selected in any category
1856
+ !tagsToExclude.has(option.value) && // Filter based on user input
1857
+ option.label.toLowerCase().includes(state.inputValue.toLowerCase())
1858
+ )
1859
+ ).slice(0, 3);
1860
+ },
1861
+ value: null,
1862
+ inputValue: inputValues[category],
1863
+ onInputChange: (event, newInputValue) => {
1864
+ if (event && event.type === "change") {
1865
+ setInputValues({
1866
+ ...inputValues,
1867
+ [category]: newInputValue
1868
+ });
1869
+ }
1870
+ },
1871
+ onChange: (event, newValue) => {
1872
+ if (newValue) {
1873
+ handleTagChange(newValue.value, category);
1874
+ }
1875
+ setInputValues({
1876
+ ...inputValues,
1877
+ [category]: ""
1878
+ });
1879
+ },
1880
+ slots: { popper: CustomPopper2 },
1881
+ renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField3__default.default, { ...params, label: `Select ${label}` })
1882
+ },
1883
+ `${category}-${selectedTags.join("-")}`
1884
+ )
1885
+ ] });
1886
+ };
1887
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1888
+ /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Tags" }),
1889
+ createTagSelector("mustHave", "Must Have Tags"),
1890
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
1891
+ createTagSelector("mustNotHave", "Must Not Have Tags"),
1892
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
1893
+ createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
1894
+ ] });
1895
+ };
1896
+ var CustomPopper2 = (props) => {
1897
+ return /* @__PURE__ */ jsxRuntime.jsx(
1898
+ Popper__default.default,
1899
+ {
1900
+ ...props,
1901
+ modifiers: [
1902
+ {
1903
+ name: "preventOverflow",
1904
+ options: {
1905
+ boundary: "viewport"
1906
+ // Prevent the Popper from going outside the viewport
1907
+ }
1908
+ },
1909
+ {
1910
+ name: "offset",
1911
+ options: {
1912
+ offset: [0, -10]
1913
+ // Set negative vertical offset (adjust value as needed)
1914
+ }
1915
+ }
1916
+ ],
1917
+ placement: "top-start"
1918
+ }
1919
+ );
1920
+ };
1921
+ var TagsFilter_default = TagsFilter;
1922
+ var FILTER_TYPES = [
1923
+ { id: "player", label: "Players" },
1924
+ { id: "event", label: "Events", disabled: true },
1925
+ { id: "table", label: "Tables", disabled: true }
1926
+ ];
1927
+ var TypeFilter = ({ onChange }) => {
1928
+ const [selectedTypes, setSelectedTypes] = React7__default.default.useState([]);
1929
+ const handleTypeChange = (typeId) => {
1930
+ const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
1931
+ setSelectedTypes(newSelectedTypes);
1932
+ onChange == null ? void 0 : onChange(newSelectedTypes);
1933
+ };
1934
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1935
+ /* @__PURE__ */ jsxRuntime.jsx(Typography10__default.default, { variant: "h6", gutterBottom: true, children: "Type" }),
1936
+ /* @__PURE__ */ jsxRuntime.jsx(FormGroup__default.default, { children: FILTER_TYPES.map((type) => /* @__PURE__ */ jsxRuntime.jsx(
1937
+ FormControlLabel__default.default,
1938
+ {
1939
+ control: /* @__PURE__ */ jsxRuntime.jsx(
1940
+ Checkbox__default.default,
1941
+ {
1942
+ checked: selectedTypes.includes(type.id),
1943
+ onChange: () => handleTypeChange(type.id),
1944
+ disabled: type.disabled
1945
+ }
1946
+ ),
1947
+ label: type.label
1948
+ },
1949
+ type.id
1950
+ )) })
1951
+ ] });
1952
+ };
1953
+ var TypeFilter_default = TypeFilter;
1954
+ var FiltersContainer = ({
1955
+ onTypeChange,
1956
+ onTagChange,
1957
+ onSubmit,
1958
+ tags
1959
+ }) => {
1960
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { children: [
1961
+ /* @__PURE__ */ jsxRuntime.jsx(TypeFilter_default, { onChange: onTypeChange }),
1962
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
1963
+ /* @__PURE__ */ jsxRuntime.jsx(
1964
+ TagsFilter_default,
1965
+ {
1966
+ tags,
1967
+ onChange: onTagChange
1968
+ }
1969
+ ),
1970
+ /* @__PURE__ */ jsxRuntime.jsx(Divider2__default.default, { sx: { my: 2 } }),
1971
+ /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1972
+ Button7__default.default,
1973
+ {
1974
+ variant: "contained",
1975
+ color: "primary",
1976
+ size: "large",
1977
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(SearchIcon__default.default, {}),
1978
+ onClick: onSubmit,
1979
+ sx: {
1980
+ width: "100%",
1981
+ py: 1.5,
1982
+ borderRadius: 2,
1983
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
1984
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
1985
+ "&:hover": {
1986
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.9), rgba(25, 118, 210, 1))",
1987
+ boxShadow: "0px 6px 15px rgba(0, 0, 0, 0.2)"
1988
+ }
1989
+ },
1990
+ children: "Search"
1991
+ }
1992
+ ) })
1993
+ ] });
1994
+ };
1995
+ var FiltersContainer_default = FiltersContainer;
1996
+ var PlayersScrollableList = ({
1997
+ results,
1998
+ tags,
1999
+ maxHeight,
2000
+ onResultClick
2001
+ }) => {
2002
+ const players = (results || []).filter((r) => (r == null ? void 0 : r.type) === "player");
2003
+ const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
2004
+ return /* @__PURE__ */ jsxRuntime.jsx(
2005
+ ScrollableResultsList_default,
2006
+ {
2007
+ results: players,
2008
+ tags,
2009
+ maxHeight,
2010
+ onResultClick: (id, type) => {
2011
+ if (type === "player") handleClick(id);
2012
+ }
2013
+ }
2014
+ );
2015
+ };
2016
+ var PlayersScrollableList_default = PlayersScrollableList;
2017
+ var SearchResultCard = ({
2018
+ result,
2019
+ onClick,
2020
+ tags
2021
+ }) => {
2022
+ return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, tags });
2023
+ };
2024
+ var SearchResultCard_default = SearchResultCard;
2025
+ function SearchPageLayout({
2026
+ results,
2027
+ title = "Search Results",
2028
+ onTypeChange,
2029
+ onTagChange,
2030
+ onSubmit,
2031
+ onResultClick,
2032
+ validTags,
2033
+ allTags
2034
+ }) {
2035
+ "use client";
2036
+ const theme = material.useTheme();
2037
+ const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
2038
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { padding: 2 }, children: [
2039
+ /* @__PURE__ */ jsxRuntime.jsx(Card10__default.default, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2040
+ CardHeader4__default.default,
2041
+ {
2042
+ title,
2043
+ style: {
2044
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2045
+ color: "#FFFFFF",
2046
+ fontSize: "1.5rem",
2047
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2048
+ }
2049
+ }
2050
+ ) }),
2051
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, spacing: 2, children: [
2052
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 3 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { sx: { marginBottom: isMobile ? 2 : 0 }, children: [
2053
+ /* @__PURE__ */ jsxRuntime.jsx(
2054
+ CardHeader4__default.default,
2055
+ {
2056
+ title: "Filters",
2057
+ style: {
2058
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2059
+ color: "#FFFFFF",
2060
+ fontSize: "1.5rem",
2061
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2062
+ }
2063
+ }
2064
+ ),
2065
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2066
+ FiltersContainer_default,
2067
+ {
2068
+ onTypeChange,
2069
+ onTagChange,
2070
+ onSubmit,
2071
+ tags: validTags
2072
+ }
2073
+ ) })
2074
+ ] }) }),
2075
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 9 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
2076
+ /* @__PURE__ */ jsxRuntime.jsx(
2077
+ CardHeader4__default.default,
2078
+ {
2079
+ title: "Results",
2080
+ style: {
2081
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2082
+ color: "#FFFFFF",
2083
+ fontSize: "1.5rem",
2084
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2085
+ }
2086
+ }
2087
+ ),
2088
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
2089
+ ResultsContainer_default,
2090
+ {
2091
+ results,
2092
+ onResultClick,
2093
+ tags: allTags
2094
+ }
2095
+ ) })
2096
+ ] }) })
2097
+ ] })
2098
+ ] });
2099
+ }
2100
+ var GameTableContext = React7__default.default.createContext(void 0);
2101
+ function GameTableProvider(props) {
2102
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.children });
2103
+ }
2104
+ function useGameTableContext() {
2105
+ const context = React7__default.default.useContext(GameTableContext);
2106
+ if (context) {
2107
+ return context;
2108
+ }
2109
+ throw new Error("useGameTableContext is deprecated in the package build. Pass table data through props instead.");
2110
+ }
2111
+ var ModalContext = React7.createContext({
2112
+ showModal: (content) => {
2113
+ },
2114
+ hideModal: () => {
2115
+ }
2116
+ });
2117
+ var useModal = () => React7.useContext(ModalContext);
2118
+ var Modal = ({ onClose, children }) => {
2119
+ const modalRef = React7.useRef(null);
2120
+ const previouslyFocusedElement = React7.useRef(null);
2121
+ React7.useEffect(() => {
2122
+ var _a;
2123
+ if (children) {
2124
+ previouslyFocusedElement.current = document.activeElement;
2125
+ (_a = modalRef.current) == null ? void 0 : _a.focus();
2126
+ }
2127
+ return () => {
2128
+ var _a2;
2129
+ (_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
2130
+ };
2131
+ }, [children]);
2132
+ const handleOnClose = () => {
2133
+ onClose();
2134
+ };
2135
+ const handleKeyDown = (e) => {
2136
+ var _a;
2137
+ if (e.key !== "Tab") return;
2138
+ const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
2139
+ 'button, [tabindex]:not([tabindex="-1"])'
2140
+ );
2141
+ if (!focusableElements || focusableElements.length === 0) return;
2142
+ const first = focusableElements[0];
2143
+ const last = focusableElements[focusableElements.length - 1];
2144
+ if (e.shiftKey) {
2145
+ if (document.activeElement === first) {
2146
+ e.preventDefault();
2147
+ last.focus();
2148
+ }
2149
+ } else {
2150
+ if (document.activeElement === last) {
2151
+ e.preventDefault();
2152
+ first.focus();
2153
+ }
2154
+ }
2155
+ };
2156
+ return /* @__PURE__ */ jsxRuntime.jsx(
2157
+ "div",
2158
+ {
2159
+ className: "modal-overlay",
2160
+ onKeyDown: handleKeyDown,
2161
+ ref: modalRef,
2162
+ role: "dialog",
2163
+ tabIndex: -1,
2164
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "modal-container", children: [
2165
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleOnClose, children: "X" }) }),
2166
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-content", children })
2167
+ ] })
2168
+ }
2169
+ );
2170
+ };
2171
+ var Modal_default = Modal;
2172
+ var ModalProvider = ({ children }) => {
2173
+ const [modalContent, setModalContent] = React7.useState(null);
2174
+ const showModal = (content) => setModalContent(content);
2175
+ const hideModal = () => setModalContent(null);
2176
+ return /* @__PURE__ */ jsxRuntime.jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
2177
+ children,
2178
+ modalContent && /* @__PURE__ */ jsxRuntime.jsx(Modal_default, { onClose: hideModal, children: modalContent })
2179
+ ] });
2180
+ };
2181
+ var ModalProvider_default = ModalProvider;
2182
+ var PlayerHighlightsCard = function(props) {
2183
+ const {
2184
+ allTags,
2185
+ canChangeDungeonMaster,
2186
+ canEdit,
2187
+ handleAssignToDungeonMaster,
2188
+ isWaitList,
2189
+ player,
2190
+ removeFromTable
2191
+ } = props;
2192
+ return /* @__PURE__ */ jsxRuntime.jsx(material.Card, { elevation: 3, sx: { backgroundColor: canEdit ? "#fffbea" : "#f5f9fa", marginBottom: "6px" }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { children: [
2193
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, spacing: 2, direction: "column", children: [
2194
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, direction: "row", children: [
2195
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 64, src: player.miniPic || "", width: 64 }) }),
2196
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) })
2197
+ ] }),
2198
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: renderTagsFromIds(player.tags, allTags) })
2199
+ ] }),
2200
+ canEdit && /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { children: [
2201
+ /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => removeFromTable(player), children: isWaitList ? /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Deny Player" }) : /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Remove Player" }) }),
2202
+ canChangeDungeonMaster && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => {
2203
+ handleAssignToDungeonMaster(player);
2204
+ removeFromTable(player);
2205
+ }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Assign to DungeonMaster" }) })
2206
+ ] })
2207
+ ] }) });
2208
+ };
2209
+ var DMHighlightsCard = function({ canEdit, player, allTags }) {
2210
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { elevation: 3, sx: { backgroundColor: "#f5f9fa", marginBottom: "6px" }, children: [
2211
+ /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Game Master" }),
2212
+ /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, spacing: 2, direction: "column", children: [
2213
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) }),
2214
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, direction: "row", children: [
2215
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 120, src: player.imageUrl ? player.imageUrl : "", width: 256 }) }),
2216
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { children: renderTagsFromIds(player.tags, allTags) }),
2217
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { children: player.description })
2218
+ ] })
2219
+ ] }) })
2220
+ ] });
2221
+ };
2222
+ function TableActionsBar(props) {
2223
+ const { hideModal, showModal } = useModal();
2224
+ const {
2225
+ isInEditMode,
2226
+ numPlayers,
2227
+ onDeleteTable,
2228
+ onEditModeChange,
2229
+ onJoinWaitlist,
2230
+ onLeaveTable,
2231
+ onPromoteWaitlistPlayer,
2232
+ onSave,
2233
+ slots,
2234
+ tableStatus,
2235
+ waitlistPlayers
2236
+ } = props;
2237
+ const { isOwner, isPlayer, isDM, onWaitlist } = tableStatus;
2238
+ const canEditTable = isOwner && !isInEditMode;
2239
+ const canSaveTable = isOwner && isInEditMode;
2240
+ const canViewWaitlist = isOwner || isDM || waitlistPlayers.length > 0;
2241
+ const renderPlayerWaitlistModalContent = (canMovePlayersToTable) => {
2242
+ if (waitlistPlayers.length === 0) {
2243
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Waitlist is empty!" });
2244
+ }
2245
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2246
+ /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { slotProps: { title: { variant: "h4" } }, title: "Waitlist Players: " }),
2247
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-8", children: waitlistPlayers.map((player) => /* @__PURE__ */ jsxRuntime.jsxs(
2248
+ "li",
2249
+ {
2250
+ className: `${canMovePlayersToTable ? "bg-amber-100 cursor-pointer" : "bg-gray-200"} mb-8 flex flex-row flex-start space-between justify-center items-center gap-3 p-2 rounded`,
2251
+ onClick: () => canMovePlayersToTable ? onPromoteWaitlistPlayer == null ? void 0 : onPromoteWaitlistPlayer(player.id) : void 0,
2252
+ tabIndex: 0,
2253
+ children: [
2254
+ /* @__PURE__ */ jsxRuntime.jsx(
2255
+ Image2__default.default,
2256
+ {
2257
+ alt: player.username + "'s profile pic",
2258
+ height: 64,
2259
+ src: player.miniPic || "",
2260
+ width: 64
2261
+ }
2262
+ ),
2263
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: player.username })
2264
+ ]
2265
+ },
2266
+ player.id
2267
+ )) }),
2268
+ /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: () => hideModal(), children: "close modal" })
2269
+ ] });
2270
+ };
2271
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "column", spacing: 1, children: [
2272
+ /* @__PURE__ */ jsxRuntime.jsx(material.Grid, { container: true, direction: "row", children: /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { color: "white", sx: { textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)" }, children: [
2273
+ "Players: ",
2274
+ numPlayers,
2275
+ " / ",
2276
+ slots
2277
+ ] }) }),
2278
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "row", children: [
2279
+ !isOwner && !isPlayer && !isDM && !onWaitlist && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onJoinWaitlist == null ? void 0 : onJoinWaitlist(), sx: buttonStyle, children: "Join Waitlist" }),
2280
+ !isOwner && (isPlayer || onWaitlist) && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onLeaveTable == null ? void 0 : onLeaveTable(), sx: buttonStyle, children: onWaitlist ? "Leave Waitlist" : "Leave Table" }),
2281
+ canEditTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2282
+ /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onEditModeChange(true), sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(EditIcon__default.default, {}), children: "Edit" }),
2283
+ canViewWaitlist ? /* @__PURE__ */ jsxRuntime.jsx(
2284
+ Button7__default.default,
2285
+ {
2286
+ endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2287
+ onClick: () => showModal(renderPlayerWaitlistModalContent(false)),
2288
+ sx: buttonStyle,
2289
+ children: "View Waitlist"
2290
+ }
2291
+ ) : null
2292
+ ] }) : canSaveTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2293
+ /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: onSave, sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(SaveIcon__default.default, {}), children: "Save" }),
2294
+ /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onEditModeChange(false), sx: buttonStyle, children: "Cancel" }),
2295
+ /* @__PURE__ */ jsxRuntime.jsx(
2296
+ Button7__default.default,
2297
+ {
2298
+ endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2299
+ onClick: () => showModal(renderPlayerWaitlistModalContent(true)),
2300
+ sx: buttonStyle,
2301
+ children: "Edit Waitlist"
2302
+ }
2303
+ )
2304
+ ] }) : null,
2305
+ isOwner && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onDeleteTable == null ? void 0 : onDeleteTable(), sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(DeleteIcon__default.default, {}), children: "Delete Table" })
2306
+ ] })
2307
+ ] });
2308
+ }
2309
+ var buttonStyle = {
2310
+ marginLeft: "3px",
2311
+ backgroundColor: "blue",
2312
+ color: "white",
2313
+ borderRadius: "5px"
2314
+ };
2315
+ var AutoResizingTextarea = (props) => {
2316
+ const { isInEditMode, onChange, textareaRef, value } = props;
2317
+ React7.useEffect(() => {
2318
+ if (isInEditMode && textareaRef.current) {
2319
+ const textarea = textareaRef.current;
2320
+ textarea.style.height = "auto";
2321
+ textarea.style.height = `${textarea.scrollHeight}px`;
2322
+ }
2323
+ }, [isInEditMode, textareaRef, value]);
2324
+ return /* @__PURE__ */ jsxRuntime.jsx(
2325
+ "textarea",
2326
+ {
2327
+ ref: textareaRef,
2328
+ value,
2329
+ onChange: (e) => onChange(e.target.value),
2330
+ style: {
2331
+ backgroundColor: "#fffbea",
2332
+ overflow: "hidden",
2333
+ resize: "none",
2334
+ width: "100%"
2335
+ }
2336
+ }
2337
+ );
2338
+ };
2339
+ var AutoResizingTextarea_default = AutoResizingTextarea;
2340
+ var NextGameCountdown = ({ nextGameTime }) => {
2341
+ const [timeLeft, setTimeLeft] = React7.useState("");
2342
+ React7.useEffect(() => {
2343
+ if (!nextGameTime) return;
2344
+ const timer = setInterval(() => {
2345
+ const now = (/* @__PURE__ */ new Date()).getTime();
2346
+ const distance = new Date(nextGameTime).getTime() - now;
2347
+ if (distance < 0) {
2348
+ clearInterval(timer);
2349
+ setTimeLeft("Started");
2350
+ return;
2351
+ }
2352
+ const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
2353
+ const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
2354
+ const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
2355
+ const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
2356
+ let timeString = "";
2357
+ if (days > 0) timeString += `${days}d `;
2358
+ if (hours > 0 || days > 0) timeString += `${hours}h `;
2359
+ timeString += `${minutes}m ${seconds}s`;
2360
+ setTimeLeft(timeString);
2361
+ }, 1e3);
2362
+ return () => clearInterval(timer);
2363
+ }, [nextGameTime]);
2364
+ if (!nextGameTime) return null;
2365
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
2366
+ "Next Game: ",
2367
+ timeLeft
2368
+ ] });
2369
+ };
2370
+ function TablePageLayout(props) {
2371
+ var _a;
2372
+ const { allTags, dungeonMaster, onDeleteTable, onJoinWaitlist, onLeaveTable, onSaveDraft, players, table, tableStatus, waitlistPlayers } = props;
2373
+ const textAreaRef = React7.useRef(null);
2374
+ const [isTableInEditMode, setIsTableInEditMode] = React7.useState(false);
2375
+ const [currentDescription, setCurrentDescription] = React7.useState(table.description);
2376
+ const [currentDungeonMaster, setCurrentDungeonMaster] = React7.useState(dungeonMaster);
2377
+ const [currentPlayers, setCurrentPlayers] = React7.useState(players);
2378
+ const [currentShortDescription, setCurrentShortDescription] = React7.useState(table.shortDescription);
2379
+ const [currentTitle, setCurrentTitle] = React7.useState(table.title);
2380
+ const [currentWaitlistPlayers, setCurrentWaitlistPlayers] = React7.useState(waitlistPlayers);
2381
+ const [currentTagIds, setCurrentTagIds] = React7.useState((_a = table.tags) != null ? _a : []);
2382
+ React7.useEffect(() => {
2383
+ var _a2;
2384
+ setCurrentDescription(table.description);
2385
+ setCurrentDungeonMaster(dungeonMaster);
2386
+ setCurrentPlayers(players);
2387
+ setCurrentShortDescription(table.shortDescription);
2388
+ setCurrentTitle(table.title);
2389
+ setCurrentWaitlistPlayers(waitlistPlayers);
2390
+ setCurrentTagIds((_a2 = table.tags) != null ? _a2 : []);
2391
+ }, [dungeonMaster, players, table, waitlistPlayers]);
2392
+ const currentTags = React7.useMemo(
2393
+ () => allTags.filter((tag) => currentTagIds.includes(tag.id)),
2394
+ [allTags, currentTagIds]
2395
+ );
2396
+ const handleAssignToDungeonMaster = (newDungeonMaster) => {
2397
+ setCurrentDungeonMaster(newDungeonMaster);
2398
+ };
2399
+ const handleRemovePlayerFromTable = (playerToRemove) => {
2400
+ setCurrentPlayers((prevState) => prevState.filter((player) => player.id !== playerToRemove.id));
2401
+ };
2402
+ const handlePromoteWaitlistPlayer = (playerIdToPromote) => {
2403
+ setCurrentWaitlistPlayers((prevWaitlist) => {
2404
+ const foundPlayer = prevWaitlist.find((player) => player.id === playerIdToPromote);
2405
+ if (!foundPlayer) {
2406
+ return prevWaitlist;
2407
+ }
2408
+ setCurrentPlayers((prevPlayers) => [...prevPlayers, foundPlayer]);
2409
+ return prevWaitlist.filter((player) => player.id !== playerIdToPromote);
2410
+ });
2411
+ };
2412
+ const handleToggleTag = (tagId) => {
2413
+ setCurrentTagIds(
2414
+ (prevState) => prevState.includes(tagId) ? prevState.filter((id) => id !== tagId) : [...prevState, tagId]
2415
+ );
2416
+ };
2417
+ const handleSaveTable = () => {
2418
+ const nextDraft = {
2419
+ ...table,
2420
+ description: currentDescription,
2421
+ dungeonMaster: String(currentDungeonMaster.id),
2422
+ players: currentPlayers.map((player) => player.id),
2423
+ shortDescription: currentShortDescription,
2424
+ tags: currentTagIds,
2425
+ title: currentTitle,
2426
+ waitlist: currentWaitlistPlayers.map((player) => player.id)
2427
+ };
2428
+ void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
2429
+ setIsTableInEditMode(false);
2430
+ };
2431
+ return /* @__PURE__ */ jsxRuntime.jsx(
2432
+ material.Card,
2433
+ {
2434
+ sx: {
2435
+ backgroundColor: isTableInEditMode ? "lightsalmon" : "white",
2436
+ borderRadius: "5%",
2437
+ p: 2,
2438
+ boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)"
2439
+ },
2440
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, direction: "column", children: [
2441
+ /* @__PURE__ */ jsxRuntime.jsxs(
2442
+ Grid9__default.default,
2443
+ {
2444
+ container: true,
2445
+ direction: "column",
2446
+ spacing: 1,
2447
+ sx: {
2448
+ px: 2,
2449
+ py: 1.5,
2450
+ borderRadius: 2,
2451
+ background: "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))",
2452
+ textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)"
2453
+ },
2454
+ children: [
2455
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2456
+ "input",
2457
+ {
2458
+ onChange: (e) => setCurrentTitle(e.target.value),
2459
+ style: { backgroundColor: "#fffbea" },
2460
+ tabIndex: 0,
2461
+ type: "text",
2462
+ value: currentTitle
2463
+ }
2464
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
2465
+ material.CardHeader,
2466
+ {
2467
+ title: currentTitle,
2468
+ sx: {
2469
+ p: 0,
2470
+ "& .MuiCardHeader-title": {
2471
+ color: "white",
2472
+ fontWeight: 700
2473
+ }
2474
+ }
2475
+ }
2476
+ ) }),
2477
+ isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2478
+ "input",
2479
+ {
2480
+ onChange: (e) => setCurrentShortDescription(e.target.value),
2481
+ style: { backgroundColor: "#fffbea" },
2482
+ tabIndex: 0,
2483
+ type: "text",
2484
+ value: currentShortDescription
2485
+ }
2486
+ ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { color: "white", opacity: 0.95 }, children: currentShortDescription }),
2487
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, children: isTableInEditMode ? renderEditableTags(currentTags, allTags, handleToggleTag) : renderTags(currentTagIds, allTags) }),
2488
+ /* @__PURE__ */ jsxRuntime.jsx(
2489
+ TableActionsBar,
2490
+ {
2491
+ isInEditMode: isTableInEditMode,
2492
+ numPlayers: currentPlayers.length,
2493
+ onDeleteTable,
2494
+ onEditModeChange: setIsTableInEditMode,
2495
+ onJoinWaitlist,
2496
+ onLeaveTable,
2497
+ onPromoteWaitlistPlayer: handlePromoteWaitlistPlayer,
2498
+ onSave: handleSaveTable,
2499
+ slots: table.capacity || 0,
2500
+ tableStatus,
2501
+ waitlistPlayers: currentWaitlistPlayers
2502
+ }
2503
+ )
2504
+ ]
2505
+ }
2506
+ ),
2507
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { container: true, spacing: 2, sx: { mt: 2 }, children: [
2508
+ /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12, md: 8 }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Card, { sx: { height: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { children: isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2509
+ AutoResizingTextarea_default,
2510
+ {
2511
+ isInEditMode: isTableInEditMode,
2512
+ onChange: setCurrentDescription,
2513
+ textareaRef: textAreaRef,
2514
+ value: currentDescription
2515
+ }
2516
+ ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { whiteSpace: "pre-wrap" }, children: currentDescription }) }) }) }),
2517
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid9__default.default, { size: { xs: 12, md: 4 }, children: [
2518
+ /* @__PURE__ */ jsxRuntime.jsx(DMHighlightsCard, { canEdit: isTableInEditMode, player: currentDungeonMaster, allTags }),
2519
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { sx: { height: "100%" }, children: [
2520
+ /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Players: " }),
2521
+ /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { children: currentPlayers.map((player) => /* @__PURE__ */ jsxRuntime.jsx(
2522
+ PlayerHighlightsCard,
2523
+ {
2524
+ allTags,
2525
+ canChangeDungeonMaster: tableStatus.isOwner || tableStatus.isDM,
2526
+ canEdit: isTableInEditMode,
2527
+ handleAssignToDungeonMaster,
2528
+ player,
2529
+ removeFromTable: handleRemovePlayerFromTable
2530
+ },
2531
+ player.id
2532
+ )) })
2533
+ ] })
2534
+ ] })
2535
+ ] })
2536
+ ] })
2537
+ }
2538
+ );
2539
+ }
2540
+ var renderTags = function(tags, allTags) {
2541
+ if (!tags || !allTags) {
2542
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2543
+ }
2544
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { container: true, spacing: 1, sx: { pb: 1.5 }, children: tags.map((tagId) => {
2545
+ const tag = allTags.find((potentialTag) => tagId === potentialTag.id);
2546
+ return tag ? generateTagsDisplay(tag) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2547
+ }) });
2548
+ };
2549
+ var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
2550
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid9__default.default, { size: { xs: 12 }, sx: { pb: 1.5 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2551
+ TagEditor,
2552
+ {
2553
+ title: "Table Tags",
2554
+ possibleTags: allTags.filter((tag) => {
2555
+ var _a;
2556
+ return (_a = tag.appliesTo) == null ? void 0 : _a.tables;
2557
+ }),
2558
+ selectedTags,
2559
+ onToggleTag
2560
+ }
2561
+ ) });
2562
+ };
2563
+ var TablePageLayout_default = TablePageLayout;
2564
+
2565
+ exports.AutoResizingTextarea = AutoResizingTextarea_default;
2566
+ exports.BaseSearchResultCard = BaseSearchResultCard_default;
2567
+ exports.CANDIDATE_TIMEZONES = CANDIDATE_TIMEZONES;
2568
+ exports.DMHighlightsCard = DMHighlightsCard;
2569
+ exports.EventBanner = EventBanner;
2570
+ exports.EventBannerEdit = EventBannerEdit;
2571
+ exports.EventBasicInfo = EventBasicInfo;
2572
+ exports.EventBasicInfoEdit = EventBasicInfoEdit;
2573
+ exports.EventEditProvider = EventEditProvider;
2574
+ exports.EventPageLayout = EventPageLayout;
2575
+ exports.EventResultCard = EventResultCard_default;
2576
+ exports.EventTablesCard = EventTablesCard_default;
2577
+ exports.FiltersContainer = FiltersContainer_default;
2578
+ exports.GameTableProvider = GameTableProvider;
2579
+ exports.ModalContext = ModalContext;
2580
+ exports.ModalProvider = ModalProvider_default;
2581
+ exports.NextGameCountdown = NextGameCountdown;
2582
+ exports.PlayerDetailsCard = PlayerDetailsCard_default;
2583
+ exports.PlayerDisplayCard = PlayerDisplayCard_default;
2584
+ exports.PlayerHighlightsCard = PlayerHighlightsCard;
2585
+ exports.PlayerPromptCard = PlayerPromptCard_default;
2586
+ exports.PlayerResultCard = PlayerResultCard_default;
2587
+ exports.PlayerTagsCard = PlayerTagsCard;
2588
+ exports.PlayerTagsEdit = PlayerTagsEdit;
2589
+ exports.PlayersScrollableList = PlayersScrollableList_default;
2590
+ exports.ResultsContainer = ResultsContainer_default;
2591
+ exports.ScrollableResultsList = ScrollableResultsList_default;
2592
+ exports.SearchPageLayout = SearchPageLayout;
2593
+ exports.SearchResultCard = SearchResultCard_default;
2594
+ exports.SortOptions = SortOptions_default;
2595
+ exports.TableActionsBar = TableActionsBar;
2596
+ exports.TablePageLayout = TablePageLayout_default;
2597
+ exports.TableResultCard = TableResultCard_default;
2598
+ exports.TablesScrollableList = TablesScrollableList_default;
2599
+ exports.TagEditor = TagEditor;
2600
+ exports.TagsFilter = TagsFilter_default;
2601
+ exports.TypeFilter = TypeFilter_default;
2602
+ exports.generateTagsDisplay = generateTagsDisplay;
2603
+ exports.renderTagsFromIds = renderTagsFromIds;
2604
+ exports.useEventEdit = useEventEdit;
2605
+ exports.useGameTableContext = useGameTableContext;
2606
+ exports.useModal = useModal;
2607
+ //# sourceMappingURL=index.cjs.map
2608
+ //# sourceMappingURL=index.cjs.map