@getmicdrop/svelte-components 5.8.1 → 5.8.2

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 (228) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
  3. package/dist/calendar/FAQs/FAQs.svelte +75 -75
  4. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
  5. package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
  6. package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
  7. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  8. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  9. package/dist/components/Heading.svelte +60 -58
  10. package/dist/components/Heading.svelte.d.ts +1 -0
  11. package/dist/components/Heading.svelte.d.ts.map +1 -1
  12. package/dist/components/Layout/AppShell.svelte +104 -104
  13. package/dist/components/Layout/ContentSection.svelte +80 -80
  14. package/dist/components/Layout/Grid.svelte +4 -4
  15. package/dist/components/Layout/Heading.svelte +81 -81
  16. package/dist/components/Layout/PageContainer.svelte +69 -69
  17. package/dist/components/Layout/Responsive.svelte +75 -75
  18. package/dist/components/Layout/Section.svelte +80 -80
  19. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  20. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  21. package/dist/components/Layout/Sidebar.svelte +108 -108
  22. package/dist/components/Layout/Stack.spec.js +1 -1
  23. package/dist/components/Layout/Stack.svelte +6 -6
  24. package/dist/components/Layout/Text.svelte +87 -87
  25. package/dist/components/Layout/TwoColumn.svelte +108 -108
  26. package/dist/components/Text.svelte +53 -53
  27. package/dist/constants/validation.js +91 -91
  28. package/dist/constants/validation.spec.js +64 -64
  29. package/dist/datetime/__tests__/format.test.js +1 -1
  30. package/dist/datetime/__tests__/parse.test.js +1 -1
  31. package/dist/datetime/__tests__/timezone.test.js +1 -1
  32. package/dist/datetime/parse.js +1 -1
  33. package/dist/forms/createFormStore.svelte.js +1 -0
  34. package/dist/index.js +50 -50
  35. package/dist/patterns/data/DataGrid.svelte +45 -45
  36. package/dist/patterns/data/DataList.svelte +24 -24
  37. package/dist/patterns/data/DataTable.svelte +36 -36
  38. package/dist/patterns/forms/FormActions.spec.js +95 -95
  39. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  40. package/dist/patterns/forms/FormActions.svelte +46 -46
  41. package/dist/patterns/forms/FormGrid.svelte +33 -33
  42. package/dist/patterns/forms/FormSection.svelte +32 -32
  43. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  44. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  45. package/dist/patterns/layout/Sidebar.svelte +39 -39
  46. package/dist/patterns/layout/index.js +29 -29
  47. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  48. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  49. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  50. package/dist/patterns/navigation/Header.svelte +193 -193
  51. package/dist/patterns/page/PageHeader.svelte +18 -18
  52. package/dist/patterns/page/PageLayout.svelte +40 -40
  53. package/dist/patterns/page/PageLoader.spec.js +57 -57
  54. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  55. package/dist/patterns/page/PageLoader.svelte +24 -24
  56. package/dist/patterns/page/SectionHeader.svelte +29 -29
  57. package/dist/presets/badges.js +112 -112
  58. package/dist/presets/buttons.js +76 -76
  59. package/dist/presets/index.js +9 -9
  60. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  61. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  62. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  63. package/dist/primitives/Alert/Alert.spec.js +173 -173
  64. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  65. package/dist/primitives/Alert/Alert.svelte +27 -27
  66. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  67. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  68. package/dist/primitives/Badges/Badge.spec.js +144 -144
  69. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  70. package/dist/primitives/Badges/Badge.svelte +79 -79
  71. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  72. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  73. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  74. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  75. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  76. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  77. package/dist/primitives/Button/Button.spec.js +223 -223
  78. package/dist/primitives/Button/Button.stories.svelte +76 -76
  79. package/dist/primitives/Button/Button.svelte +270 -270
  80. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  81. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  82. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  83. package/dist/primitives/Card.spec.js +49 -49
  84. package/dist/primitives/Card.stories.svelte +22 -22
  85. package/dist/primitives/Card.svelte +28 -28
  86. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  87. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  88. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  89. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  90. package/dist/primitives/DarkModeToggle.svelte +136 -136
  91. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  92. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  93. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  94. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  95. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  96. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  97. package/dist/primitives/Helper/Helper.svelte +33 -33
  98. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  99. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  100. package/dist/primitives/Icons/Availability.svelte +14 -14
  101. package/dist/primitives/Icons/Back.svelte +14 -14
  102. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  103. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  104. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  105. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  106. package/dist/primitives/Icons/Copy.svelte +15 -15
  107. package/dist/primitives/Icons/Cross.svelte +5 -5
  108. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  109. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  110. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  111. package/dist/primitives/Icons/Home.svelte +15 -15
  112. package/dist/primitives/Icons/Icon.spec.js +169 -169
  113. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  114. package/dist/primitives/Icons/Icon.svelte +52 -52
  115. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  116. package/dist/primitives/Icons/Info.svelte +7 -7
  117. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  118. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  119. package/dist/primitives/Icons/Message.svelte +15 -15
  120. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  121. package/dist/primitives/Icons/More.svelte +21 -21
  122. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  123. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  124. package/dist/primitives/Icons/Notification.svelte +14 -14
  125. package/dist/primitives/Icons/Payment.svelte +14 -14
  126. package/dist/primitives/Icons/Profile.svelte +21 -21
  127. package/dist/primitives/Icons/Reload.svelte +29 -29
  128. package/dist/primitives/Icons/Shows.svelte +21 -21
  129. package/dist/primitives/Icons/Signout.svelte +21 -21
  130. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  131. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  132. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  133. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  134. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  135. package/dist/primitives/Input/Input.spec.js +573 -573
  136. package/dist/primitives/Input/Input.stories.svelte +139 -139
  137. package/dist/primitives/Input/Select.spec.js +212 -212
  138. package/dist/primitives/Input/Select.stories.svelte +112 -112
  139. package/dist/primitives/Input/Select.svelte +128 -128
  140. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  141. package/dist/primitives/Input/Textarea.svelte +35 -35
  142. package/dist/primitives/Label/Label.svelte +37 -37
  143. package/dist/primitives/Modal/Modal.spec.js +99 -99
  144. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  145. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  146. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  147. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  148. package/dist/primitives/Radio/Radio.svelte +67 -67
  149. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  150. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  151. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  152. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  153. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  154. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  155. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  156. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  157. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  158. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  159. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  160. package/dist/primitives/Toggle.spec.js +143 -143
  161. package/dist/primitives/Toggle.stories.svelte +92 -92
  162. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  163. package/dist/primitives/Typography/Typography.svelte +53 -53
  164. package/dist/primitives/ValidationError.spec.js +103 -103
  165. package/dist/primitives/ValidationError.stories.svelte +69 -69
  166. package/dist/primitives/ValidationError.svelte +29 -29
  167. package/dist/primitives/index.js +91 -91
  168. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  169. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  170. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  171. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  172. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  173. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  174. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  175. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  176. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  177. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  178. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  179. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  180. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  181. package/dist/recipes/fields/FormField.svelte +58 -58
  182. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  183. package/dist/recipes/fields/SelectField.svelte +80 -80
  184. package/dist/recipes/fields/TextareaField.svelte +97 -97
  185. package/dist/recipes/fields/ToggleField.svelte +60 -60
  186. package/dist/recipes/fields/index.js +7 -7
  187. package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
  188. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  189. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  190. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  191. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  192. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  193. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
  194. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  195. package/dist/recipes/inputs/Search.svelte +37 -37
  196. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  197. package/dist/recipes/modals/AlertModal.svelte +130 -130
  198. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  199. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  200. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  201. package/dist/recipes/modals/InputModal.svelte +182 -182
  202. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  203. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  204. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  205. package/dist/recipes/modals/StatusModal.svelte +206 -206
  206. package/dist/services/EventService.js +75 -75
  207. package/dist/services/EventService.spec.js +217 -217
  208. package/dist/services/ShowService.spec.js +345 -345
  209. package/dist/stores/toaster.js +13 -13
  210. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  211. package/dist/stories/ButtonAuditReview.svelte +427 -427
  212. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  213. package/dist/stories/PatternsGallery.svelte +206 -206
  214. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  215. package/dist/stories/PrimitivesGallery.svelte +725 -725
  216. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  217. package/dist/stories/RecipesGallery.svelte +271 -271
  218. package/dist/stories/button-audit-manifest.json +11186 -11186
  219. package/dist/tailwind/preset.cjs +82 -82
  220. package/dist/telemetry.js +405 -405
  221. package/dist/telemetry.spec.js +1169 -1169
  222. package/dist/tokens/tokens.css +87 -87
  223. package/dist/tokens/typography-base.css +163 -163
  224. package/dist/tokens/utilities.css +353 -0
  225. package/dist/utils/apiConfig.spec.js +219 -219
  226. package/dist/utils/transitions.js +62 -62
  227. package/dist/utils/utils.js +354 -354
  228. package/package.json +296 -295
@@ -1,357 +1,357 @@
1
- import { twMerge } from "tailwind-merge";
2
- import clsx from "clsx";
3
- import EventIcon from "../assets/svg/role/event.svg";
4
- import BookingIcon from "../assets/svg/role/booking.svg";
5
- import EmailIcon from "../assets/svg/role/emails.svg";
6
- import VenueIcon from "../assets/svg/role/venue.svg";
7
- import PayoutIcon from "../assets/svg/role/payout.svg";
8
- import MarketingIcon from "../assets/svg/role/marketing.svg";
9
- import OrdersIcon from "../assets/svg/role/orders.svg";
10
- import OrganisationIcon from "../assets/svg/role/organisation.svg";
11
- import ReportingIcon from "../assets/svg/role/reporting.svg";
12
- import microphonePlaceholder from "../assets/images/microphone.png";
13
-
14
- export function classNames(...classes) {
15
- return classes.filter(Boolean).join(" ");
16
- }
17
-
18
- export function truncateTitle(title, maxLength) {
19
- if (title.length > maxLength) {
20
- return title.slice(0, maxLength) + "...";
21
- }
22
- return title;
23
- }
24
-
25
- export function convertToCustomDateFormat(isoString) {
26
- const date = new Date(isoString);
27
-
28
- const year = date.getUTCFullYear();
29
- const month = date.getUTCMonth();
30
- const day = date.getUTCDate();
31
-
32
- const customDate = new Date(year, month, day);
33
-
34
- return customDate;
35
- }
36
-
37
- export function cn(...inputs) {
38
- return twMerge(clsx(inputs));
39
- }
40
-
41
- export function getDays(params) {
42
- if (params === "weeks") {
43
- return [
44
- { value: "monday", label: "Monday" },
45
- { value: "tuesday", label: "Tuesday" },
46
- { value: "wednesday", label: "Wednesday" },
47
- { value: "thursday", label: "Thursday" },
48
- { value: "friday", label: "Friday" },
49
- ];
50
- } else {
51
- return Array.from({ length: 31 }, (_, i) => {
52
- const day = i + 1;
53
- const suffix =
54
- day % 10 === 1 && day !== 11
55
- ? "st"
56
- : day % 10 === 2 && day !== 12
57
- ? "nd"
58
- : day % 10 === 3 && day !== 13
59
- ? "rd"
60
- : "th";
61
- return {
62
- value: day.toString(),
63
- label: day + suffix,
64
- };
65
- });
66
- }
67
- }
68
-
69
- // Function to get days number options based on selected time unit
70
- export function getDaysNumberOptions(timeUnit) {
71
- if (timeUnit === "months") {
72
- return Array.from({ length: 12 }, (_, i) => ({
73
- value: (i + 1).toString(),
74
- label: (i + 1).toString(),
75
- }));
76
- } else if (timeUnit === "weeks") {
77
- return Array.from({ length: 10 }, (_, i) => ({
78
- value: (i + 1).toString(),
79
- label: (i + 1).toString(),
80
- }));
81
- } else {
82
- return Array.from({ length: 31 }, (_, i) => ({
83
- value: (i + 1).toString(),
84
- label: (i + 1).toString(),
85
- }));
86
- }
87
- }
88
-
89
- export const ROLE_PERMISSION_LIST = [
90
- {
91
- icon: EventIcon,
92
- title: "Event creation",
93
- description:
94
- "Allow users to enter event info, create tickets & customize order forms",
95
- checkbox: [
96
- "Create Events",
97
- "Edit Event Details",
98
- "Manage event status",
99
- "Manage tickets",
100
- "Manage Collections",
101
- ],
102
- },
103
- {
104
- icon: BookingIcon,
105
- title: "Booking",
106
- description:
107
- "Allow users to manage performers, their invitations and statuses",
108
- checkbox: [
109
- "Access the roster page and view performer profiles",
110
- "Edit performer profiles",
111
- "Send booking invitations",
112
- "Manually confirm/decline performers to spots",
113
- "Send avails requests",
114
- ],
115
- },
116
- {
117
- icon: VenueIcon,
118
- title: "Venue creation",
119
- description: "Allow users to create new venues",
120
- checkbox: ["Add/edit/delete venues"],
121
- },
122
- {
123
- icon: MarketingIcon,
124
- title: "Marketing",
125
- description:
126
- "Sell more tickets by creating campaigns, tracking engagements, etc.",
127
- checkbox: [
128
- "Access social media posts",
129
- "Manage tracking links",
130
- "Manage promo codes",
131
- ],
132
- },
133
- {
134
- icon: OrdersIcon,
135
- title: "Orders & attendees",
136
- description:
137
- "Allow users to view, update & refund orders, manage attendee guest or waitlists & release tickets",
138
- checkbox: [
139
- "Add attendees",
140
- "Manage orders, refunds, transfers and attendees",
141
- "View list of attendees",
142
- "Check in attendees",
143
- "Resend confirmation emails",
144
- "Override ticket restrictions",
145
- "Sell tickets at the door",
146
- "Revoke and reissue barcodes",
147
- ],
148
- },
149
- {
150
- icon: OrganisationIcon,
151
- title: "Organization",
152
- description:
153
- "Keep your users organized with assigned permissions per user, enable access to APIs & extensions",
154
- checkbox: [
155
- "Manage organization members & permissions",
156
- "Edit organization infomation",
157
- ],
158
- },
159
- {
160
- icon: EmailIcon,
161
- title: "Contacts",
162
- description:
163
- "Keep our users in the loop, select which emails you would like them to receive",
164
- checkbox: ["Email attendees", "Email/SMS performers"],
165
- },
166
- {
167
- icon: ReportingIcon,
168
- title: "Reporting",
169
- description:
170
- "Allow users to access, filter & export data across your organization",
171
- checkbox: ["Access reports pages"],
172
- },
173
- {
174
- icon: PayoutIcon,
175
- title: "Payouts & billing",
176
- description:
177
- "Users can configure payout methods, manage event payment options & track financials with reporting",
178
- checkbox: ["Manage financial accounts (Stripe)"],
179
- },
180
- ];
181
-
182
- /**
183
- * Parse a location string into street address and city/state/zip components
184
- * @param {string} locationString - Full location string (e.g., "3400 Warner Blvd, Burbank, CA 91505")
185
- * @returns {{street: string, cityStateZip: string}} Parsed location object
186
- */
187
- export function parseLocation(locationString) {
188
- if (!locationString) return { street: '', cityStateZip: '' };
189
-
190
- // Split by comma to separate components
191
- const parts = locationString.split(',').map(part => part.trim());
192
-
193
- if (parts.length >= 3) {
194
- // Format: "3400 Warner Blvd, Burbank, CA 91505"
195
- const street = parts[0];
196
- const cityStateZip = parts.slice(1).join(', ');
197
- return { street, cityStateZip };
198
- } else if (parts.length === 2) {
199
- // Format: "Street, City State Zip"
200
- return { street: parts[0], cityStateZip: parts[1] };
201
- } else {
202
- // Single part or unexpected format
203
- return { street: locationString, cityStateZip: '' };
204
- }
205
- }
206
-
207
- /**
208
- * Set authentication cookies with proper domain and security settings
209
- * @param {string} token - Authentication token
210
- * @param {Object} userDetails - User details object
211
- */
212
- export function setAuthCookies(token, userDetails, rememberMe = true) {
213
- const isProd = window.location.hostname.includes("get-micdrop.com");
214
- const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
215
- const secureAttr = window.location.protocol === "https:" ? "secure;" : "";
216
- const maxAge = rememberMe ? "max-age=2592000;" : ""; // 30 days or session
217
-
218
- document.cookie = `performer_token=${token}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
219
- document.cookie = `userDetails=${encodeURIComponent(
220
- JSON.stringify(userDetails),
221
- )}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
222
- }
223
-
224
- /**
225
- * Clear authentication cookies
226
- */
227
- export function clearAuthCookies() {
228
- const isProd = window.location.hostname.includes("get-micdrop.com");
229
- const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
230
-
231
- document.cookie = `userDetails=; path=/; max-age=0; ${domainAttr}`;
232
- document.cookie = `performer_token=; path=/; max-age=0; ${domainAttr}`;
233
- }
234
-
235
- // Export microphone placeholder for universal event image fallback
236
- export { microphonePlaceholder };
237
-
238
- // ============================================
239
- // COOKIE UTILITIES
240
- // ============================================
241
-
242
- /**
243
- * Parse all cookies into an object
244
- * @returns {Record<string, string>} Cookie key-value pairs
245
- */
246
- export function parseCookies() {
247
- if (typeof document === "undefined") return {};
248
- return document.cookie.split("; ").reduce((acc, cookie) => {
249
- if (!cookie) return acc;
250
- const [name, ...valueParts] = cookie.split("=");
251
- acc[name] = decodeURIComponent(valueParts.join("="));
252
- return acc;
253
- }, {});
254
- }
255
-
256
- /**
257
- * Get a specific cookie value
258
- * @param {string} name - Cookie name
259
- * @returns {string|null} Cookie value or null
260
- */
261
- export function getCookie(name) {
262
- const cookies = parseCookies();
263
- return cookies[name] || null;
264
- }
265
-
266
- /**
267
- * Set a cookie with options
268
- * @param {string} name - Cookie name
269
- * @param {string} value - Cookie value
270
- * @param {Object} options - Cookie options
271
- */
272
- export function setCookie(name, value, options = {}) {
273
- const isProd = typeof window !== "undefined" && window.location.hostname.includes("get-micdrop.com");
274
- const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
275
- const secureAttr = typeof window !== "undefined" && window.location.protocol === "https:" ? "secure;" : "";
276
- const maxAge = options.maxAge ? `max-age=${options.maxAge};` : "";
277
- const path = options.path || "/";
278
-
279
- document.cookie = `${name}=${encodeURIComponent(value)}; path=${path}; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
280
- }
281
-
282
- /**
283
- * Get the performer token from cookies
284
- * @returns {string|null} Token or null
285
- */
286
- export function getPerformerToken() {
287
- return getCookie("performer_token");
288
- }
289
-
290
- /**
291
- * Get user details from cookies
292
- * @returns {Object|null} User details or null
293
- */
294
- export function getUserDetails() {
295
- const details = getCookie("userDetails");
296
- if (!details) return null;
297
- try {
298
- return JSON.parse(details);
299
- } catch {
300
- return null;
301
- }
302
- }
303
-
304
- /**
305
- * Get suppressed alerts from cookies
306
- * @returns {string[]} Array of suppressed alert IDs
307
- */
308
- export function getSuppressedAlerts() {
309
- const alerts = getCookie("suppressedAlerts");
310
- if (!alerts) return [];
311
- try {
312
- return JSON.parse(alerts);
313
- } catch {
314
- return [];
315
- }
316
- }
317
-
318
- /**
319
- * Save suppressed alerts to cookies
320
- * @param {string[]} alertIds - Array of alert IDs to suppress
321
- */
322
- export function saveSuppressedAlerts(alertIds) {
323
- setCookie("suppressedAlerts", JSON.stringify(alertIds), { maxAge: 31536000 }); // 1 year
324
- }
325
-
326
- // ============================================
327
- // DATA FETCHING UTILITIES
328
- // ============================================
329
-
330
- /**
331
- * Fetch data from an API endpoint with error handling
332
- * @param {string} endpoint - API endpoint
333
- * @param {Object} options - Fetch options
334
- * @returns {Promise<{data: any, error: string|null}>}
335
- */
336
- export async function fetchData(endpoint, options = {}) {
337
- try {
338
- const res = await fetch(endpoint, {
339
- headers: { "Content-Type": "application/json", ...options.headers },
340
- ...options,
341
- });
342
-
343
- if (!res.ok) {
344
- const errorText = await res.text().catch(() => "Unknown error");
345
- throw new Error(errorText || `Request failed with status ${res.status}`);
346
- }
347
-
348
- const data = await res.json();
349
- return { data, error: null };
350
- } catch (err) {
351
- return { data: null, error: err.message };
352
- }
353
- }
354
-
1
+ import { twMerge } from "tailwind-merge";
2
+ import clsx from "clsx";
3
+ import EventIcon from "../assets/svg/role/event.svg";
4
+ import BookingIcon from "../assets/svg/role/booking.svg";
5
+ import EmailIcon from "../assets/svg/role/emails.svg";
6
+ import VenueIcon from "../assets/svg/role/venue.svg";
7
+ import PayoutIcon from "../assets/svg/role/payout.svg";
8
+ import MarketingIcon from "../assets/svg/role/marketing.svg";
9
+ import OrdersIcon from "../assets/svg/role/orders.svg";
10
+ import OrganisationIcon from "../assets/svg/role/organisation.svg";
11
+ import ReportingIcon from "../assets/svg/role/reporting.svg";
12
+ import microphonePlaceholder from "../assets/images/microphone.png";
13
+
14
+ export function classNames(...classes) {
15
+ return classes.filter(Boolean).join(" ");
16
+ }
17
+
18
+ export function truncateTitle(title, maxLength) {
19
+ if (title.length > maxLength) {
20
+ return title.slice(0, maxLength) + "...";
21
+ }
22
+ return title;
23
+ }
24
+
25
+ export function convertToCustomDateFormat(isoString) {
26
+ const date = new Date(isoString);
27
+
28
+ const year = date.getUTCFullYear();
29
+ const month = date.getUTCMonth();
30
+ const day = date.getUTCDate();
31
+
32
+ const customDate = new Date(year, month, day);
33
+
34
+ return customDate;
35
+ }
36
+
37
+ export function cn(...inputs) {
38
+ return twMerge(clsx(inputs));
39
+ }
40
+
41
+ export function getDays(params) {
42
+ if (params === "weeks") {
43
+ return [
44
+ { value: "monday", label: "Monday" },
45
+ { value: "tuesday", label: "Tuesday" },
46
+ { value: "wednesday", label: "Wednesday" },
47
+ { value: "thursday", label: "Thursday" },
48
+ { value: "friday", label: "Friday" },
49
+ ];
50
+ } else {
51
+ return Array.from({ length: 31 }, (_, i) => {
52
+ const day = i + 1;
53
+ const suffix =
54
+ day % 10 === 1 && day !== 11
55
+ ? "st"
56
+ : day % 10 === 2 && day !== 12
57
+ ? "nd"
58
+ : day % 10 === 3 && day !== 13
59
+ ? "rd"
60
+ : "th";
61
+ return {
62
+ value: day.toString(),
63
+ label: day + suffix,
64
+ };
65
+ });
66
+ }
67
+ }
68
+
69
+ // Function to get days number options based on selected time unit
70
+ export function getDaysNumberOptions(timeUnit) {
71
+ if (timeUnit === "months") {
72
+ return Array.from({ length: 12 }, (_, i) => ({
73
+ value: (i + 1).toString(),
74
+ label: (i + 1).toString(),
75
+ }));
76
+ } else if (timeUnit === "weeks") {
77
+ return Array.from({ length: 10 }, (_, i) => ({
78
+ value: (i + 1).toString(),
79
+ label: (i + 1).toString(),
80
+ }));
81
+ } else {
82
+ return Array.from({ length: 31 }, (_, i) => ({
83
+ value: (i + 1).toString(),
84
+ label: (i + 1).toString(),
85
+ }));
86
+ }
87
+ }
88
+
89
+ export const ROLE_PERMISSION_LIST = [
90
+ {
91
+ icon: EventIcon,
92
+ title: "Event creation",
93
+ description:
94
+ "Allow users to enter event info, create tickets & customize order forms",
95
+ checkbox: [
96
+ "Create Events",
97
+ "Edit Event Details",
98
+ "Manage event status",
99
+ "Manage tickets",
100
+ "Manage Collections",
101
+ ],
102
+ },
103
+ {
104
+ icon: BookingIcon,
105
+ title: "Booking",
106
+ description:
107
+ "Allow users to manage performers, their invitations and statuses",
108
+ checkbox: [
109
+ "Access the roster page and view performer profiles",
110
+ "Edit performer profiles",
111
+ "Send booking invitations",
112
+ "Manually confirm/decline performers to spots",
113
+ "Send avails requests",
114
+ ],
115
+ },
116
+ {
117
+ icon: VenueIcon,
118
+ title: "Venue creation",
119
+ description: "Allow users to create new venues",
120
+ checkbox: ["Add/edit/delete venues"],
121
+ },
122
+ {
123
+ icon: MarketingIcon,
124
+ title: "Marketing",
125
+ description:
126
+ "Sell more tickets by creating campaigns, tracking engagements, etc.",
127
+ checkbox: [
128
+ "Access social media posts",
129
+ "Manage tracking links",
130
+ "Manage promo codes",
131
+ ],
132
+ },
133
+ {
134
+ icon: OrdersIcon,
135
+ title: "Orders & attendees",
136
+ description:
137
+ "Allow users to view, update & refund orders, manage attendee guest or waitlists & release tickets",
138
+ checkbox: [
139
+ "Add attendees",
140
+ "Manage orders, refunds, transfers and attendees",
141
+ "View list of attendees",
142
+ "Check in attendees",
143
+ "Resend confirmation emails",
144
+ "Override ticket restrictions",
145
+ "Sell tickets at the door",
146
+ "Revoke and reissue barcodes",
147
+ ],
148
+ },
149
+ {
150
+ icon: OrganisationIcon,
151
+ title: "Organization",
152
+ description:
153
+ "Keep your users organized with assigned permissions per user, enable access to APIs & extensions",
154
+ checkbox: [
155
+ "Manage organization members & permissions",
156
+ "Edit organization infomation",
157
+ ],
158
+ },
159
+ {
160
+ icon: EmailIcon,
161
+ title: "Contacts",
162
+ description:
163
+ "Keep our users in the loop, select which emails you would like them to receive",
164
+ checkbox: ["Email attendees", "Email/SMS performers"],
165
+ },
166
+ {
167
+ icon: ReportingIcon,
168
+ title: "Reporting",
169
+ description:
170
+ "Allow users to access, filter & export data across your organization",
171
+ checkbox: ["Access reports pages"],
172
+ },
173
+ {
174
+ icon: PayoutIcon,
175
+ title: "Payouts & billing",
176
+ description:
177
+ "Users can configure payout methods, manage event payment options & track financials with reporting",
178
+ checkbox: ["Manage financial accounts (Stripe)"],
179
+ },
180
+ ];
181
+
182
+ /**
183
+ * Parse a location string into street address and city/state/zip components
184
+ * @param {string} locationString - Full location string (e.g., "3400 Warner Blvd, Burbank, CA 91505")
185
+ * @returns {{street: string, cityStateZip: string}} Parsed location object
186
+ */
187
+ export function parseLocation(locationString) {
188
+ if (!locationString) return { street: '', cityStateZip: '' };
189
+
190
+ // Split by comma to separate components
191
+ const parts = locationString.split(',').map(part => part.trim());
192
+
193
+ if (parts.length >= 3) {
194
+ // Format: "3400 Warner Blvd, Burbank, CA 91505"
195
+ const street = parts[0];
196
+ const cityStateZip = parts.slice(1).join(', ');
197
+ return { street, cityStateZip };
198
+ } else if (parts.length === 2) {
199
+ // Format: "Street, City State Zip"
200
+ return { street: parts[0], cityStateZip: parts[1] };
201
+ } else {
202
+ // Single part or unexpected format
203
+ return { street: locationString, cityStateZip: '' };
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Set authentication cookies with proper domain and security settings
209
+ * @param {string} token - Authentication token
210
+ * @param {Object} userDetails - User details object
211
+ */
212
+ export function setAuthCookies(token, userDetails, rememberMe = true) {
213
+ const isProd = window.location.hostname.includes("get-micdrop.com");
214
+ const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
215
+ const secureAttr = window.location.protocol === "https:" ? "secure;" : "";
216
+ const maxAge = rememberMe ? "max-age=2592000;" : ""; // 30 days or session
217
+
218
+ document.cookie = `performer_token=${token}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
219
+ document.cookie = `userDetails=${encodeURIComponent(
220
+ JSON.stringify(userDetails),
221
+ )}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
222
+ }
223
+
224
+ /**
225
+ * Clear authentication cookies
226
+ */
227
+ export function clearAuthCookies() {
228
+ const isProd = window.location.hostname.includes("get-micdrop.com");
229
+ const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
230
+
231
+ document.cookie = `userDetails=; path=/; max-age=0; ${domainAttr}`;
232
+ document.cookie = `performer_token=; path=/; max-age=0; ${domainAttr}`;
233
+ }
234
+
235
+ // Export microphone placeholder for universal event image fallback
236
+ export { microphonePlaceholder };
237
+
238
+ // ============================================
239
+ // COOKIE UTILITIES
240
+ // ============================================
241
+
242
+ /**
243
+ * Parse all cookies into an object
244
+ * @returns {Record<string, string>} Cookie key-value pairs
245
+ */
246
+ export function parseCookies() {
247
+ if (typeof document === "undefined") return {};
248
+ return document.cookie.split("; ").reduce((acc, cookie) => {
249
+ if (!cookie) return acc;
250
+ const [name, ...valueParts] = cookie.split("=");
251
+ acc[name] = decodeURIComponent(valueParts.join("="));
252
+ return acc;
253
+ }, {});
254
+ }
255
+
256
+ /**
257
+ * Get a specific cookie value
258
+ * @param {string} name - Cookie name
259
+ * @returns {string|null} Cookie value or null
260
+ */
261
+ export function getCookie(name) {
262
+ const cookies = parseCookies();
263
+ return cookies[name] || null;
264
+ }
265
+
266
+ /**
267
+ * Set a cookie with options
268
+ * @param {string} name - Cookie name
269
+ * @param {string} value - Cookie value
270
+ * @param {Object} options - Cookie options
271
+ */
272
+ export function setCookie(name, value, options = {}) {
273
+ const isProd = typeof window !== "undefined" && window.location.hostname.includes("get-micdrop.com");
274
+ const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
275
+ const secureAttr = typeof window !== "undefined" && window.location.protocol === "https:" ? "secure;" : "";
276
+ const maxAge = options.maxAge ? `max-age=${options.maxAge};` : "";
277
+ const path = options.path || "/";
278
+
279
+ document.cookie = `${name}=${encodeURIComponent(value)}; path=${path}; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
280
+ }
281
+
282
+ /**
283
+ * Get the performer token from cookies
284
+ * @returns {string|null} Token or null
285
+ */
286
+ export function getPerformerToken() {
287
+ return getCookie("performer_token");
288
+ }
289
+
290
+ /**
291
+ * Get user details from cookies
292
+ * @returns {Object|null} User details or null
293
+ */
294
+ export function getUserDetails() {
295
+ const details = getCookie("userDetails");
296
+ if (!details) return null;
297
+ try {
298
+ return JSON.parse(details);
299
+ } catch {
300
+ return null;
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Get suppressed alerts from cookies
306
+ * @returns {string[]} Array of suppressed alert IDs
307
+ */
308
+ export function getSuppressedAlerts() {
309
+ const alerts = getCookie("suppressedAlerts");
310
+ if (!alerts) return [];
311
+ try {
312
+ return JSON.parse(alerts);
313
+ } catch {
314
+ return [];
315
+ }
316
+ }
317
+
318
+ /**
319
+ * Save suppressed alerts to cookies
320
+ * @param {string[]} alertIds - Array of alert IDs to suppress
321
+ */
322
+ export function saveSuppressedAlerts(alertIds) {
323
+ setCookie("suppressedAlerts", JSON.stringify(alertIds), { maxAge: 31536000 }); // 1 year
324
+ }
325
+
326
+ // ============================================
327
+ // DATA FETCHING UTILITIES
328
+ // ============================================
329
+
330
+ /**
331
+ * Fetch data from an API endpoint with error handling
332
+ * @param {string} endpoint - API endpoint
333
+ * @param {Object} options - Fetch options
334
+ * @returns {Promise<{data: any, error: string|null}>}
335
+ */
336
+ export async function fetchData(endpoint, options = {}) {
337
+ try {
338
+ const res = await fetch(endpoint, {
339
+ headers: { "Content-Type": "application/json", ...options.headers },
340
+ ...options,
341
+ });
342
+
343
+ if (!res.ok) {
344
+ const errorText = await res.text().catch(() => "Unknown error");
345
+ throw new Error(errorText || `Request failed with status ${res.status}`);
346
+ }
347
+
348
+ const data = await res.json();
349
+ return { data, error: null };
350
+ } catch (err) {
351
+ return { data: null, error: err.message };
352
+ }
353
+ }
354
+
355
355
  /**
356
356
  * Post data to an API endpoint
357
357
  * @param {string} endpoint - API endpoint