@mbpockets/shared-ui 0.1.21 → 0.2.5

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 (205) hide show
  1. package/dist/EventPage/editMode/index.cjs.map +1 -1
  2. package/dist/EventPage/editMode/index.d.cts +1 -1
  3. package/dist/EventPage/editMode/index.d.ts +1 -1
  4. package/dist/EventPage/editMode/index.mjs.map +1 -1
  5. package/dist/EventPage/editMode.cjs.map +1 -1
  6. package/dist/EventPage/editMode.d.cts +1 -1
  7. package/dist/EventPage/editMode.d.ts +1 -1
  8. package/dist/EventPage/editMode.mjs.map +1 -1
  9. package/dist/EventPage/index.cjs +122 -65
  10. package/dist/EventPage/index.cjs.map +1 -1
  11. package/dist/EventPage/index.d.cts +1 -1
  12. package/dist/EventPage/index.d.ts +1 -1
  13. package/dist/EventPage/index.mjs +122 -65
  14. package/dist/EventPage/index.mjs.map +1 -1
  15. package/dist/EventPage.cjs +122 -65
  16. package/dist/EventPage.cjs.map +1 -1
  17. package/dist/EventPage.d.cts +4 -4
  18. package/dist/EventPage.d.ts +4 -4
  19. package/dist/EventPage.mjs +122 -65
  20. package/dist/EventPage.mjs.map +1 -1
  21. package/dist/PlayerPage/index.cjs +12 -8
  22. package/dist/PlayerPage/index.cjs.map +1 -1
  23. package/dist/PlayerPage/index.mjs +12 -8
  24. package/dist/PlayerPage/index.mjs.map +1 -1
  25. package/dist/PlayerPage.cjs +12 -8
  26. package/dist/PlayerPage.cjs.map +1 -1
  27. package/dist/PlayerPage.mjs +12 -8
  28. package/dist/PlayerPage.mjs.map +1 -1
  29. package/dist/ProfilePage/index.cjs +12 -8
  30. package/dist/ProfilePage/index.cjs.map +1 -1
  31. package/dist/ProfilePage/index.mjs +12 -8
  32. package/dist/ProfilePage/index.mjs.map +1 -1
  33. package/dist/ProfilePage.cjs +12 -8
  34. package/dist/ProfilePage.cjs.map +1 -1
  35. package/dist/ProfilePage.mjs +12 -8
  36. package/dist/ProfilePage.mjs.map +1 -1
  37. package/dist/SearchPage/Filters/index.cjs +38 -18
  38. package/dist/SearchPage/Filters/index.cjs.map +1 -1
  39. package/dist/SearchPage/Filters/index.d.cts +2 -1
  40. package/dist/SearchPage/Filters/index.d.ts +2 -1
  41. package/dist/SearchPage/Filters/index.mjs +34 -17
  42. package/dist/SearchPage/Filters/index.mjs.map +1 -1
  43. package/dist/SearchPage/Filters.cjs +38 -18
  44. package/dist/SearchPage/Filters.cjs.map +1 -1
  45. package/dist/SearchPage/Filters.d.cts +13 -1
  46. package/dist/SearchPage/Filters.d.ts +13 -1
  47. package/dist/SearchPage/Filters.mjs +34 -17
  48. package/dist/SearchPage/Filters.mjs.map +1 -1
  49. package/dist/SearchPage/Results/index.cjs +87 -49
  50. package/dist/SearchPage/Results/index.cjs.map +1 -1
  51. package/dist/SearchPage/Results/index.mjs +87 -49
  52. package/dist/SearchPage/Results/index.mjs.map +1 -1
  53. package/dist/SearchPage/Results.cjs +87 -49
  54. package/dist/SearchPage/Results.cjs.map +1 -1
  55. package/dist/SearchPage/Results.d.cts +10 -3
  56. package/dist/SearchPage/Results.d.ts +10 -3
  57. package/dist/SearchPage/Results.mjs +87 -49
  58. package/dist/SearchPage/Results.mjs.map +1 -1
  59. package/dist/SearchPage/index.cjs +208 -101
  60. package/dist/SearchPage/index.cjs.map +1 -1
  61. package/dist/SearchPage/index.d.cts +2 -2
  62. package/dist/SearchPage/index.d.ts +2 -2
  63. package/dist/SearchPage/index.mjs +204 -100
  64. package/dist/SearchPage/index.mjs.map +1 -1
  65. package/dist/SearchPage.cjs +208 -101
  66. package/dist/SearchPage.cjs.map +1 -1
  67. package/dist/SearchPage.d.cts +25 -3
  68. package/dist/SearchPage.d.ts +25 -3
  69. package/dist/SearchPage.mjs +204 -100
  70. package/dist/SearchPage.mjs.map +1 -1
  71. package/dist/TablePage/EditComponents/index.cjs +296 -0
  72. package/dist/TablePage/EditComponents/index.cjs.map +1 -0
  73. package/dist/TablePage/EditComponents/index.d.cts +3 -0
  74. package/dist/TablePage/EditComponents/index.d.ts +3 -0
  75. package/dist/TablePage/EditComponents/index.mjs +286 -0
  76. package/dist/TablePage/EditComponents/index.mjs.map +1 -0
  77. package/dist/TablePage/EditComponents.cjs +296 -0
  78. package/dist/TablePage/EditComponents.cjs.map +1 -0
  79. package/dist/TablePage/EditComponents.d.cts +21 -0
  80. package/dist/TablePage/EditComponents.d.ts +21 -0
  81. package/dist/TablePage/EditComponents.mjs +286 -0
  82. package/dist/TablePage/EditComponents.mjs.map +1 -0
  83. package/dist/TablePage/ModalProvider/index.cjs +59 -58
  84. package/dist/TablePage/ModalProvider/index.cjs.map +1 -1
  85. package/dist/TablePage/ModalProvider/index.d.cts +1 -1
  86. package/dist/TablePage/ModalProvider/index.d.ts +1 -1
  87. package/dist/TablePage/ModalProvider/index.mjs +50 -59
  88. package/dist/TablePage/ModalProvider/index.mjs.map +1 -1
  89. package/dist/TablePage/ModalProvider.cjs +59 -58
  90. package/dist/TablePage/ModalProvider.cjs.map +1 -1
  91. package/dist/TablePage/ModalProvider.d.cts +7 -2
  92. package/dist/TablePage/ModalProvider.d.ts +7 -2
  93. package/dist/TablePage/ModalProvider.mjs +50 -59
  94. package/dist/TablePage/ModalProvider.mjs.map +1 -1
  95. package/dist/TablePage/index.cjs +555 -331
  96. package/dist/TablePage/index.cjs.map +1 -1
  97. package/dist/TablePage/index.d.cts +3 -2
  98. package/dist/TablePage/index.d.ts +3 -2
  99. package/dist/TablePage/index.mjs +539 -320
  100. package/dist/TablePage/index.mjs.map +1 -1
  101. package/dist/TablePage/players/index.cjs +24 -4
  102. package/dist/TablePage/players/index.cjs.map +1 -1
  103. package/dist/TablePage/players/index.mjs +24 -4
  104. package/dist/TablePage/players/index.mjs.map +1 -1
  105. package/dist/TablePage/players.cjs +24 -4
  106. package/dist/TablePage/players.cjs.map +1 -1
  107. package/dist/TablePage/players.mjs +24 -4
  108. package/dist/TablePage/players.mjs.map +1 -1
  109. package/dist/TablePage.cjs +555 -331
  110. package/dist/TablePage.cjs.map +1 -1
  111. package/dist/TablePage.d.cts +4 -1
  112. package/dist/TablePage.d.ts +4 -1
  113. package/dist/TablePage.mjs +539 -320
  114. package/dist/TablePage.mjs.map +1 -1
  115. package/dist/{index-D7WHhl3Q.d.ts → index-B23RQop0.d.ts} +12 -12
  116. package/dist/{index-DC0kK3aC.d.cts → index-Csj8S4A4.d.cts} +12 -12
  117. package/dist/index.cjs +890 -426
  118. package/dist/index.cjs.map +1 -1
  119. package/dist/index.d.cts +5 -4
  120. package/dist/index.d.ts +5 -4
  121. package/dist/index.mjs +871 -423
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/mocks/{EventDB.cjs → EventDetails.cjs} +203 -3
  124. package/dist/mocks/EventDetails.cjs.map +1 -0
  125. package/dist/mocks/EventDetails.d.cts +6 -0
  126. package/dist/mocks/EventDetails.d.ts +6 -0
  127. package/dist/mocks/{EventDB.mjs → EventDetails.mjs} +203 -3
  128. package/dist/mocks/EventDetails.mjs.map +1 -0
  129. package/dist/mocks/Tables.cjs +1 -1
  130. package/dist/mocks/Tables.cjs.map +1 -1
  131. package/dist/mocks/Tables.mjs +1 -1
  132. package/dist/mocks/Tables.mjs.map +1 -1
  133. package/dist/mocks/Tags.cjs +200 -0
  134. package/dist/mocks/Tags.cjs.map +1 -1
  135. package/dist/mocks/Tags.mjs +200 -0
  136. package/dist/mocks/Tags.mjs.map +1 -1
  137. package/dist/mocks/index.cjs +202 -2
  138. package/dist/mocks/index.cjs.map +1 -1
  139. package/dist/mocks/index.d.cts +1 -1
  140. package/dist/mocks/index.d.ts +1 -1
  141. package/dist/mocks/index.mjs +202 -2
  142. package/dist/mocks/index.mjs.map +1 -1
  143. package/dist/mocks.cjs +202 -2
  144. package/dist/mocks.cjs.map +1 -1
  145. package/dist/mocks.d.cts +1 -1
  146. package/dist/mocks.d.ts +1 -1
  147. package/dist/mocks.mjs +202 -2
  148. package/dist/mocks.mjs.map +1 -1
  149. package/dist/shared/index.cjs +327 -64
  150. package/dist/shared/index.cjs.map +1 -1
  151. package/dist/shared/index.d.cts +1 -1
  152. package/dist/shared/index.d.ts +1 -1
  153. package/dist/shared/index.mjs +324 -64
  154. package/dist/shared/index.mjs.map +1 -1
  155. package/dist/shared.cjs +327 -64
  156. package/dist/shared.cjs.map +1 -1
  157. package/dist/shared.d.cts +25 -2
  158. package/dist/shared.d.ts +25 -2
  159. package/dist/shared.mjs +324 -64
  160. package/dist/shared.mjs.map +1 -1
  161. package/dist/types/event.d.cts +2 -3
  162. package/dist/types/event.d.ts +2 -3
  163. package/dist/types/index.d.cts +2 -2
  164. package/dist/types/index.d.ts +2 -2
  165. package/dist/types/search.d.cts +7 -1
  166. package/dist/types/search.d.ts +7 -1
  167. package/dist/types/tables.d.cts +1 -0
  168. package/dist/types/tables.d.ts +1 -0
  169. package/dist/types.d.cts +2 -2
  170. package/dist/types.d.ts +2 -2
  171. package/package.json +9 -2
  172. package/dist/TablePage/ModalProvider/index.css +0 -49
  173. package/dist/TablePage/ModalProvider/index.css.map +0 -1
  174. package/dist/TablePage/ModalProvider.css +0 -49
  175. package/dist/TablePage/ModalProvider.css.map +0 -1
  176. package/dist/TablePage/index.css +0 -49
  177. package/dist/TablePage/index.css.map +0 -1
  178. package/dist/TablePage.css +0 -49
  179. package/dist/TablePage.css.map +0 -1
  180. package/dist/index.css +0 -49
  181. package/dist/index.css.map +0 -1
  182. package/dist/mocks/EventDB.cjs.map +0 -1
  183. package/dist/mocks/EventDB.d.cts +0 -6
  184. package/dist/mocks/EventDB.d.ts +0 -6
  185. package/dist/mocks/EventDB.mjs.map +0 -1
  186. package/dist/shared/Modal/index.cjs +0 -64
  187. package/dist/shared/Modal/index.cjs.map +0 -1
  188. package/dist/shared/Modal/index.css +0 -49
  189. package/dist/shared/Modal/index.css.map +0 -1
  190. package/dist/shared/Modal/index.d.cts +0 -2
  191. package/dist/shared/Modal/index.d.ts +0 -2
  192. package/dist/shared/Modal/index.mjs +0 -62
  193. package/dist/shared/Modal/index.mjs.map +0 -1
  194. package/dist/shared/Modal.cjs +0 -64
  195. package/dist/shared/Modal.cjs.map +0 -1
  196. package/dist/shared/Modal.css +0 -49
  197. package/dist/shared/Modal.css.map +0 -1
  198. package/dist/shared/Modal.d.cts +0 -9
  199. package/dist/shared/Modal.d.ts +0 -9
  200. package/dist/shared/Modal.mjs +0 -62
  201. package/dist/shared/Modal.mjs.map +0 -1
  202. package/dist/shared/index.css +0 -49
  203. package/dist/shared/index.css.map +0 -1
  204. package/dist/shared.css +0 -49
  205. package/dist/shared.css.map +0 -1
package/dist/index.cjs CHANGED
@@ -5,13 +5,13 @@ var React7 = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var material = require('@mui/material');
7
7
  var DeleteIcon = require('@mui/icons-material/Delete');
8
- var EditIcon = require('@mui/icons-material/Edit');
8
+ var EditIcon3 = require('@mui/icons-material/Edit');
9
9
  var AddIcon = require('@mui/icons-material/Add');
10
10
  var ColorizeIcon = require('@mui/icons-material/Colorize');
11
11
  var CancelIcon = require('@mui/icons-material/Cancel');
12
12
  var CheckCircleIcon = require('@mui/icons-material/CheckCircle');
13
13
  var Box2 = require('@mui/material/Box');
14
- var Grid8 = require('@mui/material/Grid');
14
+ var Grid10 = require('@mui/material/Grid');
15
15
  var Card10 = require('@mui/material/Card');
16
16
  var CardContent10 = require('@mui/material/CardContent');
17
17
  var CardHeader4 = require('@mui/material/CardHeader');
@@ -19,6 +19,7 @@ var Divider3 = require('@mui/material/Divider');
19
19
  var Typography4 = require('@mui/material/Typography');
20
20
  var Pagination = require('@mui/material/Pagination');
21
21
  var Avatar = require('@mui/material/Avatar');
22
+ var navigation = require('next/navigation');
22
23
  var Chip2 = require('@mui/material/Chip');
23
24
  var LinearProgress = require('@mui/material/LinearProgress');
24
25
  var PersonIcon = require('@mui/icons-material/Person');
@@ -29,31 +30,41 @@ var LocationOnIcon = require('@mui/icons-material/LocationOn');
29
30
  var EventIcon = require('@mui/icons-material/Event');
30
31
  var Autocomplete = require('@mui/material/Autocomplete');
31
32
  var Popper = require('@mui/material/Popper');
33
+ var FormControl2 = require('@mui/material/FormControl');
34
+ var Select2 = require('@mui/material/Select');
35
+ var MenuItem2 = require('@mui/material/MenuItem');
32
36
  var FormControlLabel = require('@mui/material/FormControlLabel');
33
37
  var Checkbox = require('@mui/material/Checkbox');
34
- var FormControl2 = require('@mui/material/FormControl');
35
38
  var RadioGroup = require('@mui/material/RadioGroup');
36
39
  var Radio = require('@mui/material/Radio');
37
- var TextField4 = require('@mui/material/TextField');
40
+ var TextField7 = require('@mui/material/TextField');
38
41
  var FormGroup = require('@mui/material/FormGroup');
39
- var Button7 = require('@mui/material/Button');
42
+ var Button8 = require('@mui/material/Button');
40
43
  var SearchIcon = require('@mui/icons-material/Search');
41
44
  var CircularProgress3 = require('@mui/material/CircularProgress');
45
+ var CasinoIcon = require('@mui/icons-material/Casino');
46
+ var Dialog3 = require('@mui/material/Dialog');
47
+ var DialogContent3 = require('@mui/material/DialogContent');
48
+ var DialogActions3 = require('@mui/material/DialogActions');
49
+ var IconButton3 = require('@mui/material/IconButton');
50
+ var CloseIcon = require('@mui/icons-material/Close');
51
+ var ReactMarkdown = require('react-markdown');
42
52
  var Image2 = require('next/image');
43
53
  var ListIcon = require('@mui/icons-material/List');
44
54
  var SaveIcon = require('@mui/icons-material/Save');
55
+ var DialogTitle3 = require('@mui/material/DialogTitle');
45
56
 
46
57
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
47
58
 
48
59
  var React7__default = /*#__PURE__*/_interopDefault(React7);
49
60
  var DeleteIcon__default = /*#__PURE__*/_interopDefault(DeleteIcon);
50
- var EditIcon__default = /*#__PURE__*/_interopDefault(EditIcon);
61
+ var EditIcon3__default = /*#__PURE__*/_interopDefault(EditIcon3);
51
62
  var AddIcon__default = /*#__PURE__*/_interopDefault(AddIcon);
52
63
  var ColorizeIcon__default = /*#__PURE__*/_interopDefault(ColorizeIcon);
53
64
  var CancelIcon__default = /*#__PURE__*/_interopDefault(CancelIcon);
54
65
  var CheckCircleIcon__default = /*#__PURE__*/_interopDefault(CheckCircleIcon);
55
66
  var Box2__default = /*#__PURE__*/_interopDefault(Box2);
56
- var Grid8__default = /*#__PURE__*/_interopDefault(Grid8);
67
+ var Grid10__default = /*#__PURE__*/_interopDefault(Grid10);
57
68
  var Card10__default = /*#__PURE__*/_interopDefault(Card10);
58
69
  var CardContent10__default = /*#__PURE__*/_interopDefault(CardContent10);
59
70
  var CardHeader4__default = /*#__PURE__*/_interopDefault(CardHeader4);
@@ -71,19 +82,29 @@ var LocationOnIcon__default = /*#__PURE__*/_interopDefault(LocationOnIcon);
71
82
  var EventIcon__default = /*#__PURE__*/_interopDefault(EventIcon);
72
83
  var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
73
84
  var Popper__default = /*#__PURE__*/_interopDefault(Popper);
85
+ var FormControl2__default = /*#__PURE__*/_interopDefault(FormControl2);
86
+ var Select2__default = /*#__PURE__*/_interopDefault(Select2);
87
+ var MenuItem2__default = /*#__PURE__*/_interopDefault(MenuItem2);
74
88
  var FormControlLabel__default = /*#__PURE__*/_interopDefault(FormControlLabel);
75
89
  var Checkbox__default = /*#__PURE__*/_interopDefault(Checkbox);
76
- var FormControl2__default = /*#__PURE__*/_interopDefault(FormControl2);
77
90
  var RadioGroup__default = /*#__PURE__*/_interopDefault(RadioGroup);
78
91
  var Radio__default = /*#__PURE__*/_interopDefault(Radio);
79
- var TextField4__default = /*#__PURE__*/_interopDefault(TextField4);
92
+ var TextField7__default = /*#__PURE__*/_interopDefault(TextField7);
80
93
  var FormGroup__default = /*#__PURE__*/_interopDefault(FormGroup);
81
- var Button7__default = /*#__PURE__*/_interopDefault(Button7);
94
+ var Button8__default = /*#__PURE__*/_interopDefault(Button8);
82
95
  var SearchIcon__default = /*#__PURE__*/_interopDefault(SearchIcon);
83
96
  var CircularProgress3__default = /*#__PURE__*/_interopDefault(CircularProgress3);
97
+ var CasinoIcon__default = /*#__PURE__*/_interopDefault(CasinoIcon);
98
+ var Dialog3__default = /*#__PURE__*/_interopDefault(Dialog3);
99
+ var DialogContent3__default = /*#__PURE__*/_interopDefault(DialogContent3);
100
+ var DialogActions3__default = /*#__PURE__*/_interopDefault(DialogActions3);
101
+ var IconButton3__default = /*#__PURE__*/_interopDefault(IconButton3);
102
+ var CloseIcon__default = /*#__PURE__*/_interopDefault(CloseIcon);
103
+ var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
84
104
  var Image2__default = /*#__PURE__*/_interopDefault(Image2);
85
105
  var ListIcon__default = /*#__PURE__*/_interopDefault(ListIcon);
86
106
  var SaveIcon__default = /*#__PURE__*/_interopDefault(SaveIcon);
107
+ var DialogTitle3__default = /*#__PURE__*/_interopDefault(DialogTitle3);
87
108
 
88
109
  // src/components/EventPage/editMode/EventBannerEdit.tsx
89
110
  var defaultValue = {
@@ -172,12 +193,29 @@ function Chip({ tag, removeCallback }) {
172
193
  function generateTagsDisplay(tag) {
173
194
  return /* @__PURE__ */ jsxRuntime.jsx(Chip, { tag }, tag.id);
174
195
  }
175
- function renderTagsFromIds(ids, legalTags) {
196
+ function renderTagsFromIds(ids, legalTags, options = {}) {
176
197
  if (!ids || !legalTags || legalTags.length === 0) {
177
198
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
178
199
  }
200
+ const { showEventTag = false, eventTagId } = options;
179
201
  const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
180
- return validTags.map((tag) => generateTagsDisplay(tag));
202
+ const sortedTags = [...validTags].sort((a, b) => {
203
+ if (showEventTag && eventTagId !== void 0) {
204
+ if (a.id === eventTagId && b.id === eventTagId) return 0;
205
+ if (a.id === eventTagId) return -1;
206
+ if (b.id === eventTagId) return 1;
207
+ }
208
+ const priorityOrder = ["Organizer Run", "Display Only"];
209
+ const aIndex = priorityOrder.indexOf(a.label);
210
+ const bIndex = priorityOrder.indexOf(b.label);
211
+ if (aIndex !== -1 && bIndex !== -1) {
212
+ return aIndex - bIndex;
213
+ }
214
+ if (aIndex !== -1) return -1;
215
+ if (bIndex !== -1) return 1;
216
+ return 0;
217
+ });
218
+ return sortedTags.map((tag) => generateTagsDisplay(tag));
181
219
  }
182
220
  function EventBannerEdit({
183
221
  initialValue,
@@ -401,7 +439,7 @@ function EventBannerEdit({
401
439
  children: [
402
440
  link.text,
403
441
  /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { ml: 1, display: "flex" }, children: [
404
- /* @__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" }) }) }),
442
+ /* @__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(EditIcon3__default.default, { fontSize: "inherit" }) }) }),
405
443
  /* @__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" }) }) })
406
444
  ] })
407
445
  ]
@@ -528,7 +566,7 @@ function EventBasicInfo(props) {
528
566
  );
529
567
  }
530
568
  function EventBasicInfoView({ description, locationId, startingDate, endingDate, timeInfo, timezone, isOwner, onEdit }) {
531
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { sx: { position: "relative" }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Card, { style: {
569
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { sx: { position: "relative" }, children: /* @__PURE__ */ jsxRuntime.jsx(material.Card, { style: {
532
570
  boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
533
571
  background: "linear-gradient(135deg, rgba(225, 225, 225, 1), rgba(250, 250, 250, 1))"
534
572
  }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { children: [
@@ -812,7 +850,7 @@ function EventBannerView({
812
850
  }) {
813
851
  const backgroundColor = bannerColor || "linear-gradient(135deg, rgba(25,118,210,0.8), rgba(25,118,210,1))";
814
852
  return /* @__PURE__ */ jsxRuntime.jsxs(
815
- Grid8__default.default,
853
+ Grid10__default.default,
816
854
  {
817
855
  sx: {
818
856
  background: backgroundColor,
@@ -820,7 +858,7 @@ function EventBannerView({
820
858
  position: "relative"
821
859
  },
822
860
  children: [
823
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { children: [
861
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { children: [
824
862
  /* @__PURE__ */ jsxRuntime.jsxs(
825
863
  material.Box,
826
864
  {
@@ -879,7 +917,7 @@ function EventBannerView({
879
917
  }
880
918
  ),
881
919
  /* @__PURE__ */ jsxRuntime.jsxs(
882
- Grid8__default.default,
920
+ Grid10__default.default,
883
921
  {
884
922
  display: "flex",
885
923
  justifyContent: "center",
@@ -987,6 +1025,11 @@ var generateLink = function(link) {
987
1025
  link.text
988
1026
  );
989
1027
  };
1028
+
1029
+ // src/data/values.tsx
1030
+ var DEFAULT_PROFILE_PIC = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2IiB2aWV3Qm94PSIwIDAgMjU2IDI1NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnIHN0eWxlPSJzdHJva2U6IG5vbmU7IHN0cm9rZS13aWR0aDogMDsgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHQ7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1taXRlcmxpbWl0OiAxMDsgZmlsbDogbm9uZTsgZmlsbC1ydWxlOiBub256ZXJvOyBvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40MDY1OTM0MDY1OTM0MDE2IDEuNDA2NTkzNDA2NTkzNDAxNikgc2NhbGUoMi44MSAyLjgxKSI+Cgk8cGF0aCBkPSJNIDQ1IDg4IGMgLTExLjA0OSAwIC0yMS4xOCAtMi4wMDMgLTI5LjAyMSAtOC42MzQgQyA2LjIxMiA3MS4xMDUgMCA1OC43NjQgMCA0NSBDIDAgMjAuMTg3IDIwLjE4NyAwIDQ1IDAgYyAyNC44MTMgMCA0NSAyMC4xODcgNDUgNDUgYyAwIDEzLjc2NSAtNi4yMTIgMjYuMTA1IC0xNS45NzkgMzQuMzY2IEMgNjYuMTgxIDg1Ljk5OCA1Ni4wNDkgODggNDUgODggeiIgc3R5bGU9InN0cm9rZTogbm9uZTsgc3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiBub25lOyBzdHJva2UtbGluZWNhcDogYnV0dDsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyBmaWxsOiByZ2IoMjE0LDIxNCwyMTQpOyBmaWxsLXJ1bGU6IG5vbnplcm87IG9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiBtYXRyaXgoMSAwIDAgMSAwIDApICIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cgk8cGF0aCBkPSJNIDQ1IDYwLjcxIGMgLTExLjQ3OSAwIC0yMC44MTggLTkuMzM5IC0yMC44MTggLTIwLjgxNyBjIDAgLTExLjQ3OSA5LjMzOSAtMjAuODE4IDIwLjgxOCAtMjAuODE4IGMgMTEuNDc5IDAgMjAuODE3IDkuMzM5IDIwLjgxNyAyMC44MTggQyA2NS44MTcgNTEuMzcxIDU2LjQ3OSA2MC43MSA0NSA2MC43MSB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGw6IHJnYigxNjUsMTY0LDE2NCk7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIG1hdHJpeCgxIDAgMCAxIDAgMCkgIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KCTxwYXRoIGQ9Ik0gNDUgOTAgYyAtMTAuNjEzIDAgLTIwLjkyMiAtMy43NzMgLTI5LjAyOCAtMTAuNjI1IGMgLTAuNjQ4IC0wLjU0OCAtMC44OCAtMS40NDQgLTAuNTc5IC0yLjIzNyBDIDIwLjAzNCA2NC45MTkgMzEuOTMzIDU2LjcxIDQ1IDU2LjcxIHMgMjQuOTY2IDguMjA5IDI5LjYwNyAyMC40MjggYyAwLjMwMSAwLjc5MyAwLjA2OSAxLjY4OSAtMC41NzkgMi4yMzcgQyA2NS45MjIgODYuMjI3IDU1LjYxMyA5MCA0NSA5MCB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGw6IHJnYigxNjUsMTY0LDE2NCk7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIG1hdHJpeCgxIDAgMCAxIDAgMCkgIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9nPgo8L3N2Zz4=";
1031
+ var ProfilePictureSettings = {
1032
+ aspectRatio: 4 / 5};
990
1033
  var NextGameLabel = ({ nextGameTime }) => {
991
1034
  const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
992
1035
  return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
@@ -1000,17 +1043,22 @@ var BaseSearchResultCard = ({
1000
1043
  onClick,
1001
1044
  children,
1002
1045
  icon,
1003
- tags
1046
+ tags,
1047
+ showEventTag,
1048
+ eventTagId
1004
1049
  }) => {
1050
+ const router = navigation.useRouter();
1005
1051
  const handleClick = (e) => {
1052
+ const url = `/${result.type}/${result.id}`;
1053
+ if (e.ctrlKey || e.metaKey || e.shiftKey) {
1054
+ e.stopPropagation();
1055
+ window.open(url, "_blank");
1056
+ return;
1057
+ }
1006
1058
  if (onClick) {
1007
- if (e.ctrlKey || e.metaKey || e.shiftKey) {
1008
- e.stopPropagation();
1009
- const url = `/${result.type}/${result.id}`;
1010
- window.open(url, "_blank");
1011
- } else {
1012
- onClick(result.id);
1013
- }
1059
+ onClick(result.id);
1060
+ } else {
1061
+ router.push(url);
1014
1062
  }
1015
1063
  };
1016
1064
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1019,7 +1067,7 @@ var BaseSearchResultCard = ({
1019
1067
  elevation: 6,
1020
1068
  sx: {
1021
1069
  width: "100%",
1022
- cursor: onClick ? "pointer" : "default",
1070
+ cursor: "pointer",
1023
1071
  boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
1024
1072
  transition: "box-shadow 0.3s ease-in-out",
1025
1073
  "&:hover": {
@@ -1038,11 +1086,10 @@ var BaseSearchResultCard = ({
1038
1086
  result.type === "table" ? /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: (() => {
1039
1087
  var _a, _b;
1040
1088
  const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
1041
- if (typeof full !== "string") return "";
1042
1089
  const text = full || "";
1043
1090
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
1044
1091
  })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: result.description }),
1045
- result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags) })
1092
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { mt: 1, display: "flex", flexWrap: "wrap", gap: 1 }, children: renderTagsFromIds(result.tags, tags, { showEventTag, eventTagId }) })
1046
1093
  ] })
1047
1094
  ] })
1048
1095
  }
@@ -1084,7 +1131,7 @@ var PlayerResultCard = ({
1084
1131
  const playerIcon = /* @__PURE__ */ jsxRuntime.jsx(
1085
1132
  Avatar__default.default,
1086
1133
  {
1087
- src: result.imageUrl,
1134
+ src: result.imageUrl || DEFAULT_PROFILE_PIC,
1088
1135
  alt: result.title,
1089
1136
  sx: {
1090
1137
  width: 40,
@@ -1100,7 +1147,9 @@ var PlayerResultCard_default = PlayerResultCard;
1100
1147
  var TableResultCard = ({
1101
1148
  result,
1102
1149
  onClick,
1103
- tags
1150
+ tags,
1151
+ showEventTag,
1152
+ eventTagId
1104
1153
  }) => {
1105
1154
  const rawCapacity = result.capacity;
1106
1155
  const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
@@ -1118,40 +1167,51 @@ var TableResultCard = ({
1118
1167
  }
1119
1168
  }
1120
1169
  );
1121
- return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1122
- /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1123
- /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1124
- /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
1125
- " ",
1126
- hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1127
- ] }),
1128
- typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
1129
- Chip2__default.default,
1130
- {
1131
- icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
1132
- label: hasDM ? "DM Present" : "No DM",
1133
- color: hasDM ? "success" : "warning",
1134
- size: "small"
1135
- }
1136
- )
1137
- ] }),
1138
- /* @__PURE__ */ jsxRuntime.jsx(
1139
- LinearProgress__default.default,
1140
- {
1141
- variant: "determinate",
1142
- value: occupancyPercentage,
1143
- sx: {
1144
- height: 10,
1145
- borderRadius: 5,
1146
- backgroundColor: "#e0e0e0",
1147
- "& .MuiLinearProgress-bar": {
1148
- backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1170
+ return /* @__PURE__ */ jsxRuntime.jsx(
1171
+ BaseSearchResultCard_default,
1172
+ {
1173
+ result,
1174
+ onClick,
1175
+ icon: tableIcon,
1176
+ tags,
1177
+ showEventTag,
1178
+ eventTagId,
1179
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1180
+ /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1181
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1182
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
1183
+ " ",
1184
+ hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1185
+ ] }),
1186
+ typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
1187
+ Chip2__default.default,
1188
+ {
1189
+ icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
1190
+ label: hasDM ? "DM Present" : "No DM",
1191
+ color: hasDM ? "success" : "warning",
1192
+ size: "small"
1193
+ }
1194
+ )
1195
+ ] }),
1196
+ /* @__PURE__ */ jsxRuntime.jsx(
1197
+ LinearProgress__default.default,
1198
+ {
1199
+ variant: "determinate",
1200
+ value: occupancyPercentage,
1201
+ sx: {
1202
+ height: 10,
1203
+ borderRadius: 5,
1204
+ backgroundColor: "#e0e0e0",
1205
+ "& .MuiLinearProgress-bar": {
1206
+ backgroundColor: hasDefinedCapacity ? availableSlots > 0 ? "#4caf50" : "#f44336" : "#2196f3"
1207
+ }
1208
+ }
1149
1209
  }
1150
- }
1151
- }
1152
- ),
1153
- hasDefinedCapacity && /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
1154
- ] }) });
1210
+ ),
1211
+ hasDefinedCapacity && /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body2", sx: { mt: 0.5, textAlign: "right" }, children: availableSlots > 0 ? `${availableSlots} slot${availableSlots !== 1 ? "s" : ""} available` : "Table full" })
1212
+ ] })
1213
+ }
1214
+ );
1155
1215
  };
1156
1216
  var TableResultCard_default = TableResultCard;
1157
1217
  var EventResultCard = ({
@@ -1169,7 +1229,7 @@ var EventResultCard = ({
1169
1229
  try {
1170
1230
  const date = new Date(dateString);
1171
1231
  return date.toLocaleDateString("en-US", options);
1172
- } catch (error) {
1232
+ } catch (__) {
1173
1233
  return dateString;
1174
1234
  }
1175
1235
  };
@@ -1214,20 +1274,22 @@ var ResultsContainer = ({
1214
1274
  onResultClick,
1215
1275
  tags,
1216
1276
  pagination,
1217
- onPacketChange
1277
+ onPacketChange,
1278
+ showEventTag,
1279
+ eventTagId
1218
1280
  }) => {
1219
1281
  if (!results || results.length === 0 || !results.map) {
1220
1282
  return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1221
1283
  }
1222
- const onPlayerClick = (id) => {
1223
- onResultClick == null ? void 0 : onResultClick(id, "player");
1224
- };
1225
- const onTableClick = (id) => {
1226
- onResultClick == null ? void 0 : onResultClick(id, "table");
1227
- };
1228
- const onEventClick = (id) => {
1229
- onResultClick == null ? void 0 : onResultClick(id, "event");
1230
- };
1284
+ const onPlayerClick = onResultClick ? (id) => {
1285
+ onResultClick(id, "player");
1286
+ } : void 0;
1287
+ const onTableClick = onResultClick ? (id) => {
1288
+ onResultClick(id, "table");
1289
+ } : void 0;
1290
+ const onEventClick = onResultClick ? (id) => {
1291
+ onResultClick(id, "event");
1292
+ } : void 0;
1231
1293
  const handlePacketChange = (_event, packet) => {
1232
1294
  onPacketChange == null ? void 0 : onPacketChange(packet);
1233
1295
  };
@@ -1243,7 +1305,7 @@ var ResultsContainer = ({
1243
1305
  pagination.totalResults,
1244
1306
  " results"
1245
1307
  ] }) }),
1246
- results.map((result, index) => {
1308
+ results.map((result) => {
1247
1309
  switch (result.type) {
1248
1310
  case "player":
1249
1311
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1261,7 +1323,9 @@ var ResultsContainer = ({
1261
1323
  {
1262
1324
  result,
1263
1325
  onClick: onTableClick,
1264
- tags
1326
+ tags,
1327
+ showEventTag,
1328
+ eventTagId
1265
1329
  },
1266
1330
  result.id
1267
1331
  );
@@ -1297,17 +1361,30 @@ var ScrollableResultsList = ({
1297
1361
  tags,
1298
1362
  maxHeight = 400,
1299
1363
  onResultClick,
1300
- emptyText
1364
+ emptyText,
1365
+ showEventTag,
1366
+ eventTagId
1301
1367
  }) => {
1302
1368
  const hasResults = Array.isArray(results) && results.length > 0;
1303
- 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." }) });
1369
+ return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsxRuntime.jsx(
1370
+ ResultsContainer_default,
1371
+ {
1372
+ results,
1373
+ onResultClick,
1374
+ tags,
1375
+ showEventTag,
1376
+ eventTagId
1377
+ }
1378
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
1304
1379
  };
1305
1380
  var ScrollableResultsList_default = ScrollableResultsList;
1306
1381
  var TablesScrollableList = ({
1307
1382
  results,
1308
1383
  tags,
1309
1384
  maxHeight,
1310
- onResultClick
1385
+ onResultClick,
1386
+ showEventTag,
1387
+ eventTagId
1311
1388
  }) => {
1312
1389
  const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1313
1390
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
@@ -1319,7 +1396,9 @@ var TablesScrollableList = ({
1319
1396
  maxHeight,
1320
1397
  onResultClick: (id, type) => {
1321
1398
  if (type === "table") handleClick(id);
1322
- }
1399
+ },
1400
+ showEventTag,
1401
+ eventTagId
1323
1402
  }
1324
1403
  );
1325
1404
  };
@@ -1347,24 +1426,24 @@ function EventPageLayout({
1347
1426
  tables,
1348
1427
  allTags
1349
1428
  }) {
1350
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, flexDirection: "column", children: /* @__PURE__ */ jsxRuntime.jsxs(EventEditProvider, { initialEvent: mergedEvent, value: { isOwner, updateEvent, updateImages }, children: [
1351
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
1429
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { container: true, flexDirection: "column", children: /* @__PURE__ */ jsxRuntime.jsxs(EventEditProvider, { initialEvent: mergedEvent, value: { isOwner, updateEvent, updateImages }, children: [
1430
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(
1352
1431
  EventBanner,
1353
1432
  {
1354
1433
  attendees,
1355
1434
  numGames
1356
1435
  }
1357
1436
  ) }),
1358
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, flexDirection: "row", spacing: 3, size: { xs: 12, md: 12 }, children: [
1359
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12, md: 4 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(
1437
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, flexDirection: "row", spacing: 3, size: { xs: 12, md: 12 }, children: [
1438
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { size: { xs: 12, md: 4 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(
1360
1439
  EventBasicInfo,
1361
1440
  {
1362
1441
  locationId: mergedEvent.location || "0"
1363
1442
  }
1364
1443
  ) }),
1365
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12, md: 8 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(EventTablesCard_default, { tables, tags: allTags }) })
1444
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { size: { xs: 12, md: 8 }, spacing: 3, padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(EventTablesCard_default, { tables, tags: allTags }) })
1366
1445
  ] }),
1367
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, {})
1446
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, {})
1368
1447
  ] }) });
1369
1448
  }
1370
1449
  var PlayerDetailsCard = ({
@@ -1523,19 +1602,18 @@ var PlayerDetailsCard = ({
1523
1602
  );
1524
1603
  };
1525
1604
  var PlayerDetailsCard_default = PlayerDetailsCard;
1526
-
1527
- // src/data/values.tsx
1528
- var ProfilePictureSettings = {
1529
- aspectRatio: 4 / 5};
1530
- var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) => {
1531
- const defaultImg = "/man-walking-silhouette-clipart.jpg";
1532
- const [imageSrc, setImageSrc] = React7.useState(defaultImg);
1533
- const { aspectRatio } = ProfilePictureSettings;
1605
+ var PlayerDisplayCard = ({
1606
+ profilePicture,
1607
+ username,
1608
+ bio,
1609
+ preferredPronouns
1610
+ }) => {
1611
+ const [imageSrc, setImageSrc] = React7.useState(DEFAULT_PROFILE_PIC);
1534
1612
  React7.useEffect(() => {
1535
1613
  async function validateImage() {
1536
- const newImage = profilePicture || defaultImg;
1614
+ const newImage = profilePicture || DEFAULT_PROFILE_PIC;
1537
1615
  if (!profilePicture) {
1538
- setImageSrc(defaultImg);
1616
+ setImageSrc(DEFAULT_PROFILE_PIC);
1539
1617
  return;
1540
1618
  }
1541
1619
  const img = new Image();
@@ -1544,7 +1622,7 @@ var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) =
1544
1622
  setImageSrc(newImage);
1545
1623
  };
1546
1624
  img.onerror = () => {
1547
- setImageSrc(defaultImg);
1625
+ setImageSrc(DEFAULT_PROFILE_PIC);
1548
1626
  };
1549
1627
  }
1550
1628
  validateImage();
@@ -1574,7 +1652,7 @@ var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) =
1574
1652
  image: imageSrc,
1575
1653
  alt: `${username}'s Profile Picture`,
1576
1654
  sx: {
1577
- aspectRatio,
1655
+ aspectRatio: ProfilePictureSettings.aspectRatio,
1578
1656
  height: "auto",
1579
1657
  // Updates to maintain aspect ratio and fill space nicely
1580
1658
  width: "100%",
@@ -1893,6 +1971,24 @@ function PlayerPageLayout({
1893
1971
  ] }) })
1894
1972
  ] }) }) });
1895
1973
  }
1974
+ var DistanceFilter = ({ distances, selectedDistance, onChange }) => {
1975
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1976
+ /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Distance" }),
1977
+ /* @__PURE__ */ jsxRuntime.jsx(FormControl2__default.default, { fullWidth: true, size: "small", children: /* @__PURE__ */ jsxRuntime.jsxs(
1978
+ Select2__default.default,
1979
+ {
1980
+ value: selectedDistance !== void 0 ? selectedDistance : "",
1981
+ onChange: (e) => onChange(Number(e.target.value)),
1982
+ displayEmpty: true,
1983
+ children: [
1984
+ /* @__PURE__ */ jsxRuntime.jsx(MenuItem2__default.default, { value: "", children: /* @__PURE__ */ jsxRuntime.jsx("em", { children: "Any Distance" }) }),
1985
+ distances.map((option) => /* @__PURE__ */ jsxRuntime.jsx(MenuItem2__default.default, { value: option.value, children: option.display }, option.value))
1986
+ ]
1987
+ }
1988
+ ) })
1989
+ ] });
1990
+ };
1991
+ var DistanceFilter_default = DistanceFilter;
1896
1992
  var ExpiredTablesFilter = ({
1897
1993
  includeExpiredTables,
1898
1994
  onChange
@@ -1961,13 +2057,13 @@ var TagsFilter = ({
1961
2057
  shouldHaveAtLeastOne: ""
1962
2058
  });
1963
2059
  const tagOptions = React7__default.default.useMemo(() => {
2060
+ var _a;
1964
2061
  console.log("available tags: " + JSON.stringify(Tags));
1965
2062
  console.log(!Tags);
1966
- if (!Tags || Tags.length === 0 || !Tags.map) return [];
1967
- return Tags.map((tag) => ({
2063
+ return (_a = Tags == null ? void 0 : Tags.map((tag) => ({
1968
2064
  value: tag.id,
1969
2065
  label: tag.label
1970
- }));
2066
+ }))) != null ? _a : [];
1971
2067
  }, [Tags]);
1972
2068
  const handleTagChange = (tagId, category) => {
1973
2069
  let newTags = [];
@@ -1995,8 +2091,7 @@ var TagsFilter = ({
1995
2091
  };
1996
2092
  const renderSelectedTags = (selectedTags, category) => {
1997
2093
  const tagValues = [];
1998
- if (!Tags || Tags.length === 0 || !Tags.map) return null;
1999
- Tags.forEach((tag) => {
2094
+ Tags == null ? void 0 : Tags.forEach((tag) => {
2000
2095
  if (selectedTags.includes(tag.id)) {
2001
2096
  tagValues.push(tag);
2002
2097
  }
@@ -2062,7 +2157,7 @@ var TagsFilter = ({
2062
2157
  });
2063
2158
  },
2064
2159
  slots: { popper: CustomPopper2 },
2065
- renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField4__default.default, { ...params, label: `Select ${label}` })
2160
+ renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField7__default.default, { ...params, label: `Select ${label}` })
2066
2161
  },
2067
2162
  `${category}-${selectedTags.join("-")}`
2068
2163
  )
@@ -2134,7 +2229,7 @@ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2134
2229
  /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2135
2230
  /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
2136
2231
  /* @__PURE__ */ jsxRuntime.jsx(
2137
- TextField4__default.default,
2232
+ TextField7__default.default,
2138
2233
  {
2139
2234
  fullWidth: true,
2140
2235
  label: "Search in title and description",
@@ -2183,9 +2278,7 @@ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2183
2278
  Checkbox__default.default,
2184
2279
  {
2185
2280
  checked: selectedTypes.includes(type.id),
2186
- onChange: () => handleTypeChange(type.id),
2187
- disabled: type.id === "event",
2188
- title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
2281
+ onChange: () => handleTypeChange(type.id)
2189
2282
  }
2190
2283
  ),
2191
2284
  label: type.label
@@ -2200,10 +2293,13 @@ var FiltersContainer = ({
2200
2293
  initialSelectedTags,
2201
2294
  initialTextSearch,
2202
2295
  includeExpiredTables = false,
2296
+ distance,
2297
+ distances,
2203
2298
  onTypeChange,
2204
2299
  onTagChange,
2205
2300
  onTextSearchChange,
2206
2301
  onIncludeExpiredTablesChange,
2302
+ onDistanceChange,
2207
2303
  onSubmit,
2208
2304
  tags,
2209
2305
  searchTypes
@@ -2218,7 +2314,10 @@ var FiltersContainer = ({
2218
2314
  onTypeChange(types);
2219
2315
  }
2220
2316
  };
2221
- return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { children: [
2317
+ return /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { component: "form", onSubmit: (e) => {
2318
+ e.preventDefault();
2319
+ if (onSubmit) onSubmit();
2320
+ }, children: [
2222
2321
  /* @__PURE__ */ jsxRuntime.jsx(
2223
2322
  TypeFilter_default,
2224
2323
  {
@@ -2228,6 +2327,16 @@ var FiltersContainer = ({
2228
2327
  }
2229
2328
  ),
2230
2329
  /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2330
+ /* @__PURE__ */ jsxRuntime.jsx(
2331
+ DistanceFilter_default,
2332
+ {
2333
+ distances,
2334
+ selectedDistance: distance,
2335
+ onChange: onDistanceChange || (() => {
2336
+ })
2337
+ }
2338
+ ),
2339
+ /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } }),
2231
2340
  /* @__PURE__ */ jsxRuntime.jsx(
2232
2341
  TextSearchCard_default,
2233
2342
  {
@@ -2258,13 +2367,13 @@ var FiltersContainer = ({
2258
2367
  /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } })
2259
2368
  ] }),
2260
2369
  /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2261
- Button7__default.default,
2370
+ Button8__default.default,
2262
2371
  {
2372
+ type: "submit",
2263
2373
  variant: "contained",
2264
2374
  color: "primary",
2265
2375
  size: "large",
2266
2376
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(SearchIcon__default.default, {}),
2267
- onClick: onSubmit,
2268
2377
  sx: {
2269
2378
  width: "100%",
2270
2379
  py: 1.5,
@@ -2324,11 +2433,13 @@ function SearchPageLayout({
2324
2433
  query: "",
2325
2434
  titleOnly: false
2326
2435
  },
2327
- includeExpiredTables: initialIncludeExpiredTables = false,
2436
+ initialDistance,
2437
+ distances,
2328
2438
  onTypeChange,
2329
2439
  onTagChange,
2330
2440
  onTextSearchChange,
2331
2441
  onIncludeExpiredTablesChange,
2442
+ onDistanceChange,
2332
2443
  onSubmit,
2333
2444
  onResultClick,
2334
2445
  onPacketChange,
@@ -2336,14 +2447,16 @@ function SearchPageLayout({
2336
2447
  validTags,
2337
2448
  allTags,
2338
2449
  searchTypes,
2339
- isLoading = false
2450
+ isLoading = false,
2451
+ eventTagId
2340
2452
  }) {
2341
2453
  const theme = material.useTheme();
2342
2454
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
2343
2455
  const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2344
2456
  const [selectedTags, setSelectedTags] = React7.useState(initialSelectedTags);
2345
2457
  const [textSearch, setTextSearch] = React7.useState(initialTextSearch);
2346
- const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(initialIncludeExpiredTables);
2458
+ const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(false);
2459
+ const [distance, setDistance] = React7.useState(initialDistance);
2347
2460
  React7.useEffect(() => {
2348
2461
  setSelectedTypes(initialSelectedTypes);
2349
2462
  }, [initialSelectedTypes]);
@@ -2354,8 +2467,8 @@ function SearchPageLayout({
2354
2467
  setTextSearch(initialTextSearch);
2355
2468
  }, [initialTextSearch]);
2356
2469
  React7.useEffect(() => {
2357
- setIncludeExpiredTables(initialIncludeExpiredTables);
2358
- }, [initialIncludeExpiredTables]);
2470
+ setDistance(initialDistance);
2471
+ }, [initialDistance]);
2359
2472
  const handleTypeChange = (types) => {
2360
2473
  setSelectedTypes(types);
2361
2474
  if (onTypeChange) onTypeChange(types);
@@ -2372,12 +2485,17 @@ function SearchPageLayout({
2372
2485
  setIncludeExpiredTables(include);
2373
2486
  if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2374
2487
  };
2488
+ const handleDistanceChange = (dist) => {
2489
+ setDistance(dist);
2490
+ if (onDistanceChange) onDistanceChange(dist);
2491
+ };
2375
2492
  const handleSubmit = () => {
2376
2493
  const currentCriteria = {
2377
2494
  selectedTypes,
2378
2495
  selectedTags,
2379
2496
  textSearch,
2380
- includeExpiredTables
2497
+ includeExpiredTables,
2498
+ distance
2381
2499
  };
2382
2500
  if (onSubmit) {
2383
2501
  onSubmit(currentCriteria);
@@ -2396,8 +2514,8 @@ function SearchPageLayout({
2396
2514
  }
2397
2515
  }
2398
2516
  ) }),
2399
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, children: [
2400
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12, md: 3 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { sx: { marginBottom: isMobile ? 2 : 0 }, children: [
2517
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, spacing: 2, children: [
2518
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { size: { xs: 12, md: 3 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { sx: { marginBottom: isMobile ? 2 : 0 }, children: [
2401
2519
  /* @__PURE__ */ jsxRuntime.jsx(
2402
2520
  CardHeader4__default.default,
2403
2521
  {
@@ -2417,17 +2535,20 @@ function SearchPageLayout({
2417
2535
  initialSelectedTags: selectedTags,
2418
2536
  initialTextSearch: textSearch,
2419
2537
  includeExpiredTables,
2538
+ distance,
2539
+ distances,
2420
2540
  onTypeChange: handleTypeChange,
2421
2541
  onTagChange: handleTagChange,
2422
2542
  onTextSearchChange: handleTextSearchChange,
2423
2543
  onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2544
+ onDistanceChange: handleDistanceChange,
2424
2545
  onSubmit: handleSubmit,
2425
2546
  tags: validTags,
2426
2547
  searchTypes
2427
2548
  }
2428
2549
  ) })
2429
2550
  ] }) }),
2430
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12, md: 9 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
2551
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { size: { xs: 12, md: 9 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
2431
2552
  /* @__PURE__ */ jsxRuntime.jsx(
2432
2553
  CardHeader4__default.default,
2433
2554
  {
@@ -2447,13 +2568,255 @@ function SearchPageLayout({
2447
2568
  pagination,
2448
2569
  onPacketChange,
2449
2570
  onResultClick,
2450
- tags: allTags
2571
+ tags: allTags,
2572
+ showEventTag: true,
2573
+ eventTagId
2451
2574
  }
2452
2575
  ) })
2453
2576
  ] }) })
2454
2577
  ] })
2455
2578
  ] });
2456
2579
  }
2580
+
2581
+ // src/components/shared/NameGenerator.ts
2582
+ var getRandomTitle = () => {
2583
+ const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];
2584
+ const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];
2585
+ const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];
2586
+ return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;
2587
+ };
2588
+ var getRandomTagline = () => taglines[Math.random() * taglines.length | 0];
2589
+ var titlePrefixes = [
2590
+ "The Knights of The",
2591
+ "The Fellowship of The",
2592
+ "The Order of The",
2593
+ "The Infamous",
2594
+ "The Legendary",
2595
+ "The Dubious",
2596
+ "The Sworn Guardians of The",
2597
+ "The Ancient Guild of The",
2598
+ "The Unstoppable",
2599
+ "The Misfit",
2600
+ "The Chaotic",
2601
+ "The Brave",
2602
+ "The Forgotten",
2603
+ "The Wandering",
2604
+ "The Noble Council of The",
2605
+ "The Dread Pirates of The",
2606
+ "The Honorable Society of The",
2607
+ "The Cursed",
2608
+ "The Unlikely Heroes of The",
2609
+ "The Elders of The",
2610
+ "The Seekers of The",
2611
+ "The Champions of The",
2612
+ "The Heralds of The",
2613
+ "The Disciples of The",
2614
+ "The Ragtag Band of The",
2615
+ "The Cult of The"
2616
+ ];
2617
+ var tileMiddle = [
2618
+ "Round",
2619
+ "Kitchen",
2620
+ "Deepest",
2621
+ "Sorcery",
2622
+ "Munchkin",
2623
+ "Shenanigan",
2624
+ "Secret",
2625
+ "Dungeon",
2626
+ "Fireside",
2627
+ "Tabletop",
2628
+ "Midnight",
2629
+ "Tavern",
2630
+ "Goblin",
2631
+ "Dragon",
2632
+ "Critical",
2633
+ "Natural Twenty",
2634
+ "Counterspell",
2635
+ "Nat One",
2636
+ "Cardboard",
2637
+ "Dice Tower",
2638
+ "Campaign",
2639
+ "Lore",
2640
+ "Awkward",
2641
+ "Unhinged",
2642
+ "Chaotic Neutral",
2643
+ "Homebrew",
2644
+ "Side Quest"
2645
+ ];
2646
+ var titleSuffixes = [
2647
+ "Table",
2648
+ "Dungeon",
2649
+ "Cave",
2650
+ "Crew",
2651
+ "Team",
2652
+ "League",
2653
+ "Horde",
2654
+ "Party",
2655
+ "Conclave",
2656
+ "Collective",
2657
+ "Alliance",
2658
+ "Syndicate",
2659
+ "Guild",
2660
+ "Cabal",
2661
+ "Council",
2662
+ "Expedition",
2663
+ "Enclave",
2664
+ "Consortium",
2665
+ "Troupe",
2666
+ "Vanguard",
2667
+ "Cohort",
2668
+ "Brotherhood",
2669
+ "Sisterhood",
2670
+ "Pantheon",
2671
+ "Assembly",
2672
+ "Coven"
2673
+ ];
2674
+ var taglines = [
2675
+ "Everyone is welcome!",
2676
+ "Looking for serious players.",
2677
+ "Get in nerds, we're gaming!",
2678
+ "If you aren't there, you're square.",
2679
+ "It will be legendary!",
2680
+ "Beginners welcome \u2014 we were all level 1 once.",
2681
+ "No experience necessary. Snacks encouraged.",
2682
+ "Roleplayers, board gamers, and chaos gremlins welcome.",
2683
+ "We don't metagame. Much.",
2684
+ "All alignments accepted. True Neutral gets the snacks.",
2685
+ "Where every session is a one-shot... until it isn't.",
2686
+ "Homebrew rules may apply.",
2687
+ "Warning: may contain excessive lore.",
2688
+ "Critical failures celebrated as much as critical hits.",
2689
+ "No powergamers. Okay, maybe one powergamer.",
2690
+ "We finish campaigns. (Eventually.)",
2691
+ "Veteran players seeking worthy companions.",
2692
+ "Casuals only \u2014 we're here for the vibes.",
2693
+ "Serious about fun, not about rules.",
2694
+ "Min-maxers need not apply.",
2695
+ "For those who read the rulebook... and those who definitely didn't.",
2696
+ "Roll for initiative. Arrive on time.",
2697
+ "Side quests are the main quest here.",
2698
+ "Chaotic good energy required.",
2699
+ "If you bring snacks, you can name the first NPC.",
2700
+ "We read the rulebook so you don't have to.",
2701
+ "Wargamers only \u2014 no take-backs, no mercy.",
2702
+ "Everyone welcome. Meeple provided.",
2703
+ "We always play the longest game on the shelf.",
2704
+ "Worker placement. Resource management. Existential dread.",
2705
+ "No phones at the table! We're here for the game.",
2706
+ "Someone always flips the table. Metaphorically. Usually.",
2707
+ "We have a designated rules lawyer. It's fine.",
2708
+ "Cooperative games only \u2014 we can't handle another Monopoly incident.",
2709
+ "Teaching time is half the fun!"
2710
+ ];
2711
+ function TagSelector({ initialTagIDs, allTags, onTagChange }) {
2712
+ const [tagList, updateTagList] = React7.useState(initialTagIDs);
2713
+ const [inputValue, setInputValue] = React7.useState("");
2714
+ const toggleTag = (id) => tagList.find((t) => t === id) ? removeTag(id) : addTag(id);
2715
+ const addTag = (id) => {
2716
+ const newList = [...tagList, id];
2717
+ updateTagList(newList);
2718
+ onTagChange(newList);
2719
+ };
2720
+ const removeTag = (id) => {
2721
+ const newList = tagList.filter((t) => t !== id);
2722
+ updateTagList(newList);
2723
+ onTagChange(newList);
2724
+ };
2725
+ const selectedTags = React7.useMemo(() => allTags.filter((tag) => tagList.includes(tag.id)), [allTags, tagList]);
2726
+ const options = React7.useMemo(
2727
+ () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),
2728
+ [allTags]
2729
+ );
2730
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2731
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
2732
+ Chip,
2733
+ {
2734
+ tag,
2735
+ removeCallback: () => toggleTag(tag.id)
2736
+ },
2737
+ tag.id
2738
+ )) }),
2739
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { sx: { marginTop: 3, width: "100%", minWidth: "550px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
2740
+ Autocomplete__default.default,
2741
+ {
2742
+ options,
2743
+ filterOptions: (availableOptions, state) => availableOptions.filter(
2744
+ (option) => !tagList.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
2745
+ ),
2746
+ value: null,
2747
+ inputValue,
2748
+ onInputChange: (event, newInputValue) => {
2749
+ if (event && event.type === "change") {
2750
+ setInputValue(newInputValue);
2751
+ }
2752
+ },
2753
+ onChange: (event, newValue) => {
2754
+ if (newValue) {
2755
+ toggleTag(newValue.value);
2756
+ }
2757
+ setInputValue("");
2758
+ },
2759
+ renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField7__default.default, { ...params, label: "Select Tags" })
2760
+ },
2761
+ tagList.join("-")
2762
+ ) }) })
2763
+ ] });
2764
+ }
2765
+ function EditTableDetailsForm({ initialTitle, initialSubtitle, onTitleChange, onSubtitleChange, allowEditingTitles, initialTagIDs, allTags, onTagChange }) {
2766
+ const [title, setTitle] = React7.useState(initialTitle);
2767
+ const [subtitle, setSubtitle] = React7.useState(initialSubtitle);
2768
+ const handleTitleChange = (newTitle) => {
2769
+ setTitle(newTitle);
2770
+ onTitleChange(newTitle);
2771
+ };
2772
+ const handleSubtitleChange = (newSubtitle) => {
2773
+ setSubtitle(newSubtitle);
2774
+ onSubtitleChange(newSubtitle);
2775
+ };
2776
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2777
+ allowEditingTitles && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { className: "flex flex-col gap-4 mb-8", children: [
2778
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { className: "inline-flex", children: [
2779
+ /* @__PURE__ */ jsxRuntime.jsx(
2780
+ TextField7__default.default,
2781
+ {
2782
+ sx: { minWidth: "400px" },
2783
+ label: "Title",
2784
+ onChange: (e) => handleTitleChange(e.target.value),
2785
+ variant: "filled",
2786
+ value: title
2787
+ }
2788
+ ),
2789
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsxRuntime.jsx(
2790
+ CasinoIcon__default.default,
2791
+ {
2792
+ sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
2793
+ onClick: () => handleTitleChange(getRandomTitle())
2794
+ }
2795
+ ) })
2796
+ ] }),
2797
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { className: "inline-flex min-w-96", children: [
2798
+ /* @__PURE__ */ jsxRuntime.jsx(
2799
+ TextField7__default.default,
2800
+ {
2801
+ sx: { minWidth: "400px" },
2802
+ label: "Short Description or Tagline",
2803
+ onChange: (e) => handleSubtitleChange(e.target.value),
2804
+ variant: "filled",
2805
+ value: subtitle
2806
+ }
2807
+ ),
2808
+ /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsxRuntime.jsx(
2809
+ CasinoIcon__default.default,
2810
+ {
2811
+ sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
2812
+ onClick: () => handleSubtitleChange(getRandomTagline())
2813
+ }
2814
+ ) })
2815
+ ] })
2816
+ ] }),
2817
+ /* @__PURE__ */ jsxRuntime.jsx(TagSelector, { initialTagIDs, allTags, onTagChange })
2818
+ ] });
2819
+ }
2457
2820
  var GameTableContext = React7__default.default.createContext(void 0);
2458
2821
  function GameTableProvider(props) {
2459
2822
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.children });
@@ -2466,76 +2829,206 @@ function useGameTableContext() {
2466
2829
  throw new Error("useGameTableContext is deprecated in the package build. Pass table data through props instead.");
2467
2830
  }
2468
2831
  var ModalContext = React7.createContext({
2469
- showModal: (content) => {
2832
+ showModal: () => {
2470
2833
  },
2471
2834
  hideModal: () => {
2472
2835
  }
2473
2836
  });
2474
2837
  var useModal = () => React7.useContext(ModalContext);
2475
- var Modal = ({ onClose, children }) => {
2476
- const modalRef = React7.useRef(null);
2477
- const previouslyFocusedElement = React7.useRef(null);
2838
+ var AutoResizingTextarea = (props) => {
2839
+ const { isInEditMode, onChange, textareaRef, value } = props;
2478
2840
  React7.useEffect(() => {
2479
- var _a;
2480
- if (children) {
2481
- previouslyFocusedElement.current = document.activeElement;
2482
- (_a = modalRef.current) == null ? void 0 : _a.focus();
2841
+ if (isInEditMode && textareaRef.current) {
2842
+ const textarea = textareaRef.current;
2843
+ textarea.style.height = "auto";
2844
+ textarea.style.height = `${textarea.scrollHeight}px`;
2483
2845
  }
2484
- return () => {
2485
- var _a2;
2486
- (_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
2487
- };
2488
- }, [children]);
2489
- const handleOnClose = () => {
2490
- onClose();
2491
- };
2492
- const handleKeyDown = (e) => {
2493
- var _a;
2494
- if (e.key !== "Tab") return;
2495
- const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
2496
- 'button, [tabindex]:not([tabindex="-1"])'
2497
- );
2498
- if (!focusableElements || focusableElements.length === 0) return;
2499
- const first = focusableElements[0];
2500
- const last = focusableElements[focusableElements.length - 1];
2501
- if (e.shiftKey) {
2502
- if (document.activeElement === first) {
2503
- e.preventDefault();
2504
- last.focus();
2846
+ }, [isInEditMode, textareaRef, value]);
2847
+ return /* @__PURE__ */ jsxRuntime.jsx(
2848
+ "textarea",
2849
+ {
2850
+ ref: textareaRef,
2851
+ value,
2852
+ onChange: (e) => onChange(e.target.value),
2853
+ style: {
2854
+ backgroundColor: "#fffbea",
2855
+ overflow: "hidden",
2856
+ resize: "none",
2857
+ width: "100%"
2505
2858
  }
2506
- } else {
2507
- if (document.activeElement === last) {
2508
- e.preventDefault();
2509
- first.focus();
2859
+ }
2860
+ );
2861
+ };
2862
+ var AutoResizingTextarea_default = AutoResizingTextarea;
2863
+ var NextGameCountdown = ({ nextGameTime }) => {
2864
+ const [timeLeft, setTimeLeft] = React7.useState("");
2865
+ React7.useEffect(() => {
2866
+ if (!nextGameTime) return;
2867
+ const timer = setInterval(() => {
2868
+ const now = (/* @__PURE__ */ new Date()).getTime();
2869
+ const distance = new Date(nextGameTime).getTime() - now;
2870
+ if (distance < 0) {
2871
+ clearInterval(timer);
2872
+ setTimeLeft("Started");
2873
+ return;
2874
+ }
2875
+ const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
2876
+ const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
2877
+ const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
2878
+ const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
2879
+ let timeString = "";
2880
+ if (days > 0) timeString += `${days}d `;
2881
+ if (hours > 0 || days > 0) timeString += `${hours}h `;
2882
+ timeString += `${minutes}m ${seconds}s`;
2883
+ setTimeLeft(timeString);
2884
+ }, 1e3);
2885
+ return () => clearInterval(timer);
2886
+ }, [nextGameTime]);
2887
+ if (!nextGameTime) return null;
2888
+ return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
2889
+ "Next Game: ",
2890
+ timeLeft
2891
+ ] });
2892
+ };
2893
+ function TagEditor({
2894
+ title,
2895
+ selectedTags,
2896
+ possibleTags,
2897
+ onToggleTag
2898
+ }) {
2899
+ const selectedIds = React7.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
2900
+ const onTagChange = (newSelectedIds) => {
2901
+ const addedTags = newSelectedIds.filter((id) => !selectedIds.includes(id));
2902
+ const removedTags = selectedIds.filter((id) => !newSelectedIds.includes(id));
2903
+ addedTags.forEach((id) => onToggleTag(id));
2904
+ removedTags.forEach((id) => onToggleTag(id));
2905
+ };
2906
+ return /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { size: { xs: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
2907
+ title ? /* @__PURE__ */ jsxRuntime.jsx(
2908
+ CardHeader4__default.default,
2909
+ {
2910
+ title,
2911
+ style: {
2912
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2913
+ color: "#FFFFFF",
2914
+ fontSize: "1.5rem",
2915
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2916
+ }
2510
2917
  }
2918
+ ) : "",
2919
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TagSelector, { initialTagIDs: selectedIds, allTags: possibleTags, onTagChange }) })
2920
+ ] }) }) });
2921
+ }
2922
+ var UserAgreementModal = ({
2923
+ open,
2924
+ onClose,
2925
+ markdownContent,
2926
+ requirements,
2927
+ onAccept,
2928
+ title = "User Agreement",
2929
+ forceAgreement = false
2930
+ }) => {
2931
+ const [checkedState, setCheckedState] = React7.useState(
2932
+ new Array(requirements.length).fill(false)
2933
+ );
2934
+ const handleCheckboxChange = (index) => {
2935
+ const updatedCheckedState = checkedState.map(
2936
+ (item, i) => i === index ? !item : item
2937
+ );
2938
+ setCheckedState(updatedCheckedState);
2939
+ };
2940
+ const isAllRequiredChecked = requirements.every((req, index) => {
2941
+ if (req.required) {
2942
+ return checkedState[index];
2943
+ }
2944
+ return true;
2945
+ });
2946
+ const handleAccept = () => {
2947
+ if (isAllRequiredChecked) {
2948
+ onAccept();
2511
2949
  }
2512
2950
  };
2513
- return /* @__PURE__ */ jsxRuntime.jsx(
2514
- "div",
2951
+ const handleClose = (event, reason) => {
2952
+ if (forceAgreement) return;
2953
+ if (onClose) onClose();
2954
+ };
2955
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2956
+ material.Dialog,
2515
2957
  {
2516
- className: "modal-overlay",
2517
- onKeyDown: handleKeyDown,
2518
- ref: modalRef,
2519
- role: "dialog",
2520
- tabIndex: -1,
2521
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "modal-container", children: [
2522
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleOnClose, children: "X" }) }),
2523
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-content", children })
2524
- ] })
2958
+ open,
2959
+ onClose: handleClose,
2960
+ maxWidth: "md",
2961
+ fullWidth: true,
2962
+ disableEscapeKeyDown: forceAgreement,
2963
+ children: [
2964
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogTitle, { children: title }),
2965
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogContent, { dividers: true, children: [
2966
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mb: 3 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2967
+ ReactMarkdown__default.default,
2968
+ {
2969
+ components: {
2970
+ h1: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h4", gutterBottom: true, ...props }),
2971
+ h2: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", gutterBottom: true, ...props }),
2972
+ h3: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", gutterBottom: true, ...props }),
2973
+ h4: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle1", gutterBottom: true, ...props }),
2974
+ h5: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle2", gutterBottom: true, ...props }),
2975
+ h6: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "caption", gutterBottom: true, ...props }),
2976
+ p: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", gutterBottom: true, ...props }),
2977
+ li: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "li", sx: { mb: 1, ml: 2 }, ...props }),
2978
+ ul: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "ul", sx: { mb: 2 }, ...props }),
2979
+ ol: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "ol", sx: { mb: 2 }, ...props }),
2980
+ a: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Link, { ...props, target: "_blank", rel: "noopener" })
2981
+ },
2982
+ children: markdownContent
2983
+ }
2984
+ ) }),
2985
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", flexDirection: "column", gap: 1 }, children: requirements.map((req, index) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", alignItems: "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsx(
2986
+ material.FormControlLabel,
2987
+ {
2988
+ control: /* @__PURE__ */ jsxRuntime.jsx(
2989
+ material.Checkbox,
2990
+ {
2991
+ checked: checkedState[index],
2992
+ onChange: () => handleCheckboxChange(index)
2993
+ }
2994
+ ),
2995
+ label: /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", children: [
2996
+ req.statement,
2997
+ req.link && req.linkText && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2998
+ " ",
2999
+ /* @__PURE__ */ jsxRuntime.jsx(material.Link, { href: req.link, target: "_blank", rel: "noopener", children: req.linkText })
3000
+ ] }),
3001
+ req.required && /* @__PURE__ */ jsxRuntime.jsx(
3002
+ material.Typography,
3003
+ {
3004
+ component: "span",
3005
+ color: "error",
3006
+ sx: { ml: 0.5 },
3007
+ children: "*"
3008
+ }
3009
+ )
3010
+ ] })
3011
+ }
3012
+ ) }, index)) })
3013
+ ] }),
3014
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogActions, { children: [
3015
+ !forceAgreement && /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: onClose, color: "inherit", children: "Cancel" }),
3016
+ /* @__PURE__ */ jsxRuntime.jsx(
3017
+ material.Button,
3018
+ {
3019
+ onClick: handleAccept,
3020
+ variant: "contained",
3021
+ disabled: !isAllRequiredChecked,
3022
+ fullWidth: forceAgreement,
3023
+ children: "Accept"
3024
+ }
3025
+ )
3026
+ ] })
3027
+ ]
2525
3028
  }
2526
3029
  );
2527
3030
  };
2528
- var Modal_default = Modal;
2529
- var ModalProvider = ({ children }) => {
2530
- const [modalContent, setModalContent] = React7.useState(null);
2531
- const showModal = (content) => setModalContent(content);
2532
- const hideModal = () => setModalContent(null);
2533
- return /* @__PURE__ */ jsxRuntime.jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
2534
- children,
2535
- modalContent && /* @__PURE__ */ jsxRuntime.jsx(Modal_default, { onClose: hideModal, children: modalContent })
2536
- ] });
2537
- };
2538
- var ModalProvider_default = ModalProvider;
3031
+ var UserAgreementModal_default = UserAgreementModal;
2539
3032
  var PlayerHighlightsCard = function(props) {
2540
3033
  const {
2541
3034
  allTags,
@@ -2547,16 +3040,16 @@ var PlayerHighlightsCard = function(props) {
2547
3040
  removeFromTable
2548
3041
  } = props;
2549
3042
  return /* @__PURE__ */ jsxRuntime.jsx(material.Card, { elevation: 3, sx: { backgroundColor: canEdit ? "#fffbea" : "#f5f9fa", marginBottom: "6px" }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { children: [
2550
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, direction: "column", children: [
2551
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, direction: "row", children: [
2552
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 64, src: player.miniPic || "", width: 64 }) }),
2553
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) })
3043
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, spacing: 2, direction: "column", children: [
3044
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, direction: "row", children: [
3045
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 64, src: player.miniPic || DEFAULT_PROFILE_PIC, width: 64 }) }),
3046
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) })
2554
3047
  ] }),
2555
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: renderTagsFromIds(player.tags, allTags) })
3048
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: renderTagsFromIds(player.tags, allTags) })
2556
3049
  ] }),
2557
- canEdit && /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { children: [
2558
- /* @__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" }) }),
2559
- canChangeDungeonMaster && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => {
3050
+ canEdit && /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { children: [
3051
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => removeFromTable(player), children: isWaitList ? /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Deny Player" }) : /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Remove Player" }) }),
3052
+ canChangeDungeonMaster && /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => {
2560
3053
  handleAssignToDungeonMaster(player);
2561
3054
  removeFromTable(player);
2562
3055
  }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Assign to DungeonMaster" }) })
@@ -2566,11 +3059,11 @@ var PlayerHighlightsCard = function(props) {
2566
3059
  var DMHighlightsCard = function({ canEdit, player, allTags }) {
2567
3060
  return /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { elevation: 3, sx: { backgroundColor: "#f5f9fa", marginBottom: "6px" }, children: [
2568
3061
  /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Game Master" }),
2569
- /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, direction: "column", children: [
2570
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) }),
2571
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, direction: "row", children: [
2572
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 120, src: player.imageUrl ? player.imageUrl : "", width: 256 }) }),
2573
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: renderTagsFromIds(player.tags, allTags) }),
3062
+ /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, spacing: 2, direction: "column", children: [
3063
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) }),
3064
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, direction: "row", children: [
3065
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Image2__default.default, { alt: player.username + "'s profile pic", height: 120, src: player.imageUrl || DEFAULT_PROFILE_PIC, width: 256 }) }),
3066
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: renderTagsFromIds(player.tags, allTags) }),
2574
3067
  /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { children: player.description })
2575
3068
  ] })
2576
3069
  ] }) })
@@ -2599,12 +3092,11 @@ function TableActionsBar(props) {
2599
3092
  if (waitlistPlayers.length === 0) {
2600
3093
  return /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Waitlist is empty!" });
2601
3094
  }
2602
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2603
- /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { slotProps: { title: { variant: "h4" } }, title: "Waitlist Players: " }),
2604
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-8", children: waitlistPlayers.map((player) => /* @__PURE__ */ jsxRuntime.jsxs(
3095
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3096
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "gap-8 px-6", children: waitlistPlayers.map((player) => /* @__PURE__ */ jsxRuntime.jsxs(
2605
3097
  "li",
2606
3098
  {
2607
- 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`,
3099
+ className: `${canMovePlayersToTable ? "bg-amber-100 cursor-pointer" : "bg-gray-200"} mb-8 flex flex-row flex-start space-between items-center gap-3 p-2 rounded`,
2608
3100
  onClick: () => canMovePlayersToTable ? onPromoteWaitlistPlayer == null ? void 0 : onPromoteWaitlistPlayer(player.id) : void 0,
2609
3101
  tabIndex: 0,
2610
3102
  children: [
@@ -2613,7 +3105,7 @@ function TableActionsBar(props) {
2613
3105
  {
2614
3106
  alt: player.username + "'s profile pic",
2615
3107
  height: 64,
2616
- src: player.miniPic || "",
3108
+ src: player.miniPic || DEFAULT_PROFILE_PIC,
2617
3109
  width: 64
2618
3110
  }
2619
3111
  ),
@@ -2622,7 +3114,7 @@ function TableActionsBar(props) {
2622
3114
  },
2623
3115
  player.id
2624
3116
  )) }),
2625
- /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: () => hideModal(), children: "close modal" })
3117
+ /* @__PURE__ */ jsxRuntime.jsx(DialogActions3__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => hideModal(), children: "Close" }) })
2626
3118
  ] });
2627
3119
  };
2628
3120
  return /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "column", spacing: 1, children: [
@@ -2633,33 +3125,45 @@ function TableActionsBar(props) {
2633
3125
  slots
2634
3126
  ] }) }),
2635
3127
  /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "row", children: [
2636
- !isOwner && !isPlayer && !isDM && !onWaitlist && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onJoinWaitlist == null ? void 0 : onJoinWaitlist(), sx: buttonStyle, children: "Join Waitlist" }),
2637
- !isOwner && (isPlayer || onWaitlist) && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onLeaveTable == null ? void 0 : onLeaveTable(), sx: buttonStyle, children: onWaitlist ? "Leave Waitlist" : "Leave Table" }),
3128
+ !isOwner && !isPlayer && !isDM && !onWaitlist && /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => onJoinWaitlist == null ? void 0 : onJoinWaitlist(), sx: buttonStyle, children: "Join Waitlist" }),
3129
+ !isOwner && (isPlayer || onWaitlist) && /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => onLeaveTable == null ? void 0 : onLeaveTable(), sx: buttonStyle, children: onWaitlist ? "Leave Waitlist" : "Leave Table" }),
2638
3130
  canEditTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2639
- /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onEditModeChange(true), sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(EditIcon__default.default, {}), children: "Edit" }),
3131
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => onEditModeChange(true), sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(EditIcon3__default.default, {}), children: "Edit" }),
2640
3132
  canViewWaitlist ? /* @__PURE__ */ jsxRuntime.jsx(
2641
- Button7__default.default,
3133
+ Button8__default.default,
2642
3134
  {
2643
3135
  endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2644
- onClick: () => showModal(renderPlayerWaitlistModalContent(false)),
3136
+ onClick: () => showModal(renderPlayerWaitlistModalContent(false), "Waitlist Players:"),
2645
3137
  sx: buttonStyle,
2646
3138
  children: "View Waitlist"
2647
3139
  }
2648
3140
  ) : null
2649
3141
  ] }) : canSaveTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2650
- /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: onSave, sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(SaveIcon__default.default, {}), children: "Save" }),
2651
- /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onEditModeChange(false), sx: buttonStyle, children: "Cancel" }),
3142
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: onSave, sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(SaveIcon__default.default, {}), children: "Save" }),
3143
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => onEditModeChange(false), sx: buttonStyle, children: "Cancel" }),
2652
3144
  /* @__PURE__ */ jsxRuntime.jsx(
2653
- Button7__default.default,
3145
+ Button8__default.default,
2654
3146
  {
2655
3147
  endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2656
- onClick: () => showModal(renderPlayerWaitlistModalContent(true)),
3148
+ onClick: () => showModal(renderPlayerWaitlistModalContent(true), "Waitlist Players:"),
2657
3149
  sx: buttonStyle,
2658
3150
  children: "Edit Waitlist"
2659
3151
  }
2660
3152
  )
2661
3153
  ] }) : null,
2662
- 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" })
3154
+ isOwner && /* @__PURE__ */ jsxRuntime.jsx(
3155
+ Button8__default.default,
3156
+ {
3157
+ onClick: () => showModal(
3158
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { children: "Are you sure you want to delete this table? This action cannot be undone." }),
3159
+ "Delete Table",
3160
+ { acceptText: "Delete", onAccept: () => onDeleteTable == null ? void 0 : onDeleteTable() }
3161
+ ),
3162
+ sx: buttonStyle,
3163
+ endIcon: /* @__PURE__ */ jsxRuntime.jsx(DeleteIcon__default.default, {}),
3164
+ children: "Delete Table"
3165
+ }
3166
+ )
2663
3167
  ] })
2664
3168
  ] });
2665
3169
  }
@@ -2669,165 +3173,82 @@ var buttonStyle = {
2669
3173
  color: "white",
2670
3174
  borderRadius: "5px"
2671
3175
  };
2672
- var AutoResizingTextarea = (props) => {
2673
- const { isInEditMode, onChange, textareaRef, value } = props;
2674
- React7.useEffect(() => {
2675
- if (isInEditMode && textareaRef.current) {
2676
- const textarea = textareaRef.current;
2677
- textarea.style.height = "auto";
2678
- textarea.style.height = `${textarea.scrollHeight}px`;
2679
- }
2680
- }, [isInEditMode, textareaRef, value]);
2681
- return /* @__PURE__ */ jsxRuntime.jsx(
2682
- "textarea",
2683
- {
2684
- ref: textareaRef,
2685
- value,
2686
- onChange: (e) => onChange(e.target.value),
2687
- style: {
2688
- backgroundColor: "#fffbea",
2689
- overflow: "hidden",
2690
- resize: "none",
2691
- width: "100%"
2692
- }
2693
- }
2694
- );
2695
- };
2696
- var AutoResizingTextarea_default = AutoResizingTextarea;
2697
- var NextGameCountdown = ({ nextGameTime }) => {
2698
- const [timeLeft, setTimeLeft] = React7.useState("");
2699
- React7.useEffect(() => {
2700
- if (!nextGameTime) return;
2701
- const timer = setInterval(() => {
2702
- const now = (/* @__PURE__ */ new Date()).getTime();
2703
- const distance = new Date(nextGameTime).getTime() - now;
2704
- if (distance < 0) {
2705
- clearInterval(timer);
2706
- setTimeLeft("Started");
2707
- return;
2708
- }
2709
- const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
2710
- const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
2711
- const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
2712
- const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
2713
- let timeString = "";
2714
- if (days > 0) timeString += `${days}d `;
2715
- if (hours > 0 || days > 0) timeString += `${hours}h `;
2716
- timeString += `${minutes}m ${seconds}s`;
2717
- setTimeLeft(timeString);
2718
- }, 1e3);
2719
- return () => clearInterval(timer);
2720
- }, [nextGameTime]);
2721
- if (!nextGameTime) return null;
2722
- return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
2723
- "Next Game: ",
2724
- timeLeft
2725
- ] });
2726
- };
2727
- function TagEditor({
2728
- title = "Tags",
2729
- selectedTags,
2730
- possibleTags,
2731
- onToggleTag
2732
- }) {
2733
- const [inputValue, setInputValue] = React7.useState("");
2734
- const selectedIds = React7.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
2735
- const options = React7.useMemo(
2736
- () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
2737
- [possibleTags]
2738
- );
2739
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card10__default.default, { children: [
2740
- /* @__PURE__ */ jsxRuntime.jsx(
2741
- CardHeader4__default.default,
2742
- {
2743
- title,
2744
- style: {
2745
- background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2746
- color: "#FFFFFF",
2747
- fontSize: "1.5rem",
2748
- textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2749
- }
2750
- }
2751
- ),
2752
- /* @__PURE__ */ jsxRuntime.jsxs(CardContent10__default.default, { children: [
2753
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
2754
- Chip,
2755
- {
2756
- tag,
2757
- removeCallback: () => onToggleTag(tag.id)
2758
- },
2759
- tag.id
2760
- )) }),
2761
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
2762
- Autocomplete__default.default,
2763
- {
2764
- options,
2765
- filterOptions: (availableOptions, state) => availableOptions.filter(
2766
- (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
2767
- ).slice(0, 3),
2768
- value: null,
2769
- inputValue,
2770
- onInputChange: (event, newInputValue) => {
2771
- if (event && event.type === "change") {
2772
- setInputValue(newInputValue);
2773
- }
2774
- },
2775
- onChange: (event, newValue) => {
2776
- if (newValue) {
2777
- onToggleTag(newValue.value);
2778
- }
2779
- setInputValue("");
2780
- },
2781
- slots: { popper: CustomPopper3 },
2782
- renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField4__default.default, { ...params, label: "Select Tags" })
2783
- },
2784
- selectedIds.join("-")
2785
- ) }) })
2786
- ] })
2787
- ] }) }) });
2788
- }
2789
- var CustomPopper3 = (props) => {
2790
- return /* @__PURE__ */ jsxRuntime.jsx(
2791
- Popper__default.default,
2792
- {
2793
- ...props,
2794
- modifiers: [
2795
- {
2796
- name: "preventOverflow",
2797
- options: { boundary: "viewport" }
2798
- },
2799
- {
2800
- name: "offset",
2801
- options: { offset: [0, -10] }
2802
- }
2803
- ],
2804
- placement: "top-start"
2805
- }
2806
- );
2807
- };
2808
3176
  function TablePageLayout(props) {
2809
3177
  var _a;
2810
- const { allTags, dungeonMaster, onDeleteTable, onJoinWaitlist, onLeaveTable, onSaveDraft, players, table, tableStatus, waitlistPlayers } = props;
3178
+ const { hideModal, showModal } = useModal();
3179
+ const { allTags, dungeonMaster, onDeleteTable, onJoinWaitlist, onLeaveTable, onSaveDraft, players, table, tableStatus, waitlistPlayers, startWithEditTitle, eventTagId } = props;
3180
+ const canEdit = tableStatus.isOwner;
2811
3181
  const textAreaRef = React7.useRef(null);
2812
3182
  const [isTableInEditMode, setIsTableInEditMode] = React7.useState(false);
3183
+ const [currentTitle, setCurrentTitle] = React7.useState(table.title);
3184
+ const [currentSubtitle, setCurrentSubtitle] = React7.useState(table.shortDescription);
2813
3185
  const [currentDescription, setCurrentDescription] = React7.useState(table.description);
2814
3186
  const [currentDungeonMaster, setCurrentDungeonMaster] = React7.useState(dungeonMaster);
2815
3187
  const [currentPlayers, setCurrentPlayers] = React7.useState(players);
2816
- const [currentShortDescription, setCurrentShortDescription] = React7.useState(table.shortDescription);
2817
- const [currentTitle, setCurrentTitle] = React7.useState(table.title);
2818
3188
  const [currentWaitlistPlayers, setCurrentWaitlistPlayers] = React7.useState(waitlistPlayers);
2819
3189
  const [currentTagIds, setCurrentTagIds] = React7.useState((_a = table.tags) != null ? _a : []);
3190
+ const pendingEdits = React7.useRef({ title: currentTitle, subtitle: currentSubtitle, tags: currentTagIds });
3191
+ const handleSaveTable = (tableData = {}) => {
3192
+ const nextDraft = {
3193
+ ...table,
3194
+ description: currentDescription,
3195
+ dungeonMaster: String(currentDungeonMaster.id),
3196
+ players: currentPlayers.map((player) => player.id),
3197
+ shortDescription: currentSubtitle,
3198
+ tags: currentTagIds,
3199
+ title: currentTitle,
3200
+ waitlist: currentWaitlistPlayers.map((player) => player.id),
3201
+ ...tableData
3202
+ };
3203
+ void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
3204
+ setIsTableInEditMode(false);
3205
+ };
3206
+ const clean = (text) => text.replaceAll(
3207
+ /\b(n[i1!]g+(er|a|e)s?|f[a@]g|f[a@]g+[o0]ts?|k[i1!]k[e3]s?|ch[i1!]nks?|w[e3]tb[a@]cks?|r[a@]gh[e3][a@]ds?|t[o0]w[e3]lh[e3][a@]ds?|r[e3]t[a@]rd(ed|s)?|c[o0][o0]ns?|tr[a@]nn(y|i[e3]s?)|g[o0][o0]ks?)\b/gi,
3208
+ "dudes"
3209
+ );
3210
+ const editTableDetails = () => {
3211
+ if (!canEdit) {
3212
+ return;
3213
+ }
3214
+ pendingEdits.current = {
3215
+ title: currentTitle,
3216
+ subtitle: currentSubtitle,
3217
+ tags: currentTagIds
3218
+ };
3219
+ const editContent = /* @__PURE__ */ jsxRuntime.jsx(
3220
+ EditTableDetailsForm,
3221
+ {
3222
+ initialTitle: currentTitle,
3223
+ initialSubtitle: currentSubtitle,
3224
+ onTitleChange: (t) => pendingEdits.current.title = t,
3225
+ onSubtitleChange: (s) => pendingEdits.current.subtitle = s,
3226
+ onTagChange: (t) => pendingEdits.current.tags = t,
3227
+ initialTagIDs: currentTagIds,
3228
+ allTags: allTags.filter((t) => t.appliesTo.tables),
3229
+ allowEditingTitles: true
3230
+ }
3231
+ );
3232
+ showModal(editContent, "Edit Table Details", {
3233
+ acceptText: "Save",
3234
+ onAccept: () => {
3235
+ setCurrentTitle(clean(pendingEdits.current.title));
3236
+ setCurrentSubtitle(clean(pendingEdits.current.subtitle));
3237
+ setCurrentTagIds(pendingEdits.current.tags);
3238
+ handleSaveTable({
3239
+ title: clean(pendingEdits.current.title),
3240
+ shortDescription: clean(pendingEdits.current.subtitle),
3241
+ tags: pendingEdits.current.tags
3242
+ });
3243
+ }
3244
+ });
3245
+ };
2820
3246
  React7.useEffect(() => {
2821
- var _a2;
2822
- setCurrentDescription(table.description);
2823
- setCurrentDungeonMaster(dungeonMaster);
2824
- setCurrentPlayers(players);
2825
- setCurrentShortDescription(table.shortDescription);
2826
- setCurrentTitle(table.title);
2827
- setCurrentWaitlistPlayers(waitlistPlayers);
2828
- setCurrentTagIds((_a2 = table.tags) != null ? _a2 : []);
2829
- }, [dungeonMaster, players, table, waitlistPlayers]);
2830
- const currentTags = React7.useMemo(
3247
+ if (startWithEditTitle) {
3248
+ editTableDetails();
3249
+ }
3250
+ });
3251
+ React7.useMemo(
2831
3252
  () => allTags.filter((tag) => currentTagIds.includes(tag.id)),
2832
3253
  [allTags, currentTagIds]
2833
3254
  );
@@ -2847,37 +3268,17 @@ function TablePageLayout(props) {
2847
3268
  return prevWaitlist.filter((player) => player.id !== playerIdToPromote);
2848
3269
  });
2849
3270
  };
2850
- const handleToggleTag = (tagId) => {
2851
- setCurrentTagIds(
2852
- (prevState) => prevState.includes(tagId) ? prevState.filter((id) => id !== tagId) : [...prevState, tagId]
2853
- );
2854
- };
2855
- const handleSaveTable = () => {
2856
- const nextDraft = {
2857
- ...table,
2858
- description: currentDescription,
2859
- dungeonMaster: String(currentDungeonMaster.id),
2860
- players: currentPlayers.map((player) => player.id),
2861
- shortDescription: currentShortDescription,
2862
- tags: currentTagIds,
2863
- title: currentTitle,
2864
- waitlist: currentWaitlistPlayers.map((player) => player.id)
2865
- };
2866
- void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
2867
- setIsTableInEditMode(false);
2868
- };
2869
3271
  return /* @__PURE__ */ jsxRuntime.jsx(
2870
3272
  material.Card,
2871
3273
  {
2872
3274
  sx: {
2873
3275
  backgroundColor: isTableInEditMode ? "lightsalmon" : "white",
2874
- borderRadius: "5%",
2875
3276
  p: 2,
2876
3277
  boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)"
2877
3278
  },
2878
- children: /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, direction: "column", children: [
3279
+ children: /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, direction: "column", children: [
2879
3280
  /* @__PURE__ */ jsxRuntime.jsxs(
2880
- Grid8__default.default,
3281
+ Grid10__default.default,
2881
3282
  {
2882
3283
  container: true,
2883
3284
  direction: "column",
@@ -2890,39 +3291,49 @@ function TablePageLayout(props) {
2890
3291
  textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)"
2891
3292
  },
2892
3293
  children: [
2893
- /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2894
- "input",
2895
- {
2896
- onChange: (e) => setCurrentTitle(e.target.value),
2897
- style: { backgroundColor: "#fffbea" },
2898
- tabIndex: 0,
2899
- type: "text",
2900
- value: currentTitle
2901
- }
2902
- ) : /* @__PURE__ */ jsxRuntime.jsx(
2903
- material.CardHeader,
3294
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(
3295
+ material.Box,
2904
3296
  {
2905
- title: currentTitle,
2906
- sx: {
2907
- p: 0,
2908
- "& .MuiCardHeader-title": {
2909
- color: "white",
2910
- fontWeight: 700
2911
- }
2912
- }
3297
+ className: `flex items-center gap-1 ${canEdit ? "cursor-pointer" : ""}`,
3298
+ sx: { "&:hover .edit-icon": { opacity: 1 } },
3299
+ onClick: editTableDetails,
3300
+ children: [
3301
+ /* @__PURE__ */ jsxRuntime.jsx(
3302
+ material.CardHeader,
3303
+ {
3304
+ title: currentTitle,
3305
+ sx: {
3306
+ p: 0,
3307
+ "& .MuiCardHeader-title": {
3308
+ color: "white",
3309
+ fontWeight: 700
3310
+ }
3311
+ }
3312
+ }
3313
+ ),
3314
+ canEdit ? /* @__PURE__ */ jsxRuntime.jsx(EditIcon3__default.default, { className: "edit-icon text-white", sx: { opacity: 0, transition: "opacity 0.2s" } }) : ""
3315
+ ]
2913
3316
  }
2914
3317
  ) }),
2915
- isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2916
- "input",
3318
+ /* @__PURE__ */ jsxRuntime.jsxs(
3319
+ material.Box,
2917
3320
  {
2918
- onChange: (e) => setCurrentShortDescription(e.target.value),
2919
- style: { backgroundColor: "#fffbea" },
2920
- tabIndex: 0,
2921
- type: "text",
2922
- value: currentShortDescription
3321
+ className: `flex items-center gap-1 ${canEdit ? "cursor-pointer" : ""}`,
3322
+ sx: { "&:hover .edit-icon": { opacity: 1 } },
3323
+ onClick: editTableDetails,
3324
+ children: [
3325
+ /* @__PURE__ */ jsxRuntime.jsx(
3326
+ material.Typography,
3327
+ {
3328
+ sx: { color: "white", opacity: 0.95 },
3329
+ children: currentSubtitle
3330
+ }
3331
+ ),
3332
+ canEdit ? /* @__PURE__ */ jsxRuntime.jsx(EditIcon3__default.default, { className: "edit-icon text-white", sx: { opacity: 0, transition: "opacity 0.2s", fontSize: "medium" } }) : ""
3333
+ ]
2923
3334
  }
2924
- ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { color: "white", opacity: 0.95 }, children: currentShortDescription }),
2925
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, children: isTableInEditMode ? renderEditableTags(currentTags, allTags, handleToggleTag) : renderTags(currentTagIds, allTags) }),
3335
+ ),
3336
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { container: true, onClick: editTableDetails, className: `${canEdit ? "cursor-pointer" : ""}`, children: renderTags(currentTagIds, allTags, canEdit, table.eventTagId || eventTagId) }),
2926
3337
  /* @__PURE__ */ jsxRuntime.jsx(
2927
3338
  TableActionsBar,
2928
3339
  {
@@ -2942,8 +3353,8 @@ function TablePageLayout(props) {
2942
3353
  ]
2943
3354
  }
2944
3355
  ),
2945
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, sx: { mt: 2 }, children: [
2946
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__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(
3356
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, spacing: 2, sx: { mt: 2 }, children: [
3357
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__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(
2947
3358
  AutoResizingTextarea_default,
2948
3359
  {
2949
3360
  isInEditMode: isTableInEditMode,
@@ -2952,7 +3363,7 @@ function TablePageLayout(props) {
2952
3363
  value: currentDescription
2953
3364
  }
2954
3365
  ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { whiteSpace: "pre-wrap" }, children: currentDescription }) }) }) }),
2955
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { size: { xs: 12, md: 4 }, children: [
3366
+ /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { size: { xs: 12, md: 4 }, children: [
2956
3367
  /* @__PURE__ */ jsxRuntime.jsx(DMHighlightsCard, { canEdit: isTableInEditMode, player: currentDungeonMaster, allTags }),
2957
3368
  /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { sx: { height: "100%" }, children: [
2958
3369
  /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Players: " }),
@@ -2975,36 +3386,85 @@ function TablePageLayout(props) {
2975
3386
  }
2976
3387
  );
2977
3388
  }
2978
- var renderTags = function(tags, allTags) {
3389
+ var renderTags = function(tags, allTags, canEdit, eventTagId) {
2979
3390
  if (!tags || !allTags) {
2980
3391
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2981
3392
  }
2982
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, spacing: 1, sx: { pb: 1.5 }, children: tags.map((tagId) => {
2983
- const tag = allTags.find((potentialTag) => tagId === potentialTag.id);
2984
- return tag ? generateTagsDisplay(tag) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2985
- }) });
2986
- };
2987
- var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
2988
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12 }, sx: { pb: 1.5 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2989
- TagEditor,
2990
- {
2991
- title: "Table Tags",
2992
- possibleTags: allTags.filter((tag) => {
2993
- var _a;
2994
- return (_a = tag.appliesTo) == null ? void 0 : _a.tables;
2995
- }),
2996
- selectedTags,
2997
- onToggleTag
2998
- }
2999
- ) });
3393
+ return /* @__PURE__ */ jsxRuntime.jsxs(Grid10__default.default, { container: true, spacing: 1, sx: { pb: 1.5 }, children: [
3394
+ renderTagsFromIds(tags, allTags, { showEventTag: true, eventTagId }),
3395
+ canEdit ? /* @__PURE__ */ jsxRuntime.jsx(
3396
+ material.Button,
3397
+ {
3398
+ variant: "text",
3399
+ className: "inline-block text-sm px-3 py-1font-outlined m-0.5 font-stretch-105% font-sans",
3400
+ sx: {
3401
+ color: "white",
3402
+ textShadow: "black 1.5px 1px 1.5px",
3403
+ "&:hover": {
3404
+ background: "#889"
3405
+ }
3406
+ },
3407
+ children: "Edit Tags..."
3408
+ }
3409
+ ) : ""
3410
+ ] });
3000
3411
  };
3001
3412
  var TablePageLayout_default = TablePageLayout;
3413
+ var ModalProvider = ({ children }) => {
3414
+ var _a;
3415
+ const [modalContent, setModalContent] = React7.useState(null);
3416
+ const [displayModal, setDisplayModal] = React7.useState(false);
3417
+ const [title, setTitle] = React7.useState("");
3418
+ const [options, setOptions] = React7.useState({});
3419
+ const showModal = (content, title2, opts) => {
3420
+ setModalContent(content);
3421
+ setTitle(title2);
3422
+ setOptions(opts != null ? opts : {});
3423
+ setDisplayModal(true);
3424
+ };
3425
+ const hideModal = () => {
3426
+ setDisplayModal(false);
3427
+ };
3428
+ return /* @__PURE__ */ jsxRuntime.jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
3429
+ children,
3430
+ /* @__PURE__ */ jsxRuntime.jsxs(Dialog3__default.default, { open: displayModal, onClose: hideModal, sx: { height: "85%" }, children: [
3431
+ /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { children: [
3432
+ /* @__PURE__ */ jsxRuntime.jsx(DialogTitle3__default.default, { sx: { marginRight: "20px", minWidth: "400px" }, children: title }),
3433
+ /* @__PURE__ */ jsxRuntime.jsx(
3434
+ IconButton3__default.default,
3435
+ {
3436
+ "aria-label": "close",
3437
+ onClick: hideModal,
3438
+ sx: { position: "absolute", right: 8, top: 8 },
3439
+ children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon__default.default, {})
3440
+ }
3441
+ )
3442
+ ] }),
3443
+ /* @__PURE__ */ jsxRuntime.jsx(DialogContent3__default.default, { sx: { paddingTop: 0 }, children: modalContent }),
3444
+ (options.acceptText || options.onAccept) && /* @__PURE__ */ jsxRuntime.jsxs(DialogActions3__default.default, { children: [
3445
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { variant: "contained", onClick: () => {
3446
+ var _a2;
3447
+ hideModal();
3448
+ (_a2 = options.onAccept) == null ? void 0 : _a2.call(options);
3449
+ }, children: (_a = options.acceptText) != null ? _a : "OK" }),
3450
+ /* @__PURE__ */ jsxRuntime.jsx(Button8__default.default, { onClick: () => {
3451
+ var _a2;
3452
+ hideModal();
3453
+ (_a2 = options.onCancel) == null ? void 0 : _a2.call(options);
3454
+ }, children: "Cancel" })
3455
+ ] })
3456
+ ] })
3457
+ ] });
3458
+ };
3459
+ var ModalProvider_default = ModalProvider;
3002
3460
 
3003
3461
  exports.AutoResizingTextarea = AutoResizingTextarea_default;
3004
3462
  exports.BaseSearchResultCard = BaseSearchResultCard_default;
3005
3463
  exports.CANDIDATE_TIMEZONES = CANDIDATE_TIMEZONES;
3006
3464
  exports.Chip = Chip;
3007
3465
  exports.DMHighlightsCard = DMHighlightsCard;
3466
+ exports.DistanceFilter = DistanceFilter_default;
3467
+ exports.EditTableDetailsForm = EditTableDetailsForm;
3008
3468
  exports.EventBanner = EventBanner;
3009
3469
  exports.EventBannerEdit = EventBannerEdit;
3010
3470
  exports.EventBasicInfo = EventBasicInfo;
@@ -3039,10 +3499,14 @@ exports.TablePageLayout = TablePageLayout_default;
3039
3499
  exports.TableResultCard = TableResultCard_default;
3040
3500
  exports.TablesScrollableList = TablesScrollableList_default;
3041
3501
  exports.TagEditor = TagEditor;
3502
+ exports.TagSelector = TagSelector;
3042
3503
  exports.TagsFilter = TagsFilter_default;
3043
3504
  exports.TextSearchCard = TextSearchCard_default;
3044
3505
  exports.TypeFilter = TypeFilter_default;
3506
+ exports.UserAgreementModal = UserAgreementModal_default;
3045
3507
  exports.generateTagsDisplay = generateTagsDisplay;
3508
+ exports.getRandomTagline = getRandomTagline;
3509
+ exports.getRandomTitle = getRandomTitle;
3046
3510
  exports.renderTagsFromIds = renderTagsFromIds;
3047
3511
  exports.useEventEdit = useEventEdit;
3048
3512
  exports.useGameTableContext = useGameTableContext;