@getmicdrop/svelte-components 5.3.15 → 5.4.0

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