@mbpockets/shared-ui 0.1.21 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/EventPage/editMode/index.cjs.map +1 -1
  2. package/dist/EventPage/editMode/index.d.cts +1 -1
  3. package/dist/EventPage/editMode/index.d.ts +1 -1
  4. package/dist/EventPage/editMode/index.mjs.map +1 -1
  5. package/dist/EventPage/editMode.cjs.map +1 -1
  6. package/dist/EventPage/editMode.d.cts +1 -1
  7. package/dist/EventPage/editMode.d.ts +1 -1
  8. package/dist/EventPage/editMode.mjs.map +1 -1
  9. package/dist/EventPage/index.cjs +122 -65
  10. package/dist/EventPage/index.cjs.map +1 -1
  11. package/dist/EventPage/index.d.cts +1 -1
  12. package/dist/EventPage/index.d.ts +1 -1
  13. package/dist/EventPage/index.mjs +122 -65
  14. package/dist/EventPage/index.mjs.map +1 -1
  15. package/dist/EventPage.cjs +122 -65
  16. package/dist/EventPage.cjs.map +1 -1
  17. package/dist/EventPage.d.cts +4 -4
  18. package/dist/EventPage.d.ts +4 -4
  19. package/dist/EventPage.mjs +122 -65
  20. package/dist/EventPage.mjs.map +1 -1
  21. package/dist/PlayerPage/index.cjs +12 -8
  22. package/dist/PlayerPage/index.cjs.map +1 -1
  23. package/dist/PlayerPage/index.mjs +12 -8
  24. package/dist/PlayerPage/index.mjs.map +1 -1
  25. package/dist/PlayerPage.cjs +12 -8
  26. package/dist/PlayerPage.cjs.map +1 -1
  27. package/dist/PlayerPage.mjs +12 -8
  28. package/dist/PlayerPage.mjs.map +1 -1
  29. package/dist/ProfilePage/index.cjs +12 -8
  30. package/dist/ProfilePage/index.cjs.map +1 -1
  31. package/dist/ProfilePage/index.mjs +12 -8
  32. package/dist/ProfilePage/index.mjs.map +1 -1
  33. package/dist/ProfilePage.cjs +12 -8
  34. package/dist/ProfilePage.cjs.map +1 -1
  35. package/dist/ProfilePage.mjs +12 -8
  36. package/dist/ProfilePage.mjs.map +1 -1
  37. package/dist/SearchPage/Filters/index.cjs +38 -18
  38. package/dist/SearchPage/Filters/index.cjs.map +1 -1
  39. package/dist/SearchPage/Filters/index.d.cts +2 -1
  40. package/dist/SearchPage/Filters/index.d.ts +2 -1
  41. package/dist/SearchPage/Filters/index.mjs +34 -17
  42. package/dist/SearchPage/Filters/index.mjs.map +1 -1
  43. package/dist/SearchPage/Filters.cjs +38 -18
  44. package/dist/SearchPage/Filters.cjs.map +1 -1
  45. package/dist/SearchPage/Filters.d.cts +13 -1
  46. package/dist/SearchPage/Filters.d.ts +13 -1
  47. package/dist/SearchPage/Filters.mjs +34 -17
  48. package/dist/SearchPage/Filters.mjs.map +1 -1
  49. package/dist/SearchPage/Results/index.cjs +87 -49
  50. package/dist/SearchPage/Results/index.cjs.map +1 -1
  51. package/dist/SearchPage/Results/index.mjs +87 -49
  52. package/dist/SearchPage/Results/index.mjs.map +1 -1
  53. package/dist/SearchPage/Results.cjs +87 -49
  54. package/dist/SearchPage/Results.cjs.map +1 -1
  55. package/dist/SearchPage/Results.d.cts +10 -3
  56. package/dist/SearchPage/Results.d.ts +10 -3
  57. package/dist/SearchPage/Results.mjs +87 -49
  58. package/dist/SearchPage/Results.mjs.map +1 -1
  59. package/dist/SearchPage/index.cjs +208 -101
  60. package/dist/SearchPage/index.cjs.map +1 -1
  61. package/dist/SearchPage/index.d.cts +2 -2
  62. package/dist/SearchPage/index.d.ts +2 -2
  63. package/dist/SearchPage/index.mjs +204 -100
  64. package/dist/SearchPage/index.mjs.map +1 -1
  65. package/dist/SearchPage.cjs +208 -101
  66. package/dist/SearchPage.cjs.map +1 -1
  67. package/dist/SearchPage.d.cts +25 -3
  68. package/dist/SearchPage.d.ts +25 -3
  69. package/dist/SearchPage.mjs +204 -100
  70. package/dist/SearchPage.mjs.map +1 -1
  71. package/dist/TablePage/EditComponents/index.cjs +296 -0
  72. package/dist/TablePage/EditComponents/index.cjs.map +1 -0
  73. package/dist/TablePage/EditComponents/index.d.cts +3 -0
  74. package/dist/TablePage/EditComponents/index.d.ts +3 -0
  75. package/dist/TablePage/EditComponents/index.mjs +286 -0
  76. package/dist/TablePage/EditComponents/index.mjs.map +1 -0
  77. package/dist/TablePage/EditComponents.cjs +296 -0
  78. package/dist/TablePage/EditComponents.cjs.map +1 -0
  79. package/dist/TablePage/EditComponents.d.cts +21 -0
  80. package/dist/TablePage/EditComponents.d.ts +21 -0
  81. package/dist/TablePage/EditComponents.mjs +286 -0
  82. package/dist/TablePage/EditComponents.mjs.map +1 -0
  83. package/dist/TablePage/ModalProvider/index.cjs +59 -58
  84. package/dist/TablePage/ModalProvider/index.cjs.map +1 -1
  85. package/dist/TablePage/ModalProvider/index.d.cts +1 -1
  86. package/dist/TablePage/ModalProvider/index.d.ts +1 -1
  87. package/dist/TablePage/ModalProvider/index.mjs +50 -59
  88. package/dist/TablePage/ModalProvider/index.mjs.map +1 -1
  89. package/dist/TablePage/ModalProvider.cjs +59 -58
  90. package/dist/TablePage/ModalProvider.cjs.map +1 -1
  91. package/dist/TablePage/ModalProvider.d.cts +7 -2
  92. package/dist/TablePage/ModalProvider.d.ts +7 -2
  93. package/dist/TablePage/ModalProvider.mjs +50 -59
  94. package/dist/TablePage/ModalProvider.mjs.map +1 -1
  95. package/dist/TablePage/index.cjs +555 -331
  96. package/dist/TablePage/index.cjs.map +1 -1
  97. package/dist/TablePage/index.d.cts +3 -2
  98. package/dist/TablePage/index.d.ts +3 -2
  99. package/dist/TablePage/index.mjs +539 -320
  100. package/dist/TablePage/index.mjs.map +1 -1
  101. package/dist/TablePage/players/index.cjs +24 -4
  102. package/dist/TablePage/players/index.cjs.map +1 -1
  103. package/dist/TablePage/players/index.mjs +24 -4
  104. package/dist/TablePage/players/index.mjs.map +1 -1
  105. package/dist/TablePage/players.cjs +24 -4
  106. package/dist/TablePage/players.cjs.map +1 -1
  107. package/dist/TablePage/players.mjs +24 -4
  108. package/dist/TablePage/players.mjs.map +1 -1
  109. package/dist/TablePage.cjs +555 -331
  110. package/dist/TablePage.cjs.map +1 -1
  111. package/dist/TablePage.d.cts +4 -1
  112. package/dist/TablePage.d.ts +4 -1
  113. package/dist/TablePage.mjs +539 -320
  114. package/dist/TablePage.mjs.map +1 -1
  115. package/dist/{index-D7WHhl3Q.d.ts → index-B23RQop0.d.ts} +12 -12
  116. package/dist/{index-DC0kK3aC.d.cts → index-Csj8S4A4.d.cts} +12 -12
  117. package/dist/index.cjs +890 -426
  118. package/dist/index.cjs.map +1 -1
  119. package/dist/index.d.cts +5 -4
  120. package/dist/index.d.ts +5 -4
  121. package/dist/index.mjs +871 -423
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/mocks/{EventDB.cjs → EventDetails.cjs} +203 -3
  124. package/dist/mocks/EventDetails.cjs.map +1 -0
  125. package/dist/mocks/EventDetails.d.cts +6 -0
  126. package/dist/mocks/EventDetails.d.ts +6 -0
  127. package/dist/mocks/{EventDB.mjs → EventDetails.mjs} +203 -3
  128. package/dist/mocks/EventDetails.mjs.map +1 -0
  129. package/dist/mocks/Tables.cjs +1 -1
  130. package/dist/mocks/Tables.cjs.map +1 -1
  131. package/dist/mocks/Tables.mjs +1 -1
  132. package/dist/mocks/Tables.mjs.map +1 -1
  133. package/dist/mocks/Tags.cjs +200 -0
  134. package/dist/mocks/Tags.cjs.map +1 -1
  135. package/dist/mocks/Tags.mjs +200 -0
  136. package/dist/mocks/Tags.mjs.map +1 -1
  137. package/dist/mocks/index.cjs +202 -2
  138. package/dist/mocks/index.cjs.map +1 -1
  139. package/dist/mocks/index.d.cts +1 -1
  140. package/dist/mocks/index.d.ts +1 -1
  141. package/dist/mocks/index.mjs +202 -2
  142. package/dist/mocks/index.mjs.map +1 -1
  143. package/dist/mocks.cjs +202 -2
  144. package/dist/mocks.cjs.map +1 -1
  145. package/dist/mocks.d.cts +1 -1
  146. package/dist/mocks.d.ts +1 -1
  147. package/dist/mocks.mjs +202 -2
  148. package/dist/mocks.mjs.map +1 -1
  149. package/dist/shared/index.cjs +327 -64
  150. package/dist/shared/index.cjs.map +1 -1
  151. package/dist/shared/index.d.cts +1 -1
  152. package/dist/shared/index.d.ts +1 -1
  153. package/dist/shared/index.mjs +324 -64
  154. package/dist/shared/index.mjs.map +1 -1
  155. package/dist/shared.cjs +327 -64
  156. package/dist/shared.cjs.map +1 -1
  157. package/dist/shared.d.cts +25 -2
  158. package/dist/shared.d.ts +25 -2
  159. package/dist/shared.mjs +324 -64
  160. package/dist/shared.mjs.map +1 -1
  161. package/dist/types/event.d.cts +2 -3
  162. package/dist/types/event.d.ts +2 -3
  163. package/dist/types/index.d.cts +2 -2
  164. package/dist/types/index.d.ts +2 -2
  165. package/dist/types/search.d.cts +7 -1
  166. package/dist/types/search.d.ts +7 -1
  167. package/dist/types/tables.d.cts +1 -0
  168. package/dist/types/tables.d.ts +1 -0
  169. package/dist/types.d.cts +2 -2
  170. package/dist/types.d.ts +2 -2
  171. package/package.json +9 -2
  172. package/dist/TablePage/ModalProvider/index.css +0 -49
  173. package/dist/TablePage/ModalProvider/index.css.map +0 -1
  174. package/dist/TablePage/ModalProvider.css +0 -49
  175. package/dist/TablePage/ModalProvider.css.map +0 -1
  176. package/dist/TablePage/index.css +0 -49
  177. package/dist/TablePage/index.css.map +0 -1
  178. package/dist/TablePage.css +0 -49
  179. package/dist/TablePage.css.map +0 -1
  180. package/dist/index.css +0 -49
  181. package/dist/index.css.map +0 -1
  182. package/dist/mocks/EventDB.cjs.map +0 -1
  183. package/dist/mocks/EventDB.d.cts +0 -6
  184. package/dist/mocks/EventDB.d.ts +0 -6
  185. package/dist/mocks/EventDB.mjs.map +0 -1
  186. package/dist/shared/Modal/index.cjs +0 -64
  187. package/dist/shared/Modal/index.cjs.map +0 -1
  188. package/dist/shared/Modal/index.css +0 -49
  189. package/dist/shared/Modal/index.css.map +0 -1
  190. package/dist/shared/Modal/index.d.cts +0 -2
  191. package/dist/shared/Modal/index.d.ts +0 -2
  192. package/dist/shared/Modal/index.mjs +0 -62
  193. package/dist/shared/Modal/index.mjs.map +0 -1
  194. package/dist/shared/Modal.cjs +0 -64
  195. package/dist/shared/Modal.cjs.map +0 -1
  196. package/dist/shared/Modal.css +0 -49
  197. package/dist/shared/Modal.css.map +0 -1
  198. package/dist/shared/Modal.d.cts +0 -9
  199. package/dist/shared/Modal.d.ts +0 -9
  200. package/dist/shared/Modal.mjs +0 -62
  201. package/dist/shared/Modal.mjs.map +0 -1
  202. package/dist/shared/index.css +0 -49
  203. package/dist/shared/index.css.map +0 -1
  204. package/dist/shared.css +0 -49
  205. package/dist/shared.css.map +0 -1
package/dist/shared.cjs CHANGED
@@ -4,23 +4,23 @@
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var material = require('@mui/material');
7
- var Autocomplete = require('@mui/material/Autocomplete');
8
7
  var Card = require('@mui/material/Card');
9
8
  var CardContent = require('@mui/material/CardContent');
10
9
  var CardHeader = require('@mui/material/CardHeader');
11
10
  var Grid = require('@mui/material/Grid');
12
- var Popper = require('@mui/material/Popper');
13
11
  var TextField = require('@mui/material/TextField');
12
+ var Autocomplete = require('@mui/material/Autocomplete');
13
+ var ReactMarkdown = require('react-markdown');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
17
- var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
18
17
  var Card__default = /*#__PURE__*/_interopDefault(Card);
19
18
  var CardContent__default = /*#__PURE__*/_interopDefault(CardContent);
20
19
  var CardHeader__default = /*#__PURE__*/_interopDefault(CardHeader);
21
20
  var Grid__default = /*#__PURE__*/_interopDefault(Grid);
22
- var Popper__default = /*#__PURE__*/_interopDefault(Popper);
23
21
  var TextField__default = /*#__PURE__*/_interopDefault(TextField);
22
+ var Autocomplete__default = /*#__PURE__*/_interopDefault(Autocomplete);
23
+ var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
24
24
 
25
25
  // src/components/shared/AutoResizingTextarea.tsx
26
26
  var AutoResizingTextarea = (props) => {
@@ -80,6 +80,137 @@ function Chip({ tag, removeCallback }) {
80
80
  tag.id
81
81
  ) });
82
82
  }
83
+
84
+ // src/components/shared/NameGenerator.ts
85
+ var getRandomTitle = () => {
86
+ const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];
87
+ const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];
88
+ const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];
89
+ return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;
90
+ };
91
+ var getRandomTagline = () => taglines[Math.random() * taglines.length | 0];
92
+ var titlePrefixes = [
93
+ "The Knights of The",
94
+ "The Fellowship of The",
95
+ "The Order of The",
96
+ "The Infamous",
97
+ "The Legendary",
98
+ "The Dubious",
99
+ "The Sworn Guardians of The",
100
+ "The Ancient Guild of The",
101
+ "The Unstoppable",
102
+ "The Misfit",
103
+ "The Chaotic",
104
+ "The Brave",
105
+ "The Forgotten",
106
+ "The Wandering",
107
+ "The Noble Council of The",
108
+ "The Dread Pirates of The",
109
+ "The Honorable Society of The",
110
+ "The Cursed",
111
+ "The Unlikely Heroes of The",
112
+ "The Elders of The",
113
+ "The Seekers of The",
114
+ "The Champions of The",
115
+ "The Heralds of The",
116
+ "The Disciples of The",
117
+ "The Ragtag Band of The",
118
+ "The Cult of The"
119
+ ];
120
+ var tileMiddle = [
121
+ "Round",
122
+ "Kitchen",
123
+ "Deepest",
124
+ "Sorcery",
125
+ "Munchkin",
126
+ "Shenanigan",
127
+ "Secret",
128
+ "Dungeon",
129
+ "Fireside",
130
+ "Tabletop",
131
+ "Midnight",
132
+ "Tavern",
133
+ "Goblin",
134
+ "Dragon",
135
+ "Critical",
136
+ "Natural Twenty",
137
+ "Counterspell",
138
+ "Nat One",
139
+ "Cardboard",
140
+ "Dice Tower",
141
+ "Campaign",
142
+ "Lore",
143
+ "Awkward",
144
+ "Unhinged",
145
+ "Chaotic Neutral",
146
+ "Homebrew",
147
+ "Side Quest"
148
+ ];
149
+ var titleSuffixes = [
150
+ "Table",
151
+ "Dungeon",
152
+ "Cave",
153
+ "Crew",
154
+ "Team",
155
+ "League",
156
+ "Horde",
157
+ "Party",
158
+ "Conclave",
159
+ "Collective",
160
+ "Alliance",
161
+ "Syndicate",
162
+ "Guild",
163
+ "Cabal",
164
+ "Council",
165
+ "Expedition",
166
+ "Enclave",
167
+ "Consortium",
168
+ "Troupe",
169
+ "Vanguard",
170
+ "Cohort",
171
+ "Brotherhood",
172
+ "Sisterhood",
173
+ "Pantheon",
174
+ "Assembly",
175
+ "Coven"
176
+ ];
177
+ var taglines = [
178
+ "Everyone is welcome!",
179
+ "Looking for serious players.",
180
+ "Get in nerds, we're gaming!",
181
+ "If you aren't there, you're square.",
182
+ "It will be legendary!",
183
+ "Beginners welcome \u2014 we were all level 1 once.",
184
+ "No experience necessary. Snacks encouraged.",
185
+ "Roleplayers, board gamers, and chaos gremlins welcome.",
186
+ "We don't metagame. Much.",
187
+ "All alignments accepted. True Neutral gets the snacks.",
188
+ "Where every session is a one-shot... until it isn't.",
189
+ "Homebrew rules may apply.",
190
+ "Warning: may contain excessive lore.",
191
+ "Critical failures celebrated as much as critical hits.",
192
+ "No powergamers. Okay, maybe one powergamer.",
193
+ "We finish campaigns. (Eventually.)",
194
+ "Veteran players seeking worthy companions.",
195
+ "Casuals only \u2014 we're here for the vibes.",
196
+ "Serious about fun, not about rules.",
197
+ "Min-maxers need not apply.",
198
+ "For those who read the rulebook... and those who definitely didn't.",
199
+ "Roll for initiative. Arrive on time.",
200
+ "Side quests are the main quest here.",
201
+ "Chaotic good energy required.",
202
+ "If you bring snacks, you can name the first NPC.",
203
+ "We read the rulebook so you don't have to.",
204
+ "Wargamers only \u2014 no take-backs, no mercy.",
205
+ "Everyone welcome. Meeple provided.",
206
+ "We always play the longest game on the shelf.",
207
+ "Worker placement. Resource management. Existential dread.",
208
+ "No phones at the table! We're here for the game.",
209
+ "Someone always flips the table. Metaphorically. Usually.",
210
+ "We have a designated rules lawyer. It's fine.",
211
+ "Cooperative games only \u2014 we can't handle another Monopoly incident.",
212
+ "Teaching time is half the fun!"
213
+ ];
83
214
  var NextGameCountdown = ({ nextGameTime }) => {
84
215
  const [timeLeft, setTimeLeft] = react.useState("");
85
216
  react.useEffect(() => {
@@ -113,27 +244,99 @@ var NextGameCountdown = ({ nextGameTime }) => {
113
244
  function generateTagsDisplay(tag) {
114
245
  return /* @__PURE__ */ jsxRuntime.jsx(Chip, { tag }, tag.id);
115
246
  }
116
- function renderTagsFromIds(ids, legalTags) {
247
+ function renderTagsFromIds(ids, legalTags, options = {}) {
117
248
  if (!ids || !legalTags || legalTags.length === 0) {
118
249
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
119
250
  }
251
+ const { showEventTag = false, eventTagId } = options;
120
252
  const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
121
- return validTags.map((tag) => generateTagsDisplay(tag));
253
+ const sortedTags = [...validTags].sort((a, b) => {
254
+ if (showEventTag && eventTagId !== void 0) {
255
+ if (a.id === eventTagId && b.id === eventTagId) return 0;
256
+ if (a.id === eventTagId) return -1;
257
+ if (b.id === eventTagId) return 1;
258
+ }
259
+ const priorityOrder = ["Organizer Run", "Display Only"];
260
+ const aIndex = priorityOrder.indexOf(a.label);
261
+ const bIndex = priorityOrder.indexOf(b.label);
262
+ if (aIndex !== -1 && bIndex !== -1) {
263
+ return aIndex - bIndex;
264
+ }
265
+ if (aIndex !== -1) return -1;
266
+ if (bIndex !== -1) return 1;
267
+ return 0;
268
+ });
269
+ return sortedTags.map((tag) => generateTagsDisplay(tag));
270
+ }
271
+ function TagSelector({ initialTagIDs, allTags, onTagChange }) {
272
+ const [tagList, updateTagList] = react.useState(initialTagIDs);
273
+ const [inputValue, setInputValue] = react.useState("");
274
+ const toggleTag = (id) => tagList.find((t) => t === id) ? removeTag(id) : addTag(id);
275
+ const addTag = (id) => {
276
+ const newList = [...tagList, id];
277
+ updateTagList(newList);
278
+ onTagChange(newList);
279
+ };
280
+ const removeTag = (id) => {
281
+ const newList = tagList.filter((t) => t !== id);
282
+ updateTagList(newList);
283
+ onTagChange(newList);
284
+ };
285
+ const selectedTags = react.useMemo(() => allTags.filter((tag) => tagList.includes(tag.id)), [allTags, tagList]);
286
+ const options = react.useMemo(
287
+ () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),
288
+ [allTags]
289
+ );
290
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
291
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
292
+ Chip,
293
+ {
294
+ tag,
295
+ removeCallback: () => toggleTag(tag.id)
296
+ },
297
+ tag.id
298
+ )) }),
299
+ /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { sx: { marginTop: 3, width: "100%", minWidth: "550px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
300
+ Autocomplete__default.default,
301
+ {
302
+ options,
303
+ filterOptions: (availableOptions, state) => availableOptions.filter(
304
+ (option) => !tagList.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
305
+ ),
306
+ value: null,
307
+ inputValue,
308
+ onInputChange: (event, newInputValue) => {
309
+ if (event && event.type === "change") {
310
+ setInputValue(newInputValue);
311
+ }
312
+ },
313
+ onChange: (event, newValue) => {
314
+ if (newValue) {
315
+ toggleTag(newValue.value);
316
+ }
317
+ setInputValue("");
318
+ },
319
+ renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField__default.default, { ...params, label: "Select Tags" })
320
+ },
321
+ tagList.join("-")
322
+ ) }) })
323
+ ] });
122
324
  }
123
325
  function TagEditor({
124
- title = "Tags",
326
+ title,
125
327
  selectedTags,
126
328
  possibleTags,
127
329
  onToggleTag
128
330
  }) {
129
- const [inputValue, setInputValue] = react.useState("");
130
331
  const selectedIds = react.useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
131
- const options = react.useMemo(
132
- () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
133
- [possibleTags]
134
- );
332
+ const onTagChange = (newSelectedIds) => {
333
+ const addedTags = newSelectedIds.filter((id) => !selectedIds.includes(id));
334
+ const removedTags = selectedIds.filter((id) => !newSelectedIds.includes(id));
335
+ addedTags.forEach((id) => onToggleTag(id));
336
+ removedTags.forEach((id) => onToggleTag(id));
337
+ };
135
338
  return /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { container: true, children: /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { size: { xs: 12 }, children: /* @__PURE__ */ jsxRuntime.jsxs(Card__default.default, { children: [
136
- /* @__PURE__ */ jsxRuntime.jsx(
339
+ title ? /* @__PURE__ */ jsxRuntime.jsx(
137
340
  CardHeader__default.default,
138
341
  {
139
342
  title,
@@ -144,69 +347,129 @@ function TagEditor({
144
347
  textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
145
348
  }
146
349
  }
147
- ),
148
- /* @__PURE__ */ jsxRuntime.jsxs(CardContent__default.default, { children: [
149
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
150
- Chip,
151
- {
152
- tag,
153
- removeCallback: () => onToggleTag(tag.id)
154
- },
155
- tag.id
156
- )) }),
157
- /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { container: true, spacing: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Grid__default.default, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
158
- Autocomplete__default.default,
159
- {
160
- options,
161
- filterOptions: (availableOptions, state) => availableOptions.filter(
162
- (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
163
- ).slice(0, 3),
164
- value: null,
165
- inputValue,
166
- onInputChange: (event, newInputValue) => {
167
- if (event && event.type === "change") {
168
- setInputValue(newInputValue);
169
- }
170
- },
171
- onChange: (event, newValue) => {
172
- if (newValue) {
173
- onToggleTag(newValue.value);
174
- }
175
- setInputValue("");
176
- },
177
- slots: { popper: CustomPopper },
178
- renderInput: (params) => /* @__PURE__ */ jsxRuntime.jsx(TextField__default.default, { ...params, label: "Select Tags" })
179
- },
180
- selectedIds.join("-")
181
- ) }) })
182
- ] })
350
+ ) : "",
351
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent__default.default, { children: /* @__PURE__ */ jsxRuntime.jsx(TagSelector, { initialTagIDs: selectedIds, allTags: possibleTags, onTagChange }) })
183
352
  ] }) }) });
184
353
  }
185
- var CustomPopper = (props) => {
186
- return /* @__PURE__ */ jsxRuntime.jsx(
187
- Popper__default.default,
354
+ var UserAgreementModal = ({
355
+ open,
356
+ onClose,
357
+ markdownContent,
358
+ requirements,
359
+ onAccept,
360
+ title = "User Agreement",
361
+ forceAgreement = false
362
+ }) => {
363
+ const [checkedState, setCheckedState] = react.useState(
364
+ new Array(requirements.length).fill(false)
365
+ );
366
+ const handleCheckboxChange = (index) => {
367
+ const updatedCheckedState = checkedState.map(
368
+ (item, i) => i === index ? !item : item
369
+ );
370
+ setCheckedState(updatedCheckedState);
371
+ };
372
+ const isAllRequiredChecked = requirements.every((req, index) => {
373
+ if (req.required) {
374
+ return checkedState[index];
375
+ }
376
+ return true;
377
+ });
378
+ const handleAccept = () => {
379
+ if (isAllRequiredChecked) {
380
+ onAccept();
381
+ }
382
+ };
383
+ const handleClose = (event, reason) => {
384
+ if (forceAgreement) return;
385
+ if (onClose) onClose();
386
+ };
387
+ return /* @__PURE__ */ jsxRuntime.jsxs(
388
+ material.Dialog,
188
389
  {
189
- ...props,
190
- modifiers: [
191
- {
192
- name: "preventOverflow",
193
- options: { boundary: "viewport" }
194
- },
195
- {
196
- name: "offset",
197
- options: { offset: [0, -10] }
198
- }
199
- ],
200
- placement: "top-start"
390
+ open,
391
+ onClose: handleClose,
392
+ maxWidth: "md",
393
+ fullWidth: true,
394
+ disableEscapeKeyDown: forceAgreement,
395
+ children: [
396
+ /* @__PURE__ */ jsxRuntime.jsx(material.DialogTitle, { children: title }),
397
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogContent, { dividers: true, children: [
398
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mb: 3 }, children: /* @__PURE__ */ jsxRuntime.jsx(
399
+ ReactMarkdown__default.default,
400
+ {
401
+ components: {
402
+ h1: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h4", gutterBottom: true, ...props }),
403
+ h2: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h5", gutterBottom: true, ...props }),
404
+ h3: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h6", gutterBottom: true, ...props }),
405
+ h4: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle1", gutterBottom: true, ...props }),
406
+ h5: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle2", gutterBottom: true, ...props }),
407
+ h6: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "caption", gutterBottom: true, ...props }),
408
+ p: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", gutterBottom: true, ...props }),
409
+ li: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "li", sx: { mb: 1, ml: 2 }, ...props }),
410
+ ul: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "ul", sx: { mb: 2 }, ...props }),
411
+ ol: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { component: "ol", sx: { mb: 2 }, ...props }),
412
+ a: ({ node, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(material.Link, { ...props, target: "_blank", rel: "noopener" })
413
+ },
414
+ children: markdownContent
415
+ }
416
+ ) }),
417
+ /* @__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(
418
+ material.FormControlLabel,
419
+ {
420
+ control: /* @__PURE__ */ jsxRuntime.jsx(
421
+ material.Checkbox,
422
+ {
423
+ checked: checkedState[index],
424
+ onChange: () => handleCheckboxChange(index)
425
+ }
426
+ ),
427
+ label: /* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", children: [
428
+ req.statement,
429
+ req.link && req.linkText && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
430
+ " ",
431
+ /* @__PURE__ */ jsxRuntime.jsx(material.Link, { href: req.link, target: "_blank", rel: "noopener", children: req.linkText })
432
+ ] }),
433
+ req.required && /* @__PURE__ */ jsxRuntime.jsx(
434
+ material.Typography,
435
+ {
436
+ component: "span",
437
+ color: "error",
438
+ sx: { ml: 0.5 },
439
+ children: "*"
440
+ }
441
+ )
442
+ ] })
443
+ }
444
+ ) }, index)) })
445
+ ] }),
446
+ /* @__PURE__ */ jsxRuntime.jsxs(material.DialogActions, { children: [
447
+ !forceAgreement && /* @__PURE__ */ jsxRuntime.jsx(material.Button, { onClick: onClose, color: "inherit", children: "Cancel" }),
448
+ /* @__PURE__ */ jsxRuntime.jsx(
449
+ material.Button,
450
+ {
451
+ onClick: handleAccept,
452
+ variant: "contained",
453
+ disabled: !isAllRequiredChecked,
454
+ fullWidth: forceAgreement,
455
+ children: "Accept"
456
+ }
457
+ )
458
+ ] })
459
+ ]
201
460
  }
202
461
  );
203
462
  };
463
+ var UserAgreementModal_default = UserAgreementModal;
204
464
 
205
465
  exports.AutoResizingTextarea = AutoResizingTextarea_default;
206
466
  exports.Chip = Chip;
207
467
  exports.NextGameCountdown = NextGameCountdown;
208
468
  exports.TagEditor = TagEditor;
469
+ exports.UserAgreementModal = UserAgreementModal_default;
209
470
  exports.generateTagsDisplay = generateTagsDisplay;
471
+ exports.getRandomTagline = getRandomTagline;
472
+ exports.getRandomTitle = getRandomTitle;
210
473
  exports.renderTagsFromIds = renderTagsFromIds;
211
474
  //# sourceMappingURL=shared.cjs.map
212
475
  //# sourceMappingURL=shared.cjs.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":["useEffect","jsx","Fragment","jsxs","useState","Typography","useMemo","Grid","Card","CardHeader","CardContent","Autocomplete","TextField","Popper"],"mappings":"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","file":"shared.cjs","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":["useEffect","jsx","Fragment","jsxs","useState","Typography","useMemo","Grid","Autocomplete","TextField","Card","CardHeader","CardContent","Dialog","DialogTitle","DialogContent","Box","ReactMarkdown","Link","FormControlLabel","Checkbox","DialogActions","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAWA,IAAM,oBAAA,GAA6D,CAAC,KAAA,KAAsC;AACtG,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAU,WAAA,EAAa,OAAM,GAAI,KAAA;AAEvD,EAAAA,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,YAAA,IAAgB,YAAY,OAAA,EAAS;AACrC,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAE7B,MAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AACxB,MAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,YAAY,CAAA,EAAA,CAAA;AAAA,IACpD;AAAA,EACJ,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,EAAa,KAAK,CAAC,CAAA;AAErC,EAAA,uBACIC,cAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,WAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,KAAA,EAAO;AAAA,QACH,eAAA,EAAiB,SAAA;AAAA,QACjB,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACX;AAAA,GACJ;AAER,CAAA;AAEA,IAAO,4BAAA,GAAQ;ACnCA,SAAR,IAAA,CAAsB,EAAE,GAAA,EAAK,cAAA,EAAe,EAA2D;AAH9G,EAAA,IAAA,EAAA;AAIE,EAAA,MAAM,KAAA,GAAA,CAAQ,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,EAAA,GAAa,SAAA;AAC3B,EAAA,uBACIA,eAAAC,mBAAA,EAAA,EACA,QAAA,kBAAAC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAEG,SAAA,EAAU,iHAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,sBAAsB,KAAK,CAAA,YAAA,CAAA;AAAA,QACxC,UAAA,EAAY,CAAA,2CAAA,EAA8C,KAAK,CAAA,oCAAA,EAAuC,KAAK,CAAA,kBAAA,CAAA;AAAA,QAC3G,UAAA,EAAY,uBAAA;AAAA,QACZ,MAAA,EAAQ,gDAAgD,KAAK,CAAA,aAAA;AAAA,OAC/D;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,KAAA;AAAA,QACJ,kCACGF,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,YACpC,SAAA,EAAU,8GAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY;AAAA,aACd;AAAA,YACH,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,KAAA;AAAA,IApBC,GAAA,CAAI;AAAA,GAsBf,EACA,CAAA;AAGJ;;;ACjCO,IAAM,iBAAiB,MAAM;AAChC,EAAA,MAAM,eAAe,aAAA,CAAc,IAAA,CAAK,QAAO,GAAI,aAAA,CAAc,SAAS,CAAC,CAAA;AAC3E,EAAA,MAAM,eAAe,UAAA,CAAW,IAAA,CAAK,QAAO,GAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AACrE,EAAA,MAAM,eAAe,aAAA,CAAc,IAAA,CAAK,QAAO,GAAI,aAAA,CAAc,SAAS,CAAC,CAAA;AAC3E,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,YAAY,IAAI,YAAY,CAAA,CAAA;AAC1D;AAEO,IAAM,gBAAA,GAAmB,MAAM,QAAA,CAAS,IAAA,CAAK,QAAO,GAAI,QAAA,CAAS,SAAS,CAAC;AAGlF,IAAM,aAAA,GAAgB;AAAA,EAClB,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,4BAAA;AAAA,EACA,0BAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,8BAAA;AAAA,EACA,YAAA;AAAA,EACA,4BAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACJ,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACf,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACJ,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EAClB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACJ,CAAA;AAEA,IAAM,QAAA,GAAW;AAAA,EACb,sBAAA;AAAA,EACA,8BAAA;AAAA,EACA,6BAAA;AAAA,EACA,qCAAA;AAAA,EACA,uBAAA;AAAA,EACA,oDAAA;AAAA,EACA,6CAAA;AAAA,EACA,wDAAA;AAAA,EACA,0BAAA;AAAA,EACA,wDAAA;AAAA,EACA,sDAAA;AAAA,EACA,2BAAA;AAAA,EACA,sCAAA;AAAA,EACA,wDAAA;AAAA,EACA,6CAAA;AAAA,EACA,oCAAA;AAAA,EACA,4CAAA;AAAA,EACA,+CAAA;AAAA,EACA,qCAAA;AAAA,EACA,4BAAA;AAAA,EACA,qEAAA;AAAA,EACA,sCAAA;AAAA,EACA,sCAAA;AAAA,EACA,+BAAA;AAAA,EACA,kDAAA;AAAA,EACA,4CAAA;AAAA,EACA,gDAAA;AAAA,EACA,oCAAA;AAAA,EACA,+CAAA;AAAA,EACA,2DAAA;AAAA,EACA,kDAAA;AAAA,EACA,0DAAA;AAAA,EACA,+CAAA;AAAA,EACA,0EAAA;AAAA,EACA;AACJ,CAAA;AClIO,IAAM,iBAAA,GAAoB,CAAC,EAAE,YAAA,EAAa,KAAwC;AACvF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIG,eAAiB,EAAE,CAAA;AAEnD,EAAAJ,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,OAAA,EAAQ;AAC/B,MAAA,MAAM,WAAW,IAAI,IAAA,CAAK,YAAY,CAAA,CAAE,SAAQ,GAAI,GAAA;AAEpD,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,WAAA,CAAY,SAAS,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,YAAY,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAO,QAAA,IAAY,GAAA,GAAO,KAAK,EAAA,GAAK,EAAA,CAAA,IAAQ,GAAA,GAAO,EAAA,GAAK,EAAA,CAAG,CAAA;AAC9E,MAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAO,QAAA,IAAY,MAAO,EAAA,GAAK,EAAA,CAAA,IAAQ,MAAO,EAAA,CAAG,CAAA;AACtE,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAO,QAAA,IAAY,GAAA,GAAO,MAAO,GAAI,CAAA;AAE1D,MAAA,IAAI,UAAA,GAAa,EAAA;AACjB,MAAA,IAAI,IAAA,GAAO,CAAA,EAAG,UAAA,IAAc,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACnC,MAAA,IAAI,QAAQ,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG,UAAA,IAAc,GAAG,KAAK,CAAA,EAAA,CAAA;AACjD,MAAA,UAAA,IAAc,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAEpC,MAAA,WAAA,CAAY,UAAU,CAAA;AAAA,IACxB,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,uBACEG,eAAAA,CAACE,mBAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,EAAA,EAAI,EAAE,UAAA,EAAY,MAAA,EAAO,EAAG,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,IAC1D;AAAA,GAAA,EACd,CAAA;AAEJ;ACtCO,SAAS,oBAAoB,GAAA,EAAU;AAC1C,EAAA,uBACIJ,cAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAA,EAAe,IAAI,EAAI,CAAA;AAErC;AAEO,SAAS,iBAAA,CAAkB,GAAA,EAA2B,SAAA,EAAkB,OAAA,GAA2D,EAAC,EAAG;AAC1I,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,IAAa,SAAA,CAAU,WAAW,CAAA,EAAG;AAAE,IAAA,uBAASA,cAAAA,CAAAC,mBAAAA,EAAA,EAAE,CAAA;AAAA,EAAK;AACpE,EAAA,MAAM,EAAE,YAAA,GAAe,KAAA,EAAO,UAAA,EAAW,GAAI,OAAA;AAC7C,EAAA,MAAM,YAAY,GAAA,CACb,GAAA,CAAI,CAAC,EAAA,KAAO,SAAA,CAAU,KAAK,CAAC,GAAA,KAAQ,IAAI,EAAA,KAAO,EAAE,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,GAAA,KAAoB,OAAA,CAAQ,GAAG,CAAC,CAAA;AAG7C,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,SAAS,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAE7C,IAAA,IAAI,YAAA,IAAgB,eAAe,MAAA,EAAW;AAC1C,MAAA,IAAI,EAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,EAAA,KAAO,YAAY,OAAO,CAAA;AACvD,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,EAAA;AAChC,MAAA,IAAI,CAAA,CAAE,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,eAAA,EAAiB,cAAc,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA;AAE5C,IAAA,IAAI,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,EAAA,EAAI;AAChC,MAAA,OAAO,MAAA,GAAS,MAAA;AAAA,IACpB;AACA,IAAA,IAAI,MAAA,KAAW,IAAI,OAAO,EAAA;AAC1B,IAAA,IAAI,MAAA,KAAW,IAAI,OAAO,CAAA;AAC1B,IAAA,OAAO,CAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO,WAAW,GAAA,CAAI,CAAC,GAAA,KAAQ,mBAAA,CAAoB,GAAG,CAAC,CAAA;AAC3D;AClCO,SAAS,WAAA,CAAY,EAAC,aAAA,EAAe,OAAA,EAAS,aAAW,EAI7D;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,aAAa,CAAA,GAAIE,eAAS,aAAa,CAAA;AACvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,EAAE,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAe,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,EAAE,CAAA,GAAI,SAAA,CAAU,EAAE,CAAA,GAAI,OAAO,EAAE,CAAA;AACzF,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAe;AAC7B,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAA,EAAS,EAAE,CAAA;AAC/B,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,WAAA,CAAY,OAAO,CAAA;AAAA,EACrB,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAe;AAChC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,EAAE,CAAA;AAC5C,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,WAAA,CAAY,OAAO,CAAA;AAAA,EACrB,CAAA;AACA,EAAA,MAAM,YAAA,GAAeE,aAAA,CAAQ,MAAM,OAAA,CAAQ,OAAO,CAAA,GAAA,KAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AACtG,EAAA,MAAM,OAAA,GAAUA,aAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,CAAE,CAAA;AAAA,IAChE,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,uBACEH,eAAAA,CAAAD,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACZ,uBAAa,GAAA,CAAI,CAAC,wBACfA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEG,GAAA;AAAA,QACA,cAAA,EAAgB,MAAM,SAAA,CAAU,GAAA,CAAI,EAAE;AAAA,OAAA;AAAA,MAFjC,GAAA,CAAI;AAAA,KAIhB,CAAA,EACH,CAAA;AAAA,oBACAA,cAAAA,CAACM,qBAAA,EAAA,EAAK,WAAS,IAAA,EAAC,OAAA,EAAS,GACrB,QAAA,kBAAAN,cAAAA,CAACM,yBAAK,EAAA,EAAI,EAAE,WAAW,CAAA,EAAG,KAAA,EAAO,QAAQ,QAAA,EAAU,OAAA,IAC/C,QAAA,kBAAAN,cAAAA;AAAA,MAACO,6BAAA;AAAA,MAAA;AAAA,QAEG,OAAA;AAAA,QACA,aAAA,EAAe,CAAC,gBAAA,EAAkB,KAAA,KAC9B,gBAAA,CACK,MAAA;AAAA,UACG,CAAC,MAAA,KACG,CAAC,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK,CAAA,IAC9B,MAAA,CAAO,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAA,CAAM,UAAA,CAAW,aAAa;AAAA,SAC1E;AAAA,QAER,KAAA,EAAO,IAAA;AAAA,QACP,UAAA;AAAA,QACA,aAAA,EAAe,CAAC,KAAA,EAAO,aAAA,KAAkB;AACvC,UAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AACpC,YAAA,aAAA,CAAc,aAAa,CAAA;AAAA,UAC7B;AAAA,QACF,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,EAAO,QAAA,KAAa;AAC7B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,UAC1B;AACA,UAAA,aAAA,CAAc,EAAE,CAAA;AAAA,QAClB,CAAA;AAAA,QACA,WAAA,EAAa,CAAC,MAAA,qBAAWP,eAACQ,0BAAA,EAAA,EAAW,GAAG,MAAA,EAAQ,KAAA,EAAM,aAAA,EAAc;AAAA,OAAA;AAAA,MAvB/D,OAAA,CAAQ,KAAK,GAAG;AAAA,OAyB7B,CAAA,EACJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC1DO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,WAAA,GAAcH,aAAAA,CAAQ,MAAM,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEnF,EAAA,MAAM,WAAA,GAAc,CAAC,cAAA,KAA6B;AAChD,IAAA,MAAM,SAAA,GAAY,eAAe,MAAA,CAAO,CAAC,OAAO,CAAC,WAAA,CAAY,QAAA,CAAS,EAAE,CAAC,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,OAAO,CAAC,cAAA,CAAe,QAAA,CAAS,EAAE,CAAC,CAAA;AAE3E,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AACzC,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,uBACEL,cAAAA,CAACM,qBAAAA,EAAA,EAAK,SAAA,EAAS,MACb,QAAA,kBAAAN,cAAAA,CAACM,qBAAAA,EAAA,EAAK,MAAM,EAAE,EAAA,EAAI,IAAG,EACnB,QAAA,kBAAAJ,gBAACO,qBAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,mBAAST,cAAAA;AAAA,MAACU,2BAAA;AAAA,MAAA;AAAA,QACT,KAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,yEAAA;AAAA,UACZ,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,QAAA;AAAA,UACV,UAAA,EAAY;AAAA;AACd;AAAA,KACF,GAAM,EAAA;AAAA,oBACNV,cAAAA,CAACW,4BAAA,EAAA,EACC,QAAA,kBAAAX,cAAAA,CAAC,WAAA,EAAA,EAAY,aAAA,EAAe,WAAA,EAAa,OAAA,EAAS,YAAA,EAAc,WAAA,EAA0B,CAAA,EAC5F;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;ACnBA,IAAM,qBAAwD,CAAC;AAAA,EAC3D,IAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,gBAAA;AAAA,EACR,cAAA,GAAiB;AACrB,CAAA,KAAM;AACF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIG,cAAAA;AAAA,IACpC,IAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,CAAE,KAAK,KAAK;AAAA,GAC7C;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAC5C,IAAA,MAAM,sBAAsB,YAAA,CAAa,GAAA;AAAA,MAAI,CAAC,IAAA,EAAM,CAAA,KAChD,CAAA,KAAM,KAAA,GAAQ,CAAC,IAAA,GAAO;AAAA,KAC1B;AACA,IAAA,eAAA,CAAgB,mBAAmB,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,YAAA,CAAa,KAAA,CAAM,CAAC,KAAK,KAAA,KAAU;AAC5D,IAAA,IAAI,IAAI,QAAA,EAAU;AACd,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,IAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,MAAM,eAAe,MAAM;AACvB,IAAA,IAAI,oBAAA,EAAsB;AACtB,MAAA,QAAA,EAAS;AAAA,IACb;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAW,MAAA,KAA8C;AAC1E,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,EACzB,CAAA;AAEA,EAAA,uBACID,eAAAA;AAAA,IAACU,eAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAS,IAAA;AAAA,MACT,oBAAA,EAAsB,cAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,wBAAAZ,cAAAA,CAACa,wBAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACpBX,eAAAA,CAACY,sBAAA,EAAA,EAAc,QAAA,EAAQ,IAAA,EACnB,QAAA,EAAA;AAAA,0BAAAd,eAACe,YAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IACX,QAAA,kBAAAf,cAAAA;AAAA,YAACgB,8BAAA;AAAA,YAAA;AAAA,cACG,UAAA,EAAY;AAAA,gBACR,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMhB,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC7E,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC7E,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC7E,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBACpF,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBACpF,IAAI,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBAClF,GAAG,CAAC,EAAE,IAAA,EAAM,GAAG,OAAM,qBAAMJ,cAAAA,CAACI,mBAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,YAAA,EAAY,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC/E,EAAA,EAAI,CAAC,EAAE,IAAA,EAAM,GAAG,KAAA,EAAM,qBAAMJ,cAAAA,CAACe,YAAA,EAAA,EAAI,WAAU,IAAA,EAAK,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAE,EAAI,GAAG,KAAA,EAAO,CAAA;AAAA,gBACjF,IAAI,CAAC,EAAE,MAAM,GAAG,KAAA,uBAAYf,cAAAA,CAACe,YAAA,EAAA,EAAI,SAAA,EAAU,MAAK,EAAA,EAAI,EAAE,IAAI,CAAA,EAAE,EAAI,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC1E,IAAI,CAAC,EAAE,MAAM,GAAG,KAAA,uBAAYf,cAAAA,CAACe,YAAA,EAAA,EAAI,SAAA,EAAU,MAAK,EAAA,EAAI,EAAE,IAAI,CAAA,EAAE,EAAI,GAAG,KAAA,EAAO,CAAA;AAAA,gBAC1E,CAAA,EAAG,CAAC,EAAE,IAAA,EAAM,GAAG,KAAA,EAAM,qBAAMf,cAAAA,CAACiB,iBAAM,GAAG,KAAA,EAAO,MAAA,EAAO,QAAA,EAAS,KAAI,UAAA,EAAW;AAAA,eAC/E;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACL,EACJ,CAAA;AAAA,0BACAjB,cAAAA,CAACe,YAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACvD,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACpBf,cAAAA,CAACe,YAAA,EAAA,EAAgB,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAa,EAC7D,QAAA,kBAAAf,cAAAA;AAAA,YAACkB,yBAAA;AAAA,YAAA;AAAA,cACG,yBACIlB,cAAAA;AAAA,gBAACmB,iBAAA;AAAA,gBAAA;AAAA,kBACG,OAAA,EAAS,aAAa,KAAK,CAAA;AAAA,kBAC3B,QAAA,EAAU,MAAM,oBAAA,CAAqB,KAAK;AAAA;AAAA,eAC9C;AAAA,cAEJ,uBACIjB,eAAAA,CAACE,mBAAAA,EAAA,EAAW,SAAQ,OAAA,EACf,QAAA,EAAA;AAAA,gBAAA,GAAA,CAAI,SAAA;AAAA,gBACJ,IAAI,IAAA,IAAQ,GAAA,CAAI,4BACbF,eAAAA,CAAAD,qBAAA,EACK,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kCACDD,cAAAA,CAACiB,aAAA,EAAA,EAAK,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,UAAA,EACrC,QAAA,EAAA,GAAA,CAAI,QAAA,EACT;AAAA,iBAAA,EACJ,CAAA;AAAA,gBAEH,GAAA,CAAI,4BACDjB,cAAAA;AAAA,kBAACI,mBAAAA;AAAA,kBAAA;AAAA,oBACG,SAAA,EAAU,MAAA;AAAA,oBACV,KAAA,EAAM,OAAA;AAAA,oBACN,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI;AAAA,oBACjB,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EAER;AAAA;AAAA,WAER,EAAA,EA9BM,KA+BV,CACH,CAAA,EACL;AAAA,SAAA,EACJ,CAAA;AAAA,wBACAF,gBAACkB,sBAAA,EAAA,EACI,QAAA,EAAA;AAAA,UAAA,CAAC,cAAA,oBACEpB,cAAAA,CAACqB,eAAA,EAAA,EAAO,SAAS,OAAA,EAAS,KAAA,EAAM,WAAU,QAAA,EAAA,QAAA,EAE1C,CAAA;AAAA,0BAEJrB,cAAAA;AAAA,YAACqB,eAAA;AAAA,YAAA;AAAA,cACG,OAAA,EAAS,YAAA;AAAA,cACT,OAAA,EAAQ,WAAA;AAAA,cACR,UAAU,CAAC,oBAAA;AAAA,cACX,SAAA,EAAW,cAAA;AAAA,cACd,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACJ;AAAA;AAAA;AAAA,GACJ;AAER,CAAA;AAEA,IAAO,0BAAA,GAAQ","file":"shared.cjs","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"]}
package/dist/shared.d.cts CHANGED
@@ -15,12 +15,18 @@ declare function Chip({ tag, removeCallback }: {
15
15
  removeCallback?: (tagId: number) => void;
16
16
  }): react_jsx_runtime.JSX.Element;
17
17
 
18
+ declare const getRandomTitle: () => string;
19
+ declare const getRandomTagline: () => string;
20
+
18
21
  declare const NextGameCountdown: ({ nextGameTime }: {
19
22
  nextGameTime?: Date | string;
20
23
  }) => react_jsx_runtime.JSX.Element | null;
21
24
 
22
25
  declare function generateTagsDisplay(tag: Tag): react_jsx_runtime.JSX.Element;
23
- declare function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]): react_jsx_runtime.JSX.Element | react_jsx_runtime.JSX.Element[];
26
+ declare function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[], options?: {
27
+ showEventTag?: boolean;
28
+ eventTagId?: number;
29
+ }): react_jsx_runtime.JSX.Element | react_jsx_runtime.JSX.Element[];
24
30
 
25
31
  interface TagEditorProps {
26
32
  title?: string;
@@ -30,4 +36,21 @@ interface TagEditorProps {
30
36
  }
31
37
  declare function TagEditor({ title, selectedTags, possibleTags, onToggleTag, }: TagEditorProps): react_jsx_runtime.JSX.Element;
32
38
 
33
- export { AutoResizingTextarea, Chip, NextGameCountdown, TagEditor, type TagEditorProps, generateTagsDisplay, renderTagsFromIds };
39
+ type AgreementRequirement = {
40
+ statement: string;
41
+ link?: string;
42
+ linkText?: string;
43
+ required: boolean;
44
+ };
45
+ type UserAgreementModalProps = {
46
+ open: boolean;
47
+ onClose?: () => void;
48
+ markdownContent: string;
49
+ requirements: AgreementRequirement[];
50
+ onAccept: () => void;
51
+ title?: string;
52
+ forceAgreement?: boolean;
53
+ };
54
+ declare const UserAgreementModal: React__default.FC<UserAgreementModalProps>;
55
+
56
+ export { type AgreementRequirement, AutoResizingTextarea, Chip, NextGameCountdown, TagEditor, type TagEditorProps, UserAgreementModal, type UserAgreementModalProps, generateTagsDisplay, getRandomTagline, getRandomTitle, renderTagsFromIds };