@mbpockets/shared-ui 0.1.21 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/EventPage/editMode/index.cjs.map +1 -1
  2. package/dist/EventPage/editMode/index.d.cts +1 -1
  3. package/dist/EventPage/editMode/index.d.ts +1 -1
  4. package/dist/EventPage/editMode/index.mjs.map +1 -1
  5. package/dist/EventPage/editMode.cjs.map +1 -1
  6. package/dist/EventPage/editMode.d.cts +1 -1
  7. package/dist/EventPage/editMode.d.ts +1 -1
  8. package/dist/EventPage/editMode.mjs.map +1 -1
  9. package/dist/EventPage/index.cjs +122 -65
  10. package/dist/EventPage/index.cjs.map +1 -1
  11. package/dist/EventPage/index.d.cts +1 -1
  12. package/dist/EventPage/index.d.ts +1 -1
  13. package/dist/EventPage/index.mjs +122 -65
  14. package/dist/EventPage/index.mjs.map +1 -1
  15. package/dist/EventPage.cjs +122 -65
  16. package/dist/EventPage.cjs.map +1 -1
  17. package/dist/EventPage.d.cts +4 -4
  18. package/dist/EventPage.d.ts +4 -4
  19. package/dist/EventPage.mjs +122 -65
  20. package/dist/EventPage.mjs.map +1 -1
  21. package/dist/PlayerPage/index.cjs +12 -8
  22. package/dist/PlayerPage/index.cjs.map +1 -1
  23. package/dist/PlayerPage/index.mjs +12 -8
  24. package/dist/PlayerPage/index.mjs.map +1 -1
  25. package/dist/PlayerPage.cjs +12 -8
  26. package/dist/PlayerPage.cjs.map +1 -1
  27. package/dist/PlayerPage.mjs +12 -8
  28. package/dist/PlayerPage.mjs.map +1 -1
  29. package/dist/ProfilePage/index.cjs +12 -8
  30. package/dist/ProfilePage/index.cjs.map +1 -1
  31. package/dist/ProfilePage/index.mjs +12 -8
  32. package/dist/ProfilePage/index.mjs.map +1 -1
  33. package/dist/ProfilePage.cjs +12 -8
  34. package/dist/ProfilePage.cjs.map +1 -1
  35. package/dist/ProfilePage.mjs +12 -8
  36. package/dist/ProfilePage.mjs.map +1 -1
  37. package/dist/SearchPage/Filters/index.cjs +38 -18
  38. package/dist/SearchPage/Filters/index.cjs.map +1 -1
  39. package/dist/SearchPage/Filters/index.d.cts +2 -1
  40. package/dist/SearchPage/Filters/index.d.ts +2 -1
  41. package/dist/SearchPage/Filters/index.mjs +34 -17
  42. package/dist/SearchPage/Filters/index.mjs.map +1 -1
  43. package/dist/SearchPage/Filters.cjs +38 -18
  44. package/dist/SearchPage/Filters.cjs.map +1 -1
  45. package/dist/SearchPage/Filters.d.cts +13 -1
  46. package/dist/SearchPage/Filters.d.ts +13 -1
  47. package/dist/SearchPage/Filters.mjs +34 -17
  48. package/dist/SearchPage/Filters.mjs.map +1 -1
  49. package/dist/SearchPage/Results/index.cjs +87 -49
  50. package/dist/SearchPage/Results/index.cjs.map +1 -1
  51. package/dist/SearchPage/Results/index.mjs +87 -49
  52. package/dist/SearchPage/Results/index.mjs.map +1 -1
  53. package/dist/SearchPage/Results.cjs +87 -49
  54. package/dist/SearchPage/Results.cjs.map +1 -1
  55. package/dist/SearchPage/Results.d.cts +10 -3
  56. package/dist/SearchPage/Results.d.ts +10 -3
  57. package/dist/SearchPage/Results.mjs +87 -49
  58. package/dist/SearchPage/Results.mjs.map +1 -1
  59. package/dist/SearchPage/index.cjs +208 -101
  60. package/dist/SearchPage/index.cjs.map +1 -1
  61. package/dist/SearchPage/index.d.cts +2 -2
  62. package/dist/SearchPage/index.d.ts +2 -2
  63. package/dist/SearchPage/index.mjs +204 -100
  64. package/dist/SearchPage/index.mjs.map +1 -1
  65. package/dist/SearchPage.cjs +208 -101
  66. package/dist/SearchPage.cjs.map +1 -1
  67. package/dist/SearchPage.d.cts +25 -3
  68. package/dist/SearchPage.d.ts +25 -3
  69. package/dist/SearchPage.mjs +204 -100
  70. package/dist/SearchPage.mjs.map +1 -1
  71. package/dist/TablePage/EditComponents/index.cjs +296 -0
  72. package/dist/TablePage/EditComponents/index.cjs.map +1 -0
  73. package/dist/TablePage/EditComponents/index.d.cts +3 -0
  74. package/dist/TablePage/EditComponents/index.d.ts +3 -0
  75. package/dist/TablePage/EditComponents/index.mjs +286 -0
  76. package/dist/TablePage/EditComponents/index.mjs.map +1 -0
  77. package/dist/TablePage/EditComponents.cjs +296 -0
  78. package/dist/TablePage/EditComponents.cjs.map +1 -0
  79. package/dist/TablePage/EditComponents.d.cts +21 -0
  80. package/dist/TablePage/EditComponents.d.ts +21 -0
  81. package/dist/TablePage/EditComponents.mjs +286 -0
  82. package/dist/TablePage/EditComponents.mjs.map +1 -0
  83. package/dist/TablePage/ModalProvider/index.cjs +59 -58
  84. package/dist/TablePage/ModalProvider/index.cjs.map +1 -1
  85. package/dist/TablePage/ModalProvider/index.d.cts +1 -1
  86. package/dist/TablePage/ModalProvider/index.d.ts +1 -1
  87. package/dist/TablePage/ModalProvider/index.mjs +50 -59
  88. package/dist/TablePage/ModalProvider/index.mjs.map +1 -1
  89. package/dist/TablePage/ModalProvider.cjs +59 -58
  90. package/dist/TablePage/ModalProvider.cjs.map +1 -1
  91. package/dist/TablePage/ModalProvider.d.cts +7 -2
  92. package/dist/TablePage/ModalProvider.d.ts +7 -2
  93. package/dist/TablePage/ModalProvider.mjs +50 -59
  94. package/dist/TablePage/ModalProvider.mjs.map +1 -1
  95. package/dist/TablePage/index.cjs +555 -331
  96. package/dist/TablePage/index.cjs.map +1 -1
  97. package/dist/TablePage/index.d.cts +3 -2
  98. package/dist/TablePage/index.d.ts +3 -2
  99. package/dist/TablePage/index.mjs +539 -320
  100. package/dist/TablePage/index.mjs.map +1 -1
  101. package/dist/TablePage/players/index.cjs +24 -4
  102. package/dist/TablePage/players/index.cjs.map +1 -1
  103. package/dist/TablePage/players/index.mjs +24 -4
  104. package/dist/TablePage/players/index.mjs.map +1 -1
  105. package/dist/TablePage/players.cjs +24 -4
  106. package/dist/TablePage/players.cjs.map +1 -1
  107. package/dist/TablePage/players.mjs +24 -4
  108. package/dist/TablePage/players.mjs.map +1 -1
  109. package/dist/TablePage.cjs +555 -331
  110. package/dist/TablePage.cjs.map +1 -1
  111. package/dist/TablePage.d.cts +4 -1
  112. package/dist/TablePage.d.ts +4 -1
  113. package/dist/TablePage.mjs +539 -320
  114. package/dist/TablePage.mjs.map +1 -1
  115. package/dist/{index-D7WHhl3Q.d.ts → index-B23RQop0.d.ts} +12 -12
  116. package/dist/{index-DC0kK3aC.d.cts → index-Csj8S4A4.d.cts} +12 -12
  117. package/dist/index.cjs +890 -426
  118. package/dist/index.cjs.map +1 -1
  119. package/dist/index.d.cts +5 -4
  120. package/dist/index.d.ts +5 -4
  121. package/dist/index.mjs +871 -423
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/mocks/{EventDB.cjs → EventDetails.cjs} +203 -3
  124. package/dist/mocks/EventDetails.cjs.map +1 -0
  125. package/dist/mocks/EventDetails.d.cts +6 -0
  126. package/dist/mocks/EventDetails.d.ts +6 -0
  127. package/dist/mocks/{EventDB.mjs → EventDetails.mjs} +203 -3
  128. package/dist/mocks/EventDetails.mjs.map +1 -0
  129. package/dist/mocks/Tables.cjs +1 -1
  130. package/dist/mocks/Tables.cjs.map +1 -1
  131. package/dist/mocks/Tables.mjs +1 -1
  132. package/dist/mocks/Tables.mjs.map +1 -1
  133. package/dist/mocks/Tags.cjs +200 -0
  134. package/dist/mocks/Tags.cjs.map +1 -1
  135. package/dist/mocks/Tags.mjs +200 -0
  136. package/dist/mocks/Tags.mjs.map +1 -1
  137. package/dist/mocks/index.cjs +202 -2
  138. package/dist/mocks/index.cjs.map +1 -1
  139. package/dist/mocks/index.d.cts +1 -1
  140. package/dist/mocks/index.d.ts +1 -1
  141. package/dist/mocks/index.mjs +202 -2
  142. package/dist/mocks/index.mjs.map +1 -1
  143. package/dist/mocks.cjs +202 -2
  144. package/dist/mocks.cjs.map +1 -1
  145. package/dist/mocks.d.cts +1 -1
  146. package/dist/mocks.d.ts +1 -1
  147. package/dist/mocks.mjs +202 -2
  148. package/dist/mocks.mjs.map +1 -1
  149. package/dist/shared/index.cjs +327 -64
  150. package/dist/shared/index.cjs.map +1 -1
  151. package/dist/shared/index.d.cts +1 -1
  152. package/dist/shared/index.d.ts +1 -1
  153. package/dist/shared/index.mjs +324 -64
  154. package/dist/shared/index.mjs.map +1 -1
  155. package/dist/shared.cjs +327 -64
  156. package/dist/shared.cjs.map +1 -1
  157. package/dist/shared.d.cts +25 -2
  158. package/dist/shared.d.ts +25 -2
  159. package/dist/shared.mjs +324 -64
  160. package/dist/shared.mjs.map +1 -1
  161. package/dist/types/event.d.cts +2 -3
  162. package/dist/types/event.d.ts +2 -3
  163. package/dist/types/index.d.cts +2 -2
  164. package/dist/types/index.d.ts +2 -2
  165. package/dist/types/search.d.cts +7 -1
  166. package/dist/types/search.d.ts +7 -1
  167. package/dist/types/tables.d.cts +1 -0
  168. package/dist/types/tables.d.ts +1 -0
  169. package/dist/types.d.cts +2 -2
  170. package/dist/types.d.ts +2 -2
  171. package/package.json +9 -2
  172. package/dist/TablePage/ModalProvider/index.css +0 -49
  173. package/dist/TablePage/ModalProvider/index.css.map +0 -1
  174. package/dist/TablePage/ModalProvider.css +0 -49
  175. package/dist/TablePage/ModalProvider.css.map +0 -1
  176. package/dist/TablePage/index.css +0 -49
  177. package/dist/TablePage/index.css.map +0 -1
  178. package/dist/TablePage.css +0 -49
  179. package/dist/TablePage.css.map +0 -1
  180. package/dist/index.css +0 -49
  181. package/dist/index.css.map +0 -1
  182. package/dist/mocks/EventDB.cjs.map +0 -1
  183. package/dist/mocks/EventDB.d.cts +0 -6
  184. package/dist/mocks/EventDB.d.ts +0 -6
  185. package/dist/mocks/EventDB.mjs.map +0 -1
  186. package/dist/shared/Modal/index.cjs +0 -64
  187. package/dist/shared/Modal/index.cjs.map +0 -1
  188. package/dist/shared/Modal/index.css +0 -49
  189. package/dist/shared/Modal/index.css.map +0 -1
  190. package/dist/shared/Modal/index.d.cts +0 -2
  191. package/dist/shared/Modal/index.d.ts +0 -2
  192. package/dist/shared/Modal/index.mjs +0 -62
  193. package/dist/shared/Modal/index.mjs.map +0 -1
  194. package/dist/shared/Modal.cjs +0 -64
  195. package/dist/shared/Modal.cjs.map +0 -1
  196. package/dist/shared/Modal.css +0 -49
  197. package/dist/shared/Modal.css.map +0 -1
  198. package/dist/shared/Modal.d.cts +0 -9
  199. package/dist/shared/Modal.d.ts +0 -9
  200. package/dist/shared/Modal.mjs +0 -62
  201. package/dist/shared/Modal.mjs.map +0 -1
  202. package/dist/shared/index.css +0 -49
  203. package/dist/shared/index.css.map +0 -1
  204. package/dist/shared.css +0 -49
  205. package/dist/shared.css.map +0 -1
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { useEffect, useState, useMemo } from 'react';
3
3
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
4
- import { Typography } from '@mui/material';
5
- import Autocomplete from '@mui/material/Autocomplete';
4
+ import { Typography, Dialog, DialogTitle, DialogContent, Box, Link, FormControlLabel, Checkbox, DialogActions, Button } from '@mui/material';
6
5
  import Card from '@mui/material/Card';
7
6
  import CardContent from '@mui/material/CardContent';
8
7
  import CardHeader from '@mui/material/CardHeader';
9
8
  import Grid from '@mui/material/Grid';
10
- import Popper from '@mui/material/Popper';
11
9
  import TextField from '@mui/material/TextField';
10
+ import Autocomplete from '@mui/material/Autocomplete';
11
+ import ReactMarkdown from 'react-markdown';
12
12
 
13
13
  // src/components/shared/AutoResizingTextarea.tsx
14
14
  var AutoResizingTextarea = (props) => {
@@ -68,6 +68,137 @@ function Chip({ tag, removeCallback }) {
68
68
  tag.id
69
69
  ) });
70
70
  }
71
+
72
+ // src/components/shared/NameGenerator.ts
73
+ var getRandomTitle = () => {
74
+ const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];
75
+ const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];
76
+ const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];
77
+ return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;
78
+ };
79
+ var getRandomTagline = () => taglines[Math.random() * taglines.length | 0];
80
+ var titlePrefixes = [
81
+ "The Knights of The",
82
+ "The Fellowship of The",
83
+ "The Order of The",
84
+ "The Infamous",
85
+ "The Legendary",
86
+ "The Dubious",
87
+ "The Sworn Guardians of The",
88
+ "The Ancient Guild of The",
89
+ "The Unstoppable",
90
+ "The Misfit",
91
+ "The Chaotic",
92
+ "The Brave",
93
+ "The Forgotten",
94
+ "The Wandering",
95
+ "The Noble Council of The",
96
+ "The Dread Pirates of The",
97
+ "The Honorable Society of The",
98
+ "The Cursed",
99
+ "The Unlikely Heroes of The",
100
+ "The Elders of The",
101
+ "The Seekers of The",
102
+ "The Champions of The",
103
+ "The Heralds of The",
104
+ "The Disciples of The",
105
+ "The Ragtag Band of The",
106
+ "The Cult of The"
107
+ ];
108
+ var tileMiddle = [
109
+ "Round",
110
+ "Kitchen",
111
+ "Deepest",
112
+ "Sorcery",
113
+ "Munchkin",
114
+ "Shenanigan",
115
+ "Secret",
116
+ "Dungeon",
117
+ "Fireside",
118
+ "Tabletop",
119
+ "Midnight",
120
+ "Tavern",
121
+ "Goblin",
122
+ "Dragon",
123
+ "Critical",
124
+ "Natural Twenty",
125
+ "Counterspell",
126
+ "Nat One",
127
+ "Cardboard",
128
+ "Dice Tower",
129
+ "Campaign",
130
+ "Lore",
131
+ "Awkward",
132
+ "Unhinged",
133
+ "Chaotic Neutral",
134
+ "Homebrew",
135
+ "Side Quest"
136
+ ];
137
+ var titleSuffixes = [
138
+ "Table",
139
+ "Dungeon",
140
+ "Cave",
141
+ "Crew",
142
+ "Team",
143
+ "League",
144
+ "Horde",
145
+ "Party",
146
+ "Conclave",
147
+ "Collective",
148
+ "Alliance",
149
+ "Syndicate",
150
+ "Guild",
151
+ "Cabal",
152
+ "Council",
153
+ "Expedition",
154
+ "Enclave",
155
+ "Consortium",
156
+ "Troupe",
157
+ "Vanguard",
158
+ "Cohort",
159
+ "Brotherhood",
160
+ "Sisterhood",
161
+ "Pantheon",
162
+ "Assembly",
163
+ "Coven"
164
+ ];
165
+ var taglines = [
166
+ "Everyone is welcome!",
167
+ "Looking for serious players.",
168
+ "Get in nerds, we're gaming!",
169
+ "If you aren't there, you're square.",
170
+ "It will be legendary!",
171
+ "Beginners welcome \u2014 we were all level 1 once.",
172
+ "No experience necessary. Snacks encouraged.",
173
+ "Roleplayers, board gamers, and chaos gremlins welcome.",
174
+ "We don't metagame. Much.",
175
+ "All alignments accepted. True Neutral gets the snacks.",
176
+ "Where every session is a one-shot... until it isn't.",
177
+ "Homebrew rules may apply.",
178
+ "Warning: may contain excessive lore.",
179
+ "Critical failures celebrated as much as critical hits.",
180
+ "No powergamers. Okay, maybe one powergamer.",
181
+ "We finish campaigns. (Eventually.)",
182
+ "Veteran players seeking worthy companions.",
183
+ "Casuals only \u2014 we're here for the vibes.",
184
+ "Serious about fun, not about rules.",
185
+ "Min-maxers need not apply.",
186
+ "For those who read the rulebook... and those who definitely didn't.",
187
+ "Roll for initiative. Arrive on time.",
188
+ "Side quests are the main quest here.",
189
+ "Chaotic good energy required.",
190
+ "If you bring snacks, you can name the first NPC.",
191
+ "We read the rulebook so you don't have to.",
192
+ "Wargamers only \u2014 no take-backs, no mercy.",
193
+ "Everyone welcome. Meeple provided.",
194
+ "We always play the longest game on the shelf.",
195
+ "Worker placement. Resource management. Existential dread.",
196
+ "No phones at the table! We're here for the game.",
197
+ "Someone always flips the table. Metaphorically. Usually.",
198
+ "We have a designated rules lawyer. It's fine.",
199
+ "Cooperative games only \u2014 we can't handle another Monopoly incident.",
200
+ "Teaching time is half the fun!"
201
+ ];
71
202
  var NextGameCountdown = ({ nextGameTime }) => {
72
203
  const [timeLeft, setTimeLeft] = useState("");
73
204
  useEffect(() => {
@@ -101,27 +232,99 @@ var NextGameCountdown = ({ nextGameTime }) => {
101
232
  function generateTagsDisplay(tag) {
102
233
  return /* @__PURE__ */ jsx(Chip, { tag }, tag.id);
103
234
  }
104
- function renderTagsFromIds(ids, legalTags) {
235
+ function renderTagsFromIds(ids, legalTags, options = {}) {
105
236
  if (!ids || !legalTags || legalTags.length === 0) {
106
237
  return /* @__PURE__ */ jsx(Fragment, {});
107
238
  }
239
+ const { showEventTag = false, eventTagId } = options;
108
240
  const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
109
- return validTags.map((tag) => generateTagsDisplay(tag));
241
+ const sortedTags = [...validTags].sort((a, b) => {
242
+ if (showEventTag && eventTagId !== void 0) {
243
+ if (a.id === eventTagId && b.id === eventTagId) return 0;
244
+ if (a.id === eventTagId) return -1;
245
+ if (b.id === eventTagId) return 1;
246
+ }
247
+ const priorityOrder = ["Organizer Run", "Display Only"];
248
+ const aIndex = priorityOrder.indexOf(a.label);
249
+ const bIndex = priorityOrder.indexOf(b.label);
250
+ if (aIndex !== -1 && bIndex !== -1) {
251
+ return aIndex - bIndex;
252
+ }
253
+ if (aIndex !== -1) return -1;
254
+ if (bIndex !== -1) return 1;
255
+ return 0;
256
+ });
257
+ return sortedTags.map((tag) => generateTagsDisplay(tag));
258
+ }
259
+ function TagSelector({ initialTagIDs, allTags, onTagChange }) {
260
+ const [tagList, updateTagList] = useState(initialTagIDs);
261
+ const [inputValue, setInputValue] = useState("");
262
+ const toggleTag = (id) => tagList.find((t) => t === id) ? removeTag(id) : addTag(id);
263
+ const addTag = (id) => {
264
+ const newList = [...tagList, id];
265
+ updateTagList(newList);
266
+ onTagChange(newList);
267
+ };
268
+ const removeTag = (id) => {
269
+ const newList = tagList.filter((t) => t !== id);
270
+ updateTagList(newList);
271
+ onTagChange(newList);
272
+ };
273
+ const selectedTags = useMemo(() => allTags.filter((tag) => tagList.includes(tag.id)), [allTags, tagList]);
274
+ const options = useMemo(
275
+ () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),
276
+ [allTags]
277
+ );
278
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
279
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsx(
280
+ Chip,
281
+ {
282
+ tag,
283
+ removeCallback: () => toggleTag(tag.id)
284
+ },
285
+ tag.id
286
+ )) }),
287
+ /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { sx: { marginTop: 3, width: "100%", minWidth: "550px" }, children: /* @__PURE__ */ jsx(
288
+ Autocomplete,
289
+ {
290
+ options,
291
+ filterOptions: (availableOptions, state) => availableOptions.filter(
292
+ (option) => !tagList.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
293
+ ),
294
+ value: null,
295
+ inputValue,
296
+ onInputChange: (event, newInputValue) => {
297
+ if (event && event.type === "change") {
298
+ setInputValue(newInputValue);
299
+ }
300
+ },
301
+ onChange: (event, newValue) => {
302
+ if (newValue) {
303
+ toggleTag(newValue.value);
304
+ }
305
+ setInputValue("");
306
+ },
307
+ renderInput: (params) => /* @__PURE__ */ jsx(TextField, { ...params, label: "Select Tags" })
308
+ },
309
+ tagList.join("-")
310
+ ) }) })
311
+ ] });
110
312
  }
111
313
  function TagEditor({
112
- title = "Tags",
314
+ title,
113
315
  selectedTags,
114
316
  possibleTags,
115
317
  onToggleTag
116
318
  }) {
117
- const [inputValue, setInputValue] = useState("");
118
319
  const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
119
- const options = useMemo(
120
- () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
121
- [possibleTags]
122
- );
320
+ const onTagChange = (newSelectedIds) => {
321
+ const addedTags = newSelectedIds.filter((id) => !selectedIds.includes(id));
322
+ const removedTags = selectedIds.filter((id) => !newSelectedIds.includes(id));
323
+ addedTags.forEach((id) => onToggleTag(id));
324
+ removedTags.forEach((id) => onToggleTag(id));
325
+ };
123
326
  return /* @__PURE__ */ jsx(Grid, { container: true, children: /* @__PURE__ */ jsx(Grid, { size: { xs: 12 }, children: /* @__PURE__ */ jsxs(Card, { children: [
124
- /* @__PURE__ */ jsx(
327
+ title ? /* @__PURE__ */ jsx(
125
328
  CardHeader,
126
329
  {
127
330
  title,
@@ -132,64 +335,121 @@ function TagEditor({
132
335
  textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
133
336
  }
134
337
  }
135
- ),
136
- /* @__PURE__ */ jsxs(CardContent, { children: [
137
- /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsx(
138
- Chip,
139
- {
140
- tag,
141
- removeCallback: () => onToggleTag(tag.id)
142
- },
143
- tag.id
144
- )) }),
145
- /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsx(
146
- Autocomplete,
147
- {
148
- options,
149
- filterOptions: (availableOptions, state) => availableOptions.filter(
150
- (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
151
- ).slice(0, 3),
152
- value: null,
153
- inputValue,
154
- onInputChange: (event, newInputValue) => {
155
- if (event && event.type === "change") {
156
- setInputValue(newInputValue);
157
- }
158
- },
159
- onChange: (event, newValue) => {
160
- if (newValue) {
161
- onToggleTag(newValue.value);
162
- }
163
- setInputValue("");
164
- },
165
- slots: { popper: CustomPopper },
166
- renderInput: (params) => /* @__PURE__ */ jsx(TextField, { ...params, label: "Select Tags" })
167
- },
168
- selectedIds.join("-")
169
- ) }) })
170
- ] })
338
+ ) : "",
339
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(TagSelector, { initialTagIDs: selectedIds, allTags: possibleTags, onTagChange }) })
171
340
  ] }) }) });
172
341
  }
173
- var CustomPopper = (props) => {
174
- return /* @__PURE__ */ jsx(
175
- Popper,
342
+ var UserAgreementModal = ({
343
+ open,
344
+ onClose,
345
+ markdownContent,
346
+ requirements,
347
+ onAccept,
348
+ title = "User Agreement",
349
+ forceAgreement = false
350
+ }) => {
351
+ const [checkedState, setCheckedState] = useState(
352
+ new Array(requirements.length).fill(false)
353
+ );
354
+ const handleCheckboxChange = (index) => {
355
+ const updatedCheckedState = checkedState.map(
356
+ (item, i) => i === index ? !item : item
357
+ );
358
+ setCheckedState(updatedCheckedState);
359
+ };
360
+ const isAllRequiredChecked = requirements.every((req, index) => {
361
+ if (req.required) {
362
+ return checkedState[index];
363
+ }
364
+ return true;
365
+ });
366
+ const handleAccept = () => {
367
+ if (isAllRequiredChecked) {
368
+ onAccept();
369
+ }
370
+ };
371
+ const handleClose = (event, reason) => {
372
+ if (forceAgreement) return;
373
+ if (onClose) onClose();
374
+ };
375
+ return /* @__PURE__ */ jsxs(
376
+ Dialog,
176
377
  {
177
- ...props,
178
- modifiers: [
179
- {
180
- name: "preventOverflow",
181
- options: { boundary: "viewport" }
182
- },
183
- {
184
- name: "offset",
185
- options: { offset: [0, -10] }
186
- }
187
- ],
188
- placement: "top-start"
378
+ open,
379
+ onClose: handleClose,
380
+ maxWidth: "md",
381
+ fullWidth: true,
382
+ disableEscapeKeyDown: forceAgreement,
383
+ children: [
384
+ /* @__PURE__ */ jsx(DialogTitle, { children: title }),
385
+ /* @__PURE__ */ jsxs(DialogContent, { dividers: true, children: [
386
+ /* @__PURE__ */ jsx(Box, { sx: { mb: 3 }, children: /* @__PURE__ */ jsx(
387
+ ReactMarkdown,
388
+ {
389
+ components: {
390
+ h1: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "h4", gutterBottom: true, ...props }),
391
+ h2: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "h5", gutterBottom: true, ...props }),
392
+ h3: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "h6", gutterBottom: true, ...props }),
393
+ h4: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", gutterBottom: true, ...props }),
394
+ h5: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", gutterBottom: true, ...props }),
395
+ h6: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "caption", gutterBottom: true, ...props }),
396
+ p: ({ node, ...props }) => /* @__PURE__ */ jsx(Typography, { variant: "body1", gutterBottom: true, ...props }),
397
+ li: ({ node, ...props }) => /* @__PURE__ */ jsx(Box, { component: "li", sx: { mb: 1, ml: 2 }, ...props }),
398
+ ul: ({ node, ...props }) => /* @__PURE__ */ jsx(Box, { component: "ul", sx: { mb: 2 }, ...props }),
399
+ ol: ({ node, ...props }) => /* @__PURE__ */ jsx(Box, { component: "ol", sx: { mb: 2 }, ...props }),
400
+ a: ({ node, ...props }) => /* @__PURE__ */ jsx(Link, { ...props, target: "_blank", rel: "noopener" })
401
+ },
402
+ children: markdownContent
403
+ }
404
+ ) }),
405
+ /* @__PURE__ */ jsx(Box, { sx: { display: "flex", flexDirection: "column", gap: 1 }, children: requirements.map((req, index) => /* @__PURE__ */ jsx(Box, { sx: { display: "flex", alignItems: "flex-start" }, children: /* @__PURE__ */ jsx(
406
+ FormControlLabel,
407
+ {
408
+ control: /* @__PURE__ */ jsx(
409
+ Checkbox,
410
+ {
411
+ checked: checkedState[index],
412
+ onChange: () => handleCheckboxChange(index)
413
+ }
414
+ ),
415
+ label: /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
416
+ req.statement,
417
+ req.link && req.linkText && /* @__PURE__ */ jsxs(Fragment, { children: [
418
+ " ",
419
+ /* @__PURE__ */ jsx(Link, { href: req.link, target: "_blank", rel: "noopener", children: req.linkText })
420
+ ] }),
421
+ req.required && /* @__PURE__ */ jsx(
422
+ Typography,
423
+ {
424
+ component: "span",
425
+ color: "error",
426
+ sx: { ml: 0.5 },
427
+ children: "*"
428
+ }
429
+ )
430
+ ] })
431
+ }
432
+ ) }, index)) })
433
+ ] }),
434
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
435
+ !forceAgreement && /* @__PURE__ */ jsx(Button, { onClick: onClose, color: "inherit", children: "Cancel" }),
436
+ /* @__PURE__ */ jsx(
437
+ Button,
438
+ {
439
+ onClick: handleAccept,
440
+ variant: "contained",
441
+ disabled: !isAllRequiredChecked,
442
+ fullWidth: forceAgreement,
443
+ children: "Accept"
444
+ }
445
+ )
446
+ ] })
447
+ ]
189
448
  }
190
449
  );
191
450
  };
451
+ var UserAgreementModal_default = UserAgreementModal;
192
452
 
193
- export { AutoResizingTextarea_default as AutoResizingTextarea, Chip, NextGameCountdown, TagEditor, generateTagsDisplay, renderTagsFromIds };
453
+ export { AutoResizingTextarea_default as AutoResizingTextarea, Chip, NextGameCountdown, TagEditor, UserAgreementModal_default as UserAgreementModal, generateTagsDisplay, getRandomTagline, getRandomTitle, renderTagsFromIds };
194
454
  //# sourceMappingURL=index.mjs.map
195
455
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/shared/AutoResizingTextarea.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/NextGameCountdown.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/shared/TagEditor.tsx"],"names":["jsx","useEffect","jsxs","Fragment","useState"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\"\r\n\r\nimport React, {Dispatch, SetStateAction, useEffect} from 'react';\r\n\r\ninterface IAutoResizingTextareaProps {\r\n isInEditMode: boolean;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\r\n value: string;\r\n}\r\n\r\nconst AutoResizingTextarea: React.FC<IAutoResizingTextareaProps> = (props: IAutoResizingTextareaProps) => {\r\n const { isInEditMode, onChange, textareaRef, value } = props;\r\n\r\n useEffect(() => {\r\n if (isInEditMode && textareaRef.current) {\r\n const textarea = textareaRef.current;\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${textarea.scrollHeight}px`;\r\n }\r\n }, [isInEditMode, textareaRef, value]); // Run effect when entering edit mode or value changes\r\n\r\n return (\r\n <textarea\r\n ref={textareaRef}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n backgroundColor: '#fffbea',\r\n overflow: 'hidden',\r\n resize: 'none',\r\n width: '100%'\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport default AutoResizingTextarea;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport const NextGameCountdown = ({ nextGameTime }: { nextGameTime?: Date | string }) => {\r\n const [timeLeft, setTimeLeft] = useState<string>('');\r\n\r\n useEffect(() => {\r\n if (!nextGameTime) return;\r\n\r\n const timer = setInterval(() => {\r\n const now = new Date().getTime();\r\n const distance = new Date(nextGameTime).getTime() - now;\r\n\r\n if (distance < 0) {\r\n clearInterval(timer);\r\n setTimeLeft('Started');\r\n return;\r\n }\r\n\r\n const days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n let timeString = '';\r\n if (days > 0) timeString += `${days}d `;\r\n if (hours > 0 || days > 0) timeString += `${hours}h `;\r\n timeString += `${minutes}m ${seconds}s`;\r\n\r\n setTimeLeft(timeString);\r\n }, 1000);\r\n\r\n return () => clearInterval(timer);\r\n }, [nextGameTime]);\r\n\r\n if (!nextGameTime) return null;\r\n\r\n return (\r\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 'bold' }}>\r\n Next Game: {timeLeft}\r\n </Typography>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useMemo, useState } from \"react\";\r\nimport Autocomplete from \"@mui/material/Autocomplete\";\r\nimport Card from \"@mui/material/Card\";\r\nimport CardContent from \"@mui/material/CardContent\";\r\nimport CardHeader from \"@mui/material/CardHeader\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Popper, { PopperProps } from \"@mui/material/Popper\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport interface TagEditorProps {\r\n title?: string;\r\n selectedTags: Tag[];\r\n possibleTags: Tag[];\r\n onToggleTag: (id: number) => void;\r\n}\r\n\r\nexport function TagEditor({\r\n title = \"Tags\",\r\n selectedTags,\r\n possibleTags,\r\n onToggleTag,\r\n}: TagEditorProps) {\r\n const [inputValue, setInputValue] = useState(\"\");\r\n const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);\r\n\r\n const options = useMemo(\r\n () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),\r\n [possibleTags]\r\n );\r\n\r\n return (\r\n <Grid container>\r\n <Grid size={{ xs: 12 }}>\r\n <Card>\r\n <CardHeader\r\n title={title}\r\n style={{\r\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))\",\r\n color: \"#FFFFFF\",\r\n fontSize: \"1.5rem\",\r\n textShadow: \"0px 3px 6px rgba(0, 0, 0, 0.5)\",\r\n }}\r\n />\r\n <CardContent>\r\n <div className=\"mt-2 flex flex-wrap gap-2\">\r\n {selectedTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n tag={tag}\r\n removeCallback={() => onToggleTag(tag.id)}\r\n />\r\n ))}\r\n </div>\r\n <Grid container spacing={3}>\r\n <Grid sx={{ marginTop: 3, width: \"100%\" }}>\r\n <Autocomplete\r\n key={selectedIds.join(\"-\")}\r\n options={options}\r\n filterOptions={(availableOptions, state) =>\r\n availableOptions\r\n .filter(\r\n (option) =>\r\n !selectedIds.includes(option.value) &&\r\n option.label.toLowerCase().includes(state.inputValue.toLowerCase())\r\n )\r\n .slice(0, 3)\r\n }\r\n value={null}\r\n inputValue={inputValue}\r\n onInputChange={(event, newInputValue) => {\r\n if (event && event.type === \"change\") {\r\n setInputValue(newInputValue);\r\n }\r\n }}\r\n onChange={(event, newValue) => {\r\n if (newValue) {\r\n onToggleTag(newValue.value);\r\n }\r\n setInputValue(\"\");\r\n }}\r\n slots={{ popper: CustomPopper }}\r\n renderInput={(params) => <TextField {...params} label=\"Select Tags\" />}\r\n />\r\n </Grid>\r\n </Grid>\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n </Grid>\r\n );\r\n}\r\n\r\nconst CustomPopper = (props: PopperProps) => {\r\n return (\r\n <Popper\r\n {...props}\r\n modifiers={[\r\n {\r\n name: \"preventOverflow\",\r\n options: { boundary: \"viewport\" },\r\n },\r\n {\r\n name: \"offset\",\r\n options: { offset: [0, -10] },\r\n },\r\n ]}\r\n placement=\"top-start\"\r\n />\r\n );\r\n};\r\n"]}
1
+ {"version":3,"sources":["../../src/components/shared/AutoResizingTextarea.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/NameGenerator.ts","../../src/components/shared/NextGameCountdown.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/TablePage/EditComponents/TagSelector.tsx","../../src/components/shared/TagEditor.tsx","../../src/components/shared/UserAgreementModal.tsx"],"names":["jsx","useEffect","jsxs","Fragment","useState","useMemo","Grid","Typography"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\"\r\n\r\nimport React, {Dispatch, SetStateAction, useEffect} from 'react';\r\n\r\ninterface IAutoResizingTextareaProps {\r\n isInEditMode: boolean;\r\n onChange: Dispatch<SetStateAction<string>>;\r\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\r\n value: string;\r\n}\r\n\r\nconst AutoResizingTextarea: React.FC<IAutoResizingTextareaProps> = (props: IAutoResizingTextareaProps) => {\r\n const { isInEditMode, onChange, textareaRef, value } = props;\r\n\r\n useEffect(() => {\r\n if (isInEditMode && textareaRef.current) {\r\n const textarea = textareaRef.current;\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${textarea.scrollHeight}px`;\r\n }\r\n }, [isInEditMode, textareaRef, value]); // Run effect when entering edit mode or value changes\r\n\r\n return (\r\n <textarea\r\n ref={textareaRef}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n backgroundColor: '#fffbea',\r\n overflow: 'hidden',\r\n resize: 'none',\r\n width: '100%'\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport default AutoResizingTextarea;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\r\nexport const getRandomTitle = () => {\r\n const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];\r\n const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];\r\n const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];\r\n return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;\r\n}\r\n\r\nexport const getRandomTagline = () => taglines[Math.random() * taglines.length | 0];\r\n\r\n\r\nconst titlePrefixes = [\r\n \"The Knights of The\",\r\n \"The Fellowship of The\",\r\n \"The Order of The\",\r\n \"The Infamous\",\r\n \"The Legendary\",\r\n \"The Dubious\",\r\n \"The Sworn Guardians of The\",\r\n \"The Ancient Guild of The\",\r\n \"The Unstoppable\",\r\n \"The Misfit\",\r\n \"The Chaotic\",\r\n \"The Brave\",\r\n \"The Forgotten\",\r\n \"The Wandering\",\r\n \"The Noble Council of The\",\r\n \"The Dread Pirates of The\",\r\n \"The Honorable Society of The\",\r\n \"The Cursed\",\r\n \"The Unlikely Heroes of The\",\r\n \"The Elders of The\",\r\n \"The Seekers of The\",\r\n \"The Champions of The\",\r\n \"The Heralds of The\",\r\n \"The Disciples of The\",\r\n \"The Ragtag Band of The\",\r\n \"The Cult of The\",\r\n];\r\n\r\nconst tileMiddle = [\r\n \"Round\",\r\n \"Kitchen\",\r\n \"Deepest\",\r\n \"Sorcery\",\r\n \"Munchkin\",\r\n \"Shenanigan\",\r\n \"Secret\",\r\n \"Dungeon\",\r\n \"Fireside\",\r\n \"Tabletop\",\r\n \"Midnight\",\r\n \"Tavern\",\r\n \"Goblin\",\r\n \"Dragon\",\r\n \"Critical\",\r\n \"Natural Twenty\",\r\n \"Counterspell\",\r\n \"Nat One\",\r\n \"Cardboard\",\r\n \"Dice Tower\",\r\n \"Campaign\",\r\n \"Lore\",\r\n \"Awkward\",\r\n \"Unhinged\",\r\n \"Chaotic Neutral\",\r\n \"Homebrew\",\r\n \"Side Quest\",\r\n];\r\n\r\nconst titleSuffixes = [\r\n \"Table\",\r\n \"Dungeon\",\r\n \"Cave\",\r\n \"Crew\",\r\n \"Team\",\r\n \"League\",\r\n \"Horde\",\r\n \"Party\",\r\n \"Conclave\",\r\n \"Collective\",\r\n \"Alliance\",\r\n \"Syndicate\",\r\n \"Guild\",\r\n \"Cabal\",\r\n \"Council\",\r\n \"Expedition\",\r\n \"Enclave\",\r\n \"Consortium\",\r\n \"Troupe\",\r\n \"Vanguard\",\r\n \"Cohort\",\r\n \"Brotherhood\",\r\n \"Sisterhood\",\r\n \"Pantheon\",\r\n \"Assembly\",\r\n \"Coven\",\r\n];\r\n\r\nconst taglines = [\r\n \"Everyone is welcome!\",\r\n \"Looking for serious players.\",\r\n \"Get in nerds, we're gaming!\",\r\n \"If you aren't there, you're square.\",\r\n \"It will be legendary!\",\r\n \"Beginners welcome — we were all level 1 once.\",\r\n \"No experience necessary. Snacks encouraged.\",\r\n \"Roleplayers, board gamers, and chaos gremlins welcome.\",\r\n \"We don't metagame. Much.\",\r\n \"All alignments accepted. True Neutral gets the snacks.\",\r\n \"Where every session is a one-shot... until it isn't.\",\r\n \"Homebrew rules may apply.\",\r\n \"Warning: may contain excessive lore.\",\r\n \"Critical failures celebrated as much as critical hits.\",\r\n \"No powergamers. Okay, maybe one powergamer.\",\r\n \"We finish campaigns. (Eventually.)\",\r\n \"Veteran players seeking worthy companions.\",\r\n \"Casuals only — we're here for the vibes.\",\r\n \"Serious about fun, not about rules.\",\r\n \"Min-maxers need not apply.\",\r\n \"For those who read the rulebook... and those who definitely didn't.\",\r\n \"Roll for initiative. Arrive on time.\",\r\n \"Side quests are the main quest here.\",\r\n \"Chaotic good energy required.\",\r\n \"If you bring snacks, you can name the first NPC.\",\r\n \"We read the rulebook so you don't have to.\",\r\n \"Wargamers only — no take-backs, no mercy.\",\r\n \"Everyone welcome. Meeple provided.\",\r\n \"We always play the longest game on the shelf.\",\r\n \"Worker placement. Resource management. Existential dread.\",\r\n \"No phones at the table! We're here for the game.\",\r\n \"Someone always flips the table. Metaphorically. Usually.\",\r\n \"We have a designated rules lawyer. It's fine.\",\r\n \"Cooperative games only — we can't handle another Monopoly incident.\",\r\n \"Teaching time is half the fun!\",\r\n];\r\n","\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport const NextGameCountdown = ({ nextGameTime }: { nextGameTime?: Date | string }) => {\r\n const [timeLeft, setTimeLeft] = useState<string>('');\r\n\r\n useEffect(() => {\r\n if (!nextGameTime) return;\r\n\r\n const timer = setInterval(() => {\r\n const now = new Date().getTime();\r\n const distance = new Date(nextGameTime).getTime() - now;\r\n\r\n if (distance < 0) {\r\n clearInterval(timer);\r\n setTimeLeft('Started');\r\n return;\r\n }\r\n\r\n const days = Math.floor(distance / (1000 * 60 * 60 * 24));\r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n\r\n let timeString = '';\r\n if (days > 0) timeString += `${days}d `;\r\n if (hours > 0 || days > 0) timeString += `${hours}h `;\r\n timeString += `${minutes}m ${seconds}s`;\r\n\r\n setTimeLeft(timeString);\r\n }, 1000);\r\n\r\n return () => clearInterval(timer);\r\n }, [nextGameTime]);\r\n\r\n if (!nextGameTime) return null;\r\n\r\n return (\r\n <Typography variant=\"body2\" color=\"primary\" sx={{ fontWeight: 'bold' }}>\r\n Next Game: {timeLeft}\r\n </Typography>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[], options: { showEventTag?: boolean, eventTagId?: number } = {}) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const { showEventTag = false, eventTagId } = options;\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n // Sort tags: event tag (if shown) first, then \"Organizer Run\", then \"Display Only\", then others\r\n const sortedTags = [...validTags].sort((a, b) => {\r\n // Handle event tag priority if enabled\r\n if (showEventTag && eventTagId !== undefined) {\r\n if (a.id === eventTagId && b.id === eventTagId) return 0;\r\n if (a.id === eventTagId) return -1;\r\n if (b.id === eventTagId) return 1;\r\n }\r\n\r\n const priorityOrder = [\"Organizer Run\", \"Display Only\"];\r\n const aIndex = priorityOrder.indexOf(a.label);\r\n const bIndex = priorityOrder.indexOf(b.label);\r\n\r\n if (aIndex !== -1 && bIndex !== -1) {\r\n return aIndex - bIndex;\r\n }\r\n if (aIndex !== -1) return -1;\r\n if (bIndex !== -1) return 1;\r\n return 0;\r\n });\r\n\r\n return sortedTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React, {useMemo, useState} from \"react\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Autocomplete from \"@mui/material/Autocomplete\";\r\nimport Chip from \"../../shared/Chip\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport function TagSelector({initialTagIDs, allTags, onTagChange}: {\r\n initialTagIDs: number[];\r\n allTags: Tag[];\r\n onTagChange: (tagIDs: number[]) => void;\r\n}) {\r\n const [tagList, updateTagList] = useState(initialTagIDs);\r\n const [inputValue, setInputValue] = useState(\"\");\r\n\r\n const toggleTag = (id: number) => tagList.find(t => t === id) ? removeTag(id) : addTag(id);\r\n const addTag = (id: number) => {\r\n const newList = [...tagList, id];\r\n updateTagList(newList);\r\n onTagChange(newList);\r\n };\r\n const removeTag = (id: number) => {\r\n const newList = tagList.filter(t => t !== id);\r\n updateTagList(newList);\r\n onTagChange(newList);\r\n }\r\n const selectedTags = useMemo(() => allTags.filter(tag => tagList.includes(tag.id)), [allTags, tagList]);\r\n const options = useMemo(\r\n () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),\r\n [allTags]\r\n );\r\n\r\n return (\r\n <>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {selectedTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n tag={tag}\r\n removeCallback={() => toggleTag(tag.id)}\r\n />\r\n ))}\r\n </div>\r\n <Grid container spacing={3}>\r\n <Grid sx={{ marginTop: 3, width: \"100%\", minWidth: \"550px\" }}>\r\n <Autocomplete\r\n key={tagList.join(\"-\")}\r\n options={options}\r\n filterOptions={(availableOptions, state) =>\r\n availableOptions\r\n .filter(\r\n (option) =>\r\n !tagList.includes(option.value) &&\r\n option.label.toLowerCase().includes(state.inputValue.toLowerCase())\r\n )\r\n }\r\n value={null}\r\n inputValue={inputValue}\r\n onInputChange={(event, newInputValue) => {\r\n if (event && event.type === \"change\") {\r\n setInputValue(newInputValue);\r\n }\r\n }}\r\n onChange={(event, newValue) => {\r\n if (newValue) {\r\n toggleTag(newValue.value);\r\n }\r\n setInputValue(\"\");\r\n }}\r\n renderInput={(params) => <TextField {...params} label=\"Select Tags\" />}\r\n />\r\n </Grid>\r\n </Grid>\r\n </>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport Card from \"@mui/material/Card\";\r\nimport CardContent from \"@mui/material/CardContent\";\r\nimport CardHeader from \"@mui/material/CardHeader\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport {TagSelector} from \"@/components/TablePage/EditComponents/TagSelector\";\r\n\r\nexport interface TagEditorProps {\r\n title?: string;\r\n selectedTags: Tag[];\r\n possibleTags: Tag[];\r\n onToggleTag: (id: number) => void;\r\n}\r\n\r\nexport function TagEditor({\r\n title,\r\n selectedTags,\r\n possibleTags,\r\n onToggleTag,\r\n}: TagEditorProps) {\r\n const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);\r\n\r\n const onTagChange = (newSelectedIds: number[]) => {\r\n const addedTags = newSelectedIds.filter((id) => !selectedIds.includes(id));\r\n const removedTags = selectedIds.filter((id) => !newSelectedIds.includes(id));\r\n\r\n addedTags.forEach((id) => onToggleTag(id));\r\n removedTags.forEach((id) => onToggleTag(id));\r\n }\r\n\r\n return (\r\n <Grid container>\r\n <Grid size={{ xs: 12 }}>\r\n <Card>\r\n {title ? (<CardHeader\r\n title={title}\r\n style={{\r\n background: \"linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))\",\r\n color: \"#FFFFFF\",\r\n fontSize: \"1.5rem\",\r\n textShadow: \"0px 3px 6px rgba(0, 0, 0, 0.5)\",\r\n }}\r\n />) : \"\"}\r\n <CardContent>\r\n <TagSelector initialTagIDs={selectedIds} allTags={possibleTags} onTagChange={onTagChange} />\r\n </CardContent>\r\n </Card>\r\n </Grid>\r\n </Grid>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n Checkbox,\r\n FormControlLabel,\r\n Link,\r\n Typography,\r\n Box,\r\n} from \"@mui/material\";\r\nimport ReactMarkdown from \"react-markdown\";\r\n\r\nexport type AgreementRequirement = {\r\n statement: string;\r\n link?: string;\r\n linkText?: string;\r\n required: boolean;\r\n};\r\n\r\nexport type UserAgreementModalProps = {\r\n open: boolean;\r\n onClose?: () => void;\r\n markdownContent: string;\r\n requirements: AgreementRequirement[];\r\n onAccept: () => void;\r\n title?: string;\r\n forceAgreement?: boolean;\r\n};\r\n\r\nconst UserAgreementModal: React.FC<UserAgreementModalProps> = ({\r\n open,\r\n onClose,\r\n markdownContent,\r\n requirements,\r\n onAccept,\r\n title = \"User Agreement\",\r\n forceAgreement = false,\r\n}) => {\r\n const [checkedState, setCheckedState] = useState<boolean[]>(\r\n new Array(requirements.length).fill(false)\r\n );\r\n\r\n const handleCheckboxChange = (index: number) => {\r\n const updatedCheckedState = checkedState.map((item, i) =>\r\n i === index ? !item : item\r\n );\r\n setCheckedState(updatedCheckedState);\r\n };\r\n\r\n const isAllRequiredChecked = requirements.every((req, index) => {\r\n if (req.required) {\r\n return checkedState[index];\r\n }\r\n return true;\r\n });\r\n\r\n const handleAccept = () => {\r\n if (isAllRequiredChecked) {\r\n onAccept();\r\n }\r\n };\r\n\r\n const handleClose = (event: {}, reason: \"backdropClick\" | \"escapeKeyDown\") => {\r\n if (forceAgreement) return;\r\n if (onClose) onClose();\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={handleClose}\r\n maxWidth=\"md\"\r\n fullWidth\r\n disableEscapeKeyDown={forceAgreement}\r\n >\r\n <DialogTitle>{title}</DialogTitle>\r\n <DialogContent dividers>\r\n <Box sx={{ mb: 3 }}>\r\n <ReactMarkdown\r\n components={{\r\n h1: ({ node, ...props }) => <Typography variant=\"h4\" gutterBottom {...props} />,\r\n h2: ({ node, ...props }) => <Typography variant=\"h5\" gutterBottom {...props} />,\r\n h3: ({ node, ...props }) => <Typography variant=\"h6\" gutterBottom {...props} />,\r\n h4: ({ node, ...props }) => <Typography variant=\"subtitle1\" gutterBottom {...props} />,\r\n h5: ({ node, ...props }) => <Typography variant=\"subtitle2\" gutterBottom {...props} />,\r\n h6: ({ node, ...props }) => <Typography variant=\"caption\" gutterBottom {...props} />,\r\n p: ({ node, ...props }) => <Typography variant=\"body1\" gutterBottom {...props} />,\r\n li: ({ node, ...props }) => <Box component=\"li\" sx={{ mb: 1, ml: 2 }} {...props} />,\r\n ul: ({ node, ...props }) => <Box component=\"ul\" sx={{ mb: 2 }} {...props} />,\r\n ol: ({ node, ...props }) => <Box component=\"ol\" sx={{ mb: 2 }} {...props} />,\r\n a: ({ node, ...props }) => <Link {...props} target=\"_blank\" rel=\"noopener\" />,\r\n }}\r\n >\r\n {markdownContent}\r\n </ReactMarkdown>\r\n </Box>\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\r\n {requirements.map((req, index) => (\r\n <Box key={index} sx={{ display: \"flex\", alignItems: \"flex-start\" }}>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={checkedState[index]}\r\n onChange={() => handleCheckboxChange(index)}\r\n />\r\n }\r\n label={\r\n <Typography variant=\"body2\">\r\n {req.statement}\r\n {req.link && req.linkText && (\r\n <>\r\n {\" \"}\r\n <Link href={req.link} target=\"_blank\" rel=\"noopener\">\r\n {req.linkText}\r\n </Link>\r\n </>\r\n )}\r\n {req.required && (\r\n <Typography\r\n component=\"span\"\r\n color=\"error\"\r\n sx={{ ml: 0.5 }}\r\n >\r\n *\r\n </Typography>\r\n )}\r\n </Typography>\r\n }\r\n />\r\n </Box>\r\n ))}\r\n </Box>\r\n </DialogContent>\r\n <DialogActions>\r\n {!forceAgreement && (\r\n <Button onClick={onClose} color=\"inherit\">\r\n Cancel\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleAccept}\r\n variant=\"contained\"\r\n disabled={!isAllRequiredChecked}\r\n fullWidth={forceAgreement}\r\n >\r\n Accept\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default UserAgreementModal;\r\n"]}