@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,112 +1,156 @@
1
1
  "use client";
2
- import React, { createContext, useContext, useState, useRef, useEffect, useMemo } from 'react';
3
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
4
- import { Typography, Card, CardContent, CardHeader, Grid as Grid$1, Box } from '@mui/material';
5
- import Image from 'next/image';
2
+ import React3, { createContext, useState, useMemo, useContext, useRef, useEffect } from 'react';
3
+ import { Box, Tooltip, Typography, Card, CardContent, CardHeader, Grid, Button } from '@mui/material';
4
+ import TextField2 from '@mui/material/TextField';
5
+ import CasinoIcon from '@mui/icons-material/Casino';
6
+ import Grid2 from '@mui/material/Grid';
7
+ import Autocomplete from '@mui/material/Autocomplete';
8
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
9
+ import Dialog from '@mui/material/Dialog';
10
+ import DialogContent from '@mui/material/DialogContent';
11
+ import DialogActions from '@mui/material/DialogActions';
6
12
  import Button2 from '@mui/material/Button';
7
- import Grid from '@mui/material/Grid';
8
- import CardHeader2 from '@mui/material/CardHeader';
13
+ import IconButton from '@mui/material/IconButton';
14
+ import CloseIcon from '@mui/icons-material/Close';
15
+ import Image from 'next/image';
9
16
  import DeleteIcon from '@mui/icons-material/Delete';
10
- import EditIcon from '@mui/icons-material/Edit';
17
+ import EditIcon2 from '@mui/icons-material/Edit';
11
18
  import ListIcon from '@mui/icons-material/List';
12
19
  import SaveIcon from '@mui/icons-material/Save';
13
- import Autocomplete from '@mui/material/Autocomplete';
14
- import Card2 from '@mui/material/Card';
15
- import CardContent2 from '@mui/material/CardContent';
16
- import Popper from '@mui/material/Popper';
17
- import TextField from '@mui/material/TextField';
20
+ import DialogTitle from '@mui/material/DialogTitle';
18
21
 
19
- // src/components/TablePage/GameTableProvider/GameTableContext.tsx
20
- var GameTableContext = React.createContext(void 0);
21
- function GameTableProvider(props) {
22
- return /* @__PURE__ */ jsx(Fragment, { children: props.children });
23
- }
24
- function useGameTableContext() {
25
- const context = React.useContext(GameTableContext);
26
- if (context) {
27
- return context;
28
- }
29
- throw new Error("useGameTableContext is deprecated in the package build. Pass table data through props instead.");
30
- }
31
- var ModalContext = createContext({
32
- showModal: (content) => {
33
- },
34
- hideModal: () => {
35
- }
36
- });
37
- var useModal = () => useContext(ModalContext);
38
- var Modal = ({ onClose, children }) => {
39
- const modalRef = useRef(null);
40
- const previouslyFocusedElement = useRef(null);
41
- useEffect(() => {
42
- var _a;
43
- if (children) {
44
- previouslyFocusedElement.current = document.activeElement;
45
- (_a = modalRef.current) == null ? void 0 : _a.focus();
46
- }
47
- return () => {
48
- var _a2;
49
- (_a2 = previouslyFocusedElement.current) == null ? void 0 : _a2.focus();
50
- };
51
- }, [children]);
52
- const handleOnClose = () => {
53
- onClose();
54
- };
55
- const handleKeyDown = (e) => {
56
- var _a;
57
- if (e.key !== "Tab") return;
58
- const focusableElements = (_a = modalRef.current) == null ? void 0 : _a.querySelectorAll(
59
- 'button, [tabindex]:not([tabindex="-1"])'
60
- );
61
- if (!focusableElements || focusableElements.length === 0) return;
62
- const first = focusableElements[0];
63
- const last = focusableElements[focusableElements.length - 1];
64
- if (e.shiftKey) {
65
- if (document.activeElement === first) {
66
- e.preventDefault();
67
- last.focus();
68
- }
69
- } else {
70
- if (document.activeElement === last) {
71
- e.preventDefault();
72
- first.focus();
73
- }
74
- }
75
- };
76
- return /* @__PURE__ */ jsx(
77
- "div",
78
- {
79
- className: "modal-overlay",
80
- onKeyDown: handleKeyDown,
81
- ref: modalRef,
82
- role: "dialog",
83
- tabIndex: -1,
84
- children: /* @__PURE__ */ jsxs("div", { className: "modal-container", children: [
85
- /* @__PURE__ */ jsx("div", { className: "modal-control-strip", children: /* @__PURE__ */ jsx("button", { onClick: handleOnClose, children: "X" }) }),
86
- /* @__PURE__ */ jsx("div", { className: "modal-content", children })
87
- ] })
88
- }
89
- );
90
- };
91
- var Modal_default = Modal;
92
- var ModalProvider = ({ children }) => {
93
- const [modalContent, setModalContent] = useState(null);
94
- const showModal = (content) => setModalContent(content);
95
- const hideModal = () => setModalContent(null);
96
- return /* @__PURE__ */ jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
97
- children,
98
- modalContent && /* @__PURE__ */ jsx(Modal_default, { onClose: hideModal, children: modalContent })
99
- ] });
100
- };
101
- var ModalProvider_default = ModalProvider;
102
- var NextGameLabel = ({ nextGameTime }) => {
103
- const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
104
- return /* @__PURE__ */ jsxs(Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
105
- "Next Game: ",
106
- date.toLocaleString()
107
- ] });
22
+ // src/components/TablePage/EditComponents/EditTableDetailsForm.tsx
23
+
24
+ // src/components/shared/NameGenerator.ts
25
+ var getRandomTitle = () => {
26
+ const randomPrefix = titlePrefixes[Math.random() * titlePrefixes.length | 0];
27
+ const randomMiddle = tileMiddle[Math.random() * tileMiddle.length | 0];
28
+ const randomSuffix = titleSuffixes[Math.random() * titleSuffixes.length | 0];
29
+ return `${randomPrefix} ${randomMiddle} ${randomSuffix}`;
108
30
  };
109
- var NextGameLabel_default = NextGameLabel;
31
+ var getRandomTagline = () => taglines[Math.random() * taglines.length | 0];
32
+ var titlePrefixes = [
33
+ "The Knights of The",
34
+ "The Fellowship of The",
35
+ "The Order of The",
36
+ "The Infamous",
37
+ "The Legendary",
38
+ "The Dubious",
39
+ "The Sworn Guardians of The",
40
+ "The Ancient Guild of The",
41
+ "The Unstoppable",
42
+ "The Misfit",
43
+ "The Chaotic",
44
+ "The Brave",
45
+ "The Forgotten",
46
+ "The Wandering",
47
+ "The Noble Council of The",
48
+ "The Dread Pirates of The",
49
+ "The Honorable Society of The",
50
+ "The Cursed",
51
+ "The Unlikely Heroes of The",
52
+ "The Elders of The",
53
+ "The Seekers of The",
54
+ "The Champions of The",
55
+ "The Heralds of The",
56
+ "The Disciples of The",
57
+ "The Ragtag Band of The",
58
+ "The Cult of The"
59
+ ];
60
+ var tileMiddle = [
61
+ "Round",
62
+ "Kitchen",
63
+ "Deepest",
64
+ "Sorcery",
65
+ "Munchkin",
66
+ "Shenanigan",
67
+ "Secret",
68
+ "Dungeon",
69
+ "Fireside",
70
+ "Tabletop",
71
+ "Midnight",
72
+ "Tavern",
73
+ "Goblin",
74
+ "Dragon",
75
+ "Critical",
76
+ "Natural Twenty",
77
+ "Counterspell",
78
+ "Nat One",
79
+ "Cardboard",
80
+ "Dice Tower",
81
+ "Campaign",
82
+ "Lore",
83
+ "Awkward",
84
+ "Unhinged",
85
+ "Chaotic Neutral",
86
+ "Homebrew",
87
+ "Side Quest"
88
+ ];
89
+ var titleSuffixes = [
90
+ "Table",
91
+ "Dungeon",
92
+ "Cave",
93
+ "Crew",
94
+ "Team",
95
+ "League",
96
+ "Horde",
97
+ "Party",
98
+ "Conclave",
99
+ "Collective",
100
+ "Alliance",
101
+ "Syndicate",
102
+ "Guild",
103
+ "Cabal",
104
+ "Council",
105
+ "Expedition",
106
+ "Enclave",
107
+ "Consortium",
108
+ "Troupe",
109
+ "Vanguard",
110
+ "Cohort",
111
+ "Brotherhood",
112
+ "Sisterhood",
113
+ "Pantheon",
114
+ "Assembly",
115
+ "Coven"
116
+ ];
117
+ var taglines = [
118
+ "Everyone is welcome!",
119
+ "Looking for serious players.",
120
+ "Get in nerds, we're gaming!",
121
+ "If you aren't there, you're square.",
122
+ "It will be legendary!",
123
+ "Beginners welcome \u2014 we were all level 1 once.",
124
+ "No experience necessary. Snacks encouraged.",
125
+ "Roleplayers, board gamers, and chaos gremlins welcome.",
126
+ "We don't metagame. Much.",
127
+ "All alignments accepted. True Neutral gets the snacks.",
128
+ "Where every session is a one-shot... until it isn't.",
129
+ "Homebrew rules may apply.",
130
+ "Warning: may contain excessive lore.",
131
+ "Critical failures celebrated as much as critical hits.",
132
+ "No powergamers. Okay, maybe one powergamer.",
133
+ "We finish campaigns. (Eventually.)",
134
+ "Veteran players seeking worthy companions.",
135
+ "Casuals only \u2014 we're here for the vibes.",
136
+ "Serious about fun, not about rules.",
137
+ "Min-maxers need not apply.",
138
+ "For those who read the rulebook... and those who definitely didn't.",
139
+ "Roll for initiative. Arrive on time.",
140
+ "Side quests are the main quest here.",
141
+ "Chaotic good energy required.",
142
+ "If you bring snacks, you can name the first NPC.",
143
+ "We read the rulebook so you don't have to.",
144
+ "Wargamers only \u2014 no take-backs, no mercy.",
145
+ "Everyone welcome. Meeple provided.",
146
+ "We always play the longest game on the shelf.",
147
+ "Worker placement. Resource management. Existential dread.",
148
+ "No phones at the table! We're here for the game.",
149
+ "Someone always flips the table. Metaphorically. Usually.",
150
+ "We have a designated rules lawyer. It's fine.",
151
+ "Cooperative games only \u2014 we can't handle another Monopoly incident.",
152
+ "Teaching time is half the fun!"
153
+ ];
110
154
  function Chip({ tag, removeCallback }) {
111
155
  var _a;
112
156
  const color = (_a = tag.color) != null ? _a : "#bfbcbb";
@@ -139,16 +183,196 @@ function Chip({ tag, removeCallback }) {
139
183
  tag.id
140
184
  ) });
141
185
  }
186
+ function TagSelector({ initialTagIDs, allTags, onTagChange }) {
187
+ const [tagList, updateTagList] = useState(initialTagIDs);
188
+ const [inputValue, setInputValue] = useState("");
189
+ const toggleTag = (id) => tagList.find((t) => t === id) ? removeTag(id) : addTag(id);
190
+ const addTag = (id) => {
191
+ const newList = [...tagList, id];
192
+ updateTagList(newList);
193
+ onTagChange(newList);
194
+ };
195
+ const removeTag = (id) => {
196
+ const newList = tagList.filter((t) => t !== id);
197
+ updateTagList(newList);
198
+ onTagChange(newList);
199
+ };
200
+ const selectedTags = useMemo(() => allTags.filter((tag) => tagList.includes(tag.id)), [allTags, tagList]);
201
+ const options = useMemo(
202
+ () => allTags.map((tag) => ({ value: tag.id, label: tag.label })),
203
+ [allTags]
204
+ );
205
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
206
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsx(
207
+ Chip,
208
+ {
209
+ tag,
210
+ removeCallback: () => toggleTag(tag.id)
211
+ },
212
+ tag.id
213
+ )) }),
214
+ /* @__PURE__ */ jsx(Grid2, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid2, { sx: { marginTop: 3, width: "100%", minWidth: "550px" }, children: /* @__PURE__ */ jsx(
215
+ Autocomplete,
216
+ {
217
+ options,
218
+ filterOptions: (availableOptions, state) => availableOptions.filter(
219
+ (option) => !tagList.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
220
+ ),
221
+ value: null,
222
+ inputValue,
223
+ onInputChange: (event, newInputValue) => {
224
+ if (event && event.type === "change") {
225
+ setInputValue(newInputValue);
226
+ }
227
+ },
228
+ onChange: (event, newValue) => {
229
+ if (newValue) {
230
+ toggleTag(newValue.value);
231
+ }
232
+ setInputValue("");
233
+ },
234
+ renderInput: (params) => /* @__PURE__ */ jsx(TextField2, { ...params, label: "Select Tags" })
235
+ },
236
+ tagList.join("-")
237
+ ) }) })
238
+ ] });
239
+ }
240
+ function EditTableDetailsForm({ initialTitle, initialSubtitle, onTitleChange, onSubtitleChange, allowEditingTitles, initialTagIDs, allTags, onTagChange }) {
241
+ const [title, setTitle] = useState(initialTitle);
242
+ const [subtitle, setSubtitle] = useState(initialSubtitle);
243
+ const handleTitleChange = (newTitle) => {
244
+ setTitle(newTitle);
245
+ onTitleChange(newTitle);
246
+ };
247
+ const handleSubtitleChange = (newSubtitle) => {
248
+ setSubtitle(newSubtitle);
249
+ onSubtitleChange(newSubtitle);
250
+ };
251
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
252
+ allowEditingTitles && /* @__PURE__ */ jsxs(Box, { className: "flex flex-col gap-4 mb-8", children: [
253
+ /* @__PURE__ */ jsxs(Box, { className: "inline-flex", children: [
254
+ /* @__PURE__ */ jsx(
255
+ TextField2,
256
+ {
257
+ sx: { minWidth: "400px" },
258
+ label: "Title",
259
+ onChange: (e) => handleTitleChange(e.target.value),
260
+ variant: "filled",
261
+ value: title
262
+ }
263
+ ),
264
+ /* @__PURE__ */ jsx(Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsx(
265
+ CasinoIcon,
266
+ {
267
+ sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
268
+ onClick: () => handleTitleChange(getRandomTitle())
269
+ }
270
+ ) })
271
+ ] }),
272
+ /* @__PURE__ */ jsxs(Box, { className: "inline-flex min-w-96", children: [
273
+ /* @__PURE__ */ jsx(
274
+ TextField2,
275
+ {
276
+ sx: { minWidth: "400px" },
277
+ label: "Short Description or Tagline",
278
+ onChange: (e) => handleSubtitleChange(e.target.value),
279
+ variant: "filled",
280
+ value: subtitle
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsx(Tooltip, { title: "Randomize", children: /* @__PURE__ */ jsx(
284
+ CasinoIcon,
285
+ {
286
+ sx: { cursor: "pointer", alignSelf: "center", ml: 1 },
287
+ onClick: () => handleSubtitleChange(getRandomTagline())
288
+ }
289
+ ) })
290
+ ] })
291
+ ] }),
292
+ /* @__PURE__ */ jsx(TagSelector, { initialTagIDs, allTags, onTagChange })
293
+ ] });
294
+ }
295
+ var GameTableContext = React3.createContext(void 0);
296
+ function GameTableProvider(props) {
297
+ return /* @__PURE__ */ jsx(Fragment, { children: props.children });
298
+ }
299
+ function useGameTableContext() {
300
+ const context = React3.useContext(GameTableContext);
301
+ if (context) {
302
+ return context;
303
+ }
304
+ throw new Error("useGameTableContext is deprecated in the package build. Pass table data through props instead.");
305
+ }
306
+ var ModalContext = createContext({
307
+ showModal: () => {
308
+ },
309
+ hideModal: () => {
310
+ }
311
+ });
312
+ var useModal = () => useContext(ModalContext);
142
313
  function generateTagsDisplay(tag) {
143
314
  return /* @__PURE__ */ jsx(Chip, { tag }, tag.id);
144
315
  }
145
- function renderTagsFromIds(ids, legalTags) {
316
+ function renderTagsFromIds(ids, legalTags, options = {}) {
146
317
  if (!ids || !legalTags || legalTags.length === 0) {
147
318
  return /* @__PURE__ */ jsx(Fragment, {});
148
319
  }
320
+ const { showEventTag = false, eventTagId } = options;
149
321
  const validTags = ids.map((id) => legalTags.find((tag) => tag.id === id)).filter((tag) => Boolean(tag));
150
- return validTags.map((tag) => generateTagsDisplay(tag));
322
+ const sortedTags = [...validTags].sort((a, b) => {
323
+ if (showEventTag && eventTagId !== void 0) {
324
+ if (a.id === eventTagId && b.id === eventTagId) return 0;
325
+ if (a.id === eventTagId) return -1;
326
+ if (b.id === eventTagId) return 1;
327
+ }
328
+ const priorityOrder = ["Organizer Run", "Display Only"];
329
+ const aIndex = priorityOrder.indexOf(a.label);
330
+ const bIndex = priorityOrder.indexOf(b.label);
331
+ if (aIndex !== -1 && bIndex !== -1) {
332
+ return aIndex - bIndex;
333
+ }
334
+ if (aIndex !== -1) return -1;
335
+ if (bIndex !== -1) return 1;
336
+ return 0;
337
+ });
338
+ return sortedTags.map((tag) => generateTagsDisplay(tag));
151
339
  }
340
+
341
+ // src/data/values.tsx
342
+ var DEFAULT_PROFILE_PIC = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIyNTYiIGhlaWdodD0iMjU2IiB2aWV3Qm94PSIwIDAgMjU2IDI1NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnIHN0eWxlPSJzdHJva2U6IG5vbmU7IHN0cm9rZS13aWR0aDogMDsgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHQ7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1taXRlcmxpbWl0OiAxMDsgZmlsbDogbm9uZTsgZmlsbC1ydWxlOiBub256ZXJvOyBvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40MDY1OTM0MDY1OTM0MDE2IDEuNDA2NTkzNDA2NTkzNDAxNikgc2NhbGUoMi44MSAyLjgxKSI+Cgk8cGF0aCBkPSJNIDQ1IDg4IGMgLTExLjA0OSAwIC0yMS4xOCAtMi4wMDMgLTI5LjAyMSAtOC42MzQgQyA2LjIxMiA3MS4xMDUgMCA1OC43NjQgMCA0NSBDIDAgMjAuMTg3IDIwLjE4NyAwIDQ1IDAgYyAyNC44MTMgMCA0NSAyMC4xODcgNDUgNDUgYyAwIDEzLjc2NSAtNi4yMTIgMjYuMTA1IC0xNS45NzkgMzQuMzY2IEMgNjYuMTgxIDg1Ljk5OCA1Ni4wNDkgODggNDUgODggeiIgc3R5bGU9InN0cm9rZTogbm9uZTsgc3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiBub25lOyBzdHJva2UtbGluZWNhcDogYnV0dDsgc3Ryb2tlLWxpbmVqb2luOiBtaXRlcjsgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyBmaWxsOiByZ2IoMjE0LDIxNCwyMTQpOyBmaWxsLXJ1bGU6IG5vbnplcm87IG9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiBtYXRyaXgoMSAwIDAgMSAwIDApICIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cgk8cGF0aCBkPSJNIDQ1IDYwLjcxIGMgLTExLjQ3OSAwIC0yMC44MTggLTkuMzM5IC0yMC44MTggLTIwLjgxNyBjIDAgLTExLjQ3OSA5LjMzOSAtMjAuODE4IDIwLjgxOCAtMjAuODE4IGMgMTEuNDc5IDAgMjAuODE3IDkuMzM5IDIwLjgxNyAyMC44MTggQyA2NS44MTcgNTEuMzcxIDU2LjQ3OSA2MC43MSA0NSA2MC43MSB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGw6IHJnYigxNjUsMTY0LDE2NCk7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIG1hdHJpeCgxIDAgMCAxIDAgMCkgIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KCTxwYXRoIGQ9Ik0gNDUgOTAgYyAtMTAuNjEzIDAgLTIwLjkyMiAtMy43NzMgLTI5LjAyOCAtMTAuNjI1IGMgLTAuNjQ4IC0wLjU0OCAtMC44OCAtMS40NDQgLTAuNTc5IC0yLjIzNyBDIDIwLjAzNCA2NC45MTkgMzEuOTMzIDU2LjcxIDQ1IDU2LjcxIHMgMjQuOTY2IDguMjA5IDI5LjYwNyAyMC40MjggYyAwLjMwMSAwLjc5MyAwLjA2OSAxLjY4OSAtMC41NzkgMi4yMzcgQyA2NS45MjIgODYuMjI3IDU1LjYxMyA5MCA0NSA5MCB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGw6IHJnYigxNjUsMTY0LDE2NCk7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIG1hdHJpeCgxIDAgMCAxIDAgMCkgIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9nPgo8L3N2Zz4=";
343
+ var NextGameLabel = ({ nextGameTime }) => {
344
+ const date = typeof nextGameTime === "string" ? new Date(nextGameTime) : nextGameTime;
345
+ return /* @__PURE__ */ jsxs(Typography, { variant: "caption", sx: { display: "block", mb: 1, color: "primary.main", fontWeight: "bold" }, children: [
346
+ "Next Game: ",
347
+ date.toLocaleString()
348
+ ] });
349
+ };
350
+ var NextGameLabel_default = NextGameLabel;
351
+ var AutoResizingTextarea = (props) => {
352
+ const { isInEditMode, onChange, textareaRef, value } = props;
353
+ useEffect(() => {
354
+ if (isInEditMode && textareaRef.current) {
355
+ const textarea = textareaRef.current;
356
+ textarea.style.height = "auto";
357
+ textarea.style.height = `${textarea.scrollHeight}px`;
358
+ }
359
+ }, [isInEditMode, textareaRef, value]);
360
+ return /* @__PURE__ */ jsx(
361
+ "textarea",
362
+ {
363
+ ref: textareaRef,
364
+ value,
365
+ onChange: (e) => onChange(e.target.value),
366
+ style: {
367
+ backgroundColor: "#fffbea",
368
+ overflow: "hidden",
369
+ resize: "none",
370
+ width: "100%"
371
+ }
372
+ }
373
+ );
374
+ };
375
+ var AutoResizingTextarea_default = AutoResizingTextarea;
152
376
  var PlayerHighlightsCard = function(props) {
153
377
  const {
154
378
  allTags,
@@ -160,14 +384,14 @@ var PlayerHighlightsCard = function(props) {
160
384
  removeFromTable
161
385
  } = props;
162
386
  return /* @__PURE__ */ jsx(Card, { elevation: 3, sx: { backgroundColor: canEdit ? "#fffbea" : "#f5f9fa", marginBottom: "6px" }, children: /* @__PURE__ */ jsxs(CardContent, { children: [
163
- /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, direction: "column", children: [
164
- /* @__PURE__ */ jsxs(Grid, { container: true, direction: "row", children: [
165
- /* @__PURE__ */ jsx(Grid, { children: /* @__PURE__ */ jsx(Image, { alt: player.username + "'s profile pic", height: 64, src: player.miniPic || "", width: 64 }) }),
166
- /* @__PURE__ */ jsx(Grid, { children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: player.username }) })
387
+ /* @__PURE__ */ jsxs(Grid2, { container: true, spacing: 2, direction: "column", children: [
388
+ /* @__PURE__ */ jsxs(Grid2, { container: true, direction: "row", children: [
389
+ /* @__PURE__ */ jsx(Grid2, { children: /* @__PURE__ */ jsx(Image, { alt: player.username + "'s profile pic", height: 64, src: player.miniPic || DEFAULT_PROFILE_PIC, width: 64 }) }),
390
+ /* @__PURE__ */ jsx(Grid2, { children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: player.username }) })
167
391
  ] }),
168
- /* @__PURE__ */ jsx(Grid, { children: renderTagsFromIds(player.tags, allTags) })
392
+ /* @__PURE__ */ jsx(Grid2, { children: renderTagsFromIds(player.tags, allTags) })
169
393
  ] }),
170
- canEdit && /* @__PURE__ */ jsxs(Grid, { children: [
394
+ canEdit && /* @__PURE__ */ jsxs(Grid2, { children: [
171
395
  /* @__PURE__ */ jsx(Button2, { onClick: () => removeFromTable(player), children: isWaitList ? /* @__PURE__ */ jsx("p", { children: "Deny Player" }) : /* @__PURE__ */ jsx("p", { children: "Remove Player" }) }),
172
396
  canChangeDungeonMaster && /* @__PURE__ */ jsx(Button2, { onClick: () => {
173
397
  handleAssignToDungeonMaster(player);
@@ -179,11 +403,11 @@ var PlayerHighlightsCard = function(props) {
179
403
  var DMHighlightsCard = function({ canEdit, player, allTags }) {
180
404
  return /* @__PURE__ */ jsxs(Card, { elevation: 3, sx: { backgroundColor: "#f5f9fa", marginBottom: "6px" }, children: [
181
405
  /* @__PURE__ */ jsx(CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Game Master" }),
182
- /* @__PURE__ */ jsx(CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, direction: "column", children: [
183
- /* @__PURE__ */ jsx(Grid, { children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: player.username }) }),
184
- /* @__PURE__ */ jsxs(Grid, { container: true, direction: "row", children: [
185
- /* @__PURE__ */ jsx(Grid, { children: /* @__PURE__ */ jsx(Image, { alt: player.username + "'s profile pic", height: 120, src: player.imageUrl ? player.imageUrl : "", width: 256 }) }),
186
- /* @__PURE__ */ jsx(Grid, { children: renderTagsFromIds(player.tags, allTags) }),
406
+ /* @__PURE__ */ jsx(CardContent, { sx: { backgroundColor: canEdit ? "#fffbea" : "inherit" }, children: /* @__PURE__ */ jsxs(Grid2, { container: true, spacing: 2, direction: "column", children: [
407
+ /* @__PURE__ */ jsx(Grid2, { children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: player.username }) }),
408
+ /* @__PURE__ */ jsxs(Grid2, { container: true, direction: "row", children: [
409
+ /* @__PURE__ */ jsx(Grid2, { children: /* @__PURE__ */ jsx(Image, { alt: player.username + "'s profile pic", height: 120, src: player.imageUrl || DEFAULT_PROFILE_PIC, width: 256 }) }),
410
+ /* @__PURE__ */ jsx(Grid2, { children: renderTagsFromIds(player.tags, allTags) }),
187
411
  /* @__PURE__ */ jsx(Typography, { children: player.description })
188
412
  ] })
189
413
  ] }) })
@@ -212,12 +436,11 @@ function TableActionsBar(props) {
212
436
  if (waitlistPlayers.length === 0) {
213
437
  return /* @__PURE__ */ jsx("p", { children: "Waitlist is empty!" });
214
438
  }
215
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
216
- /* @__PURE__ */ jsx(CardHeader2, { slotProps: { title: { variant: "h4" } }, title: "Waitlist Players: " }),
217
- /* @__PURE__ */ jsx("ul", { className: "gap-8", children: waitlistPlayers.map((player) => /* @__PURE__ */ jsxs(
439
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
440
+ /* @__PURE__ */ jsx("ul", { className: "gap-8 px-6", children: waitlistPlayers.map((player) => /* @__PURE__ */ jsxs(
218
441
  "li",
219
442
  {
220
- className: `${canMovePlayersToTable ? "bg-amber-100 cursor-pointer" : "bg-gray-200"} mb-8 flex flex-row flex-start space-between justify-center items-center gap-3 p-2 rounded`,
443
+ className: `${canMovePlayersToTable ? "bg-amber-100 cursor-pointer" : "bg-gray-200"} mb-8 flex flex-row flex-start space-between items-center gap-3 p-2 rounded`,
221
444
  onClick: () => canMovePlayersToTable ? onPromoteWaitlistPlayer == null ? void 0 : onPromoteWaitlistPlayer(player.id) : void 0,
222
445
  tabIndex: 0,
223
446
  children: [
@@ -226,7 +449,7 @@ function TableActionsBar(props) {
226
449
  {
227
450
  alt: player.username + "'s profile pic",
228
451
  height: 64,
229
- src: player.miniPic || "",
452
+ src: player.miniPic || DEFAULT_PROFILE_PIC,
230
453
  width: 64
231
454
  }
232
455
  ),
@@ -235,26 +458,26 @@ function TableActionsBar(props) {
235
458
  },
236
459
  player.id
237
460
  )) }),
238
- /* @__PURE__ */ jsx("button", { onClick: () => hideModal(), children: "close modal" })
461
+ /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button2, { onClick: () => hideModal(), children: "Close" }) })
239
462
  ] });
240
463
  };
241
- return /* @__PURE__ */ jsxs(Grid$1, { container: true, direction: "column", spacing: 1, children: [
242
- /* @__PURE__ */ jsx(Grid$1, { container: true, direction: "row", children: /* @__PURE__ */ jsxs(Typography, { color: "white", sx: { textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)" }, children: [
464
+ return /* @__PURE__ */ jsxs(Grid, { container: true, direction: "column", spacing: 1, children: [
465
+ /* @__PURE__ */ jsx(Grid, { container: true, direction: "row", children: /* @__PURE__ */ jsxs(Typography, { color: "white", sx: { textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)" }, children: [
243
466
  "Players: ",
244
467
  numPlayers,
245
468
  " / ",
246
469
  slots
247
470
  ] }) }),
248
- /* @__PURE__ */ jsxs(Grid$1, { container: true, direction: "row", children: [
471
+ /* @__PURE__ */ jsxs(Grid, { container: true, direction: "row", children: [
249
472
  !isOwner && !isPlayer && !isDM && !onWaitlist && /* @__PURE__ */ jsx(Button2, { onClick: () => onJoinWaitlist == null ? void 0 : onJoinWaitlist(), sx: buttonStyle, children: "Join Waitlist" }),
250
473
  !isOwner && (isPlayer || onWaitlist) && /* @__PURE__ */ jsx(Button2, { onClick: () => onLeaveTable == null ? void 0 : onLeaveTable(), sx: buttonStyle, children: onWaitlist ? "Leave Waitlist" : "Leave Table" }),
251
474
  canEditTable ? /* @__PURE__ */ jsxs(Fragment, { children: [
252
- /* @__PURE__ */ jsx(Button2, { onClick: () => onEditModeChange(true), sx: buttonStyle, endIcon: /* @__PURE__ */ jsx(EditIcon, {}), children: "Edit" }),
475
+ /* @__PURE__ */ jsx(Button2, { onClick: () => onEditModeChange(true), sx: buttonStyle, endIcon: /* @__PURE__ */ jsx(EditIcon2, {}), children: "Edit" }),
253
476
  canViewWaitlist ? /* @__PURE__ */ jsx(
254
477
  Button2,
255
478
  {
256
479
  endIcon: /* @__PURE__ */ jsx(ListIcon, {}),
257
- onClick: () => showModal(renderPlayerWaitlistModalContent(false)),
480
+ onClick: () => showModal(renderPlayerWaitlistModalContent(false), "Waitlist Players:"),
258
481
  sx: buttonStyle,
259
482
  children: "View Waitlist"
260
483
  }
@@ -266,13 +489,25 @@ function TableActionsBar(props) {
266
489
  Button2,
267
490
  {
268
491
  endIcon: /* @__PURE__ */ jsx(ListIcon, {}),
269
- onClick: () => showModal(renderPlayerWaitlistModalContent(true)),
492
+ onClick: () => showModal(renderPlayerWaitlistModalContent(true), "Waitlist Players:"),
270
493
  sx: buttonStyle,
271
494
  children: "Edit Waitlist"
272
495
  }
273
496
  )
274
497
  ] }) : null,
275
- isOwner && /* @__PURE__ */ jsx(Button2, { onClick: () => onDeleteTable == null ? void 0 : onDeleteTable(), sx: buttonStyle, endIcon: /* @__PURE__ */ jsx(DeleteIcon, {}), children: "Delete Table" })
498
+ isOwner && /* @__PURE__ */ jsx(
499
+ Button2,
500
+ {
501
+ onClick: () => showModal(
502
+ /* @__PURE__ */ jsx(Typography, { children: "Are you sure you want to delete this table? This action cannot be undone." }),
503
+ "Delete Table",
504
+ { acceptText: "Delete", onAccept: () => onDeleteTable == null ? void 0 : onDeleteTable() }
505
+ ),
506
+ sx: buttonStyle,
507
+ endIcon: /* @__PURE__ */ jsx(DeleteIcon, {}),
508
+ children: "Delete Table"
509
+ }
510
+ )
276
511
  ] })
277
512
  ] });
278
513
  }
@@ -282,135 +517,82 @@ var buttonStyle = {
282
517
  color: "white",
283
518
  borderRadius: "5px"
284
519
  };
285
- var AutoResizingTextarea = (props) => {
286
- const { isInEditMode, onChange, textareaRef, value } = props;
287
- useEffect(() => {
288
- if (isInEditMode && textareaRef.current) {
289
- const textarea = textareaRef.current;
290
- textarea.style.height = "auto";
291
- textarea.style.height = `${textarea.scrollHeight}px`;
292
- }
293
- }, [isInEditMode, textareaRef, value]);
294
- return /* @__PURE__ */ jsx(
295
- "textarea",
296
- {
297
- ref: textareaRef,
298
- value,
299
- onChange: (e) => onChange(e.target.value),
300
- style: {
301
- backgroundColor: "#fffbea",
302
- overflow: "hidden",
303
- resize: "none",
304
- width: "100%"
305
- }
306
- }
307
- );
308
- };
309
- var AutoResizingTextarea_default = AutoResizingTextarea;
310
- function TagEditor({
311
- title = "Tags",
312
- selectedTags,
313
- possibleTags,
314
- onToggleTag
315
- }) {
316
- const [inputValue, setInputValue] = useState("");
317
- const selectedIds = useMemo(() => selectedTags.map((tag) => tag.id), [selectedTags]);
318
- const options = useMemo(
319
- () => possibleTags.map((tag) => ({ value: tag.id, label: tag.label })),
320
- [possibleTags]
321
- );
322
- return /* @__PURE__ */ jsx(Grid, { container: true, children: /* @__PURE__ */ jsx(Grid, { size: { xs: 12 }, children: /* @__PURE__ */ jsxs(Card2, { children: [
323
- /* @__PURE__ */ jsx(
324
- CardHeader2,
325
- {
326
- title,
327
- style: {
328
- background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
329
- color: "#FFFFFF",
330
- fontSize: "1.5rem",
331
- textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
332
- }
333
- }
334
- ),
335
- /* @__PURE__ */ jsxs(CardContent2, { children: [
336
- /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: selectedTags.map((tag) => /* @__PURE__ */ jsx(
337
- Chip,
338
- {
339
- tag,
340
- removeCallback: () => onToggleTag(tag.id)
341
- },
342
- tag.id
343
- )) }),
344
- /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsx(Grid, { sx: { marginTop: 3, width: "100%" }, children: /* @__PURE__ */ jsx(
345
- Autocomplete,
346
- {
347
- options,
348
- filterOptions: (availableOptions, state) => availableOptions.filter(
349
- (option) => !selectedIds.includes(option.value) && option.label.toLowerCase().includes(state.inputValue.toLowerCase())
350
- ).slice(0, 3),
351
- value: null,
352
- inputValue,
353
- onInputChange: (event, newInputValue) => {
354
- if (event && event.type === "change") {
355
- setInputValue(newInputValue);
356
- }
357
- },
358
- onChange: (event, newValue) => {
359
- if (newValue) {
360
- onToggleTag(newValue.value);
361
- }
362
- setInputValue("");
363
- },
364
- slots: { popper: CustomPopper },
365
- renderInput: (params) => /* @__PURE__ */ jsx(TextField, { ...params, label: "Select Tags" })
366
- },
367
- selectedIds.join("-")
368
- ) }) })
369
- ] })
370
- ] }) }) });
371
- }
372
- var CustomPopper = (props) => {
373
- return /* @__PURE__ */ jsx(
374
- Popper,
375
- {
376
- ...props,
377
- modifiers: [
378
- {
379
- name: "preventOverflow",
380
- options: { boundary: "viewport" }
381
- },
382
- {
383
- name: "offset",
384
- options: { offset: [0, -10] }
385
- }
386
- ],
387
- placement: "top-start"
388
- }
389
- );
390
- };
391
520
  function TablePageLayout(props) {
392
521
  var _a;
393
- const { allTags, dungeonMaster, onDeleteTable, onJoinWaitlist, onLeaveTable, onSaveDraft, players, table, tableStatus, waitlistPlayers } = props;
522
+ const { hideModal, showModal } = useModal();
523
+ const { allTags, dungeonMaster, onDeleteTable, onJoinWaitlist, onLeaveTable, onSaveDraft, players, table, tableStatus, waitlistPlayers, startWithEditTitle, eventTagId } = props;
524
+ const canEdit = tableStatus.isOwner;
394
525
  const textAreaRef = useRef(null);
395
526
  const [isTableInEditMode, setIsTableInEditMode] = useState(false);
527
+ const [currentTitle, setCurrentTitle] = useState(table.title);
528
+ const [currentSubtitle, setCurrentSubtitle] = useState(table.shortDescription);
396
529
  const [currentDescription, setCurrentDescription] = useState(table.description);
397
530
  const [currentDungeonMaster, setCurrentDungeonMaster] = useState(dungeonMaster);
398
531
  const [currentPlayers, setCurrentPlayers] = useState(players);
399
- const [currentShortDescription, setCurrentShortDescription] = useState(table.shortDescription);
400
- const [currentTitle, setCurrentTitle] = useState(table.title);
401
532
  const [currentWaitlistPlayers, setCurrentWaitlistPlayers] = useState(waitlistPlayers);
402
533
  const [currentTagIds, setCurrentTagIds] = useState((_a = table.tags) != null ? _a : []);
534
+ const pendingEdits = useRef({ title: currentTitle, subtitle: currentSubtitle, tags: currentTagIds });
535
+ const handleSaveTable = (tableData = {}) => {
536
+ const nextDraft = {
537
+ ...table,
538
+ description: currentDescription,
539
+ dungeonMaster: String(currentDungeonMaster.id),
540
+ players: currentPlayers.map((player) => player.id),
541
+ shortDescription: currentSubtitle,
542
+ tags: currentTagIds,
543
+ title: currentTitle,
544
+ waitlist: currentWaitlistPlayers.map((player) => player.id),
545
+ ...tableData
546
+ };
547
+ void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
548
+ setIsTableInEditMode(false);
549
+ };
550
+ const clean = (text) => text.replaceAll(
551
+ /\b(n[i1!]g+(er|a|e)s?|f[a@]g|f[a@]g+[o0]ts?|k[i1!]k[e3]s?|ch[i1!]nks?|w[e3]tb[a@]cks?|r[a@]gh[e3][a@]ds?|t[o0]w[e3]lh[e3][a@]ds?|r[e3]t[a@]rd(ed|s)?|c[o0][o0]ns?|tr[a@]nn(y|i[e3]s?)|g[o0][o0]ks?)\b/gi,
552
+ "dudes"
553
+ );
554
+ const editTableDetails = () => {
555
+ if (!canEdit) {
556
+ return;
557
+ }
558
+ pendingEdits.current = {
559
+ title: currentTitle,
560
+ subtitle: currentSubtitle,
561
+ tags: currentTagIds
562
+ };
563
+ const editContent = /* @__PURE__ */ jsx(
564
+ EditTableDetailsForm,
565
+ {
566
+ initialTitle: currentTitle,
567
+ initialSubtitle: currentSubtitle,
568
+ onTitleChange: (t) => pendingEdits.current.title = t,
569
+ onSubtitleChange: (s) => pendingEdits.current.subtitle = s,
570
+ onTagChange: (t) => pendingEdits.current.tags = t,
571
+ initialTagIDs: currentTagIds,
572
+ allTags: allTags.filter((t) => t.appliesTo.tables),
573
+ allowEditingTitles: true
574
+ }
575
+ );
576
+ showModal(editContent, "Edit Table Details", {
577
+ acceptText: "Save",
578
+ onAccept: () => {
579
+ setCurrentTitle(clean(pendingEdits.current.title));
580
+ setCurrentSubtitle(clean(pendingEdits.current.subtitle));
581
+ setCurrentTagIds(pendingEdits.current.tags);
582
+ handleSaveTable({
583
+ title: clean(pendingEdits.current.title),
584
+ shortDescription: clean(pendingEdits.current.subtitle),
585
+ tags: pendingEdits.current.tags
586
+ });
587
+ }
588
+ });
589
+ };
403
590
  useEffect(() => {
404
- var _a2;
405
- setCurrentDescription(table.description);
406
- setCurrentDungeonMaster(dungeonMaster);
407
- setCurrentPlayers(players);
408
- setCurrentShortDescription(table.shortDescription);
409
- setCurrentTitle(table.title);
410
- setCurrentWaitlistPlayers(waitlistPlayers);
411
- setCurrentTagIds((_a2 = table.tags) != null ? _a2 : []);
412
- }, [dungeonMaster, players, table, waitlistPlayers]);
413
- const currentTags = useMemo(
591
+ if (startWithEditTitle) {
592
+ editTableDetails();
593
+ }
594
+ });
595
+ useMemo(
414
596
  () => allTags.filter((tag) => currentTagIds.includes(tag.id)),
415
597
  [allTags, currentTagIds]
416
598
  );
@@ -430,37 +612,17 @@ function TablePageLayout(props) {
430
612
  return prevWaitlist.filter((player) => player.id !== playerIdToPromote);
431
613
  });
432
614
  };
433
- const handleToggleTag = (tagId) => {
434
- setCurrentTagIds(
435
- (prevState) => prevState.includes(tagId) ? prevState.filter((id) => id !== tagId) : [...prevState, tagId]
436
- );
437
- };
438
- const handleSaveTable = () => {
439
- const nextDraft = {
440
- ...table,
441
- description: currentDescription,
442
- dungeonMaster: String(currentDungeonMaster.id),
443
- players: currentPlayers.map((player) => player.id),
444
- shortDescription: currentShortDescription,
445
- tags: currentTagIds,
446
- title: currentTitle,
447
- waitlist: currentWaitlistPlayers.map((player) => player.id)
448
- };
449
- void (onSaveDraft == null ? void 0 : onSaveDraft(nextDraft));
450
- setIsTableInEditMode(false);
451
- };
452
615
  return /* @__PURE__ */ jsx(
453
616
  Card,
454
617
  {
455
618
  sx: {
456
619
  backgroundColor: isTableInEditMode ? "lightsalmon" : "white",
457
- borderRadius: "5%",
458
620
  p: 2,
459
621
  boxShadow: "0px 8px 15px rgba(25, 118, 210, 0.3)"
460
622
  },
461
- children: /* @__PURE__ */ jsxs(Grid, { container: true, direction: "column", children: [
623
+ children: /* @__PURE__ */ jsxs(Grid2, { container: true, direction: "column", children: [
462
624
  /* @__PURE__ */ jsxs(
463
- Grid,
625
+ Grid2,
464
626
  {
465
627
  container: true,
466
628
  direction: "column",
@@ -473,39 +635,49 @@ function TablePageLayout(props) {
473
635
  textShadow: "4px 4px 6px rgba(0, 0, 0, 0.5)"
474
636
  },
475
637
  children: [
476
- /* @__PURE__ */ jsx(Box, { children: isTableInEditMode ? /* @__PURE__ */ jsx(
477
- "input",
478
- {
479
- onChange: (e) => setCurrentTitle(e.target.value),
480
- style: { backgroundColor: "#fffbea" },
481
- tabIndex: 0,
482
- type: "text",
483
- value: currentTitle
484
- }
485
- ) : /* @__PURE__ */ jsx(
486
- CardHeader,
638
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
639
+ Box,
487
640
  {
488
- title: currentTitle,
489
- sx: {
490
- p: 0,
491
- "& .MuiCardHeader-title": {
492
- color: "white",
493
- fontWeight: 700
494
- }
495
- }
641
+ className: `flex items-center gap-1 ${canEdit ? "cursor-pointer" : ""}`,
642
+ sx: { "&:hover .edit-icon": { opacity: 1 } },
643
+ onClick: editTableDetails,
644
+ children: [
645
+ /* @__PURE__ */ jsx(
646
+ CardHeader,
647
+ {
648
+ title: currentTitle,
649
+ sx: {
650
+ p: 0,
651
+ "& .MuiCardHeader-title": {
652
+ color: "white",
653
+ fontWeight: 700
654
+ }
655
+ }
656
+ }
657
+ ),
658
+ canEdit ? /* @__PURE__ */ jsx(EditIcon2, { className: "edit-icon text-white", sx: { opacity: 0, transition: "opacity 0.2s" } }) : ""
659
+ ]
496
660
  }
497
661
  ) }),
498
- isTableInEditMode ? /* @__PURE__ */ jsx(
499
- "input",
662
+ /* @__PURE__ */ jsxs(
663
+ Box,
500
664
  {
501
- onChange: (e) => setCurrentShortDescription(e.target.value),
502
- style: { backgroundColor: "#fffbea" },
503
- tabIndex: 0,
504
- type: "text",
505
- value: currentShortDescription
665
+ className: `flex items-center gap-1 ${canEdit ? "cursor-pointer" : ""}`,
666
+ sx: { "&:hover .edit-icon": { opacity: 1 } },
667
+ onClick: editTableDetails,
668
+ children: [
669
+ /* @__PURE__ */ jsx(
670
+ Typography,
671
+ {
672
+ sx: { color: "white", opacity: 0.95 },
673
+ children: currentSubtitle
674
+ }
675
+ ),
676
+ canEdit ? /* @__PURE__ */ jsx(EditIcon2, { className: "edit-icon text-white", sx: { opacity: 0, transition: "opacity 0.2s", fontSize: "medium" } }) : ""
677
+ ]
506
678
  }
507
- ) : /* @__PURE__ */ jsx(Typography, { sx: { color: "white", opacity: 0.95 }, children: currentShortDescription }),
508
- /* @__PURE__ */ jsx(Grid, { container: true, children: isTableInEditMode ? renderEditableTags(currentTags, allTags, handleToggleTag) : renderTags(currentTagIds, allTags) }),
679
+ ),
680
+ /* @__PURE__ */ jsx(Grid2, { container: true, onClick: editTableDetails, className: `${canEdit ? "cursor-pointer" : ""}`, children: renderTags(currentTagIds, allTags, canEdit, table.eventTagId || eventTagId) }),
509
681
  /* @__PURE__ */ jsx(
510
682
  TableActionsBar,
511
683
  {
@@ -525,8 +697,8 @@ function TablePageLayout(props) {
525
697
  ]
526
698
  }
527
699
  ),
528
- /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, sx: { mt: 2 }, children: [
529
- /* @__PURE__ */ jsx(Grid, { size: { xs: 12, md: 8 }, children: /* @__PURE__ */ jsx(Card, { sx: { height: "100%" }, children: /* @__PURE__ */ jsx(CardContent, { children: isTableInEditMode ? /* @__PURE__ */ jsx(
700
+ /* @__PURE__ */ jsxs(Grid2, { container: true, spacing: 2, sx: { mt: 2 }, children: [
701
+ /* @__PURE__ */ jsx(Grid2, { size: { xs: 12, md: 8 }, children: /* @__PURE__ */ jsx(Card, { sx: { height: "100%" }, children: /* @__PURE__ */ jsx(CardContent, { children: isTableInEditMode ? /* @__PURE__ */ jsx(
530
702
  AutoResizingTextarea_default,
531
703
  {
532
704
  isInEditMode: isTableInEditMode,
@@ -535,7 +707,7 @@ function TablePageLayout(props) {
535
707
  value: currentDescription
536
708
  }
537
709
  ) : /* @__PURE__ */ jsx(Typography, { sx: { whiteSpace: "pre-wrap" }, children: currentDescription }) }) }) }),
538
- /* @__PURE__ */ jsxs(Grid, { size: { xs: 12, md: 4 }, children: [
710
+ /* @__PURE__ */ jsxs(Grid2, { size: { xs: 12, md: 4 }, children: [
539
711
  /* @__PURE__ */ jsx(DMHighlightsCard, { canEdit: isTableInEditMode, player: currentDungeonMaster, allTags }),
540
712
  /* @__PURE__ */ jsxs(Card, { sx: { height: "100%" }, children: [
541
713
  /* @__PURE__ */ jsx(CardHeader, { slotProps: { title: { variant: "h4" } }, title: "Players: " }),
@@ -558,31 +730,78 @@ function TablePageLayout(props) {
558
730
  }
559
731
  );
560
732
  }
561
- var renderTags = function(tags, allTags) {
733
+ var renderTags = function(tags, allTags, canEdit, eventTagId) {
562
734
  if (!tags || !allTags) {
563
735
  return /* @__PURE__ */ jsx(Fragment, {});
564
736
  }
565
- return /* @__PURE__ */ jsx(Grid, { container: true, spacing: 1, sx: { pb: 1.5 }, children: tags.map((tagId) => {
566
- const tag = allTags.find((potentialTag) => tagId === potentialTag.id);
567
- return tag ? generateTagsDisplay(tag) : /* @__PURE__ */ jsx(Fragment, {});
568
- }) });
569
- };
570
- var renderEditableTags = function(selectedTags, allTags, onToggleTag) {
571
- return /* @__PURE__ */ jsx(Grid, { size: { xs: 12 }, sx: { pb: 1.5 }, children: /* @__PURE__ */ jsx(
572
- TagEditor,
573
- {
574
- title: "Table Tags",
575
- possibleTags: allTags.filter((tag) => {
576
- var _a;
577
- return (_a = tag.appliesTo) == null ? void 0 : _a.tables;
578
- }),
579
- selectedTags,
580
- onToggleTag
581
- }
582
- ) });
737
+ return /* @__PURE__ */ jsxs(Grid2, { container: true, spacing: 1, sx: { pb: 1.5 }, children: [
738
+ renderTagsFromIds(tags, allTags, { showEventTag: true, eventTagId }),
739
+ canEdit ? /* @__PURE__ */ jsx(
740
+ Button,
741
+ {
742
+ variant: "text",
743
+ className: "inline-block text-sm px-3 py-1font-outlined m-0.5 font-stretch-105% font-sans",
744
+ sx: {
745
+ color: "white",
746
+ textShadow: "black 1.5px 1px 1.5px",
747
+ "&:hover": {
748
+ background: "#889"
749
+ }
750
+ },
751
+ children: "Edit Tags..."
752
+ }
753
+ ) : ""
754
+ ] });
583
755
  };
584
756
  var TablePageLayout_default = TablePageLayout;
757
+ var ModalProvider = ({ children }) => {
758
+ var _a;
759
+ const [modalContent, setModalContent] = useState(null);
760
+ const [displayModal, setDisplayModal] = useState(false);
761
+ const [title, setTitle] = useState("");
762
+ const [options, setOptions] = useState({});
763
+ const showModal = (content, title2, opts) => {
764
+ setModalContent(content);
765
+ setTitle(title2);
766
+ setOptions(opts != null ? opts : {});
767
+ setDisplayModal(true);
768
+ };
769
+ const hideModal = () => {
770
+ setDisplayModal(false);
771
+ };
772
+ return /* @__PURE__ */ jsxs(ModalContext.Provider, { value: { showModal, hideModal }, children: [
773
+ children,
774
+ /* @__PURE__ */ jsxs(Dialog, { open: displayModal, onClose: hideModal, sx: { height: "85%" }, children: [
775
+ /* @__PURE__ */ jsxs(Box, { children: [
776
+ /* @__PURE__ */ jsx(DialogTitle, { sx: { marginRight: "20px", minWidth: "400px" }, children: title }),
777
+ /* @__PURE__ */ jsx(
778
+ IconButton,
779
+ {
780
+ "aria-label": "close",
781
+ onClick: hideModal,
782
+ sx: { position: "absolute", right: 8, top: 8 },
783
+ children: /* @__PURE__ */ jsx(CloseIcon, {})
784
+ }
785
+ )
786
+ ] }),
787
+ /* @__PURE__ */ jsx(DialogContent, { sx: { paddingTop: 0 }, children: modalContent }),
788
+ (options.acceptText || options.onAccept) && /* @__PURE__ */ jsxs(DialogActions, { children: [
789
+ /* @__PURE__ */ jsx(Button2, { variant: "contained", onClick: () => {
790
+ var _a2;
791
+ hideModal();
792
+ (_a2 = options.onAccept) == null ? void 0 : _a2.call(options);
793
+ }, children: (_a = options.acceptText) != null ? _a : "OK" }),
794
+ /* @__PURE__ */ jsx(Button2, { onClick: () => {
795
+ var _a2;
796
+ hideModal();
797
+ (_a2 = options.onCancel) == null ? void 0 : _a2.call(options);
798
+ }, children: "Cancel" })
799
+ ] })
800
+ ] })
801
+ ] });
802
+ };
803
+ var ModalProvider_default = ModalProvider;
585
804
 
586
- export { DMHighlightsCard, GameTableProvider, ModalContext, ModalProvider_default as ModalProvider, NextGameLabel_default as NextGameLabel, PlayerHighlightsCard, TableActionsBar, TablePageLayout_default as TablePageLayout, useGameTableContext, useModal };
805
+ export { DMHighlightsCard, EditTableDetailsForm, GameTableProvider, ModalContext, ModalProvider_default as ModalProvider, NextGameLabel_default as NextGameLabel, PlayerHighlightsCard, TableActionsBar, TablePageLayout_default as TablePageLayout, TagSelector, useGameTableContext, useModal };
587
806
  //# sourceMappingURL=index.mjs.map
588
807
  //# sourceMappingURL=index.mjs.map