@mbpockets/shared-ui 0.2.0 → 0.2.6

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