@getmicdrop/svelte-components 5.6.1 → 5.7.1

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 (255) 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 +57 -0
  10. package/dist/components/Heading.svelte.d.ts +12 -0
  11. package/dist/components/Heading.svelte.d.ts.map +1 -0
  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/Layout/index.d.ts +11 -0
  27. package/dist/components/Layout/index.d.ts.map +1 -0
  28. package/dist/components/Layout/index.js +14 -0
  29. package/dist/components/Text.svelte +40 -0
  30. package/dist/components/Text.svelte.d.ts +11 -0
  31. package/dist/components/Text.svelte.d.ts.map +1 -0
  32. package/dist/components/index.d.ts +4 -0
  33. package/dist/components/index.d.ts.map +1 -0
  34. package/dist/components/index.js +12 -0
  35. package/dist/constants/validation.js +91 -91
  36. package/dist/constants/validation.spec.js +64 -64
  37. package/dist/datetime/__tests__/format.test.js +1 -1
  38. package/dist/datetime/__tests__/parse.test.js +1 -1
  39. package/dist/datetime/__tests__/timezone.test.js +1 -1
  40. package/dist/datetime/parse.js +1 -1
  41. package/dist/forms/createFormStore.svelte.js +0 -1
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.js +10 -1
  44. package/dist/patterns/data/DataGrid.svelte +45 -45
  45. package/dist/patterns/data/DataList.svelte +24 -24
  46. package/dist/patterns/data/DataTable.svelte +36 -36
  47. package/dist/patterns/forms/FormActions.spec.js +95 -95
  48. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  49. package/dist/patterns/forms/FormActions.svelte +46 -46
  50. package/dist/patterns/forms/FormGrid.svelte +33 -33
  51. package/dist/patterns/forms/FormSection.svelte +32 -32
  52. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  53. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  54. package/dist/patterns/layout/Sidebar.svelte +39 -39
  55. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  56. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  57. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  58. package/dist/patterns/navigation/Header.svelte +193 -193
  59. package/dist/patterns/page/PageHeader.svelte +18 -18
  60. package/dist/patterns/page/PageLayout.svelte +40 -40
  61. package/dist/patterns/page/PageLoader.spec.js +57 -57
  62. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  63. package/dist/patterns/page/PageLoader.svelte +24 -24
  64. package/dist/patterns/page/SectionHeader.svelte +29 -29
  65. package/dist/presets/badges.js +112 -112
  66. package/dist/presets/buttons.js +76 -76
  67. package/dist/presets/index.js +9 -9
  68. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  69. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  70. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  71. package/dist/primitives/Alert/Alert.spec.js +173 -173
  72. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  73. package/dist/primitives/Alert/Alert.svelte +27 -27
  74. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  75. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  76. package/dist/primitives/Badges/Badge.spec.js +144 -144
  77. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  78. package/dist/primitives/Badges/Badge.svelte +79 -79
  79. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  80. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  81. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  82. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  83. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  84. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  85. package/dist/primitives/Button/Button.spec.js +223 -223
  86. package/dist/primitives/Button/Button.stories.svelte +76 -76
  87. package/dist/primitives/Button/Button.svelte +270 -270
  88. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  89. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  90. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  91. package/dist/primitives/Card.spec.js +49 -49
  92. package/dist/primitives/Card.stories.svelte +22 -22
  93. package/dist/primitives/Card.svelte +28 -28
  94. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  95. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  96. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  97. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  98. package/dist/primitives/DarkModeToggle.svelte +136 -136
  99. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  100. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  101. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  102. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  103. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  104. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  105. package/dist/primitives/Helper/Helper.svelte +33 -33
  106. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  107. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  108. package/dist/primitives/Icons/Availability.svelte +14 -14
  109. package/dist/primitives/Icons/Back.svelte +14 -14
  110. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  111. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  112. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  113. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  114. package/dist/primitives/Icons/Copy.svelte +15 -15
  115. package/dist/primitives/Icons/Cross.svelte +5 -5
  116. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  117. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  118. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  119. package/dist/primitives/Icons/Home.svelte +15 -15
  120. package/dist/primitives/Icons/Icon.spec.js +169 -169
  121. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  122. package/dist/primitives/Icons/Icon.svelte +52 -52
  123. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  124. package/dist/primitives/Icons/Info.svelte +7 -7
  125. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  126. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  127. package/dist/primitives/Icons/Message.svelte +15 -15
  128. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  129. package/dist/primitives/Icons/More.svelte +21 -21
  130. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  131. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  132. package/dist/primitives/Icons/Notification.svelte +14 -14
  133. package/dist/primitives/Icons/Payment.svelte +14 -14
  134. package/dist/primitives/Icons/Profile.svelte +21 -21
  135. package/dist/primitives/Icons/Reload.svelte +29 -29
  136. package/dist/primitives/Icons/Shows.svelte +21 -21
  137. package/dist/primitives/Icons/Signout.svelte +21 -21
  138. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  139. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  140. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  141. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  142. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  143. package/dist/primitives/Input/Input.spec.js +573 -573
  144. package/dist/primitives/Input/Input.stories.svelte +139 -139
  145. package/dist/primitives/Input/Select.spec.js +212 -212
  146. package/dist/primitives/Input/Select.stories.svelte +112 -112
  147. package/dist/primitives/Input/Select.svelte +128 -128
  148. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  149. package/dist/primitives/Input/Textarea.svelte +35 -35
  150. package/dist/primitives/Label/Label.svelte +37 -37
  151. package/dist/primitives/Modal/Modal.spec.js +99 -99
  152. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  153. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  154. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  155. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  156. package/dist/primitives/Radio/Radio.svelte +67 -67
  157. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  158. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  159. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  160. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  161. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  162. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  163. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  164. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  165. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  166. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  167. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  168. package/dist/primitives/Toggle.spec.js +143 -143
  169. package/dist/primitives/Toggle.stories.svelte +92 -92
  170. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  171. package/dist/primitives/Typography/Typography.svelte +53 -53
  172. package/dist/primitives/ValidationError.spec.js +103 -103
  173. package/dist/primitives/ValidationError.stories.svelte +69 -69
  174. package/dist/primitives/ValidationError.svelte +29 -29
  175. package/dist/primitives/index.js +91 -91
  176. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  177. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  178. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  179. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  180. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  181. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  182. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  183. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  184. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  185. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  186. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  187. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  188. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  189. package/dist/recipes/fields/FormField.svelte +58 -58
  190. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  191. package/dist/recipes/fields/SelectField.svelte +80 -80
  192. package/dist/recipes/fields/TextareaField.svelte +97 -97
  193. package/dist/recipes/fields/ToggleField.svelte +60 -60
  194. package/dist/recipes/fields/index.js +7 -7
  195. package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
  196. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  197. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  198. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  199. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  200. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  201. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
  202. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  203. package/dist/recipes/inputs/Search.svelte +37 -37
  204. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  205. package/dist/recipes/modals/AlertModal.svelte +130 -130
  206. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  207. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  208. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  209. package/dist/recipes/modals/InputModal.svelte +182 -182
  210. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  211. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  212. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  213. package/dist/recipes/modals/StatusModal.svelte +206 -206
  214. package/dist/services/EventService.js +75 -75
  215. package/dist/services/EventService.spec.js +217 -217
  216. package/dist/services/ShowService.spec.js +345 -345
  217. package/dist/stores/auth.js +36 -44
  218. package/dist/stores/auth.spec.js +139 -139
  219. package/dist/stores/formDataStore.d.ts.map +1 -1
  220. package/dist/stores/formDataStore.js +0 -8
  221. package/dist/stores/formSave.d.ts.map +1 -1
  222. package/dist/stores/formSave.js +0 -8
  223. package/dist/stores/navigation.d.ts.map +1 -1
  224. package/dist/stores/navigation.js +0 -8
  225. package/dist/stores/toaster.js +13 -13
  226. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  227. package/dist/stories/ButtonAuditReview.svelte +427 -427
  228. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  229. package/dist/stories/PatternsGallery.svelte +206 -206
  230. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  231. package/dist/stories/PrimitivesGallery.svelte +725 -725
  232. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  233. package/dist/stories/RecipesGallery.svelte +271 -271
  234. package/dist/stories/button-audit-manifest.json +11186 -11186
  235. package/dist/tailwind/preset.cjs +82 -82
  236. package/dist/telemetry.js +405 -405
  237. package/dist/telemetry.spec.js +1169 -1169
  238. package/dist/tokens/tokens.css +87 -87
  239. package/dist/tokens/typography-base.css +163 -163
  240. package/dist/utils/apiConfig.spec.js +219 -219
  241. package/dist/utils/transitions.js +62 -62
  242. package/dist/utils/utils.js +354 -354
  243. package/package.json +1 -1
  244. package/dist/stores/auth.svelte.d.ts +0 -39
  245. package/dist/stores/auth.svelte.d.ts.map +0 -1
  246. package/dist/stores/auth.svelte.js +0 -60
  247. package/dist/stores/formDataStore.svelte.d.ts +0 -47
  248. package/dist/stores/formDataStore.svelte.d.ts.map +0 -1
  249. package/dist/stores/formDataStore.svelte.js +0 -84
  250. package/dist/stores/formSave.svelte.d.ts +0 -33
  251. package/dist/stores/formSave.svelte.d.ts.map +0 -1
  252. package/dist/stores/formSave.svelte.js +0 -113
  253. package/dist/stores/navigation.svelte.d.ts +0 -35
  254. package/dist/stores/navigation.svelte.d.ts.map +0 -1
  255. package/dist/stores/navigation.svelte.js +0 -69
@@ -1,75 +1,75 @@
1
- <script>
2
- import { typography } from '../../tokens/typography';
3
-
4
- let {
5
- events = [],
6
- view = "row",
7
- placeholderImage = null,
8
- onEventClick,
9
- } = $props();
10
-
11
- let isSmallScreen = $state(false);
12
-
13
- const DEFAULT_PLACEHOLDER = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect fill='%23e5e7eb' width='100' height='100'/%3E%3Cpath d='M50 25c-8.3 0-15 6.7-15 15v5c0 8.3 6.7 15 15 15s15-6.7 15-15v-5c0-8.3-6.7-15-15-15zm0 45c-13.8 0-25 5.6-25 12.5V90h50v-7.5c0-6.9-11.2-12.5-25-12.5z' fill='%239ca3af'/%3E%3C/svg%3E";
14
-
15
- let placeholder = $derived(placeholderImage || DEFAULT_PLACEHOLDER);
16
-
17
- let options = {
18
- weekday: "short",
19
- month: "short",
20
- day: "numeric",
21
- };
22
-
23
- function handleResize() {
24
- isSmallScreen = window.innerWidth < 768;
25
- }
26
-
27
- $effect(() => {
28
- isSmallScreen = window.innerWidth < 768;
29
- window.addEventListener("resize", handleResize);
30
- return () => {
31
- if (typeof window !== 'undefined') {
32
- window.removeEventListener("resize", handleResize);
33
- }
34
- };
35
- });
36
-
37
- function handleEventClick(event) {
38
- onEventClick?.(event);
39
- }
40
-
41
- function handleKeydown(e, event) {
42
- if (e.key === 'Enter' || e.key === ' ') {
43
- e.preventDefault();
44
- handleEventClick(event);
45
- }
46
- }
47
-
48
- function getStatusBadgeClass(status) {
49
- switch (status) {
50
- case 'Sold out':
51
- return 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400';
52
- case 'Selling fast':
53
- return 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400';
54
- case 'Almost sold out':
55
- return 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400';
56
- default:
57
- return 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300';
58
- }
59
- }
60
-
61
- function shouldShowBadge(status) {
62
- return status === 'Sold out' || status === 'Selling fast' || status === 'Almost sold out';
63
- }
64
-
65
- function formatEventDate(dateStr) {
66
- if (!dateStr) return '';
67
- const [year, month, day] = dateStr.split('-').map(Number);
68
- const date = new Date(year, month - 1, day);
69
- return date.toLocaleDateString("en-US", options);
70
- }
71
- </script>
72
-
1
+ <script>
2
+ import { typography } from '../../tokens/typography';
3
+
4
+ let {
5
+ events = [],
6
+ view = "row",
7
+ placeholderImage = null,
8
+ onEventClick,
9
+ } = $props();
10
+
11
+ let isSmallScreen = $state(false);
12
+
13
+ const DEFAULT_PLACEHOLDER = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect fill='%23e5e7eb' width='100' height='100'/%3E%3Cpath d='M50 25c-8.3 0-15 6.7-15 15v5c0 8.3 6.7 15 15 15s15-6.7 15-15v-5c0-8.3-6.7-15-15-15zm0 45c-13.8 0-25 5.6-25 12.5V90h50v-7.5c0-6.9-11.2-12.5-25-12.5z' fill='%239ca3af'/%3E%3C/svg%3E";
14
+
15
+ let placeholder = $derived(placeholderImage || DEFAULT_PLACEHOLDER);
16
+
17
+ let options = {
18
+ weekday: "short",
19
+ month: "short",
20
+ day: "numeric",
21
+ };
22
+
23
+ function handleResize() {
24
+ isSmallScreen = window.innerWidth < 768;
25
+ }
26
+
27
+ $effect(() => {
28
+ isSmallScreen = window.innerWidth < 768;
29
+ window.addEventListener("resize", handleResize);
30
+ return () => {
31
+ if (typeof window !== 'undefined') {
32
+ window.removeEventListener("resize", handleResize);
33
+ }
34
+ };
35
+ });
36
+
37
+ function handleEventClick(event) {
38
+ onEventClick?.(event);
39
+ }
40
+
41
+ function handleKeydown(e, event) {
42
+ if (e.key === 'Enter' || e.key === ' ') {
43
+ e.preventDefault();
44
+ handleEventClick(event);
45
+ }
46
+ }
47
+
48
+ function getStatusBadgeClass(status) {
49
+ switch (status) {
50
+ case 'Sold out':
51
+ return 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400';
52
+ case 'Selling fast':
53
+ return 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400';
54
+ case 'Almost sold out':
55
+ return 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400';
56
+ default:
57
+ return 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300';
58
+ }
59
+ }
60
+
61
+ function shouldShowBadge(status) {
62
+ return status === 'Sold out' || status === 'Selling fast' || status === 'Almost sold out';
63
+ }
64
+
65
+ function formatEventDate(dateStr) {
66
+ if (!dateStr) return '';
67
+ const [year, month, day] = dateStr.split('-').map(Number);
68
+ const date = new Date(year, month - 1, day);
69
+ return date.toLocaleDateString("en-US", options);
70
+ }
71
+ </script>
72
+
73
73
  {#each events as event}
74
74
  <!-- svelte-ignore a11y_no_noninteractive_element_to_interactive_role -->
75
75
  <article
@@ -82,65 +82,65 @@
82
82
  role="button"
83
83
  aria-label={`${event.name}, ${event.status || 'On Sale'}, ${formatEventDate(event.date)}. Press Enter to view details.`}
84
84
  >
85
- <div
86
- class="bg-gray-100 dark:bg-gray-700 flex items-center justify-center overflow-hidden {view === 'col'
87
- ? 'w-full aspect-[4/3] rounded-t-lg'
88
- : 'w-24 h-24 sm:w-40 sm:h-32 rounded-lg flex-shrink-0'}"
89
- >
90
- <img
91
- src={event.image || placeholder}
92
- alt={event.name}
93
- class="object-contain w-full h-full"
94
- loading="lazy"
95
- />
96
- </div>
97
-
98
- <div
99
- class="flex flex-col {view === 'col' ? 'p-3 gap-1' : 'gap-1.5 sm:gap-2 justify-center'}"
100
- >
101
- {#if view === "col" && event.status && shouldShowBadge(event.status)}
102
- <span
103
- class="inline-flex items-center w-fit px-2 py-0.5 text-xs font-semibold rounded absolute top-2 left-2 {getStatusBadgeClass(event.status)}"
104
- >
105
- {event.status}
106
- </span>
107
- {/if}
108
-
109
- {#if view === "row" && event.status && shouldShowBadge(event.status)}
110
- <span
111
- class="inline-flex items-center w-fit px-2 py-0.5 text-xs font-semibold rounded {getStatusBadgeClass(event.status)}"
112
- >
113
- {event.status}
114
- </span>
115
- {/if}
116
-
117
- <h4 class="{typography.h4} leading-tight line-clamp-2">
118
- {event.name}
119
- </h4>
120
-
121
- <div
122
- class="{typography.textMuted} {view === 'col' ? 'text-xs' : 'text-xs sm:text-sm'}"
123
- >
124
- <span class="font-medium">
125
- {formatEventDate(event.date)}
126
- {#if event.timeline}
127
- <span class="text-gray-500 dark:text-gray-500">&#8226;</span>
128
- {event.timeline.split("-")[0].trim()}
129
- {/if}
130
- </span>
131
- </div>
132
-
133
- {#if view === "row" && event.description}
134
- <p class="{typography.xsMuted} text-xs sm:text-sm line-clamp-2 mt-1">
135
- {event.description}
136
- </p>
137
- {/if}
138
-
139
- {#if event.doorsTimeline && view === "row"}
140
- <div class="{typography.xsMuted} text-xs">
141
- {event.doorsTimeline}
142
- </div>
143
- {/if}
144
- </div>
145
- </article>
146
- {/each}
85
+ <div
86
+ class="bg-gray-100 dark:bg-gray-700 flex items-center justify-center overflow-hidden {view === 'col'
87
+ ? 'w-full aspect-[4/3] rounded-t-lg'
88
+ : 'w-24 h-24 sm:w-40 sm:h-32 rounded-lg flex-shrink-0'}"
89
+ >
90
+ <img
91
+ src={event.image || placeholder}
92
+ alt={event.name}
93
+ class="object-contain w-full h-full"
94
+ loading="lazy"
95
+ />
96
+ </div>
97
+
98
+ <div
99
+ class="flex flex-col {view === 'col' ? 'p-3 gap-1' : 'gap-1.5 sm:gap-2 justify-center'}"
100
+ >
101
+ {#if view === "col" && event.status && shouldShowBadge(event.status)}
102
+ <span
103
+ class="inline-flex items-center w-fit px-2 py-0.5 text-xs font-semibold rounded absolute top-2 left-2 {getStatusBadgeClass(event.status)}"
104
+ >
105
+ {event.status}
106
+ </span>
107
+ {/if}
108
+
109
+ {#if view === "row" && event.status && shouldShowBadge(event.status)}
110
+ <span
111
+ class="inline-flex items-center w-fit px-2 py-0.5 text-xs font-semibold rounded {getStatusBadgeClass(event.status)}"
112
+ >
113
+ {event.status}
114
+ </span>
115
+ {/if}
116
+
117
+ <h4 class="{typography.h4} leading-tight line-clamp-2">
118
+ {event.name}
119
+ </h4>
120
+
121
+ <div
122
+ class="{typography.textMuted} {view === 'col' ? 'text-xs' : 'text-xs sm:text-sm'}"
123
+ >
124
+ <span class="font-medium">
125
+ {formatEventDate(event.date)}
126
+ {#if event.timeline}
127
+ <span class="text-gray-500 dark:text-gray-500">&#8226;</span>
128
+ {event.timeline.split("-")[0].trim()}
129
+ {/if}
130
+ </span>
131
+ </div>
132
+
133
+ {#if view === "row" && event.description}
134
+ <p class="{typography.xsMuted} text-xs sm:text-sm line-clamp-2 mt-1">
135
+ {event.description}
136
+ </p>
137
+ {/if}
138
+
139
+ {#if event.doorsTimeline && view === "row"}
140
+ <div class="{typography.xsMuted} text-xs">
141
+ {event.doorsTimeline}
142
+ </div>
143
+ {/if}
144
+ </div>
145
+ </article>
146
+ {/each}
@@ -1,157 +1,157 @@
1
- <script>
2
- import { ShareOutline, CheckOutline } from '../../primitives/Icons';
3
- import ShowTimeCard from '../ShowTimeCard/ShowTimeCard.svelte';
4
- import { typography } from '../../tokens/typography';
5
-
6
- let {
7
- event = {},
8
- showtimes = [],
9
- showTitle = true,
10
- formatDateTime = (dateStr) => {
11
- if (!dateStr) return '';
12
- const date = new Date(dateStr);
13
- if (isNaN(date.getTime())) return dateStr;
14
- return date.toLocaleDateString('en-US', {
15
- weekday: 'long',
16
- year: 'numeric',
17
- month: 'long',
18
- day: 'numeric',
19
- hour: 'numeric',
20
- minute: '2-digit'
21
- });
22
- },
23
- formatTimeline = (timeStr) => {
24
- if (!timeStr) return '';
25
- const date = new Date(timeStr);
26
- if (!isNaN(date.getTime())) {
27
- return date.toLocaleTimeString('en-US', {
28
- hour: 'numeric',
29
- minute: '2-digit',
30
- hour12: true
31
- });
32
- }
33
- return timeStr;
34
- },
35
- onShowtimeSelect,
36
- } = $props();
37
-
38
- let selectedDate = $state(null);
39
- let shareSuccess = $state(false);
40
-
41
- function handleSelect(e) {
42
- selectedDate = e.date;
43
- onShowtimeSelect?.({ date: e.date, ...e });
44
- }
45
-
46
- async function handleShare() {
47
- const shareData = {
48
- title: event.name,
49
- text: `Check out ${event.name} at ${event.venue?.name || 'this venue'}!`,
50
- url: typeof window !== 'undefined' ? window.location.href : ''
51
- };
52
-
53
- try {
54
- if (typeof navigator !== 'undefined' && navigator.share && navigator.canShare && navigator.canShare(shareData)) {
55
- await navigator.share(shareData);
56
- } else if (typeof navigator !== 'undefined' && navigator.clipboard) {
57
- await navigator.clipboard.writeText(shareData.url);
58
- shareSuccess = true;
59
- setTimeout(() => {
60
- shareSuccess = false;
61
- }, 2000);
62
- }
63
- } catch (err) {
64
- if (err.name !== 'AbortError' && typeof navigator !== 'undefined' && navigator.clipboard) {
65
- try {
66
- await navigator.clipboard.writeText(shareData.url);
67
- shareSuccess = true;
68
- setTimeout(() => {
69
- shareSuccess = false;
70
- }, 2000);
71
- } catch {
72
- console.error('Share failed:', err);
73
- }
74
- }
75
- }
76
- }
77
- </script>
78
-
79
- <div class="h-fit rounded-lg sm:px-5 py-4 md:border md:border-gray-200 md:dark:border-gray-700 bg-white dark:bg-gray-800">
80
- {#if showTitle}
81
- <div class="flex justify-between items-start gap-2 mb-4">
82
- <h2 class="{typography.h2} flex-1 text-left">
83
- {event.name || ''}
84
- </h2>
85
- <button
86
- class="flex-shrink-0 p-2 rounded-lg transition-colors hover:bg-gray-100 dark:hover:bg-gray-700 relative"
87
- aria-label="Share event"
88
- onclick={handleShare}
89
- >
90
- {#if shareSuccess}
91
- <CheckOutline class="w-5 h-5 text-green-600 dark:text-green-500" />
92
- {:else}
93
- <ShareOutline class="w-5 h-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 cursor-pointer" />
94
- {/if}
95
- </button>
96
- </div>
97
- {/if}
98
-
99
- <div class="space-y-1">
100
- <p class="{typography.label}">{formatDateTime(event.startDateTime)}</p>
101
- {#if event.displayStartTime && event.doorsOpenTime}
102
- <p class="{typography.smMuted}">Doors open {formatTimeline(event.doorsOpenTime)}</p>
103
- {/if}
104
- {#if event.displayEndTime && event.endDateTime}
105
- <p class="{typography.smMuted}">Ends {formatTimeline(event.endDateTime)}</p>
106
- {/if}
107
- </div>
108
-
109
- {#if showtimes && showtimes.length > 1}
110
- <div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
111
- <p class="{typography.smMuted} mb-2">More showtimes</p>
112
- <div class="flex flex-wrap gap-2">
113
- {#each showtimes as showtime}
114
- <div class="w-24">
115
- <ShowTimeCard
116
- day={showtime.day}
117
- date={showtime.date}
118
- time={showtime.time}
119
- isSelected={selectedDate === showtime.date}
120
- onselect={handleSelect}
121
- />
122
- </div>
123
- {/each}
124
- </div>
125
- </div>
126
- {/if}
127
-
128
- {#if event.venue}
129
- <div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
130
- <a
131
- href="https://www.google.com/maps/search/?api=1&query={encodeURIComponent(event.venue.googleLocationNameCache || event.venue.address || event.venue.name)}"
132
- target="_blank"
133
- rel="noopener noreferrer"
134
- class="group block"
135
- >
136
- <p class="{typography.label} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500">
137
- {event.venue.name}
138
- </p>
139
- <p class="{typography.smMuted} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500">
140
- {event.venue.address || ''}
141
- </p>
142
- </a>
143
-
144
- {#if event.hasAgeRestriction || event.ageRequirement || event.minimumAge}
145
- <p class="{typography.smMuted} mt-2">
146
- {#if event.ageRequirement != null}
147
- {event.ageRequirement <= 1 ? 'All ages' : `${event.ageRequirement}+`}
148
- {:else if event.minimumAge != null}
149
- {event.minimumAge <= 1 ? 'All ages' : `${event.minimumAge}+`}
150
- {:else if event.ageRestriction != null}
151
- {event.ageRestriction <= 1 ? 'All ages' : `${event.ageRestriction}+`}
152
- {/if}
153
- </p>
154
- {/if}
155
- </div>
156
- {/if}
157
- </div>
1
+ <script>
2
+ import { ShareOutline, CheckOutline } from '../../primitives/Icons';
3
+ import ShowTimeCard from '../ShowTimeCard/ShowTimeCard.svelte';
4
+ import { typography } from '../../tokens/typography';
5
+
6
+ let {
7
+ event = {},
8
+ showtimes = [],
9
+ showTitle = true,
10
+ formatDateTime = (dateStr) => {
11
+ if (!dateStr) return '';
12
+ const date = new Date(dateStr);
13
+ if (isNaN(date.getTime())) return dateStr;
14
+ return date.toLocaleDateString('en-US', {
15
+ weekday: 'long',
16
+ year: 'numeric',
17
+ month: 'long',
18
+ day: 'numeric',
19
+ hour: 'numeric',
20
+ minute: '2-digit'
21
+ });
22
+ },
23
+ formatTimeline = (timeStr) => {
24
+ if (!timeStr) return '';
25
+ const date = new Date(timeStr);
26
+ if (!isNaN(date.getTime())) {
27
+ return date.toLocaleTimeString('en-US', {
28
+ hour: 'numeric',
29
+ minute: '2-digit',
30
+ hour12: true
31
+ });
32
+ }
33
+ return timeStr;
34
+ },
35
+ onShowtimeSelect,
36
+ } = $props();
37
+
38
+ let selectedDate = $state(null);
39
+ let shareSuccess = $state(false);
40
+
41
+ function handleSelect(e) {
42
+ selectedDate = e.date;
43
+ onShowtimeSelect?.({ date: e.date, ...e });
44
+ }
45
+
46
+ async function handleShare() {
47
+ const shareData = {
48
+ title: event.name,
49
+ text: `Check out ${event.name} at ${event.venue?.name || 'this venue'}!`,
50
+ url: typeof window !== 'undefined' ? window.location.href : ''
51
+ };
52
+
53
+ try {
54
+ if (typeof navigator !== 'undefined' && navigator.share && navigator.canShare && navigator.canShare(shareData)) {
55
+ await navigator.share(shareData);
56
+ } else if (typeof navigator !== 'undefined' && navigator.clipboard) {
57
+ await navigator.clipboard.writeText(shareData.url);
58
+ shareSuccess = true;
59
+ setTimeout(() => {
60
+ shareSuccess = false;
61
+ }, 2000);
62
+ }
63
+ } catch (err) {
64
+ if (err.name !== 'AbortError' && typeof navigator !== 'undefined' && navigator.clipboard) {
65
+ try {
66
+ await navigator.clipboard.writeText(shareData.url);
67
+ shareSuccess = true;
68
+ setTimeout(() => {
69
+ shareSuccess = false;
70
+ }, 2000);
71
+ } catch {
72
+ console.error('Share failed:', err);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ </script>
78
+
79
+ <div class="h-fit rounded-lg sm:px-5 py-4 md:border md:border-gray-200 md:dark:border-gray-700 bg-white dark:bg-gray-800">
80
+ {#if showTitle}
81
+ <div class="flex justify-between items-start gap-2 mb-4">
82
+ <h2 class="{typography.h2} flex-1 text-left">
83
+ {event.name || ''}
84
+ </h2>
85
+ <button
86
+ class="flex-shrink-0 p-2 rounded-lg transition-colors hover:bg-gray-100 dark:hover:bg-gray-700 relative"
87
+ aria-label="Share event"
88
+ onclick={handleShare}
89
+ >
90
+ {#if shareSuccess}
91
+ <CheckOutline class="w-5 h-5 text-green-600 dark:text-green-500" />
92
+ {:else}
93
+ <ShareOutline class="w-5 h-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 cursor-pointer" />
94
+ {/if}
95
+ </button>
96
+ </div>
97
+ {/if}
98
+
99
+ <div class="space-y-1">
100
+ <p class="{typography.label}">{formatDateTime(event.startDateTime)}</p>
101
+ {#if event.displayStartTime && event.doorsOpenTime}
102
+ <p class="{typography.smMuted}">Doors open {formatTimeline(event.doorsOpenTime)}</p>
103
+ {/if}
104
+ {#if event.displayEndTime && event.endDateTime}
105
+ <p class="{typography.smMuted}">Ends {formatTimeline(event.endDateTime)}</p>
106
+ {/if}
107
+ </div>
108
+
109
+ {#if showtimes && showtimes.length > 1}
110
+ <div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
111
+ <p class="{typography.smMuted} mb-2">More showtimes</p>
112
+ <div class="flex flex-wrap gap-2">
113
+ {#each showtimes as showtime}
114
+ <div class="w-24">
115
+ <ShowTimeCard
116
+ day={showtime.day}
117
+ date={showtime.date}
118
+ time={showtime.time}
119
+ isSelected={selectedDate === showtime.date}
120
+ onselect={handleSelect}
121
+ />
122
+ </div>
123
+ {/each}
124
+ </div>
125
+ </div>
126
+ {/if}
127
+
128
+ {#if event.venue}
129
+ <div class="mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
130
+ <a
131
+ href="https://www.google.com/maps/search/?api=1&query={encodeURIComponent(event.venue.googleLocationNameCache || event.venue.address || event.venue.name)}"
132
+ target="_blank"
133
+ rel="noopener noreferrer"
134
+ class="group block"
135
+ >
136
+ <p class="{typography.label} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500">
137
+ {event.venue.name}
138
+ </p>
139
+ <p class="{typography.smMuted} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500">
140
+ {event.venue.address || ''}
141
+ </p>
142
+ </a>
143
+
144
+ {#if event.hasAgeRestriction || event.ageRequirement || event.minimumAge}
145
+ <p class="{typography.smMuted} mt-2">
146
+ {#if event.ageRequirement != null}
147
+ {event.ageRequirement <= 1 ? 'All ages' : `${event.ageRequirement}+`}
148
+ {:else if event.minimumAge != null}
149
+ {event.minimumAge <= 1 ? 'All ages' : `${event.minimumAge}+`}
150
+ {:else if event.ageRestriction != null}
151
+ {event.ageRestriction <= 1 ? 'All ages' : `${event.ageRestriction}+`}
152
+ {/if}
153
+ </p>
154
+ {/if}
155
+ </div>
156
+ {/if}
157
+ </div>