@getmicdrop/svelte-components 5.5.0 → 5.5.4

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 (214) 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/Layout/Grid.svelte +4 -4
  10. package/dist/components/Layout/Section.svelte +80 -80
  11. package/dist/components/Layout/Sidebar.svelte +108 -108
  12. package/dist/components/Layout/Stack.svelte +6 -6
  13. package/dist/constants/validation.js +91 -91
  14. package/dist/constants/validation.spec.js +64 -64
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +226 -226
  17. package/dist/patterns/data/DataGrid.svelte +45 -45
  18. package/dist/patterns/data/DataList.svelte +24 -24
  19. package/dist/patterns/data/DataTable.svelte +36 -36
  20. package/dist/patterns/forms/FormActions.spec.js +88 -88
  21. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  22. package/dist/patterns/forms/FormActions.svelte +46 -46
  23. package/dist/patterns/forms/FormGrid.svelte +33 -33
  24. package/dist/patterns/forms/FormSection.svelte +32 -32
  25. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  26. package/dist/patterns/forms/FormValidationSummary.svelte +33 -33
  27. package/dist/patterns/layout/Sidebar.svelte +39 -39
  28. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  29. package/dist/patterns/navigation/BottomNav.svelte +20 -20
  30. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  31. package/dist/patterns/navigation/Header.svelte +193 -193
  32. package/dist/patterns/page/PageHeader.svelte +18 -18
  33. package/dist/patterns/page/PageLayout.svelte +40 -40
  34. package/dist/patterns/page/PageLoader.spec.js +54 -54
  35. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  36. package/dist/patterns/page/PageLoader.svelte +24 -24
  37. package/dist/patterns/page/SectionHeader.svelte +29 -29
  38. package/dist/presets/badges.js +112 -112
  39. package/dist/presets/buttons.js +76 -76
  40. package/dist/presets/index.js +9 -9
  41. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  42. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  43. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  44. package/dist/primitives/Alert/Alert.spec.js +170 -170
  45. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  46. package/dist/primitives/Alert/Alert.svelte +27 -27
  47. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  48. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  49. package/dist/primitives/Badges/Badge.spec.js +103 -103
  50. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  51. package/dist/primitives/Badges/Badge.svelte +79 -79
  52. package/dist/primitives/BottomSheet/BottomSheet.spec.js +127 -127
  53. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  54. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  55. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +120 -120
  56. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  57. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  58. package/dist/primitives/Button/Button.spec.js +211 -211
  59. package/dist/primitives/Button/Button.stories.svelte +76 -76
  60. package/dist/primitives/Button/Button.svelte +270 -270
  61. package/dist/primitives/Button/ButtonSaveDemo.spec.js +48 -48
  62. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  63. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  64. package/dist/primitives/Card.spec.js +49 -49
  65. package/dist/primitives/Card.stories.svelte +22 -22
  66. package/dist/primitives/Card.svelte +28 -28
  67. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  68. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  69. package/dist/primitives/DarkModeToggle.spec.js +357 -357
  70. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  71. package/dist/primitives/DarkModeToggle.svelte +136 -136
  72. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  73. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  74. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  75. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  76. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  77. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  78. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  79. package/dist/primitives/Icons/Availability.svelte +14 -14
  80. package/dist/primitives/Icons/Back.svelte +14 -14
  81. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  82. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  83. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  84. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  85. package/dist/primitives/Icons/Copy.svelte +15 -15
  86. package/dist/primitives/Icons/Cross.svelte +5 -5
  87. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  88. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  89. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  90. package/dist/primitives/Icons/Home.svelte +15 -15
  91. package/dist/primitives/Icons/Icon.spec.js +169 -169
  92. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  93. package/dist/primitives/Icons/Icon.svelte +52 -52
  94. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  95. package/dist/primitives/Icons/Info.svelte +7 -7
  96. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  97. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  98. package/dist/primitives/Icons/Message.svelte +15 -15
  99. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  100. package/dist/primitives/Icons/More.svelte +21 -21
  101. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  102. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  103. package/dist/primitives/Icons/Notification.svelte +14 -14
  104. package/dist/primitives/Icons/Payment.svelte +14 -14
  105. package/dist/primitives/Icons/Profile.svelte +21 -21
  106. package/dist/primitives/Icons/Reload.svelte +29 -29
  107. package/dist/primitives/Icons/Shows.svelte +21 -21
  108. package/dist/primitives/Icons/Signout.svelte +21 -21
  109. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  110. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  111. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  112. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  113. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  114. package/dist/primitives/Input/Input.spec.js +573 -573
  115. package/dist/primitives/Input/Input.stories.svelte +139 -139
  116. package/dist/primitives/Input/Input.svelte +392 -392
  117. package/dist/primitives/Input/Select.spec.js +218 -218
  118. package/dist/primitives/Input/Select.stories.svelte +112 -112
  119. package/dist/primitives/Input/Select.svelte +128 -128
  120. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  121. package/dist/primitives/Input/Textarea.svelte +35 -35
  122. package/dist/primitives/Label/Label.svelte +37 -37
  123. package/dist/primitives/Modal/Modal.spec.js +95 -95
  124. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  125. package/dist/primitives/Modal/Modal.svelte +158 -158
  126. package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
  127. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  128. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  129. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  130. package/dist/primitives/Radio/Radio.svelte +67 -67
  131. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  132. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  133. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  134. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  135. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  136. package/dist/primitives/Spinner/Spinner.spec.js +75 -75
  137. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  138. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  139. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  140. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  141. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  142. package/dist/primitives/Toggle.spec.js +127 -127
  143. package/dist/primitives/Toggle.stories.svelte +92 -92
  144. package/dist/primitives/Toggle.svelte +71 -71
  145. package/dist/primitives/Typography/Typography.svelte +53 -53
  146. package/dist/primitives/ValidationError.spec.js +103 -103
  147. package/dist/primitives/ValidationError.stories.svelte +69 -69
  148. package/dist/primitives/ValidationError.svelte +29 -29
  149. package/dist/recipes/CropImage/CropImage.spec.js +216 -216
  150. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  151. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  152. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  153. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  154. package/dist/recipes/SuperLogin/SuperLogin.svelte +7 -6
  155. package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
  156. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  157. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  158. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  159. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  160. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  161. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +129 -129
  162. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  163. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  164. package/dist/recipes/fields/FormField.svelte +58 -58
  165. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  166. package/dist/recipes/fields/SelectField.svelte +80 -80
  167. package/dist/recipes/fields/TextareaField.svelte +97 -97
  168. package/dist/recipes/fields/ToggleField.svelte +60 -60
  169. package/dist/recipes/fields/index.js +7 -7
  170. package/dist/recipes/inputs/MultiSelect.spec.js +257 -257
  171. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  172. package/dist/recipes/inputs/MultiSelect.svelte +249 -249
  173. package/dist/recipes/inputs/OTPInput.spec.js +238 -238
  174. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  175. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  176. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  177. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
  178. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +43 -43
  179. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
  180. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  181. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
  182. package/dist/recipes/inputs/Search.svelte +37 -37
  183. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  184. package/dist/recipes/modals/AlertModal.svelte +130 -130
  185. package/dist/recipes/modals/ConfirmationModal.spec.js +191 -191
  186. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  187. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  188. package/dist/recipes/modals/InputModal.svelte +182 -182
  189. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  190. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  191. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  192. package/dist/recipes/modals/StatusModal.svelte +206 -206
  193. package/dist/services/EventService.js +75 -75
  194. package/dist/services/EventService.spec.js +217 -217
  195. package/dist/services/ShowService.spec.js +342 -342
  196. package/dist/stores/auth.js +36 -36
  197. package/dist/stores/auth.spec.js +139 -139
  198. package/dist/stores/toaster.js +13 -13
  199. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  200. package/dist/stories/ButtonAuditReview.svelte +427 -427
  201. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  202. package/dist/stories/PatternsGallery.svelte +206 -206
  203. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  204. package/dist/stories/PrimitivesGallery.svelte +725 -725
  205. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  206. package/dist/stories/RecipesGallery.svelte +271 -271
  207. package/dist/stories/button-audit-manifest.json +11186 -11186
  208. package/dist/tailwind/preset.cjs +82 -82
  209. package/dist/tokens/tokens.css +87 -87
  210. package/dist/utils/transitions.d.ts +24 -0
  211. package/dist/utils/transitions.d.ts.map +1 -0
  212. package/dist/utils/transitions.js +62 -0
  213. package/dist/utils/utils.js +354 -354
  214. package/package.json +283 -283
@@ -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