@mbpockets/shared-ui 0.2.0 → 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 +121 -63
  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 +121 -63
  14. package/dist/EventPage/index.mjs.map +1 -1
  15. package/dist/EventPage.cjs +121 -63
  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 +121 -63
  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 -48
  50. package/dist/SearchPage/Results/index.cjs.map +1 -1
  51. package/dist/SearchPage/Results/index.mjs +87 -48
  52. package/dist/SearchPage/Results/index.mjs.map +1 -1
  53. package/dist/SearchPage/Results.cjs +87 -48
  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 -48
  58. package/dist/SearchPage/Results.mjs.map +1 -1
  59. package/dist/SearchPage/index.cjs +207 -99
  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 +203 -98
  64. package/dist/SearchPage/index.mjs.map +1 -1
  65. package/dist/SearchPage.cjs +207 -99
  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 +203 -98
  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 +889 -424
  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 +870 -421
  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": {
@@ -1041,7 +1089,7 @@ var BaseSearchResultCard = ({
1041
1089
  const text = full || "";
1042
1090
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
1043
1091
  })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "body1", children: result.description }),
1044
- 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 }) })
1045
1093
  ] })
1046
1094
  ] })
1047
1095
  }
@@ -1083,7 +1131,7 @@ var PlayerResultCard = ({
1083
1131
  const playerIcon = /* @__PURE__ */ jsxRuntime.jsx(
1084
1132
  Avatar__default.default,
1085
1133
  {
1086
- src: result.imageUrl,
1134
+ src: result.imageUrl || DEFAULT_PROFILE_PIC,
1087
1135
  alt: result.title,
1088
1136
  sx: {
1089
1137
  width: 40,
@@ -1099,7 +1147,9 @@ var PlayerResultCard_default = PlayerResultCard;
1099
1147
  var TableResultCard = ({
1100
1148
  result,
1101
1149
  onClick,
1102
- tags
1150
+ tags,
1151
+ showEventTag,
1152
+ eventTagId
1103
1153
  }) => {
1104
1154
  const rawCapacity = result.capacity;
1105
1155
  const hasDefinedCapacity = typeof rawCapacity === "number" && Number.isFinite(rawCapacity) && rawCapacity > 0;
@@ -1117,40 +1167,51 @@ var TableResultCard = ({
1117
1167
  }
1118
1168
  }
1119
1169
  );
1120
- return /* @__PURE__ */ jsxRuntime.jsx(BaseSearchResultCard_default, { result, onClick, icon: tableIcon, tags, children: /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
1121
- /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1 }, children: [
1122
- /* @__PURE__ */ jsxRuntime.jsxs(Typography4__default.default, { variant: "body2", children: [
1123
- /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Players:" }),
1124
- " ",
1125
- hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers
1126
- ] }),
1127
- typeof hasDM === "boolean" && /* @__PURE__ */ jsxRuntime.jsx(
1128
- Chip2__default.default,
1129
- {
1130
- icon: hasDM ? /* @__PURE__ */ jsxRuntime.jsx(SupervisorAccountIcon__default.default, {}) : /* @__PURE__ */ jsxRuntime.jsx(PersonIcon__default.default, {}),
1131
- label: hasDM ? "DM Present" : "No DM",
1132
- color: hasDM ? "success" : "warning",
1133
- size: "small"
1134
- }
1135
- )
1136
- ] }),
1137
- /* @__PURE__ */ jsxRuntime.jsx(
1138
- LinearProgress__default.default,
1139
- {
1140
- variant: "determinate",
1141
- value: occupancyPercentage,
1142
- sx: {
1143
- height: 10,
1144
- borderRadius: 5,
1145
- backgroundColor: "#e0e0e0",
1146
- "& .MuiLinearProgress-bar": {
1147
- 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
+ }
1148
1209
  }
1149
- }
1150
- }
1151
- ),
1152
- 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" })
1153
- ] }) });
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
+ );
1154
1215
  };
1155
1216
  var TableResultCard_default = TableResultCard;
1156
1217
  var EventResultCard = ({
@@ -1168,7 +1229,7 @@ var EventResultCard = ({
1168
1229
  try {
1169
1230
  const date = new Date(dateString);
1170
1231
  return date.toLocaleDateString("en-US", options);
1171
- } catch (error) {
1232
+ } catch (__) {
1172
1233
  return dateString;
1173
1234
  }
1174
1235
  };
@@ -1213,20 +1274,22 @@ var ResultsContainer = ({
1213
1274
  onResultClick,
1214
1275
  tags,
1215
1276
  pagination,
1216
- onPacketChange
1277
+ onPacketChange,
1278
+ showEventTag,
1279
+ eventTagId
1217
1280
  }) => {
1218
1281
  if (!results || results.length === 0 || !results.map) {
1219
1282
  return /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
1220
1283
  }
1221
- const onPlayerClick = (id) => {
1222
- onResultClick == null ? void 0 : onResultClick(id, "player");
1223
- };
1224
- const onTableClick = (id) => {
1225
- onResultClick == null ? void 0 : onResultClick(id, "table");
1226
- };
1227
- const onEventClick = (id) => {
1228
- onResultClick == null ? void 0 : onResultClick(id, "event");
1229
- };
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;
1230
1293
  const handlePacketChange = (_event, packet) => {
1231
1294
  onPacketChange == null ? void 0 : onPacketChange(packet);
1232
1295
  };
@@ -1260,7 +1323,9 @@ var ResultsContainer = ({
1260
1323
  {
1261
1324
  result,
1262
1325
  onClick: onTableClick,
1263
- tags
1326
+ tags,
1327
+ showEventTag,
1328
+ eventTagId
1264
1329
  },
1265
1330
  result.id
1266
1331
  );
@@ -1296,17 +1361,30 @@ var ScrollableResultsList = ({
1296
1361
  tags,
1297
1362
  maxHeight = 400,
1298
1363
  onResultClick,
1299
- emptyText
1364
+ emptyText,
1365
+ showEventTag,
1366
+ eventTagId
1300
1367
  }) => {
1301
1368
  const hasResults = Array.isArray(results) && results.length > 0;
1302
- 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." }) });
1303
1379
  };
1304
1380
  var ScrollableResultsList_default = ScrollableResultsList;
1305
1381
  var TablesScrollableList = ({
1306
1382
  results,
1307
1383
  tags,
1308
1384
  maxHeight,
1309
- onResultClick
1385
+ onResultClick,
1386
+ showEventTag,
1387
+ eventTagId
1310
1388
  }) => {
1311
1389
  const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
1312
1390
  const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
@@ -1318,7 +1396,9 @@ var TablesScrollableList = ({
1318
1396
  maxHeight,
1319
1397
  onResultClick: (id, type) => {
1320
1398
  if (type === "table") handleClick(id);
1321
- }
1399
+ },
1400
+ showEventTag,
1401
+ eventTagId
1322
1402
  }
1323
1403
  );
1324
1404
  };
@@ -1346,24 +1426,24 @@ function EventPageLayout({
1346
1426
  tables,
1347
1427
  allTags
1348
1428
  }) {
1349
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, flexDirection: "column", children: /* @__PURE__ */ jsxRuntime.jsxs(EventEditProvider, { initialEvent: mergedEvent, value: { isOwner, updateEvent, updateImages }, children: [
1350
- /* @__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(
1351
1431
  EventBanner,
1352
1432
  {
1353
1433
  attendees,
1354
1434
  numGames
1355
1435
  }
1356
1436
  ) }),
1357
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, flexDirection: "row", spacing: 3, size: { xs: 12, md: 12 }, children: [
1358
- /* @__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(
1359
1439
  EventBasicInfo,
1360
1440
  {
1361
1441
  locationId: mergedEvent.location || "0"
1362
1442
  }
1363
1443
  ) }),
1364
- /* @__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 }) })
1365
1445
  ] }),
1366
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, {})
1446
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, {})
1367
1447
  ] }) });
1368
1448
  }
1369
1449
  var PlayerDetailsCard = ({
@@ -1522,19 +1602,18 @@ var PlayerDetailsCard = ({
1522
1602
  );
1523
1603
  };
1524
1604
  var PlayerDetailsCard_default = PlayerDetailsCard;
1525
-
1526
- // src/data/values.tsx
1527
- var ProfilePictureSettings = {
1528
- aspectRatio: 4 / 5};
1529
- var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) => {
1530
- const defaultImg = "/man-walking-silhouette-clipart.jpg";
1531
- const [imageSrc, setImageSrc] = React7.useState(defaultImg);
1532
- const { aspectRatio } = ProfilePictureSettings;
1605
+ var PlayerDisplayCard = ({
1606
+ profilePicture,
1607
+ username,
1608
+ bio,
1609
+ preferredPronouns
1610
+ }) => {
1611
+ const [imageSrc, setImageSrc] = React7.useState(DEFAULT_PROFILE_PIC);
1533
1612
  React7.useEffect(() => {
1534
1613
  async function validateImage() {
1535
- const newImage = profilePicture || defaultImg;
1614
+ const newImage = profilePicture || DEFAULT_PROFILE_PIC;
1536
1615
  if (!profilePicture) {
1537
- setImageSrc(defaultImg);
1616
+ setImageSrc(DEFAULT_PROFILE_PIC);
1538
1617
  return;
1539
1618
  }
1540
1619
  const img = new Image();
@@ -1543,7 +1622,7 @@ var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) =
1543
1622
  setImageSrc(newImage);
1544
1623
  };
1545
1624
  img.onerror = () => {
1546
- setImageSrc(defaultImg);
1625
+ setImageSrc(DEFAULT_PROFILE_PIC);
1547
1626
  };
1548
1627
  }
1549
1628
  validateImage();
@@ -1573,7 +1652,7 @@ var PlayerDisplayCard = ({ profilePicture, username, bio, preferredPronouns }) =
1573
1652
  image: imageSrc,
1574
1653
  alt: `${username}'s Profile Picture`,
1575
1654
  sx: {
1576
- aspectRatio,
1655
+ aspectRatio: ProfilePictureSettings.aspectRatio,
1577
1656
  height: "auto",
1578
1657
  // Updates to maintain aspect ratio and fill space nicely
1579
1658
  width: "100%",
@@ -1892,6 +1971,24 @@ function PlayerPageLayout({
1892
1971
  ] }) })
1893
1972
  ] }) }) });
1894
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;
1895
1992
  var ExpiredTablesFilter = ({
1896
1993
  includeExpiredTables,
1897
1994
  onChange
@@ -1960,13 +2057,13 @@ var TagsFilter = ({
1960
2057
  shouldHaveAtLeastOne: ""
1961
2058
  });
1962
2059
  const tagOptions = React7__default.default.useMemo(() => {
2060
+ var _a;
1963
2061
  console.log("available tags: " + JSON.stringify(Tags));
1964
2062
  console.log(!Tags);
1965
- if (!Tags || Tags.length === 0 || !Tags.map) return [];
1966
- return Tags.map((tag) => ({
2063
+ return (_a = Tags == null ? void 0 : Tags.map((tag) => ({
1967
2064
  value: tag.id,
1968
2065
  label: tag.label
1969
- }));
2066
+ }))) != null ? _a : [];
1970
2067
  }, [Tags]);
1971
2068
  const handleTagChange = (tagId, category) => {
1972
2069
  let newTags = [];
@@ -1994,8 +2091,7 @@ var TagsFilter = ({
1994
2091
  };
1995
2092
  const renderSelectedTags = (selectedTags, category) => {
1996
2093
  const tagValues = [];
1997
- if (!Tags || Tags.length === 0 || !Tags.map) return null;
1998
- Tags.forEach((tag) => {
2094
+ Tags == null ? void 0 : Tags.forEach((tag) => {
1999
2095
  if (selectedTags.includes(tag.id)) {
2000
2096
  tagValues.push(tag);
2001
2097
  }
@@ -2061,7 +2157,7 @@ var TagsFilter = ({
2061
2157
  });
2062
2158
  },
2063
2159
  slots: { popper: CustomPopper2 },
2064
- 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}` })
2065
2161
  },
2066
2162
  `${category}-${selectedTags.join("-")}`
2067
2163
  )
@@ -2133,7 +2229,7 @@ var TextSearchCard = ({ onChange, selectedTypes, initialTextSearch }) => {
2133
2229
  /* @__PURE__ */ jsxRuntime.jsx(Typography4__default.default, { variant: "h6", gutterBottom: true, children: "Text Search" }),
2134
2230
  /* @__PURE__ */ jsxRuntime.jsxs(Box2__default.default, { sx: { mb: 2 }, children: [
2135
2231
  /* @__PURE__ */ jsxRuntime.jsx(
2136
- TextField4__default.default,
2232
+ TextField7__default.default,
2137
2233
  {
2138
2234
  fullWidth: true,
2139
2235
  label: "Search in title and description",
@@ -2182,9 +2278,7 @@ var TypeFilter = ({ types, initialSelectedTypes = [], onChange }) => {
2182
2278
  Checkbox__default.default,
2183
2279
  {
2184
2280
  checked: selectedTypes.includes(type.id),
2185
- onChange: () => handleTypeChange(type.id),
2186
- disabled: type.id === "event",
2187
- title: type.id === "event" ? "Coming soon! Currently only player and table search are supported." : ""
2281
+ onChange: () => handleTypeChange(type.id)
2188
2282
  }
2189
2283
  ),
2190
2284
  label: type.label
@@ -2199,10 +2293,13 @@ var FiltersContainer = ({
2199
2293
  initialSelectedTags,
2200
2294
  initialTextSearch,
2201
2295
  includeExpiredTables = false,
2296
+ distance,
2297
+ distances,
2202
2298
  onTypeChange,
2203
2299
  onTagChange,
2204
2300
  onTextSearchChange,
2205
2301
  onIncludeExpiredTablesChange,
2302
+ onDistanceChange,
2206
2303
  onSubmit,
2207
2304
  tags,
2208
2305
  searchTypes
@@ -2217,7 +2314,10 @@ var FiltersContainer = ({
2217
2314
  onTypeChange(types);
2218
2315
  }
2219
2316
  };
2220
- 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: [
2221
2321
  /* @__PURE__ */ jsxRuntime.jsx(
2222
2322
  TypeFilter_default,
2223
2323
  {
@@ -2227,6 +2327,16 @@ var FiltersContainer = ({
2227
2327
  }
2228
2328
  ),
2229
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 } }),
2230
2340
  /* @__PURE__ */ jsxRuntime.jsx(
2231
2341
  TextSearchCard_default,
2232
2342
  {
@@ -2257,13 +2367,13 @@ var FiltersContainer = ({
2257
2367
  /* @__PURE__ */ jsxRuntime.jsx(Divider3__default.default, { sx: { my: 2 } })
2258
2368
  ] }),
2259
2369
  /* @__PURE__ */ jsxRuntime.jsx(Box2__default.default, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2260
- Button7__default.default,
2370
+ Button8__default.default,
2261
2371
  {
2372
+ type: "submit",
2262
2373
  variant: "contained",
2263
2374
  color: "primary",
2264
2375
  size: "large",
2265
2376
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(SearchIcon__default.default, {}),
2266
- onClick: onSubmit,
2267
2377
  sx: {
2268
2378
  width: "100%",
2269
2379
  py: 1.5,
@@ -2323,11 +2433,13 @@ function SearchPageLayout({
2323
2433
  query: "",
2324
2434
  titleOnly: false
2325
2435
  },
2326
- includeExpiredTables: initialIncludeExpiredTables = false,
2436
+ initialDistance,
2437
+ distances,
2327
2438
  onTypeChange,
2328
2439
  onTagChange,
2329
2440
  onTextSearchChange,
2330
2441
  onIncludeExpiredTablesChange,
2442
+ onDistanceChange,
2331
2443
  onSubmit,
2332
2444
  onResultClick,
2333
2445
  onPacketChange,
@@ -2335,14 +2447,16 @@ function SearchPageLayout({
2335
2447
  validTags,
2336
2448
  allTags,
2337
2449
  searchTypes,
2338
- isLoading = false
2450
+ isLoading = false,
2451
+ eventTagId
2339
2452
  }) {
2340
2453
  const theme = material.useTheme();
2341
2454
  const isMobile = material.useMediaQuery(theme.breakpoints.down("md"));
2342
2455
  const [selectedTypes, setSelectedTypes] = React7.useState(initialSelectedTypes);
2343
2456
  const [selectedTags, setSelectedTags] = React7.useState(initialSelectedTags);
2344
2457
  const [textSearch, setTextSearch] = React7.useState(initialTextSearch);
2345
- const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(initialIncludeExpiredTables);
2458
+ const [includeExpiredTables, setIncludeExpiredTables] = React7.useState(false);
2459
+ const [distance, setDistance] = React7.useState(initialDistance);
2346
2460
  React7.useEffect(() => {
2347
2461
  setSelectedTypes(initialSelectedTypes);
2348
2462
  }, [initialSelectedTypes]);
@@ -2353,8 +2467,8 @@ function SearchPageLayout({
2353
2467
  setTextSearch(initialTextSearch);
2354
2468
  }, [initialTextSearch]);
2355
2469
  React7.useEffect(() => {
2356
- setIncludeExpiredTables(initialIncludeExpiredTables);
2357
- }, [initialIncludeExpiredTables]);
2470
+ setDistance(initialDistance);
2471
+ }, [initialDistance]);
2358
2472
  const handleTypeChange = (types) => {
2359
2473
  setSelectedTypes(types);
2360
2474
  if (onTypeChange) onTypeChange(types);
@@ -2371,12 +2485,17 @@ function SearchPageLayout({
2371
2485
  setIncludeExpiredTables(include);
2372
2486
  if (onIncludeExpiredTablesChange) onIncludeExpiredTablesChange(include);
2373
2487
  };
2488
+ const handleDistanceChange = (dist) => {
2489
+ setDistance(dist);
2490
+ if (onDistanceChange) onDistanceChange(dist);
2491
+ };
2374
2492
  const handleSubmit = () => {
2375
2493
  const currentCriteria = {
2376
2494
  selectedTypes,
2377
2495
  selectedTags,
2378
2496
  textSearch,
2379
- includeExpiredTables
2497
+ includeExpiredTables,
2498
+ distance
2380
2499
  };
2381
2500
  if (onSubmit) {
2382
2501
  onSubmit(currentCriteria);
@@ -2395,8 +2514,8 @@ function SearchPageLayout({
2395
2514
  }
2396
2515
  }
2397
2516
  ) }),
2398
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, children: [
2399
- /* @__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: [
2400
2519
  /* @__PURE__ */ jsxRuntime.jsx(
2401
2520
  CardHeader4__default.default,
2402
2521
  {
@@ -2416,17 +2535,20 @@ function SearchPageLayout({
2416
2535
  initialSelectedTags: selectedTags,
2417
2536
  initialTextSearch: textSearch,
2418
2537
  includeExpiredTables,
2538
+ distance,
2539
+ distances,
2419
2540
  onTypeChange: handleTypeChange,
2420
2541
  onTagChange: handleTagChange,
2421
2542
  onTextSearchChange: handleTextSearchChange,
2422
2543
  onIncludeExpiredTablesChange: handleIncludeExpiredTablesChange,
2544
+ onDistanceChange: handleDistanceChange,
2423
2545
  onSubmit: handleSubmit,
2424
2546
  tags: validTags,
2425
2547
  searchTypes
2426
2548
  }
2427
2549
  ) })
2428
2550
  ] }) }),
2429
- /* @__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: [
2430
2552
  /* @__PURE__ */ jsxRuntime.jsx(
2431
2553
  CardHeader4__default.default,
2432
2554
  {
@@ -2446,13 +2568,255 @@ function SearchPageLayout({
2446
2568
  pagination,
2447
2569
  onPacketChange,
2448
2570
  onResultClick,
2449
- tags: allTags
2571
+ tags: allTags,
2572
+ showEventTag: true,
2573
+ eventTagId
2450
2574
  }
2451
2575
  ) })
2452
2576
  ] }) })
2453
2577
  ] })
2454
2578
  ] });
2455
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
+ }
2456
2820
  var GameTableContext = React7__default.default.createContext(void 0);
2457
2821
  function GameTableProvider(props) {
2458
2822
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.children });
@@ -2465,76 +2829,206 @@ function useGameTableContext() {
2465
2829
  throw new Error("useGameTableContext is deprecated in the package build. Pass table data through props instead.");
2466
2830
  }
2467
2831
  var ModalContext = React7.createContext({
2468
- showModal: (content) => {
2832
+ showModal: () => {
2469
2833
  },
2470
2834
  hideModal: () => {
2471
2835
  }
2472
2836
  });
2473
2837
  var useModal = () => React7.useContext(ModalContext);
2474
- var Modal = ({ onClose, children }) => {
2475
- const modalRef = React7.useRef(null);
2476
- const previouslyFocusedElement = React7.useRef(null);
2838
+ var AutoResizingTextarea = (props) => {
2839
+ const { isInEditMode, onChange, textareaRef, value } = props;
2477
2840
  React7.useEffect(() => {
2478
- var _a;
2479
- if (children) {
2480
- previouslyFocusedElement.current = document.activeElement;
2481
- (_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`;
2482
2845
  }
2483
- return () => {
2484
- var _a2;
2485
- (_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
2486
- };
2487
- }, [children]);
2488
- const handleOnClose = () => {
2489
- onClose();
2490
- };
2491
- const handleKeyDown = (e) => {
2492
- var _a;
2493
- if (e.key !== "Tab") return;
2494
- const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
2495
- 'button, [tabindex]:not([tabindex="-1"])'
2496
- );
2497
- if (!focusableElements || focusableElements.length === 0) return;
2498
- const first = focusableElements[0];
2499
- const last = focusableElements[focusableElements.length - 1];
2500
- if (e.shiftKey) {
2501
- if (document.activeElement === first) {
2502
- e.preventDefault();
2503
- 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%"
2504
2858
  }
2505
- } else {
2506
- if (document.activeElement === last) {
2507
- e.preventDefault();
2508
- 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
+ }
2509
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();
2510
2949
  }
2511
2950
  };
2512
- return /* @__PURE__ */ jsxRuntime.jsx(
2513
- "div",
2951
+ const handleClose = (event, reason) => {
2952
+ if (forceAgreement) return;
2953
+ if (onClose) onClose();
2954
+ };
2955
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2956
+ material.Dialog,
2514
2957
  {
2515
- className: "modal-overlay",
2516
- onKeyDown: handleKeyDown,
2517
- ref: modalRef,
2518
- role: "dialog",
2519
- tabIndex: -1,
2520
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "modal-container", children: [
2521
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleOnClose, children: "X" }) }),
2522
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "modal-content", children })
2523
- ] })
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
+ ]
2524
3028
  }
2525
3029
  );
2526
3030
  };
2527
- var Modal_default = Modal;
2528
- var ModalProvider = ({ children }) => {
2529
- const [modalContent, setModalContent] = React7.useState(null);
2530
- const showModal = (content) => setModalContent(content);
2531
- const hideModal = () => setModalContent(null);
2532
- return /* @__PURE__ */ jsxRuntime.jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
2533
- children,
2534
- modalContent && /* @__PURE__ */ jsxRuntime.jsx(Modal_default, { onClose: hideModal, children: modalContent })
2535
- ] });
2536
- };
2537
- var ModalProvider_default = ModalProvider;
3031
+ var UserAgreementModal_default = UserAgreementModal;
2538
3032
  var PlayerHighlightsCard = function(props) {
2539
3033
  const {
2540
3034
  allTags,
@@ -2546,16 +3040,16 @@ var PlayerHighlightsCard = function(props) {
2546
3040
  removeFromTable
2547
3041
  } = props;
2548
3042
  return /* @__PURE__ */ jsxRuntime.jsx(material.Card, { elevation: 3, sx: { backgroundColor: canEdit ? "#fffbea" : "#f5f9fa", marginBottom: "6px" }, children: /* @__PURE__ */ jsxRuntime.jsxs(material.CardContent, { children: [
2549
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, direction: "column", children: [
2550
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, direction: "row", children: [
2551
- /* @__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 }) }),
2552
- /* @__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 }) })
2553
3047
  ] }),
2554
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: renderTagsFromIds(player.tags, allTags) })
3048
+ /* @__PURE__ */ jsxRuntime.jsx(Grid10__default.default, { children: renderTagsFromIds(player.tags, allTags) })
2555
3049
  ] }),
2556
- canEdit && /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { children: [
2557
- /* @__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" }) }),
2558
- 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: () => {
2559
3053
  handleAssignToDungeonMaster(player);
2560
3054
  removeFromTable(player);
2561
3055
  }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Assign to DungeonMaster" }) })
@@ -2565,11 +3059,11 @@ var PlayerHighlightsCard = function(props) {
2565
3059
  var DMHighlightsCard = function({ canEdit, player, allTags }) {
2566
3060
  return /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { elevation: 3, sx: { backgroundColor: "#f5f9fa", marginBottom: "6px" }, children: [
2567
3061
  /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Game Master" }),
2568
- /* @__PURE__ */ jsxRuntime.jsx(material.CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, direction: "column", children: [
2569
- /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", children: player.username }) }),
2570
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, direction: "row", children: [
2571
- /* @__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 }) }),
2572
- /* @__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) }),
2573
3067
  /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { children: player.description })
2574
3068
  ] })
2575
3069
  ] }) })
@@ -2598,12 +3092,11 @@ function TableActionsBar(props) {
2598
3092
  if (waitlistPlayers.length === 0) {
2599
3093
  return /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Waitlist is empty!" });
2600
3094
  }
2601
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2602
- /* @__PURE__ */ jsxRuntime.jsx(CardHeader4__default.default, { slotProps: { title: { variant: "h4" } }, title: "Waitlist Players: " }),
2603
- /* @__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(
2604
3097
  "li",
2605
3098
  {
2606
- 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`,
2607
3100
  onClick: () => canMovePlayersToTable ? onPromoteWaitlistPlayer == null ? void 0 : onPromoteWaitlistPlayer(player.id) : void 0,
2608
3101
  tabIndex: 0,
2609
3102
  children: [
@@ -2612,7 +3105,7 @@ function TableActionsBar(props) {
2612
3105
  {
2613
3106
  alt: player.username + "'s profile pic",
2614
3107
  height: 64,
2615
- src: player.miniPic || "",
3108
+ src: player.miniPic || DEFAULT_PROFILE_PIC,
2616
3109
  width: 64
2617
3110
  }
2618
3111
  ),
@@ -2621,7 +3114,7 @@ function TableActionsBar(props) {
2621
3114
  },
2622
3115
  player.id
2623
3116
  )) }),
2624
- /* @__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" }) })
2625
3118
  ] });
2626
3119
  };
2627
3120
  return /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "column", spacing: 1, children: [
@@ -2632,33 +3125,45 @@ function TableActionsBar(props) {
2632
3125
  slots
2633
3126
  ] }) }),
2634
3127
  /* @__PURE__ */ jsxRuntime.jsxs(material.Grid, { container: true, direction: "row", children: [
2635
- !isOwner && !isPlayer && !isDM && !onWaitlist && /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: () => onJoinWaitlist == null ? void 0 : onJoinWaitlist(), sx: buttonStyle, children: "Join Waitlist" }),
2636
- !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" }),
2637
3130
  canEditTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2638
- /* @__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" }),
2639
3132
  canViewWaitlist ? /* @__PURE__ */ jsxRuntime.jsx(
2640
- Button7__default.default,
3133
+ Button8__default.default,
2641
3134
  {
2642
3135
  endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2643
- onClick: () => showModal(renderPlayerWaitlistModalContent(false)),
3136
+ onClick: () => showModal(renderPlayerWaitlistModalContent(false), "Waitlist Players:"),
2644
3137
  sx: buttonStyle,
2645
3138
  children: "View Waitlist"
2646
3139
  }
2647
3140
  ) : null
2648
3141
  ] }) : canSaveTable ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2649
- /* @__PURE__ */ jsxRuntime.jsx(Button7__default.default, { onClick: onSave, sx: buttonStyle, endIcon: /* @__PURE__ */ jsxRuntime.jsx(SaveIcon__default.default, {}), children: "Save" }),
2650
- /* @__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" }),
2651
3144
  /* @__PURE__ */ jsxRuntime.jsx(
2652
- Button7__default.default,
3145
+ Button8__default.default,
2653
3146
  {
2654
3147
  endIcon: /* @__PURE__ */ jsxRuntime.jsx(ListIcon__default.default, {}),
2655
- onClick: () => showModal(renderPlayerWaitlistModalContent(true)),
3148
+ onClick: () => showModal(renderPlayerWaitlistModalContent(true), "Waitlist Players:"),
2656
3149
  sx: buttonStyle,
2657
3150
  children: "Edit Waitlist"
2658
3151
  }
2659
3152
  )
2660
3153
  ] }) : null,
2661
- 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
+ )
2662
3167
  ] })
2663
3168
  ] });
2664
3169
  }
@@ -2668,165 +3173,82 @@ var buttonStyle = {
2668
3173
  color: "white",
2669
3174
  borderRadius: "5px"
2670
3175
  };
2671
- var AutoResizingTextarea = (props) => {
2672
- const { isInEditMode, onChange, textareaRef, value } = props;
2673
- React7.useEffect(() => {
2674
- if (isInEditMode && textareaRef.current) {
2675
- const textarea = textareaRef.current;
2676
- textarea.style.height = "auto";
2677
- textarea.style.height = `${textarea.scrollHeight}px`;
2678
- }
2679
- }, [isInEditMode, textareaRef, value]);
2680
- return /* @__PURE__ */ jsxRuntime.jsx(
2681
- "textarea",
2682
- {
2683
- ref: textareaRef,
2684
- value,
2685
- onChange: (e) => onChange(e.target.value),
2686
- style: {
2687
- backgroundColor: "#fffbea",
2688
- overflow: "hidden",
2689
- resize: "none",
2690
- width: "100%"
2691
- }
2692
- }
2693
- );
2694
- };
2695
- var AutoResizingTextarea_default = AutoResizingTextarea;
2696
- var NextGameCountdown = ({ nextGameTime }) => {
2697
- const [timeLeft, setTimeLeft] = React7.useState("");
2698
- React7.useEffect(() => {
2699
- if (!nextGameTime) return;
2700
- const timer = setInterval(() => {
2701
- const now = (/* @__PURE__ */ new Date()).getTime();
2702
- const distance = new Date(nextGameTime).getTime() - now;
2703
- if (distance < 0) {
2704
- clearInterval(timer);
2705
- setTimeLeft("Started");
2706
- return;
2707
- }
2708
- const days = Math.floor(distance / (1e3 * 60 * 60 * 24));
2709
- const hours = Math.floor(distance % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60));
2710
- const minutes = Math.floor(distance % (1e3 * 60 * 60) / (1e3 * 60));
2711
- const seconds = Math.floor(distance % (1e3 * 60) / 1e3);
2712
- let timeString = "";
2713
- if (days > 0) timeString += `${days}d `;
2714
- if (hours > 0 || days > 0) timeString += `${hours}h `;
2715
- timeString += `${minutes}m ${seconds}s`;
2716
- setTimeLeft(timeString);
2717
- }, 1e3);
2718
- return () => clearInterval(timer);
2719
- }, [nextGameTime]);
2720
- if (!nextGameTime) return null;
2721
- return /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", color: "primary", sx: { fontWeight: "bold" }, children: [
2722
- "Next Game: ",
2723
- timeLeft
2724
- ] });
2725
- };
2726
- function TagEditor({
2727
- title = "Tags",
2728
- selectedTags,
2729
- possibleTags,
2730
- onToggleTag
2731
- }) {
2732
- const [inputValue, setInputValue] = React7.useState("");
2733
- const selectedIds = React7.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
2734
- const options = React7.useMemo(
2735
- () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
2736
- [possibleTags]
2737
- );
2738
- 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: [
2739
- /* @__PURE__ */ jsxRuntime.jsx(
2740
- CardHeader4__default.default,
2741
- {
2742
- title,
2743
- style: {
2744
- background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
2745
- color: "#FFFFFF",
2746
- fontSize: "1.5rem",
2747
- textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
2748
- }
2749
- }
2750
- ),
2751
- /* @__PURE__ */ jsxRuntime.jsxs(CardContent10__default.default, { children: [
2752
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
2753
- Chip,
2754
- {
2755
- tag,
2756
- removeCallback: () => onToggleTag(tag.id)
2757
- },
2758
- tag.id
2759
- )) }),
2760
- /* @__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(
2761
- Autocomplete__default.default,
2762
- {
2763
- options,
2764
- filterOptions: (availableOptions, state) => availableOptions.filter(
2765
- (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
2766
- ).slice(0, 3),
2767
- value: null,
2768
- inputValue,
2769
- onInputChange: (event, newInputValue) => {
2770
- if (event && event.type === "change") {
2771
- setInputValue(newInputValue);
2772
- }
2773
- },
2774
- onChange: (event, newValue) => {
2775
- if (newValue) {
2776
- onToggleTag(newValue.value);
2777
- }
2778
- setInputValue("");
2779
- },
2780
- slots: { popper: CustomPopper3 },
2781
- renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField4__default.default, { ...params, label: "Select Tags" })
2782
- },
2783
- selectedIds.join("-")
2784
- ) }) })
2785
- ] })
2786
- ] }) }) });
2787
- }
2788
- var CustomPopper3 = (props) => {
2789
- return /* @__PURE__ */ jsxRuntime.jsx(
2790
- Popper__default.default,
2791
- {
2792
- ...props,
2793
- modifiers: [
2794
- {
2795
- name: "preventOverflow",
2796
- options: { boundary: "viewport" }
2797
- },
2798
- {
2799
- name: "offset",
2800
- options: { offset: [0, -10] }
2801
- }
2802
- ],
2803
- placement: "top-start"
2804
- }
2805
- );
2806
- };
2807
3176
  function TablePageLayout(props) {
2808
3177
  var _a;
2809
- 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;
2810
3181
  const textAreaRef = React7.useRef(null);
2811
3182
  const [isTableInEditMode, setIsTableInEditMode] = React7.useState(false);
3183
+ const [currentTitle, setCurrentTitle] = React7.useState(table.title);
3184
+ const [currentSubtitle, setCurrentSubtitle] = React7.useState(table.shortDescription);
2812
3185
  const [currentDescription, setCurrentDescription] = React7.useState(table.description);
2813
3186
  const [currentDungeonMaster, setCurrentDungeonMaster] = React7.useState(dungeonMaster);
2814
3187
  const [currentPlayers, setCurrentPlayers] = React7.useState(players);
2815
- const [currentShortDescription, setCurrentShortDescription] = React7.useState(table.shortDescription);
2816
- const [currentTitle, setCurrentTitle] = React7.useState(table.title);
2817
3188
  const [currentWaitlistPlayers, setCurrentWaitlistPlayers] = React7.useState(waitlistPlayers);
2818
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
+ };
2819
3246
  React7.useEffect(() => {
2820
- var _a2;
2821
- setCurrentDescription(table.description);
2822
- setCurrentDungeonMaster(dungeonMaster);
2823
- setCurrentPlayers(players);
2824
- setCurrentShortDescription(table.shortDescription);
2825
- setCurrentTitle(table.title);
2826
- setCurrentWaitlistPlayers(waitlistPlayers);
2827
- setCurrentTagIds((_a2 = table.tags) != null ? _a2 : []);
2828
- }, [dungeonMaster, players, table, waitlistPlayers]);
2829
- const currentTags = React7.useMemo(
3247
+ if (startWithEditTitle) {
3248
+ editTableDetails();
3249
+ }
3250
+ });
3251
+ React7.useMemo(
2830
3252
  () => allTags.filter((tag) => currentTagIds.includes(tag.id)),
2831
3253
  [allTags, currentTagIds]
2832
3254
  );
@@ -2846,37 +3268,17 @@ function TablePageLayout(props) {
2846
3268
  return prevWaitlist.filter((player) => player.id !== playerIdToPromote);
2847
3269
  });
2848
3270
  };
2849
- const handleToggleTag = (tagId) => {
2850
- setCurrentTagIds(
2851
- (prevState) => prevState.includes(tagId) ? prevState.filter((id) => id !== tagId) : [...prevState, tagId]
2852
- );
2853
- };
2854
- const handleSaveTable = () => {
2855
- const nextDraft = {
2856
- ...table,
2857
- description: currentDescription,
2858
- dungeonMaster: String(currentDungeonMaster.id),
2859
- players: currentPlayers.map((player) => player.id),
2860
- shortDescription: currentShortDescription,
2861
- tags: currentTagIds,
2862
- title: currentTitle,
2863
- waitlist: currentWaitlistPlayers.map((player) => player.id)
2864
- };
2865
- void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
2866
- setIsTableInEditMode(false);
2867
- };
2868
3271
  return /* @__PURE__ */ jsxRuntime.jsx(
2869
3272
  material.Card,
2870
3273
  {
2871
3274
  sx: {
2872
3275
  backgroundColor: isTableInEditMode ? "lightsalmon" : "white",
2873
- borderRadius: "5%",
2874
3276
  p: 2,
2875
3277
  boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)"
2876
3278
  },
2877
- 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: [
2878
3280
  /* @__PURE__ */ jsxRuntime.jsxs(
2879
- Grid8__default.default,
3281
+ Grid10__default.default,
2880
3282
  {
2881
3283
  container: true,
2882
3284
  direction: "column",
@@ -2889,39 +3291,49 @@ function TablePageLayout(props) {
2889
3291
  textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)"
2890
3292
  },
2891
3293
  children: [
2892
- /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2893
- "input",
2894
- {
2895
- onChange: (e) => setCurrentTitle(e.target.value),
2896
- style: { backgroundColor: "#fffbea" },
2897
- tabIndex: 0,
2898
- type: "text",
2899
- value: currentTitle
2900
- }
2901
- ) : /* @__PURE__ */ jsxRuntime.jsx(
2902
- material.CardHeader,
3294
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(
3295
+ material.Box,
2903
3296
  {
2904
- title: currentTitle,
2905
- sx: {
2906
- p: 0,
2907
- "& .MuiCardHeader-title": {
2908
- color: "white",
2909
- fontWeight: 700
2910
- }
2911
- }
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
+ ]
2912
3316
  }
2913
3317
  ) }),
2914
- isTableInEditMode ? /* @__PURE__ */ jsxRuntime.jsx(
2915
- "input",
3318
+ /* @__PURE__ */ jsxRuntime.jsxs(
3319
+ material.Box,
2916
3320
  {
2917
- onChange: (e) => setCurrentShortDescription(e.target.value),
2918
- style: { backgroundColor: "#fffbea" },
2919
- tabIndex: 0,
2920
- type: "text",
2921
- 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
+ ]
2922
3334
  }
2923
- ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { color: "white", opacity: 0.95 }, children: currentShortDescription }),
2924
- /* @__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) }),
2925
3337
  /* @__PURE__ */ jsxRuntime.jsx(
2926
3338
  TableActionsBar,
2927
3339
  {
@@ -2941,8 +3353,8 @@ function TablePageLayout(props) {
2941
3353
  ]
2942
3354
  }
2943
3355
  ),
2944
- /* @__PURE__ */ jsxRuntime.jsxs(Grid8__default.default, { container: true, spacing: 2, sx: { mt: 2 }, children: [
2945
- /* @__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(
2946
3358
  AutoResizingTextarea_default,
2947
3359
  {
2948
3360
  isInEditMode: isTableInEditMode,
@@ -2951,7 +3363,7 @@ function TablePageLayout(props) {
2951
3363
  value: currentDescription
2952
3364
  }
2953
3365
  ) : /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { sx: { whiteSpace: "pre-wrap" }, children: currentDescription }) }) }) }),
2954
- /* @__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: [
2955
3367
  /* @__PURE__ */ jsxRuntime.jsx(DMHighlightsCard, { canEdit: isTableInEditMode, player: currentDungeonMaster, allTags }),
2956
3368
  /* @__PURE__ */ jsxRuntime.jsxs(material.Card, { sx: { height: "100%" }, children: [
2957
3369
  /* @__PURE__ */ jsxRuntime.jsx(material.CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Players: " }),
@@ -2974,36 +3386,85 @@ function TablePageLayout(props) {
2974
3386
  }
2975
3387
  );
2976
3388
  }
2977
- var renderTags = function(tags, allTags) {
3389
+ var renderTags = function(tags, allTags, canEdit, eventTagId) {
2978
3390
  if (!tags || !allTags) {
2979
3391
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2980
3392
  }
2981
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { container: true, spacing: 1, sx: { pb: 1.5 }, children: tags.map((tagId) => {
2982
- const tag = allTags.find((potentialTag) => tagId === potentialTag.id);
2983
- return tag ? generateTagsDisplay(tag) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
2984
- }) });
2985
- };
2986
- var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
2987
- return /* @__PURE__ */ jsxRuntime.jsx(Grid8__default.default, { size: { xs: 12 }, sx: { pb: 1.5 }, children: /* @__PURE__ */ jsxRuntime.jsx(
2988
- TagEditor,
2989
- {
2990
- title: "Table Tags",
2991
- possibleTags: allTags.filter((tag) => {
2992
- var _a;
2993
- return (_a = tag.appliesTo) == null ? void 0 : _a.tables;
2994
- }),
2995
- selectedTags,
2996
- onToggleTag
2997
- }
2998
- ) });
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
+ ] });
2999
3411
  };
3000
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;
3001
3460
 
3002
3461
  exports.AutoResizingTextarea = AutoResizingTextarea_default;
3003
3462
  exports.BaseSearchResultCard = BaseSearchResultCard_default;
3004
3463
  exports.CANDIDATE_TIMEZONES = CANDIDATE_TIMEZONES;
3005
3464
  exports.Chip = Chip;
3006
3465
  exports.DMHighlightsCard = DMHighlightsCard;
3466
+ exports.DistanceFilter = DistanceFilter_default;
3467
+ exports.EditTableDetailsForm = EditTableDetailsForm;
3007
3468
  exports.EventBanner = EventBanner;
3008
3469
  exports.EventBannerEdit = EventBannerEdit;
3009
3470
  exports.EventBasicInfo = EventBasicInfo;
@@ -3038,10 +3499,14 @@ exports.TablePageLayout = TablePageLayout_default;
3038
3499
  exports.TableResultCard = TableResultCard_default;
3039
3500
  exports.TablesScrollableList = TablesScrollableList_default;
3040
3501
  exports.TagEditor = TagEditor;
3502
+ exports.TagSelector = TagSelector;
3041
3503
  exports.TagsFilter = TagsFilter_default;
3042
3504
  exports.TextSearchCard = TextSearchCard_default;
3043
3505
  exports.TypeFilter = TypeFilter_default;
3506
+ exports.UserAgreementModal = UserAgreementModal_default;
3044
3507
  exports.generateTagsDisplay = generateTagsDisplay;
3508
+ exports.getRandomTagline = getRandomTagline;
3509
+ exports.getRandomTitle = getRandomTitle;
3045
3510
  exports.renderTagsFromIds = renderTagsFromIds;
3046
3511
  exports.useEventEdit = useEventEdit;
3047
3512
  exports.useGameTableContext = useGameTableContext;