@getmicdrop/svelte-components 5.6.1 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) 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 +58 -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 +10 -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 +53 -0
  30. package/dist/components/Text.svelte.d.ts +12 -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/layout/index.d.ts +0 -2
  56. package/dist/patterns/layout/index.js +3 -2
  57. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  58. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  59. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  60. package/dist/patterns/navigation/Header.svelte +193 -193
  61. package/dist/patterns/page/PageHeader.svelte +18 -18
  62. package/dist/patterns/page/PageLayout.svelte +40 -40
  63. package/dist/patterns/page/PageLoader.spec.js +57 -57
  64. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  65. package/dist/patterns/page/PageLoader.svelte +24 -24
  66. package/dist/patterns/page/SectionHeader.svelte +29 -29
  67. package/dist/presets/badges.js +112 -112
  68. package/dist/presets/buttons.js +76 -76
  69. package/dist/presets/index.js +9 -9
  70. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  71. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  72. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  73. package/dist/primitives/Alert/Alert.spec.js +173 -173
  74. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  75. package/dist/primitives/Alert/Alert.svelte +27 -27
  76. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  77. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  78. package/dist/primitives/Badges/Badge.spec.js +144 -144
  79. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  80. package/dist/primitives/Badges/Badge.svelte +79 -79
  81. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  82. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  83. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  84. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  85. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  86. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  87. package/dist/primitives/Button/Button.spec.js +223 -223
  88. package/dist/primitives/Button/Button.stories.svelte +76 -76
  89. package/dist/primitives/Button/Button.svelte +270 -270
  90. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  91. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  92. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  93. package/dist/primitives/Card.spec.js +49 -49
  94. package/dist/primitives/Card.stories.svelte +22 -22
  95. package/dist/primitives/Card.svelte +28 -28
  96. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  97. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  98. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  99. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  100. package/dist/primitives/DarkModeToggle.svelte +136 -136
  101. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  102. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  103. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  104. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  105. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  106. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  107. package/dist/primitives/Helper/Helper.svelte +33 -33
  108. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  109. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  110. package/dist/primitives/Icons/Availability.svelte +14 -14
  111. package/dist/primitives/Icons/Back.svelte +14 -14
  112. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  113. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  114. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  115. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  116. package/dist/primitives/Icons/Copy.svelte +15 -15
  117. package/dist/primitives/Icons/Cross.svelte +5 -5
  118. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  119. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  120. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  121. package/dist/primitives/Icons/Home.svelte +15 -15
  122. package/dist/primitives/Icons/Icon.spec.js +169 -169
  123. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  124. package/dist/primitives/Icons/Icon.svelte +52 -52
  125. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  126. package/dist/primitives/Icons/Info.svelte +7 -7
  127. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  128. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  129. package/dist/primitives/Icons/Message.svelte +15 -15
  130. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  131. package/dist/primitives/Icons/More.svelte +21 -21
  132. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  133. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  134. package/dist/primitives/Icons/Notification.svelte +14 -14
  135. package/dist/primitives/Icons/Payment.svelte +14 -14
  136. package/dist/primitives/Icons/Profile.svelte +21 -21
  137. package/dist/primitives/Icons/Reload.svelte +29 -29
  138. package/dist/primitives/Icons/Shows.svelte +21 -21
  139. package/dist/primitives/Icons/Signout.svelte +21 -21
  140. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  141. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  142. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  143. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  144. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  145. package/dist/primitives/Input/Input.spec.js +573 -573
  146. package/dist/primitives/Input/Input.stories.svelte +139 -139
  147. package/dist/primitives/Input/Select.spec.js +212 -212
  148. package/dist/primitives/Input/Select.stories.svelte +112 -112
  149. package/dist/primitives/Input/Select.svelte +128 -128
  150. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  151. package/dist/primitives/Input/Textarea.svelte +35 -35
  152. package/dist/primitives/Label/Label.svelte +37 -37
  153. package/dist/primitives/Modal/Modal.spec.js +99 -99
  154. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  155. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  156. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  157. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  158. package/dist/primitives/Radio/Radio.svelte +67 -67
  159. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  160. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  161. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  162. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  163. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  164. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  165. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  166. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  167. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  168. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  169. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  170. package/dist/primitives/Toggle.spec.js +143 -143
  171. package/dist/primitives/Toggle.stories.svelte +92 -92
  172. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  173. package/dist/primitives/Typography/Typography.svelte +53 -53
  174. package/dist/primitives/ValidationError.spec.js +103 -103
  175. package/dist/primitives/ValidationError.stories.svelte +69 -69
  176. package/dist/primitives/ValidationError.svelte +29 -29
  177. package/dist/primitives/index.js +91 -91
  178. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  179. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  180. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  181. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  182. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  183. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  184. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  185. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  186. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  187. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  188. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  189. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  190. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  191. package/dist/recipes/fields/FormField.svelte +58 -58
  192. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  193. package/dist/recipes/fields/SelectField.svelte +80 -80
  194. package/dist/recipes/fields/TextareaField.svelte +97 -97
  195. package/dist/recipes/fields/ToggleField.svelte +60 -60
  196. package/dist/recipes/fields/index.js +7 -7
  197. package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
  198. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  199. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  200. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  201. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  202. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  203. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
  204. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  205. package/dist/recipes/inputs/Search.svelte +37 -37
  206. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  207. package/dist/recipes/modals/AlertModal.svelte +130 -130
  208. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  209. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  210. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  211. package/dist/recipes/modals/InputModal.svelte +182 -182
  212. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  213. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  214. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  215. package/dist/recipes/modals/StatusModal.svelte +206 -206
  216. package/dist/services/EventService.js +75 -75
  217. package/dist/services/EventService.spec.js +217 -217
  218. package/dist/services/ShowService.spec.js +345 -345
  219. package/dist/stores/auth.js +36 -44
  220. package/dist/stores/auth.spec.js +139 -139
  221. package/dist/stores/formDataStore.d.ts.map +1 -1
  222. package/dist/stores/formDataStore.js +0 -8
  223. package/dist/stores/formSave.d.ts.map +1 -1
  224. package/dist/stores/formSave.js +0 -8
  225. package/dist/stores/navigation.d.ts.map +1 -1
  226. package/dist/stores/navigation.js +0 -8
  227. package/dist/stores/toaster.js +13 -13
  228. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  229. package/dist/stories/ButtonAuditReview.svelte +427 -427
  230. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  231. package/dist/stories/PatternsGallery.svelte +206 -206
  232. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  233. package/dist/stories/PrimitivesGallery.svelte +725 -725
  234. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  235. package/dist/stories/RecipesGallery.svelte +271 -271
  236. package/dist/stories/button-audit-manifest.json +11186 -11186
  237. package/dist/tailwind/preset.cjs +82 -82
  238. package/dist/telemetry.js +405 -405
  239. package/dist/telemetry.spec.js +1169 -1169
  240. package/dist/tokens/tokens.css +87 -87
  241. package/dist/tokens/typography-base.css +163 -163
  242. package/dist/utils/apiConfig.spec.js +219 -219
  243. package/dist/utils/transitions.js +62 -62
  244. package/dist/utils/utils.js +354 -354
  245. package/package.json +1 -1
  246. package/dist/stores/auth.svelte.d.ts +0 -39
  247. package/dist/stores/auth.svelte.d.ts.map +0 -1
  248. package/dist/stores/auth.svelte.js +0 -60
  249. package/dist/stores/formDataStore.svelte.d.ts +0 -47
  250. package/dist/stores/formDataStore.svelte.d.ts.map +0 -1
  251. package/dist/stores/formDataStore.svelte.js +0 -84
  252. package/dist/stores/formSave.svelte.d.ts +0 -33
  253. package/dist/stores/formSave.svelte.d.ts.map +0 -1
  254. package/dist/stores/formSave.svelte.js +0 -113
  255. package/dist/stores/navigation.svelte.d.ts +0 -35
  256. package/dist/stores/navigation.svelte.d.ts.map +0 -1
  257. package/dist/stores/navigation.svelte.js +0 -69
@@ -1,74 +1,74 @@
1
- <script lang="ts">
2
- import { safeSlide } from "../../utils/transitions.js";
3
- import { cubicOut } from "svelte/easing";
4
- import WarningIcon from "../../primitives/Icons/WarningIcon.svelte";
5
- import Button from "../../primitives/Button/Button.svelte";
6
-
7
- interface Props {
8
- errors?: Record<string, string | null | undefined>;
9
- show?: boolean;
10
- fieldLabels?: Record<string, string>;
11
- fieldIds?: Record<string, string>;
12
- }
13
-
14
- let {
15
- errors = {},
16
- show = false,
17
- fieldLabels = {},
18
- fieldIds = {},
19
- }: Props = $props();
20
-
21
- // Get list of fields with errors
22
- let errorFields = $derived(Object.entries(errors)
23
- .filter(([_, message]) => message && message.trim() !== "")
24
- .map(([key, message]) => ({
25
- key,
26
- label: fieldLabels[key] || key,
27
- message,
28
- elementId: fieldIds[key] || key
29
- })));
30
-
31
- let hasErrors = $derived(errorFields.length > 0);
32
-
33
- function scrollToField(elementId: string) {
34
- const element = document.getElementById(elementId);
35
- if (element) {
36
- element.scrollIntoView({ behavior: "smooth", block: "center" });
37
- if (element.focus) {
38
- setTimeout(() => element.focus(), 300);
39
- }
40
- }
41
- }
42
- </script>
43
-
44
- {#if show && hasErrors}
45
- <div
46
- transition:safeSlide={{ duration: 300, easing: cubicOut }}
47
- class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-4"
48
- role="alert"
49
- aria-live="polite"
50
- >
51
- <div class="flex items-start gap-2">
52
- <WarningIcon class="shrink-0 text-red-600 dark:text-red-500 mt-0.5" />
53
- <div class="flex-1">
54
- <p class="text-sm font-medium text-red-800 dark:text-red-400">
55
- Please fix the following:
56
- </p>
57
- <ul class="mt-2 space-y-1">
58
- {#each errorFields as field}
59
- <li>
60
- <Button
61
- variant="link"
62
- size="sm"
63
- class="!text-red-600 dark:!text-red-500 hover:!text-red-900 dark:hover:!text-red-400"
64
- onclick={() => scrollToField(field.elementId)}
65
- >
66
- {field.label}
67
- </Button>
68
- </li>
69
- {/each}
70
- </ul>
71
- </div>
72
- </div>
73
- </div>
74
- {/if}
1
+ <script lang="ts">
2
+ import { safeSlide } from "../../utils/transitions.js";
3
+ import { cubicOut } from "svelte/easing";
4
+ import WarningIcon from "../../primitives/Icons/WarningIcon.svelte";
5
+ import Button from "../../primitives/Button/Button.svelte";
6
+
7
+ interface Props {
8
+ errors?: Record<string, string | null | undefined>;
9
+ show?: boolean;
10
+ fieldLabels?: Record<string, string>;
11
+ fieldIds?: Record<string, string>;
12
+ }
13
+
14
+ let {
15
+ errors = {},
16
+ show = false,
17
+ fieldLabels = {},
18
+ fieldIds = {},
19
+ }: Props = $props();
20
+
21
+ // Get list of fields with errors
22
+ let errorFields = $derived(Object.entries(errors)
23
+ .filter(([_, message]) => message && message.trim() !== "")
24
+ .map(([key, message]) => ({
25
+ key,
26
+ label: fieldLabels[key] || key,
27
+ message,
28
+ elementId: fieldIds[key] || key
29
+ })));
30
+
31
+ let hasErrors = $derived(errorFields.length > 0);
32
+
33
+ function scrollToField(elementId: string) {
34
+ const element = document.getElementById(elementId);
35
+ if (element) {
36
+ element.scrollIntoView({ behavior: "smooth", block: "center" });
37
+ if (element.focus) {
38
+ setTimeout(() => element.focus(), 300);
39
+ }
40
+ }
41
+ }
42
+ </script>
43
+
44
+ {#if show && hasErrors}
45
+ <div
46
+ transition:safeSlide={{ duration: 300, easing: cubicOut }}
47
+ class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 mb-4"
48
+ role="alert"
49
+ aria-live="polite"
50
+ >
51
+ <div class="flex items-start gap-2">
52
+ <WarningIcon class="shrink-0 text-red-600 dark:text-red-500 mt-0.5" />
53
+ <div class="flex-1">
54
+ <p class="text-sm font-medium text-red-800 dark:text-red-400">
55
+ Please fix the following:
56
+ </p>
57
+ <ul class="mt-2 space-y-1">
58
+ {#each errorFields as field}
59
+ <li>
60
+ <Button
61
+ variant="link"
62
+ size="sm"
63
+ class="!text-red-600 dark:!text-red-500 hover:!text-red-900 dark:hover:!text-red-400"
64
+ onclick={() => scrollToField(field.elementId)}
65
+ >
66
+ {field.label}
67
+ </Button>
68
+ </li>
69
+ {/each}
70
+ </ul>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ {/if}
@@ -1,39 +1,39 @@
1
- <script>
2
- let {
3
- sidebarWidth = 'medium',
4
- sidebarPosition = 'right',
5
- class: className = '',
6
- sidebar,
7
- children,
8
- } = $props();
9
-
10
- const widthClasses = {
11
- narrow: 'lg:w-72',
12
- medium: 'lg:w-80',
13
- wide: 'lg:w-96',
14
- };
15
-
16
- const mainWidthClasses = {
17
- narrow: 'lg:w-[calc(100%-18rem)]',
18
- medium: 'lg:w-[calc(100%-20rem)]',
19
- wide: 'lg:w-[calc(100%-24rem)]',
20
- };
21
- </script>
22
-
23
- <div class="flex flex-col lg:flex-row gap-6 {className}">
24
- {#if sidebarPosition === 'left'}
25
- <aside class="w-full {widthClasses[sidebarWidth]} flex-shrink-0">
26
- {@render sidebar?.()}
27
- </aside>
28
- <main class="w-full {mainWidthClasses[sidebarWidth]} flex-grow min-w-0">
29
- {@render children?.()}
30
- </main>
31
- {:else}
32
- <main class="w-full {mainWidthClasses[sidebarWidth]} flex-grow min-w-0">
33
- {@render children?.()}
34
- </main>
35
- <aside class="w-full {widthClasses[sidebarWidth]} flex-shrink-0">
36
- {@render sidebar?.()}
37
- </aside>
38
- {/if}
39
- </div>
1
+ <script>
2
+ let {
3
+ sidebarWidth = 'medium',
4
+ sidebarPosition = 'right',
5
+ class: className = '',
6
+ sidebar,
7
+ children,
8
+ } = $props();
9
+
10
+ const widthClasses = {
11
+ narrow: 'lg:w-72',
12
+ medium: 'lg:w-80',
13
+ wide: 'lg:w-96',
14
+ };
15
+
16
+ const mainWidthClasses = {
17
+ narrow: 'lg:w-[calc(100%-18rem)]',
18
+ medium: 'lg:w-[calc(100%-20rem)]',
19
+ wide: 'lg:w-[calc(100%-24rem)]',
20
+ };
21
+ </script>
22
+
23
+ <div class="flex flex-col lg:flex-row gap-6 {className}">
24
+ {#if sidebarPosition === 'left'}
25
+ <aside class="w-full {widthClasses[sidebarWidth]} flex-shrink-0">
26
+ {@render sidebar?.()}
27
+ </aside>
28
+ <main class="w-full {mainWidthClasses[sidebarWidth]} flex-grow min-w-0">
29
+ {@render children?.()}
30
+ </main>
31
+ {:else}
32
+ <main class="w-full {mainWidthClasses[sidebarWidth]} flex-grow min-w-0">
33
+ {@render children?.()}
34
+ </main>
35
+ <aside class="w-full {widthClasses[sidebarWidth]} flex-shrink-0">
36
+ {@render sidebar?.()}
37
+ </aside>
38
+ {/if}
39
+ </div>
@@ -2,8 +2,6 @@ export { default as Grid } from "../../components/Layout/Grid.svelte";
2
2
  export { default as Section } from "../../components/Layout/Section.svelte";
3
3
  export { default as Sidebar } from "../../components/Layout/Sidebar.svelte";
4
4
  export { default as Stack } from "../../components/Layout/Stack.svelte";
5
- export { default as Text } from "../../components/Layout/Text.svelte";
6
- export { default as Heading } from "../../components/Layout/Heading.svelte";
7
5
  export { default as PageContainer } from "../../components/Layout/PageContainer.svelte";
8
6
  export { default as ContentSection } from "../../components/Layout/ContentSection.svelte";
9
7
  export { default as TwoColumn } from "../../components/Layout/TwoColumn.svelte";
@@ -8,8 +8,9 @@ export { default as Sidebar } from '../../components/Layout/Sidebar.svelte';
8
8
  export { default as Stack } from '../../components/Layout/Stack.svelte';
9
9
 
10
10
  // Typography components
11
- export { default as Text } from '../../components/Layout/Text.svelte';
12
- export { default as Heading } from '../../components/Layout/Heading.svelte';
11
+ // Note: Text is exported from components/Text.svelte (simpler API)
12
+ // Note: Heading is exported from components/Heading.svelte (canonical export)
13
+ // Layout/Text.svelte and Layout/Heading.svelte are internal - use the main exports
13
14
 
14
15
  // Container components
15
16
  export { default as PageContainer } from '../../components/Layout/PageContainer.svelte';
@@ -1,117 +1,117 @@
1
- <script module>
2
- import { defineMeta } from "@storybook/addon-svelte-csf";
3
-
4
- import BottomNav from './BottomNav.svelte';
5
-
6
- const { Story } = defineMeta({
7
- title: 'Components/Layout/BottomNav',
8
- component: BottomNav,
9
- tags: ['autodocs'],
10
- });
11
-
12
- </script>
13
-
14
- <script>
15
-
16
- const defaultLinks = [
17
- { label: 'Home', href: '/', icon: 'Home' },
18
- { label: 'Shows', href: '/shows', icon: 'Shows' },
19
- { label: 'Availability', href: '/availability', icon: 'Availability' },
20
- { label: 'Profile', href: '/profile', icon: 'Profile' },
21
- ];
22
-
23
- const extendedLinks = [
24
- { label: 'Home', href: '/', icon: 'Home' },
25
- { label: 'Shows', href: '/shows', icon: 'Shows' },
26
- { label: 'Availability', href: '/availability', icon: 'Availability' },
27
- { label: 'Messages', href: '/messages', icon: 'Message' },
28
- { label: 'Profile', href: '/profile', icon: 'Profile' },
29
- ];
30
- </script>
31
-
32
- <Story name="Default (4 Tabs)">
33
- <div class="bg-gray-100 dark:bg-gray-700 p-4">
34
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Mobile Bottom Navigation (4 tabs)</p>
35
- <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
36
- <div class="h-64 bg-gradient-to-br from-blue-50 to-blue-100 flex items-center justify-center">
37
- <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
38
- </div>
39
- <div class="flex border-t bg-white dark:bg-gray-900">
40
- <BottomNav links={defaultLinks} />
41
- </div>
42
- </div>
43
- </div>
44
- </Story>
45
-
46
- <Story name="With 5 Tabs">
47
- <div class="bg-gray-100 dark:bg-gray-700 p-4">
48
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Extended Navigation (5 tabs)</p>
49
- <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
50
- <div class="h-64 bg-gradient-to-br from-purple-50 to-purple-100 flex items-center justify-center">
51
- <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
52
- </div>
53
- <div class="flex border-t bg-white dark:bg-gray-900">
54
- <BottomNav links={extendedLinks} />
55
- </div>
56
- </div>
57
- </div>
58
- </Story>
59
-
60
- <Story name="Different Icon Set">
61
- <div class="bg-gray-100 dark:bg-gray-700 p-4">
62
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Custom Icons</p>
63
- <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
64
- <div class="h-64 bg-gradient-to-br from-green-50 to-green-100 flex items-center justify-center">
65
- <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
66
- </div>
67
- <div class="flex border-t bg-white dark:bg-gray-900">
68
- <BottomNav
69
- links={[
70
- { label: 'Dashboard', href: '/', icon: 'Home' },
71
- { label: 'Events', href: '/events', icon: 'Shows' },
72
- { label: 'Notifications', href: '/notifications', icon: 'Notification' },
73
- { label: 'Settings', href: '/settings', icon: 'Profile' },
74
- ]}
75
- />
76
- </div>
77
- </div>
78
- </div>
79
- </Story>
80
-
81
- <Story name="Mobile Viewport">
82
- <div class="max-w-[375px] mx-auto bg-white dark:bg-gray-900 shadow-2xl rounded-3xl overflow-hidden">
83
- <!-- Mock iPhone screen -->
84
- <div class="h-[667px] flex flex-col">
85
- <!-- Status bar -->
86
- <div class="h-6 bg-black flex items-center justify-between px-4">
87
- <span class="text-white text-xs">9:41</span>
88
- <span class="text-white text-xs">100%</span>
89
- </div>
90
-
91
- <!-- Content area -->
92
- <div class="flex-1 bg-gradient-to-br from-blue-50 to-purple-50 p-4">
93
- <h1 class="text-2xl font-bold mb-2">Home</h1>
94
- <p class="text-gray-500 dark:text-gray-400">This is a mobile viewport simulation</p>
95
- </div>
96
-
97
- <!-- Bottom navigation -->
98
- <div class="flex border-t bg-white dark:bg-gray-900 safe-bottom">
99
- <BottomNav links={defaultLinks} />
100
- </div>
101
- </div>
102
- </div>
103
- </Story>
104
-
105
- <Story name="Dark Mode">
106
- <div class="dark bg-gray-900 p-4 min-h-screen">
107
- <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Dark Mode Bottom Navigation</p>
108
- <div class="max-w-md mx-auto bg-gray-800 rounded-lg shadow-2xl overflow-hidden">
109
- <div class="h-64 bg-gradient-to-br from-gray-900 to-gray-800 flex items-center justify-center">
110
- <p class="text-gray-500 dark:text-gray-400">Dark Mode Content</p>
111
- </div>
112
- <div class="flex border-t border-gray-700 bg-gray-800">
113
- <BottomNav links={defaultLinks} />
114
- </div>
115
- </div>
116
- </div>
117
- </Story>
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+
4
+ import BottomNav from './BottomNav.svelte';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'Components/Layout/BottomNav',
8
+ component: BottomNav,
9
+ tags: ['autodocs'],
10
+ });
11
+
12
+ </script>
13
+
14
+ <script>
15
+
16
+ const defaultLinks = [
17
+ { label: 'Home', href: '/', icon: 'Home' },
18
+ { label: 'Shows', href: '/shows', icon: 'Shows' },
19
+ { label: 'Availability', href: '/availability', icon: 'Availability' },
20
+ { label: 'Profile', href: '/profile', icon: 'Profile' },
21
+ ];
22
+
23
+ const extendedLinks = [
24
+ { label: 'Home', href: '/', icon: 'Home' },
25
+ { label: 'Shows', href: '/shows', icon: 'Shows' },
26
+ { label: 'Availability', href: '/availability', icon: 'Availability' },
27
+ { label: 'Messages', href: '/messages', icon: 'Message' },
28
+ { label: 'Profile', href: '/profile', icon: 'Profile' },
29
+ ];
30
+ </script>
31
+
32
+ <Story name="Default (4 Tabs)">
33
+ <div class="bg-gray-100 dark:bg-gray-700 p-4">
34
+ <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Mobile Bottom Navigation (4 tabs)</p>
35
+ <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
36
+ <div class="h-64 bg-gradient-to-br from-blue-50 to-blue-100 flex items-center justify-center">
37
+ <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
38
+ </div>
39
+ <div class="flex border-t bg-white dark:bg-gray-900">
40
+ <BottomNav links={defaultLinks} />
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </Story>
45
+
46
+ <Story name="With 5 Tabs">
47
+ <div class="bg-gray-100 dark:bg-gray-700 p-4">
48
+ <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Extended Navigation (5 tabs)</p>
49
+ <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
50
+ <div class="h-64 bg-gradient-to-br from-purple-50 to-purple-100 flex items-center justify-center">
51
+ <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
52
+ </div>
53
+ <div class="flex border-t bg-white dark:bg-gray-900">
54
+ <BottomNav links={extendedLinks} />
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </Story>
59
+
60
+ <Story name="Different Icon Set">
61
+ <div class="bg-gray-100 dark:bg-gray-700 p-4">
62
+ <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Custom Icons</p>
63
+ <div class="max-w-md mx-auto bg-white dark:bg-gray-900 rounded-lg shadow-lg overflow-hidden">
64
+ <div class="h-64 bg-gradient-to-br from-green-50 to-green-100 flex items-center justify-center">
65
+ <p class="text-gray-500 dark:text-gray-400">Page Content Area</p>
66
+ </div>
67
+ <div class="flex border-t bg-white dark:bg-gray-900">
68
+ <BottomNav
69
+ links={[
70
+ { label: 'Dashboard', href: '/', icon: 'Home' },
71
+ { label: 'Events', href: '/events', icon: 'Shows' },
72
+ { label: 'Notifications', href: '/notifications', icon: 'Notification' },
73
+ { label: 'Settings', href: '/settings', icon: 'Profile' },
74
+ ]}
75
+ />
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </Story>
80
+
81
+ <Story name="Mobile Viewport">
82
+ <div class="max-w-[375px] mx-auto bg-white dark:bg-gray-900 shadow-2xl rounded-3xl overflow-hidden">
83
+ <!-- Mock iPhone screen -->
84
+ <div class="h-[667px] flex flex-col">
85
+ <!-- Status bar -->
86
+ <div class="h-6 bg-black flex items-center justify-between px-4">
87
+ <span class="text-white text-xs">9:41</span>
88
+ <span class="text-white text-xs">100%</span>
89
+ </div>
90
+
91
+ <!-- Content area -->
92
+ <div class="flex-1 bg-gradient-to-br from-blue-50 to-purple-50 p-4">
93
+ <h1 class="text-2xl font-bold mb-2">Home</h1>
94
+ <p class="text-gray-500 dark:text-gray-400">This is a mobile viewport simulation</p>
95
+ </div>
96
+
97
+ <!-- Bottom navigation -->
98
+ <div class="flex border-t bg-white dark:bg-gray-900 safe-bottom">
99
+ <BottomNav links={defaultLinks} />
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </Story>
104
+
105
+ <Story name="Dark Mode">
106
+ <div class="dark bg-gray-900 p-4 min-h-screen">
107
+ <p class="text-sm text-gray-500 dark:text-gray-400 mb-4">Dark Mode Bottom Navigation</p>
108
+ <div class="max-w-md mx-auto bg-gray-800 rounded-lg shadow-2xl overflow-hidden">
109
+ <div class="h-64 bg-gradient-to-br from-gray-900 to-gray-800 flex items-center justify-center">
110
+ <p class="text-gray-500 dark:text-gray-400">Dark Mode Content</p>
111
+ </div>
112
+ <div class="flex border-t border-gray-700 bg-gray-800">
113
+ <BottomNav links={defaultLinks} />
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </Story>
@@ -1,74 +1,74 @@
1
- <script lang="ts">
2
- import { page } from '../../__LIB_STORES__.js';
3
- import { base } from '../../__LIB_PATHS__.js';
4
- import { browser } from '../../__LIB_ENVIRONMENT__.js';
5
- import { onMount } from "svelte";
6
- import Icon from "../../primitives/Icons/Icon.svelte";
7
- import { typography } from '../../tokens/typography';
8
-
9
- interface NavLink {
10
- label: string;
11
- href: string;
12
- icon: string;
13
- }
14
-
15
- interface Props {
16
- links?: NavLink[];
17
- }
18
-
19
- let {
20
- links = [],
21
- }: Props = $props();
22
-
23
- let invitationCount = $state(0);
24
-
25
- let currentPath = $derived($page.url.pathname);
26
-
27
- function isActive(href: string, path: string): boolean {
28
- if (href === `${base}/` || href === '/') {
29
- return path === href || path === `${base}/`;
30
- }
31
- return path.startsWith(href);
32
- }
33
-
34
- onMount(() => {
35
- async function fetchShows() {
36
- try {
37
- const res = await fetch(`/api/getEventsForVenue`);
38
- if (!res.ok) {
39
- // Silently ignore auth errors - user may not be logged in yet
40
- if (res.status === 401) return;
41
- return;
42
- }
43
- const events = await res.json();
44
- invitationCount = events.filter((event: { acceptedState: number }) => event.acceptedState === 0).length;
45
- } catch (err) {
46
- // Silently fail - this is non-critical UI enhancement
47
- }
48
- }
49
-
50
- if (browser) {
51
- fetchShows();
52
- }
53
- });
54
- </script>
55
-
56
- {#each links as { label, href, icon }}
57
- <a
58
- {href}
59
- class={`bottom-nav-item flex-1 flex items-center justify-center py-3 px-2 no-underline bg-transparent border-none cursor-pointer min-w-0
60
- ${typography.textMuted} transition-colors duration-150
61
- hover:text-gray-900 hover:no-underline dark:hover:text-white
62
- select-none touch-manipulation
63
- ${isActive(href, currentPath) ? 'active text-blue-700 dark:text-blue-500' : ''}`}
64
- aria-label={label}
65
- style="-webkit-tap-highlight-color: transparent; -webkit-touch-callout: none;"
66
- >
67
- <span class="bottom-nav-icon relative flex items-center justify-center transition-transform duration-150 active:scale-[0.8]">
68
- <Icon name={icon} size="24" />
69
- {#if label === "Shows" && invitationCount > 0}
70
- <span class="notification-dot absolute -top-1 -right-1 w-2 h-2 bg-red-500 rounded-full"></span>
71
- {/if}
72
- </span>
73
- </a>
74
- {/each}
1
+ <script lang="ts">
2
+ import { page } from '../../__LIB_STORES__.js';
3
+ import { base } from '../../__LIB_PATHS__.js';
4
+ import { browser } from '../../__LIB_ENVIRONMENT__.js';
5
+ import { onMount } from "svelte";
6
+ import Icon from "../../primitives/Icons/Icon.svelte";
7
+ import { typography } from '../../tokens/typography';
8
+
9
+ interface NavLink {
10
+ label: string;
11
+ href: string;
12
+ icon: string;
13
+ }
14
+
15
+ interface Props {
16
+ links?: NavLink[];
17
+ }
18
+
19
+ let {
20
+ links = [],
21
+ }: Props = $props();
22
+
23
+ let invitationCount = $state(0);
24
+
25
+ let currentPath = $derived($page.url.pathname);
26
+
27
+ function isActive(href: string, path: string): boolean {
28
+ if (href === `${base}/` || href === '/') {
29
+ return path === href || path === `${base}/`;
30
+ }
31
+ return path.startsWith(href);
32
+ }
33
+
34
+ onMount(() => {
35
+ async function fetchShows() {
36
+ try {
37
+ const res = await fetch(`/api/getEventsForVenue`);
38
+ if (!res.ok) {
39
+ // Silently ignore auth errors - user may not be logged in yet
40
+ if (res.status === 401) return;
41
+ return;
42
+ }
43
+ const events = await res.json();
44
+ invitationCount = events.filter((event: { acceptedState: number }) => event.acceptedState === 0).length;
45
+ } catch (err) {
46
+ // Silently fail - this is non-critical UI enhancement
47
+ }
48
+ }
49
+
50
+ if (browser) {
51
+ fetchShows();
52
+ }
53
+ });
54
+ </script>
55
+
56
+ {#each links as { label, href, icon }}
57
+ <a
58
+ {href}
59
+ class={`bottom-nav-item flex-1 flex items-center justify-center py-3 px-2 no-underline bg-transparent border-none cursor-pointer min-w-0
60
+ ${typography.textMuted} transition-colors duration-150
61
+ hover:text-gray-900 hover:no-underline dark:hover:text-white
62
+ select-none touch-manipulation
63
+ ${isActive(href, currentPath) ? 'active text-blue-700 dark:text-blue-500' : ''}`}
64
+ aria-label={label}
65
+ style="-webkit-tap-highlight-color: transparent; -webkit-touch-callout: none;"
66
+ >
67
+ <span class="bottom-nav-icon relative flex items-center justify-center transition-transform duration-150 active:scale-[0.8]">
68
+ <Icon name={icon} size="24" />
69
+ {#if label === "Shows" && invitationCount > 0}
70
+ <span class="notification-dot absolute -top-1 -right-1 w-2 h-2 bg-red-500 rounded-full"></span>
71
+ {/if}
72
+ </span>
73
+ </a>
74
+ {/each}