@mbpockets/shared-ui 0.1.18

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 (281) hide show
  1. package/LICENSE +681 -0
  2. package/README.md +85 -0
  3. package/dist/EventPage/editMode/index.cjs +573 -0
  4. package/dist/EventPage/editMode/index.cjs.map +1 -0
  5. package/dist/EventPage/editMode/index.d.cts +5 -0
  6. package/dist/EventPage/editMode/index.d.ts +5 -0
  7. package/dist/EventPage/editMode/index.mjs +559 -0
  8. package/dist/EventPage/editMode/index.mjs.map +1 -0
  9. package/dist/EventPage/editMode.cjs +573 -0
  10. package/dist/EventPage/editMode.cjs.map +1 -0
  11. package/dist/EventPage/editMode.d.cts +5 -0
  12. package/dist/EventPage/editMode.d.ts +5 -0
  13. package/dist/EventPage/editMode.mjs +559 -0
  14. package/dist/EventPage/editMode.mjs.map +1 -0
  15. package/dist/EventPage/index.cjs +1245 -0
  16. package/dist/EventPage/index.cjs.map +1 -0
  17. package/dist/EventPage/index.d.cts +6 -0
  18. package/dist/EventPage/index.d.ts +6 -0
  19. package/dist/EventPage/index.mjs +1215 -0
  20. package/dist/EventPage/index.mjs.map +1 -0
  21. package/dist/EventPage.cjs +1245 -0
  22. package/dist/EventPage.cjs.map +1 -0
  23. package/dist/EventPage.d.cts +42 -0
  24. package/dist/EventPage.d.ts +42 -0
  25. package/dist/EventPage.mjs +1215 -0
  26. package/dist/EventPage.mjs.map +1 -0
  27. package/dist/PlayerPage/index.cjs +370 -0
  28. package/dist/PlayerPage/index.cjs.map +1 -0
  29. package/dist/PlayerPage/index.d.cts +4 -0
  30. package/dist/PlayerPage/index.d.ts +4 -0
  31. package/dist/PlayerPage/index.mjs +358 -0
  32. package/dist/PlayerPage/index.mjs.map +1 -0
  33. package/dist/PlayerPage.cjs +370 -0
  34. package/dist/PlayerPage.cjs.map +1 -0
  35. package/dist/PlayerPage.d.cts +32 -0
  36. package/dist/PlayerPage.d.ts +32 -0
  37. package/dist/PlayerPage.mjs +358 -0
  38. package/dist/PlayerPage.mjs.map +1 -0
  39. package/dist/ProfilePage/index.cjs +136 -0
  40. package/dist/ProfilePage/index.cjs.map +1 -0
  41. package/dist/ProfilePage/index.d.cts +3 -0
  42. package/dist/ProfilePage/index.d.ts +3 -0
  43. package/dist/ProfilePage/index.mjs +124 -0
  44. package/dist/ProfilePage/index.mjs.map +1 -0
  45. package/dist/ProfilePage.cjs +136 -0
  46. package/dist/ProfilePage.cjs.map +1 -0
  47. package/dist/ProfilePage.d.cts +10 -0
  48. package/dist/ProfilePage.d.ts +10 -0
  49. package/dist/ProfilePage.mjs +124 -0
  50. package/dist/ProfilePage.mjs.map +1 -0
  51. package/dist/SearchPage/Filters/index.cjs +270 -0
  52. package/dist/SearchPage/Filters/index.cjs.map +1 -0
  53. package/dist/SearchPage/Filters/index.d.cts +4 -0
  54. package/dist/SearchPage/Filters/index.d.ts +4 -0
  55. package/dist/SearchPage/Filters/index.mjs +250 -0
  56. package/dist/SearchPage/Filters/index.mjs.map +1 -0
  57. package/dist/SearchPage/Filters.cjs +270 -0
  58. package/dist/SearchPage/Filters.cjs.map +1 -0
  59. package/dist/SearchPage/Filters.d.cts +31 -0
  60. package/dist/SearchPage/Filters.d.ts +31 -0
  61. package/dist/SearchPage/Filters.mjs +250 -0
  62. package/dist/SearchPage/Filters.mjs.map +1 -0
  63. package/dist/SearchPage/Results/index.cjs +226 -0
  64. package/dist/SearchPage/Results/index.cjs.map +1 -0
  65. package/dist/SearchPage/Results/index.d.cts +4 -0
  66. package/dist/SearchPage/Results/index.d.ts +4 -0
  67. package/dist/SearchPage/Results/index.mjs +212 -0
  68. package/dist/SearchPage/Results/index.mjs.map +1 -0
  69. package/dist/SearchPage/Results.cjs +226 -0
  70. package/dist/SearchPage/Results.cjs.map +1 -0
  71. package/dist/SearchPage/Results.d.cts +53 -0
  72. package/dist/SearchPage/Results.d.ts +53 -0
  73. package/dist/SearchPage/Results.mjs +212 -0
  74. package/dist/SearchPage/Results.mjs.map +1 -0
  75. package/dist/SearchPage/index.cjs +737 -0
  76. package/dist/SearchPage/index.cjs.map +1 -0
  77. package/dist/SearchPage/index.d.cts +7 -0
  78. package/dist/SearchPage/index.d.ts +7 -0
  79. package/dist/SearchPage/index.mjs +695 -0
  80. package/dist/SearchPage/index.mjs.map +1 -0
  81. package/dist/SearchPage.cjs +737 -0
  82. package/dist/SearchPage.cjs.map +1 -0
  83. package/dist/SearchPage.d.cts +110 -0
  84. package/dist/SearchPage.d.ts +110 -0
  85. package/dist/SearchPage.mjs +695 -0
  86. package/dist/SearchPage.mjs.map +1 -0
  87. package/dist/TablePage/GameTableProvider/index.cjs +26 -0
  88. package/dist/TablePage/GameTableProvider/index.cjs.map +1 -0
  89. package/dist/TablePage/GameTableProvider/index.d.cts +4 -0
  90. package/dist/TablePage/GameTableProvider/index.d.ts +4 -0
  91. package/dist/TablePage/GameTableProvider/index.mjs +19 -0
  92. package/dist/TablePage/GameTableProvider/index.mjs.map +1 -0
  93. package/dist/TablePage/GameTableProvider.cjs +26 -0
  94. package/dist/TablePage/GameTableProvider.cjs.map +1 -0
  95. package/dist/TablePage/GameTableProvider.d.cts +15 -0
  96. package/dist/TablePage/GameTableProvider.d.ts +15 -0
  97. package/dist/TablePage/GameTableProvider.mjs +19 -0
  98. package/dist/TablePage/GameTableProvider.mjs.map +1 -0
  99. package/dist/TablePage/ModalProvider/index.cjs +83 -0
  100. package/dist/TablePage/ModalProvider/index.cjs.map +1 -0
  101. package/dist/TablePage/ModalProvider/index.css +49 -0
  102. package/dist/TablePage/ModalProvider/index.css.map +1 -0
  103. package/dist/TablePage/ModalProvider/index.d.cts +3 -0
  104. package/dist/TablePage/ModalProvider/index.d.ts +3 -0
  105. package/dist/TablePage/ModalProvider/index.mjs +79 -0
  106. package/dist/TablePage/ModalProvider/index.mjs.map +1 -0
  107. package/dist/TablePage/ModalProvider.cjs +83 -0
  108. package/dist/TablePage/ModalProvider.cjs.map +1 -0
  109. package/dist/TablePage/ModalProvider.css +49 -0
  110. package/dist/TablePage/ModalProvider.css.map +1 -0
  111. package/dist/TablePage/ModalProvider.d.cts +17 -0
  112. package/dist/TablePage/ModalProvider.d.ts +17 -0
  113. package/dist/TablePage/ModalProvider.mjs +79 -0
  114. package/dist/TablePage/ModalProvider.mjs.map +1 -0
  115. package/dist/TablePage/index.cjs +606 -0
  116. package/dist/TablePage/index.cjs.map +1 -0
  117. package/dist/TablePage/index.css +49 -0
  118. package/dist/TablePage/index.css.map +1 -0
  119. package/dist/TablePage/index.d.cts +10 -0
  120. package/dist/TablePage/index.d.ts +10 -0
  121. package/dist/TablePage/index.mjs +579 -0
  122. package/dist/TablePage/index.mjs.map +1 -0
  123. package/dist/TablePage/players/index.cjs +85 -0
  124. package/dist/TablePage/players/index.cjs.map +1 -0
  125. package/dist/TablePage/players/index.d.cts +4 -0
  126. package/dist/TablePage/players/index.d.ts +4 -0
  127. package/dist/TablePage/players/index.mjs +76 -0
  128. package/dist/TablePage/players/index.mjs.map +1 -0
  129. package/dist/TablePage/players.cjs +85 -0
  130. package/dist/TablePage/players.cjs.map +1 -0
  131. package/dist/TablePage/players.d.cts +22 -0
  132. package/dist/TablePage/players.d.ts +22 -0
  133. package/dist/TablePage/players.mjs +76 -0
  134. package/dist/TablePage/players.mjs.map +1 -0
  135. package/dist/TablePage.cjs +606 -0
  136. package/dist/TablePage.cjs.map +1 -0
  137. package/dist/TablePage.css +49 -0
  138. package/dist/TablePage.css.map +1 -0
  139. package/dist/TablePage.d.cts +54 -0
  140. package/dist/TablePage.d.ts +54 -0
  141. package/dist/TablePage.mjs +579 -0
  142. package/dist/TablePage.mjs.map +1 -0
  143. package/dist/common/Modal/index.cjs +64 -0
  144. package/dist/common/Modal/index.cjs.map +1 -0
  145. package/dist/common/Modal/index.css +49 -0
  146. package/dist/common/Modal/index.css.map +1 -0
  147. package/dist/common/Modal/index.d.cts +2 -0
  148. package/dist/common/Modal/index.d.ts +2 -0
  149. package/dist/common/Modal/index.mjs +62 -0
  150. package/dist/common/Modal/index.mjs.map +1 -0
  151. package/dist/common/Modal.cjs +64 -0
  152. package/dist/common/Modal.cjs.map +1 -0
  153. package/dist/common/Modal.css +49 -0
  154. package/dist/common/Modal.css.map +1 -0
  155. package/dist/common/Modal.d.cts +9 -0
  156. package/dist/common/Modal.d.ts +9 -0
  157. package/dist/common/Modal.mjs +62 -0
  158. package/dist/common/Modal.mjs.map +1 -0
  159. package/dist/common/index.cjs +210 -0
  160. package/dist/common/index.cjs.map +1 -0
  161. package/dist/common/index.css +49 -0
  162. package/dist/common/index.css.map +1 -0
  163. package/dist/common/index.d.cts +4 -0
  164. package/dist/common/index.d.ts +4 -0
  165. package/dist/common/index.mjs +194 -0
  166. package/dist/common/index.mjs.map +1 -0
  167. package/dist/common.cjs +210 -0
  168. package/dist/common.cjs.map +1 -0
  169. package/dist/common.css +49 -0
  170. package/dist/common.css.map +1 -0
  171. package/dist/common.d.cts +28 -0
  172. package/dist/common.d.ts +28 -0
  173. package/dist/common.mjs +194 -0
  174. package/dist/common.mjs.map +1 -0
  175. package/dist/index-D7WHhl3Q.d.ts +64 -0
  176. package/dist/index-DC0kK3aC.d.cts +64 -0
  177. package/dist/index.cjs +2608 -0
  178. package/dist/index.cjs.map +1 -0
  179. package/dist/index.css +49 -0
  180. package/dist/index.css.map +1 -0
  181. package/dist/index.d.cts +20 -0
  182. package/dist/index.d.ts +20 -0
  183. package/dist/index.mjs +2529 -0
  184. package/dist/index.mjs.map +1 -0
  185. package/dist/mocks/EventDB.cjs +171 -0
  186. package/dist/mocks/EventDB.cjs.map +1 -0
  187. package/dist/mocks/EventDB.d.cts +6 -0
  188. package/dist/mocks/EventDB.d.ts +6 -0
  189. package/dist/mocks/EventDB.mjs +169 -0
  190. package/dist/mocks/EventDB.mjs.map +1 -0
  191. package/dist/mocks/Events.cjs +59 -0
  192. package/dist/mocks/Events.cjs.map +1 -0
  193. package/dist/mocks/Events.d.cts +13 -0
  194. package/dist/mocks/Events.d.ts +13 -0
  195. package/dist/mocks/Events.mjs +57 -0
  196. package/dist/mocks/Events.mjs.map +1 -0
  197. package/dist/mocks/Players.cjs +75 -0
  198. package/dist/mocks/Players.cjs.map +1 -0
  199. package/dist/mocks/Players.d.cts +15 -0
  200. package/dist/mocks/Players.d.ts +15 -0
  201. package/dist/mocks/Players.mjs +73 -0
  202. package/dist/mocks/Players.mjs.map +1 -0
  203. package/dist/mocks/SearchResults.cjs +143 -0
  204. package/dist/mocks/SearchResults.cjs.map +1 -0
  205. package/dist/mocks/SearchResults.d.cts +30 -0
  206. package/dist/mocks/SearchResults.d.ts +30 -0
  207. package/dist/mocks/SearchResults.mjs +137 -0
  208. package/dist/mocks/SearchResults.mjs.map +1 -0
  209. package/dist/mocks/Tables.cjs +133 -0
  210. package/dist/mocks/Tables.cjs.map +1 -0
  211. package/dist/mocks/Tables.d.cts +38 -0
  212. package/dist/mocks/Tables.d.ts +38 -0
  213. package/dist/mocks/Tables.mjs +131 -0
  214. package/dist/mocks/Tables.mjs.map +1 -0
  215. package/dist/mocks/Tags.cjs +142 -0
  216. package/dist/mocks/Tags.cjs.map +1 -0
  217. package/dist/mocks/Tags.d.cts +5 -0
  218. package/dist/mocks/Tags.d.ts +5 -0
  219. package/dist/mocks/Tags.mjs +140 -0
  220. package/dist/mocks/Tags.mjs.map +1 -0
  221. package/dist/mocks/index.cjs +566 -0
  222. package/dist/mocks/index.cjs.map +1 -0
  223. package/dist/mocks/index.d.cts +8 -0
  224. package/dist/mocks/index.d.ts +8 -0
  225. package/dist/mocks/index.mjs +555 -0
  226. package/dist/mocks/index.mjs.map +1 -0
  227. package/dist/mocks.cjs +566 -0
  228. package/dist/mocks.cjs.map +1 -0
  229. package/dist/mocks.d.cts +8 -0
  230. package/dist/mocks.d.ts +8 -0
  231. package/dist/mocks.mjs +555 -0
  232. package/dist/mocks.mjs.map +1 -0
  233. package/dist/types/event.cjs +4 -0
  234. package/dist/types/event.cjs.map +1 -0
  235. package/dist/types/event.d.cts +37 -0
  236. package/dist/types/event.d.ts +37 -0
  237. package/dist/types/event.mjs +3 -0
  238. package/dist/types/event.mjs.map +1 -0
  239. package/dist/types/index.cjs +4 -0
  240. package/dist/types/index.cjs.map +1 -0
  241. package/dist/types/index.d.cts +6 -0
  242. package/dist/types/index.d.ts +6 -0
  243. package/dist/types/index.mjs +3 -0
  244. package/dist/types/index.mjs.map +1 -0
  245. package/dist/types/player.cjs +4 -0
  246. package/dist/types/player.cjs.map +1 -0
  247. package/dist/types/player.d.cts +20 -0
  248. package/dist/types/player.d.ts +20 -0
  249. package/dist/types/player.mjs +3 -0
  250. package/dist/types/player.mjs.map +1 -0
  251. package/dist/types/search.cjs +4 -0
  252. package/dist/types/search.cjs.map +1 -0
  253. package/dist/types/search.d.cts +20 -0
  254. package/dist/types/search.d.ts +20 -0
  255. package/dist/types/search.mjs +3 -0
  256. package/dist/types/search.mjs.map +1 -0
  257. package/dist/types/table.cjs +4 -0
  258. package/dist/types/table.cjs.map +1 -0
  259. package/dist/types/table.d.cts +21 -0
  260. package/dist/types/table.d.ts +21 -0
  261. package/dist/types/table.mjs +3 -0
  262. package/dist/types/table.mjs.map +1 -0
  263. package/dist/types/tables.cjs +4 -0
  264. package/dist/types/tables.cjs.map +1 -0
  265. package/dist/types/tables.d.cts +21 -0
  266. package/dist/types/tables.d.ts +21 -0
  267. package/dist/types/tables.mjs +3 -0
  268. package/dist/types/tables.mjs.map +1 -0
  269. package/dist/types/tag.cjs +4 -0
  270. package/dist/types/tag.cjs.map +1 -0
  271. package/dist/types/tag.d.cts +14 -0
  272. package/dist/types/tag.d.ts +14 -0
  273. package/dist/types/tag.mjs +3 -0
  274. package/dist/types/tag.mjs.map +1 -0
  275. package/dist/types.cjs +4 -0
  276. package/dist/types.cjs.map +1 -0
  277. package/dist/types.d.cts +6 -0
  278. package/dist/types.d.ts +6 -0
  279. package/dist/types.mjs +3 -0
  280. package/dist/types.mjs.map +1 -0
  281. package/package.json +117 -0
@@ -0,0 +1,695 @@
1
+ "use client";
2
+ import Typography2 from '@mui/material/Typography';
3
+ import FormControl from '@mui/material/FormControl';
4
+ import RadioGroup from '@mui/material/RadioGroup';
5
+ import FormControlLabel from '@mui/material/FormControlLabel';
6
+ import Radio from '@mui/material/Radio';
7
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
+ import React from 'react';
9
+ import Box2 from '@mui/material/Box';
10
+ import Autocomplete from '@mui/material/Autocomplete';
11
+ import TextField from '@mui/material/TextField';
12
+ import Popper from '@mui/material/Popper';
13
+ import Divider from '@mui/material/Divider';
14
+ import FormGroup from '@mui/material/FormGroup';
15
+ import Checkbox from '@mui/material/Checkbox';
16
+ import Button from '@mui/material/Button';
17
+ import SearchIcon from '@mui/icons-material/Search';
18
+ import Avatar from '@mui/material/Avatar';
19
+ import { Card, CardContent, Box, Typography, Chip, LinearProgress, useTheme, useMediaQuery } from '@mui/material';
20
+ import CasinoIcon from '@mui/icons-material/Casino';
21
+ import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
22
+ import LocationOnIcon from '@mui/icons-material/LocationOn';
23
+ import EventIcon from '@mui/icons-material/Event';
24
+ import Grid from '@mui/material/Grid';
25
+ import Card2 from '@mui/material/Card';
26
+ import CardHeader from '@mui/material/CardHeader';
27
+ import CardContent2 from '@mui/material/CardContent';
28
+
29
+ // src/components/SearchPage/Filters/SortOptions.tsx
30
+ var SORT_OPTIONS = [
31
+ { id: "relevance", label: "Relevance" },
32
+ { id: "newest", label: "Newest" },
33
+ { id: "popular", label: "Most Popular" }
34
+ ];
35
+ var SortOptions = ({
36
+ defaultValue = "relevance",
37
+ onChange
38
+ }) => {
39
+ const handleSortChange = (event) => {
40
+ onChange == null ? void 0 : onChange(event.target.value);
41
+ };
42
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
43
+ /* @__PURE__ */ jsx(Typography2, { variant: "h6", gutterBottom: true, children: "Sort By" }),
44
+ /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(RadioGroup, { defaultValue, onChange: handleSortChange, children: SORT_OPTIONS.map((option) => /* @__PURE__ */ jsx(
45
+ FormControlLabel,
46
+ {
47
+ value: option.id,
48
+ control: /* @__PURE__ */ jsx(Radio, {}),
49
+ label: option.label
50
+ },
51
+ option.id
52
+ )) }) })
53
+ ] });
54
+ };
55
+ var SortOptions_default = SortOptions;
56
+ var TagsFilter = ({
57
+ onChange,
58
+ tags: Tags = []
59
+ }) => {
60
+ const [mustHaveTags, setMustHaveTags] = React.useState([]);
61
+ const [mustNotHaveTags, setMustNotHaveTags] = React.useState([]);
62
+ const [shouldHaveAtLeastOneTags, setShouldHaveAtLeastOneTags] = React.useState([]);
63
+ Tags = !!Tags ? Tags : [];
64
+ const [inputValues, setInputValues] = React.useState({
65
+ mustHave: "",
66
+ mustNotHave: "",
67
+ shouldHaveAtLeastOne: ""
68
+ });
69
+ const tagOptions = React.useMemo(() => {
70
+ console.log("available tags: " + JSON.stringify(Tags));
71
+ console.log(!Tags);
72
+ if (!Tags || Tags.length == 0 || !Tags.map) return [];
73
+ return Tags.map((tag) => ({
74
+ value: tag.id,
75
+ label: tag.label
76
+ }));
77
+ }, [Tags]);
78
+ const handleTagChange = (tagId, category) => {
79
+ let newTags = [];
80
+ switch (category) {
81
+ case "mustHave":
82
+ newTags = mustHaveTags.includes(tagId) ? mustHaveTags.filter((id) => id !== tagId) : [...mustHaveTags, tagId];
83
+ setMustHaveTags(newTags);
84
+ break;
85
+ case "mustNotHave":
86
+ newTags = mustNotHaveTags.includes(tagId) ? mustNotHaveTags.filter((id) => id !== tagId) : [...mustNotHaveTags, tagId];
87
+ setMustNotHaveTags(newTags);
88
+ break;
89
+ case "shouldHaveAtLeastOne":
90
+ newTags = shouldHaveAtLeastOneTags.includes(tagId) ? shouldHaveAtLeastOneTags.filter((id) => id !== tagId) : [...shouldHaveAtLeastOneTags, tagId];
91
+ setShouldHaveAtLeastOneTags(newTags);
92
+ break;
93
+ }
94
+ if (onChange) {
95
+ onChange({
96
+ mustHave: category === "mustHave" ? newTags : mustHaveTags,
97
+ mustNotHave: category === "mustNotHave" ? newTags : mustNotHaveTags,
98
+ shouldHaveAtLeastOne: category === "shouldHaveAtLeastOne" ? newTags : shouldHaveAtLeastOneTags
99
+ });
100
+ }
101
+ };
102
+ const renderSelectedTags = (selectedTags, category) => {
103
+ const tagValues = [];
104
+ if (!Tags || Tags.length == 0 || !Tags.map) return null;
105
+ Tags.forEach((tag) => {
106
+ if (selectedTags.includes(tag.id)) {
107
+ tagValues.push(tag);
108
+ }
109
+ });
110
+ if (tagValues.length === 0) {
111
+ return null;
112
+ }
113
+ return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexWrap: "wrap", gap: 1, mb: 2 }, children: tagValues.map((tag) => /* @__PURE__ */ jsxs(
114
+ "span",
115
+ {
116
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
117
+ style: {
118
+ background: tag.color || "#bfbcbb",
119
+ color: "white",
120
+ textShadow: "black 0.2em 0.2em 0.4em"
121
+ },
122
+ children: [
123
+ tag.label,
124
+ /* @__PURE__ */ jsx(
125
+ "button",
126
+ {
127
+ type: "button",
128
+ onClick: () => handleTagChange(tag.id, category),
129
+ className: "ml-2 text-red-500 bg-white bg-opacity-50 rounded-full outline-black outline-2 font-outlined",
130
+ children: "\xD7"
131
+ }
132
+ )
133
+ ]
134
+ },
135
+ tag.id
136
+ )) });
137
+ };
138
+ const createTagSelector = (category, label) => {
139
+ const selectedTags = category === "mustHave" ? mustHaveTags : category === "mustNotHave" ? mustNotHaveTags : shouldHaveAtLeastOneTags;
140
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
141
+ /* @__PURE__ */ jsx(Typography2, { variant: "subtitle1", gutterBottom: true, sx: { mt: 2 }, children: label }),
142
+ renderSelectedTags(selectedTags, category),
143
+ /* @__PURE__ */ jsx(
144
+ Autocomplete,
145
+ {
146
+ options: tagOptions,
147
+ filterOptions: (options, state) => {
148
+ const tagsToExclude = /* @__PURE__ */ new Set();
149
+ selectedTags.forEach((id) => tagsToExclude.add(id));
150
+ if (category !== "mustHave") {
151
+ mustHaveTags.forEach((id) => tagsToExclude.add(id));
152
+ }
153
+ if (category !== "mustNotHave") {
154
+ mustNotHaveTags.forEach((id) => tagsToExclude.add(id));
155
+ }
156
+ if (category !== "shouldHaveAtLeastOne") {
157
+ shouldHaveAtLeastOneTags.forEach((id) => tagsToExclude.add(id));
158
+ }
159
+ return options.filter(
160
+ (option) => (
161
+ // Exclude options already selected in any category
162
+ !tagsToExclude.has(option.value) && // Filter based on user input
163
+ option.label.toLowerCase().includes(state.inputValue.toLowerCase())
164
+ )
165
+ ).slice(0, 3);
166
+ },
167
+ value: null,
168
+ inputValue: inputValues[category],
169
+ onInputChange: (event, newInputValue) => {
170
+ if (event && event.type === "change") {
171
+ setInputValues({
172
+ ...inputValues,
173
+ [category]: newInputValue
174
+ });
175
+ }
176
+ },
177
+ onChange: (event, newValue) => {
178
+ if (newValue) {
179
+ handleTagChange(newValue.value, category);
180
+ }
181
+ setInputValues({
182
+ ...inputValues,
183
+ [category]: ""
184
+ });
185
+ },
186
+ slots: { popper: CustomPopper },
187
+ renderInput: (params) => /* @__PURE__ */ jsx(TextField, { ...params, label: `Select ${label}` })
188
+ },
189
+ `${category}-${selectedTags.join("-")}`
190
+ )
191
+ ] });
192
+ };
193
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
194
+ /* @__PURE__ */ jsx(Typography2, { variant: "h6", gutterBottom: true, children: "Tags" }),
195
+ createTagSelector("mustHave", "Must Have Tags"),
196
+ /* @__PURE__ */ jsx(Divider, { sx: { my: 2 } }),
197
+ createTagSelector("mustNotHave", "Must Not Have Tags"),
198
+ /* @__PURE__ */ jsx(Divider, { sx: { my: 2 } }),
199
+ createTagSelector("shouldHaveAtLeastOne", "Should Contain At Least One Tag")
200
+ ] });
201
+ };
202
+ var CustomPopper = (props) => {
203
+ return /* @__PURE__ */ jsx(
204
+ Popper,
205
+ {
206
+ ...props,
207
+ modifiers: [
208
+ {
209
+ name: "preventOverflow",
210
+ options: {
211
+ boundary: "viewport"
212
+ // Prevent the Popper from going outside the viewport
213
+ }
214
+ },
215
+ {
216
+ name: "offset",
217
+ options: {
218
+ offset: [0, -10]
219
+ // Set negative vertical offset (adjust value as needed)
220
+ }
221
+ }
222
+ ],
223
+ placement: "top-start"
224
+ }
225
+ );
226
+ };
227
+ var TagsFilter_default = TagsFilter;
228
+ var FILTER_TYPES = [
229
+ { id: "player", label: "Players" },
230
+ { id: "event", label: "Events", disabled: true },
231
+ { id: "table", label: "Tables", disabled: true }
232
+ ];
233
+ var TypeFilter = ({ onChange }) => {
234
+ const [selectedTypes, setSelectedTypes] = React.useState([]);
235
+ const handleTypeChange = (typeId) => {
236
+ const newSelectedTypes = selectedTypes.includes(typeId) ? selectedTypes.filter((id) => id !== typeId) : [...selectedTypes, typeId];
237
+ setSelectedTypes(newSelectedTypes);
238
+ onChange == null ? void 0 : onChange(newSelectedTypes);
239
+ };
240
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
241
+ /* @__PURE__ */ jsx(Typography2, { variant: "h6", gutterBottom: true, children: "Type" }),
242
+ /* @__PURE__ */ jsx(FormGroup, { children: FILTER_TYPES.map((type) => /* @__PURE__ */ jsx(
243
+ FormControlLabel,
244
+ {
245
+ control: /* @__PURE__ */ jsx(
246
+ Checkbox,
247
+ {
248
+ checked: selectedTypes.includes(type.id),
249
+ onChange: () => handleTypeChange(type.id),
250
+ disabled: type.disabled
251
+ }
252
+ ),
253
+ label: type.label
254
+ },
255
+ type.id
256
+ )) })
257
+ ] });
258
+ };
259
+ var TypeFilter_default = TypeFilter;
260
+ var FiltersContainer = ({
261
+ onTypeChange,
262
+ onTagChange,
263
+ onSubmit,
264
+ tags
265
+ }) => {
266
+ return /* @__PURE__ */ jsxs(Box2, { children: [
267
+ /* @__PURE__ */ jsx(TypeFilter_default, { onChange: onTypeChange }),
268
+ /* @__PURE__ */ jsx(Divider, { sx: { my: 2 } }),
269
+ /* @__PURE__ */ jsx(
270
+ TagsFilter_default,
271
+ {
272
+ tags,
273
+ onChange: onTagChange
274
+ }
275
+ ),
276
+ /* @__PURE__ */ jsx(Divider, { sx: { my: 2 } }),
277
+ /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", justifyContent: "center", mt: 2 }, children: /* @__PURE__ */ jsx(
278
+ Button,
279
+ {
280
+ variant: "contained",
281
+ color: "primary",
282
+ size: "large",
283
+ startIcon: /* @__PURE__ */ jsx(SearchIcon, {}),
284
+ onClick: onSubmit,
285
+ sx: {
286
+ width: "100%",
287
+ py: 1.5,
288
+ borderRadius: 2,
289
+ boxShadow: "0px 4px 10px rgba(0, 0, 0, 0.1)",
290
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
291
+ "&:hover": {
292
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.9), rgba(25, 118, 210, 1))",
293
+ boxShadow: "0px 6px 15px rgba(0, 0, 0, 0.2)"
294
+ }
295
+ },
296
+ children: "Search"
297
+ }
298
+ ) })
299
+ ] });
300
+ };
301
+ var FiltersContainer_default = FiltersContainer;
302
+ function generateTagsDisplay(tag) {
303
+ return /* @__PURE__ */ jsx(
304
+ "span",
305
+ {
306
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
307
+ style: {
308
+ marginTop: "6px",
309
+ marginRight: "6px",
310
+ marginBottom: "6px",
311
+ background: tag.color || "#bfbcbb",
312
+ color: "white",
313
+ textShadow: "black 0.2em 0.2em 0.4em"
314
+ },
315
+ children: tag.label
316
+ },
317
+ tag.id
318
+ );
319
+ }
320
+ var BaseSearchResultCard = ({
321
+ result,
322
+ onClick,
323
+ children,
324
+ icon,
325
+ tags
326
+ }) => {
327
+ const handleClick = () => {
328
+ if (onClick) {
329
+ onClick(result.id);
330
+ }
331
+ };
332
+ return /* @__PURE__ */ jsx(
333
+ Card,
334
+ {
335
+ elevation: 6,
336
+ sx: {
337
+ width: "100%",
338
+ cursor: onClick ? "pointer" : "default",
339
+ boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.15)",
340
+ transition: "box-shadow 0.3s ease-in-out",
341
+ "&:hover": {
342
+ boxShadow: "0px 12px 28px rgba(0, 0, 0, 0.2)"
343
+ },
344
+ marginBottom: 2
345
+ },
346
+ onClick: handleClick,
347
+ children: /* @__PURE__ */ jsxs(CardContent, { sx: { display: "flex", alignItems: "flex-start" }, children: [
348
+ icon && /* @__PURE__ */ jsx(Box, { sx: { mr: 2, display: "flex", alignItems: "center", pt: 0.5 }, children: icon }),
349
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1 }, children: [
350
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", sx: { mb: 1 }, children: result.title }),
351
+ children,
352
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", children: result.description }),
353
+ result.tags && result.tags.length > 0 && /* @__PURE__ */ jsx(Box, { sx: { mt: 1 }, children: /* @__PURE__ */ jsx(Box, { sx: {
354
+ display: "block",
355
+ whiteSpace: "nowrap",
356
+ overflow: "hidden",
357
+ textOverflow: "clip",
358
+ pl: 0.5
359
+ // Add some padding to prevent clipping of the leftmost tag
360
+ }, children: (() => {
361
+ const MAX_VISIBLE = 5;
362
+ const tagObjs = result.tags.map((tagId) => tags.find((t) => t.id === tagId)).filter((t) => Boolean(t));
363
+ const visible = tagObjs.slice(0, MAX_VISIBLE);
364
+ const hiddenCount = Math.max(tagObjs.length - visible.length, 0);
365
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
366
+ visible.map((tag) => generateTagsDisplay(tag)),
367
+ hiddenCount > 0 && /* @__PURE__ */ jsxs(
368
+ "span",
369
+ {
370
+ className: "inline-block text-sm px-3 py-1 rounded-full outline-black outline-2 font-outlined",
371
+ style: {
372
+ marginTop: "6px",
373
+ marginRight: "6px",
374
+ marginBottom: "6px",
375
+ background: "#9e9e9e",
376
+ color: "white",
377
+ textShadow: "black 0.2em 0.2em 0.4em"
378
+ },
379
+ children: [
380
+ "+",
381
+ hiddenCount,
382
+ " more"
383
+ ]
384
+ }
385
+ )
386
+ ] });
387
+ })() }) })
388
+ ] })
389
+ ] })
390
+ }
391
+ );
392
+ };
393
+ var BaseSearchResultCard_default = BaseSearchResultCard;
394
+ var PlayerResultCard = ({
395
+ result,
396
+ onClick,
397
+ tags
398
+ }) => {
399
+ const firstLetter = result.title.charAt(0).toUpperCase();
400
+ const getAvatarColor = (name) => {
401
+ const colors = [
402
+ "#F44336",
403
+ "#E91E63",
404
+ "#9C27B0",
405
+ "#673AB7",
406
+ "#3F51B5",
407
+ "#2196F3",
408
+ "#03A9F4",
409
+ "#00BCD4",
410
+ "#009688",
411
+ "#4CAF50",
412
+ "#8BC34A",
413
+ "#CDDC39",
414
+ "#FFEB3B",
415
+ "#FFC107",
416
+ "#FF9800",
417
+ "#FF5722"
418
+ ];
419
+ let hash = 0;
420
+ for (let i = 0; i < name.length; i++) {
421
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
422
+ }
423
+ return colors[Math.abs(hash) % colors.length];
424
+ };
425
+ const avatarColor = getAvatarColor(result.title);
426
+ const playerIcon = /* @__PURE__ */ jsx(
427
+ Avatar,
428
+ {
429
+ src: result.imageUrl,
430
+ alt: result.title,
431
+ sx: {
432
+ width: 40,
433
+ height: 40,
434
+ bgcolor: !result.imageUrl ? avatarColor : void 0
435
+ },
436
+ children: !result.imageUrl && firstLetter
437
+ }
438
+ );
439
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: playerIcon, tags });
440
+ };
441
+ var PlayerResultCard_default = PlayerResultCard;
442
+ var TableResultCard = ({ result, tags, onClick }) => {
443
+ const capacity = result.capacity || 1;
444
+ const numPlayers = result.numPlayers || 0;
445
+ const occupancy = numPlayers / capacity * 100;
446
+ return /* @__PURE__ */ jsx(BaseSearchResultCard, { result, tags, onClick, icon: /* @__PURE__ */ jsx(CasinoIcon, { color: "primary" }), children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
447
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 0.5 }, children: [
448
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
449
+ "Players: ",
450
+ numPlayers,
451
+ " / ",
452
+ capacity
453
+ ] }),
454
+ result.dungeonMaster ? /* @__PURE__ */ jsx(Chip, { label: "DM Present", size: "small", color: "success", variant: "outlined" }) : /* @__PURE__ */ jsx(Chip, { label: "No DM", size: "small", color: "warning", variant: "outlined" })
455
+ ] }),
456
+ /* @__PURE__ */ jsx(LinearProgress, { variant: "determinate", value: occupancy, sx: { height: 8, borderRadius: 4 } })
457
+ ] }) });
458
+ };
459
+ var TableResultCard_default = TableResultCard;
460
+ var EventResultCard = ({
461
+ result,
462
+ onClick,
463
+ tags
464
+ }) => {
465
+ const formatDate = (dateString) => {
466
+ const options = {
467
+ weekday: "long",
468
+ year: "numeric",
469
+ month: "long",
470
+ day: "numeric"
471
+ };
472
+ try {
473
+ const date = new Date(dateString);
474
+ return date.toLocaleDateString("en-US", options);
475
+ } catch {
476
+ return dateString;
477
+ }
478
+ };
479
+ const formattedDate = result.date ? formatDate(result.date) : "Date TBD";
480
+ const location = result.location || "Location TBD";
481
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, icon: /* @__PURE__ */ jsx(EventIcon, { color: "primary" }), tags, children: /* @__PURE__ */ jsxs(Box, { sx: { mb: 1 }, children: [
482
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 0.5 }, children: [
483
+ /* @__PURE__ */ jsx(CalendarTodayIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
484
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: formattedDate })
485
+ ] }),
486
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", mb: 1 }, children: [
487
+ /* @__PURE__ */ jsx(LocationOnIcon, { sx: { mr: 1, fontSize: "small", color: "text.secondary" } }),
488
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: location })
489
+ ] })
490
+ ] }) });
491
+ };
492
+ var EventResultCard_default = EventResultCard;
493
+ var ResultsContainer = ({
494
+ results,
495
+ onResultClick,
496
+ tags
497
+ }) => {
498
+ if (results.length === 0 || !results.map) {
499
+ return /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 4 }, children: "No results found. Try adjusting your filters." });
500
+ }
501
+ const onPlayerClick = (id) => {
502
+ onResultClick == null ? void 0 : onResultClick(id, "player");
503
+ };
504
+ const onTableClick = (id) => {
505
+ onResultClick == null ? void 0 : onResultClick(id, "table");
506
+ };
507
+ const onEventClick = (id) => {
508
+ onResultClick == null ? void 0 : onResultClick(id, "event");
509
+ };
510
+ return /* @__PURE__ */ jsx(Box2, { sx: { display: "flex", flexDirection: "column", gap: 2 }, children: results.map((result) => {
511
+ switch (result.type) {
512
+ case "player":
513
+ return /* @__PURE__ */ jsx(
514
+ PlayerResultCard_default,
515
+ {
516
+ result,
517
+ onClick: onPlayerClick,
518
+ tags
519
+ },
520
+ result.id
521
+ );
522
+ case "table":
523
+ return /* @__PURE__ */ jsx(
524
+ TableResultCard_default,
525
+ {
526
+ result,
527
+ onClick: onTableClick,
528
+ tags
529
+ },
530
+ result.id
531
+ );
532
+ case "event":
533
+ return /* @__PURE__ */ jsx(
534
+ EventResultCard_default,
535
+ {
536
+ result,
537
+ onClick: onEventClick,
538
+ tags
539
+ },
540
+ result.id
541
+ );
542
+ default:
543
+ console.error(`Unknown result type: ${result.type}`);
544
+ return null;
545
+ }
546
+ }) });
547
+ };
548
+ var ResultsContainer_default = ResultsContainer;
549
+ var ScrollableResultsList = ({
550
+ results,
551
+ tags,
552
+ maxHeight = 400,
553
+ onResultClick,
554
+ emptyText
555
+ }) => {
556
+ const hasResults = Array.isArray(results) && results.length > 0;
557
+ return /* @__PURE__ */ jsx(Box2, { sx: { maxHeight, overflowY: "auto", pr: 1 }, children: hasResults ? /* @__PURE__ */ jsx(ResultsContainer_default, { results, onResultClick, tags }) : /* @__PURE__ */ jsx(Box2, { sx: { textAlign: "center", py: 2 }, children: emptyText || "No results to display." }) });
558
+ };
559
+ var ScrollableResultsList_default = ScrollableResultsList;
560
+ var PlayersScrollableList = ({
561
+ results,
562
+ tags,
563
+ maxHeight,
564
+ onResultClick
565
+ }) => {
566
+ const players = (results || []).filter((r) => (r == null ? void 0 : r.type) === "player");
567
+ const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
568
+ return /* @__PURE__ */ jsx(
569
+ ScrollableResultsList_default,
570
+ {
571
+ results: players,
572
+ tags,
573
+ maxHeight,
574
+ onResultClick: (id, type) => {
575
+ if (type === "player") handleClick(id);
576
+ }
577
+ }
578
+ );
579
+ };
580
+ var PlayersScrollableList_default = PlayersScrollableList;
581
+ var SearchResultCard = ({
582
+ result,
583
+ onClick,
584
+ tags
585
+ }) => {
586
+ return /* @__PURE__ */ jsx(BaseSearchResultCard_default, { result, onClick, tags });
587
+ };
588
+ var SearchResultCard_default = SearchResultCard;
589
+ function SearchPageLayout({
590
+ results,
591
+ title = "Search Results",
592
+ onTypeChange,
593
+ onTagChange,
594
+ onSubmit,
595
+ onResultClick,
596
+ validTags,
597
+ allTags
598
+ }) {
599
+ "use client";
600
+ const theme = useTheme();
601
+ const isMobile = useMediaQuery(theme.breakpoints.down("md"));
602
+ return /* @__PURE__ */ jsxs(Box2, { sx: { padding: 2 }, children: [
603
+ /* @__PURE__ */ jsx(Card2, { sx: { marginBottom: 2 }, children: /* @__PURE__ */ jsx(
604
+ CardHeader,
605
+ {
606
+ title,
607
+ style: {
608
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
609
+ color: "#FFFFFF",
610
+ fontSize: "1.5rem",
611
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
612
+ }
613
+ }
614
+ ) }),
615
+ /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
616
+ /* @__PURE__ */ jsx(Grid, { size: { xs: 12, md: 3 }, children: /* @__PURE__ */ jsxs(Card2, { sx: { marginBottom: isMobile ? 2 : 0 }, children: [
617
+ /* @__PURE__ */ jsx(
618
+ CardHeader,
619
+ {
620
+ title: "Filters",
621
+ style: {
622
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
623
+ color: "#FFFFFF",
624
+ fontSize: "1.5rem",
625
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
626
+ }
627
+ }
628
+ ),
629
+ /* @__PURE__ */ jsx(CardContent2, { children: /* @__PURE__ */ jsx(
630
+ FiltersContainer_default,
631
+ {
632
+ onTypeChange,
633
+ onTagChange,
634
+ onSubmit,
635
+ tags: validTags
636
+ }
637
+ ) })
638
+ ] }) }),
639
+ /* @__PURE__ */ jsx(Grid, { size: { xs: 12, md: 9 }, children: /* @__PURE__ */ jsxs(Card2, { children: [
640
+ /* @__PURE__ */ jsx(
641
+ CardHeader,
642
+ {
643
+ title: "Results",
644
+ style: {
645
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.8), rgba(25, 118, 210, 1))",
646
+ color: "#FFFFFF",
647
+ fontSize: "1.5rem",
648
+ textShadow: "0px 3px 6px rgba(0, 0, 0, 0.5)"
649
+ }
650
+ }
651
+ ),
652
+ /* @__PURE__ */ jsx(CardContent2, { children: /* @__PURE__ */ jsx(
653
+ ResultsContainer_default,
654
+ {
655
+ results,
656
+ onResultClick,
657
+ tags: allTags
658
+ }
659
+ ) })
660
+ ] }) })
661
+ ] })
662
+ ] });
663
+ }
664
+ var TablesScrollableList = ({
665
+ results,
666
+ tags,
667
+ maxHeight,
668
+ onResultClick,
669
+ sortBy = "availability"
670
+ }) => {
671
+ const tables = (results || []).filter((r) => (r == null ? void 0 : r.type) === "table");
672
+ const getAvailableSlots = (r) => {
673
+ const capacity = typeof r.capacity === "number" ? r.capacity : 0;
674
+ const playersCount = typeof r.numPlayers === "number" ? r.numPlayers : 0;
675
+ return Math.max(capacity - playersCount, 0);
676
+ };
677
+ const sortedTables = sortBy === "availability" ? [...tables].sort((a, b) => getAvailableSlots(b) - getAvailableSlots(a)) : tables;
678
+ const handleClick = (id) => onResultClick == null ? void 0 : onResultClick(id);
679
+ return /* @__PURE__ */ jsx(
680
+ ScrollableResultsList_default,
681
+ {
682
+ results: sortedTables,
683
+ tags,
684
+ maxHeight,
685
+ onResultClick: (id, type) => {
686
+ if (type === "table") handleClick(id);
687
+ }
688
+ }
689
+ );
690
+ };
691
+ var TablesScrollableList_default = TablesScrollableList;
692
+
693
+ export { BaseSearchResultCard_default as BaseSearchResultCard, EventResultCard_default as EventResultCard, FiltersContainer_default as FiltersContainer, PlayerResultCard_default as PlayerResultCard, PlayersScrollableList_default as PlayersScrollableList, ResultsContainer_default as ResultsContainer, ScrollableResultsList_default as ScrollableResultsList, SearchPageLayout, SearchResultCard_default as SearchResultCard, SortOptions_default as SortOptions, TableResultCard_default as TableResultCard, TablesScrollableList_default as TablesScrollableList, TagsFilter_default as TagsFilter, TypeFilter_default as TypeFilter };
694
+ //# sourceMappingURL=index.mjs.map
695
+ //# sourceMappingURL=index.mjs.map