@getmicdrop/svelte-components 5.10.1 → 5.10.3

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 (227) 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 +146 -146
  7. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  8. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  9. package/dist/components/Heading.svelte +60 -60
  10. package/dist/components/Layout/AppShell.svelte +104 -104
  11. package/dist/components/Layout/ContentSection.svelte +80 -80
  12. package/dist/components/Layout/Grid.svelte +4 -4
  13. package/dist/components/Layout/Heading.svelte +81 -81
  14. package/dist/components/Layout/PageContainer.svelte +69 -69
  15. package/dist/components/Layout/Responsive.svelte +75 -75
  16. package/dist/components/Layout/Section.svelte +80 -80
  17. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  18. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  19. package/dist/components/Layout/Sidebar.svelte +108 -108
  20. package/dist/components/Layout/Stack.svelte +6 -6
  21. package/dist/components/Layout/Text.svelte +87 -87
  22. package/dist/components/Layout/TwoColumn.svelte +108 -108
  23. package/dist/components/Text.svelte +53 -53
  24. package/dist/constants/validation.js +91 -91
  25. package/dist/constants/validation.spec.js +64 -64
  26. package/dist/index.js +51 -51
  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 +36 -36
  30. package/dist/patterns/forms/FormActions.spec.js +95 -95
  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.stories.svelte +83 -83
  36. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  37. package/dist/patterns/layout/Sidebar.svelte +39 -39
  38. package/dist/patterns/layout/index.js +29 -29
  39. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  40. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  41. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  42. package/dist/patterns/navigation/Header.svelte +255 -255
  43. package/dist/patterns/page/PageHeader.svelte +18 -18
  44. package/dist/patterns/page/PageLayout.svelte +40 -40
  45. package/dist/patterns/page/PageLoader.spec.js +57 -57
  46. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  47. package/dist/patterns/page/PageLoader.svelte +24 -24
  48. package/dist/patterns/page/SectionHeader.svelte +29 -29
  49. package/dist/presets/badges.js +112 -112
  50. package/dist/presets/buttons.js +76 -76
  51. package/dist/presets/index.js +9 -9
  52. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  53. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  54. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  55. package/dist/primitives/Alert/Alert.spec.js +173 -173
  56. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  57. package/dist/primitives/Alert/Alert.svelte +27 -27
  58. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  59. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  60. package/dist/primitives/Badges/Badge.spec.js +144 -144
  61. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  62. package/dist/primitives/Badges/Badge.svelte +99 -99
  63. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  64. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  65. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  66. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  67. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  68. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +98 -98
  69. package/dist/primitives/Button/Button.spec.js +223 -223
  70. package/dist/primitives/Button/Button.stories.svelte +76 -76
  71. package/dist/primitives/Button/Button.svelte +283 -283
  72. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  73. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  74. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  75. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  76. package/dist/primitives/Card.spec.js +49 -49
  77. package/dist/primitives/Card.stories.svelte +22 -22
  78. package/dist/primitives/Card.svelte +28 -28
  79. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  80. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  81. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  82. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  83. package/dist/primitives/DarkModeToggle.svelte +136 -136
  84. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  85. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  86. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  87. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  88. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  89. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  90. package/dist/primitives/Helper/Helper.svelte +33 -33
  91. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  92. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  93. package/dist/primitives/Icons/Availability.svelte +14 -14
  94. package/dist/primitives/Icons/Back.svelte +14 -14
  95. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  96. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  97. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  98. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  99. package/dist/primitives/Icons/Copy.svelte +15 -15
  100. package/dist/primitives/Icons/Cross.svelte +5 -5
  101. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  102. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  103. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  104. package/dist/primitives/Icons/Home.svelte +15 -15
  105. package/dist/primitives/Icons/Icon.spec.js +169 -169
  106. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  107. package/dist/primitives/Icons/Icon.svelte +52 -52
  108. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  109. package/dist/primitives/Icons/Info.svelte +7 -7
  110. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  111. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  112. package/dist/primitives/Icons/Message.svelte +15 -15
  113. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  114. package/dist/primitives/Icons/More.svelte +21 -21
  115. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  116. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  117. package/dist/primitives/Icons/Notification.svelte +14 -14
  118. package/dist/primitives/Icons/Payment.svelte +14 -14
  119. package/dist/primitives/Icons/Profile.svelte +21 -21
  120. package/dist/primitives/Icons/Reload.svelte +29 -29
  121. package/dist/primitives/Icons/Shows.svelte +21 -21
  122. package/dist/primitives/Icons/Signout.svelte +21 -21
  123. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  124. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  125. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  126. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  127. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  128. package/dist/primitives/Input/Input.spec.js +573 -573
  129. package/dist/primitives/Input/Input.stories.svelte +139 -139
  130. package/dist/primitives/Input/Input.svelte +423 -423
  131. package/dist/primitives/Input/Select.spec.js +218 -218
  132. package/dist/primitives/Input/Select.stories.svelte +112 -112
  133. package/dist/primitives/Input/Select.svelte +252 -252
  134. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  135. package/dist/primitives/Input/Textarea.svelte +105 -105
  136. package/dist/primitives/Label/Label.svelte +37 -37
  137. package/dist/primitives/Modal/Modal.spec.js +99 -99
  138. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  139. package/dist/primitives/Modal/Modal.svelte +157 -157
  140. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  141. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  142. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  143. package/dist/primitives/Radio/Radio.svelte +67 -67
  144. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  145. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  146. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  147. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  148. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  149. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  150. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  151. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  152. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  153. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  154. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  155. package/dist/primitives/Toggle.spec.js +146 -146
  156. package/dist/primitives/Toggle.stories.svelte +92 -92
  157. package/dist/primitives/Toggle.svelte +131 -131
  158. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  159. package/dist/primitives/Typography/Typography.svelte +53 -53
  160. package/dist/primitives/ValidationError.spec.js +103 -103
  161. package/dist/primitives/ValidationError.stories.svelte +69 -69
  162. package/dist/primitives/ValidationError.svelte +29 -29
  163. package/dist/primitives/index.js +92 -92
  164. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  165. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  166. package/dist/recipes/CropImage/CropImage.svelte +219 -219
  167. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  168. package/dist/recipes/ImageUploader/ImageUploader.svelte +970 -970
  169. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  170. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  171. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  172. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  173. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  174. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  175. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  176. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  177. package/dist/recipes/fields/FormField.svelte +58 -58
  178. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  179. package/dist/recipes/fields/SelectField.svelte +80 -80
  180. package/dist/recipes/fields/TextareaField.svelte +97 -97
  181. package/dist/recipes/fields/ToggleField.svelte +60 -60
  182. package/dist/recipes/fields/index.js +7 -7
  183. package/dist/recipes/inputs/MultiSelect.spec.js +260 -260
  184. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  185. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  186. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  187. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  188. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  189. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  190. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -117
  191. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts.map +1 -1
  192. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  193. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +344 -344
  194. package/dist/recipes/inputs/Search.svelte +102 -102
  195. package/dist/recipes/inputs/SelectDropdown.svelte +171 -171
  196. package/dist/recipes/modals/AlertModal.svelte +130 -130
  197. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  198. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  199. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  200. package/dist/recipes/modals/InputModal.svelte +182 -182
  201. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  202. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  203. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  204. package/dist/recipes/modals/StatusModal.svelte +206 -206
  205. package/dist/services/EventService.js +75 -75
  206. package/dist/services/EventService.spec.js +217 -217
  207. package/dist/services/ShowService.spec.js +345 -345
  208. package/dist/stores/toaster.js +13 -13
  209. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  210. package/dist/stories/ButtonAuditReview.svelte +427 -427
  211. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  212. package/dist/stories/PatternsGallery.svelte +206 -206
  213. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  214. package/dist/stories/PrimitivesGallery.svelte +752 -752
  215. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  216. package/dist/stories/RecipesGallery.svelte +471 -471
  217. package/dist/stories/button-audit-manifest.json +11186 -11186
  218. package/dist/tailwind/preset.cjs +82 -82
  219. package/dist/telemetry.js +405 -405
  220. package/dist/telemetry.spec.js +1169 -1169
  221. package/dist/tokens/tokens.css +87 -87
  222. package/dist/tokens/typography-base.css +163 -163
  223. package/dist/tokens/utilities.css +353 -353
  224. package/dist/utils/apiConfig.spec.js +219 -219
  225. package/dist/utils/transitions.js +4 -4
  226. package/dist/utils/utils.js +693 -693
  227. package/package.json +297 -297
@@ -1,61 +1,61 @@
1
- <script>
2
- import { typography } from '../../tokens/typography';
3
-
4
- let {
5
- day = '',
6
- date = '',
7
- time = '',
8
- isSelected = false,
9
- onselect,
10
- } = $props();
11
-
12
- function handleCardClick() {
13
- onselect?.({ date });
14
- }
15
-
16
- function handleKeydown(e) {
17
- if (e.key === 'Enter' || e.key === ' ') {
18
- e.preventDefault();
19
- handleCardClick();
20
- }
21
- }
22
-
23
- function formatHour(timeStr) {
24
- if (!timeStr) return '';
25
- const d = new Date(`1970-01-01T${timeStr}`);
26
- if (isNaN(d.getTime())) return timeStr;
27
- return d.toLocaleTimeString('en-US', {
28
- hour: 'numeric',
29
- minute: '2-digit',
30
- hour12: true
31
- });
32
- }
33
-
34
- function formatDate(dateStr) {
35
- if (!dateStr) return '';
36
- const d = new Date(dateStr);
37
- if (isNaN(d.getTime())) return dateStr;
38
- return d.toLocaleDateString('en-US', {
39
- month: 'short',
40
- day: 'numeric',
41
- });
42
- }
43
- </script>
44
-
45
- <div
46
- class="w-full h-28 rounded-lg flex flex-col justify-center items-center gap-1.5 cursor-pointer border-2 px-1 transition-colors bg-white dark:bg-gray-800 {isSelected
47
- ? 'border-blue-700 dark:border-blue-500'
48
- : 'border-gray-200 dark:border-gray-700 hover:border-blue-700 dark:hover:border-blue-500'}"
49
- onclick={handleCardClick}
50
- onkeydown={handleKeydown}
51
- tabindex="0"
52
- role="button"
53
- aria-label={`${day} ${formatDate(date)} at ${formatHour(time)}${isSelected ? ', selected' : ''}`}
54
- aria-pressed={isSelected}
55
- >
56
- <span class="{typography.label} text-sm {typography.textMuted}">{day}</span>
57
- <span class="{typography.label} text-base {isSelected ? 'text-blue-700 dark:text-blue-500' : ''}">
58
- {formatDate(date)}
59
- </span>
60
- <span class="{typography.label} text-sm {typography.textMuted}">{formatHour(time)}</span>
61
- </div>
1
+ <script>
2
+ import { typography } from '../../tokens/typography';
3
+
4
+ let {
5
+ day = '',
6
+ date = '',
7
+ time = '',
8
+ isSelected = false,
9
+ onselect,
10
+ } = $props();
11
+
12
+ function handleCardClick() {
13
+ onselect?.({ date });
14
+ }
15
+
16
+ function handleKeydown(e) {
17
+ if (e.key === 'Enter' || e.key === ' ') {
18
+ e.preventDefault();
19
+ handleCardClick();
20
+ }
21
+ }
22
+
23
+ function formatHour(timeStr) {
24
+ if (!timeStr) return '';
25
+ const d = new Date(`1970-01-01T${timeStr}`);
26
+ if (isNaN(d.getTime())) return timeStr;
27
+ return d.toLocaleTimeString('en-US', {
28
+ hour: 'numeric',
29
+ minute: '2-digit',
30
+ hour12: true
31
+ });
32
+ }
33
+
34
+ function formatDate(dateStr) {
35
+ if (!dateStr) return '';
36
+ const d = new Date(dateStr);
37
+ if (isNaN(d.getTime())) return dateStr;
38
+ return d.toLocaleDateString('en-US', {
39
+ month: 'short',
40
+ day: 'numeric',
41
+ });
42
+ }
43
+ </script>
44
+
45
+ <div
46
+ class="w-full h-28 rounded-lg flex flex-col justify-center items-center gap-1.5 cursor-pointer border-2 px-1 transition-colors bg-white dark:bg-gray-800 {isSelected
47
+ ? 'border-blue-700 dark:border-blue-500'
48
+ : 'border-gray-200 dark:border-gray-700 hover:border-blue-700 dark:hover:border-blue-500'}"
49
+ onclick={handleCardClick}
50
+ onkeydown={handleKeydown}
51
+ tabindex="0"
52
+ role="button"
53
+ aria-label={`${day} ${formatDate(date)} at ${formatHour(time)}${isSelected ? ', selected' : ''}`}
54
+ aria-pressed={isSelected}
55
+ >
56
+ <span class="{typography.label} text-sm {typography.textMuted}">{day}</span>
57
+ <span class="{typography.label} text-base {isSelected ? 'text-blue-700 dark:text-blue-500' : ''}">
58
+ {formatDate(date)}
59
+ </span>
60
+ <span class="{typography.label} text-sm {typography.textMuted}">{formatHour(time)}</span>
61
+ </div>
@@ -1,60 +1,60 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
-
4
- interface Props {
5
- level?: 1 | 2 | 3 | 4 | 5 | 6;
6
- size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
7
- weight?: 'normal' | 'medium' | 'semibold' | 'bold';
8
- class?: string;
9
- id?: string;
10
- children: Snippet;
11
- }
12
-
13
- let {
14
- level = 2,
15
- size = 'lg',
16
- weight,
17
- class: className = '',
18
- id,
19
- children,
20
- }: Props = $props();
21
-
22
- const sizeClasses: Record<string, string> = {
23
- xs: 'text-xs',
24
- sm: 'text-sm',
25
- base: 'text-base',
26
- md: 'text-base',
27
- lg: 'text-lg',
28
- xl: 'text-xl',
29
- '2xl': 'text-2xl',
30
- '3xl': 'text-3xl',
31
- '4xl': 'text-4xl',
32
- '5xl': 'text-5xl',
33
- };
34
-
35
- const weightClasses: Record<string, string> = {
36
- normal: 'font-normal',
37
- medium: 'font-medium',
38
- semibold: 'font-semibold',
39
- bold: 'font-bold',
40
- };
41
-
42
- const baseClasses = 'text-gray-900 dark:text-white';
43
- let sizeClass = $derived(sizeClasses[size] || 'text-lg');
44
- let weightClass = $derived(weight ? weightClasses[weight] : '');
45
- let classes = $derived(`${baseClasses} ${sizeClass} ${weightClass} ${className}`.trim());
46
- </script>
47
-
48
- {#if level === 1}
49
- <h1 {id} class={classes}>{@render children()}</h1>
50
- {:else if level === 2}
51
- <h2 {id} class={classes}>{@render children()}</h2>
52
- {:else if level === 3}
53
- <h3 {id} class={classes}>{@render children()}</h3>
54
- {:else if level === 4}
55
- <h4 {id} class={classes}>{@render children()}</h4>
56
- {:else if level === 5}
57
- <h5 {id} class={classes}>{@render children()}</h5>
58
- {:else}
59
- <h6 {id} class={classes}>{@render children()}</h6>
60
- {/if}
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
6
+ size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
7
+ weight?: 'normal' | 'medium' | 'semibold' | 'bold';
8
+ class?: string;
9
+ id?: string;
10
+ children: Snippet;
11
+ }
12
+
13
+ let {
14
+ level = 2,
15
+ size = 'lg',
16
+ weight,
17
+ class: className = '',
18
+ id,
19
+ children,
20
+ }: Props = $props();
21
+
22
+ const sizeClasses: Record<string, string> = {
23
+ xs: 'text-xs',
24
+ sm: 'text-sm',
25
+ base: 'text-base',
26
+ md: 'text-base',
27
+ lg: 'text-lg',
28
+ xl: 'text-xl',
29
+ '2xl': 'text-2xl',
30
+ '3xl': 'text-3xl',
31
+ '4xl': 'text-4xl',
32
+ '5xl': 'text-5xl',
33
+ };
34
+
35
+ const weightClasses: Record<string, string> = {
36
+ normal: 'font-normal',
37
+ medium: 'font-medium',
38
+ semibold: 'font-semibold',
39
+ bold: 'font-bold',
40
+ };
41
+
42
+ const baseClasses = 'text-gray-900 dark:text-white';
43
+ let sizeClass = $derived(sizeClasses[size] || 'text-lg');
44
+ let weightClass = $derived(weight ? weightClasses[weight] : '');
45
+ let classes = $derived(`${baseClasses} ${sizeClass} ${weightClass} ${className}`.trim());
46
+ </script>
47
+
48
+ {#if level === 1}
49
+ <h1 {id} class={classes}>{@render children()}</h1>
50
+ {:else if level === 2}
51
+ <h2 {id} class={classes}>{@render children()}</h2>
52
+ {:else if level === 3}
53
+ <h3 {id} class={classes}>{@render children()}</h3>
54
+ {:else if level === 4}
55
+ <h4 {id} class={classes}>{@render children()}</h4>
56
+ {:else if level === 5}
57
+ <h5 {id} class={classes}>{@render children()}</h5>
58
+ {:else}
59
+ <h6 {id} class={classes}>{@render children()}</h6>
60
+ {/if}
@@ -1,104 +1,104 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
-
4
- type Variant = 'admin' | 'performer' | 'public' | 'minimal';
5
-
6
- interface Props {
7
- /** Shell variant determines overall styling */
8
- variant?: Variant;
9
- /** Whether sidebar is collapsed (only for admin variant) */
10
- sidebarCollapsed?: boolean;
11
- /** Whether to show bottom navigation on mobile */
12
- showBottomNav?: boolean;
13
- /** Fixed header */
14
- fixedHeader?: boolean;
15
- /** Additional CSS classes for main content area */
16
- class?: string;
17
- /** Header slot */
18
- header?: Snippet;
19
- /** Sidebar slot (left side) */
20
- sidebar?: Snippet;
21
- /** Bottom navigation slot (mobile) */
22
- bottomNav?: Snippet;
23
- /** Main content */
24
- children?: Snippet;
25
- }
26
-
27
- let {
28
- variant = 'admin',
29
- sidebarCollapsed = false,
30
- showBottomNav = true,
31
- fixedHeader = true,
32
- class: className = '',
33
- header,
34
- sidebar,
35
- bottomNav,
36
- children,
37
- }: Props = $props();
38
-
39
- // Background classes based on variant
40
- const variantBackgrounds: Record<Variant, string> = {
41
- admin: 'bg-gray-50 dark:bg-gray-800',
42
- performer: 'bg-gray-50 dark:bg-gray-800',
43
- public: 'bg-white dark:bg-gray-900',
44
- minimal: 'bg-white dark:bg-gray-900',
45
- };
46
-
47
- // Sidebar width classes
48
- const sidebarWidthExpanded = 'md:ml-64';
49
- const sidebarWidthCollapsed = 'md:ml-20';
50
-
51
- let mainMarginClass = $derived(
52
- sidebar
53
- ? sidebarCollapsed
54
- ? sidebarWidthCollapsed
55
- : sidebarWidthExpanded
56
- : ''
57
- );
58
-
59
- let headerPadding = $derived(fixedHeader ? 'pt-16' : '');
60
- let bottomPadding = $derived(showBottomNav && bottomNav ? 'pb-16 md:pb-0' : '');
61
- </script>
62
-
63
- <div class="min-h-screen {variantBackgrounds[variant]}">
64
- <!-- Header -->
65
- {#if header}
66
- <header
67
- class="w-full z-30"
68
- class:fixed={fixedHeader}
69
- class:top-0={fixedHeader}
70
- class:left-0={fixedHeader}
71
- >
72
- {@render header()}
73
- </header>
74
- {/if}
75
-
76
- <!-- Sidebar -->
77
- {#if sidebar}
78
- <aside
79
- class="fixed top-0 left-0 z-20 h-screen transition-all duration-300 hidden md:block"
80
- class:w-64={!sidebarCollapsed}
81
- class:w-20={sidebarCollapsed}
82
- >
83
- {@render sidebar()}
84
- </aside>
85
- {/if}
86
-
87
- <!-- Main Content -->
88
- <main
89
- class="transition-all duration-300 {headerPadding} {mainMarginClass} {bottomPadding} {className}"
90
- >
91
- <div class="{variantBackgrounds[variant]} min-h-screen">
92
- {#if children}
93
- {@render children()}
94
- {/if}
95
- </div>
96
- </main>
97
-
98
- <!-- Bottom Navigation (Mobile) -->
99
- {#if showBottomNav && bottomNav}
100
- <nav class="fixed bottom-0 left-0 right-0 z-30 md:hidden">
101
- {@render bottomNav()}
102
- </nav>
103
- {/if}
104
- </div>
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ type Variant = 'admin' | 'performer' | 'public' | 'minimal';
5
+
6
+ interface Props {
7
+ /** Shell variant determines overall styling */
8
+ variant?: Variant;
9
+ /** Whether sidebar is collapsed (only for admin variant) */
10
+ sidebarCollapsed?: boolean;
11
+ /** Whether to show bottom navigation on mobile */
12
+ showBottomNav?: boolean;
13
+ /** Fixed header */
14
+ fixedHeader?: boolean;
15
+ /** Additional CSS classes for main content area */
16
+ class?: string;
17
+ /** Header slot */
18
+ header?: Snippet;
19
+ /** Sidebar slot (left side) */
20
+ sidebar?: Snippet;
21
+ /** Bottom navigation slot (mobile) */
22
+ bottomNav?: Snippet;
23
+ /** Main content */
24
+ children?: Snippet;
25
+ }
26
+
27
+ let {
28
+ variant = 'admin',
29
+ sidebarCollapsed = false,
30
+ showBottomNav = true,
31
+ fixedHeader = true,
32
+ class: className = '',
33
+ header,
34
+ sidebar,
35
+ bottomNav,
36
+ children,
37
+ }: Props = $props();
38
+
39
+ // Background classes based on variant
40
+ const variantBackgrounds: Record<Variant, string> = {
41
+ admin: 'bg-gray-50 dark:bg-gray-800',
42
+ performer: 'bg-gray-50 dark:bg-gray-800',
43
+ public: 'bg-white dark:bg-gray-900',
44
+ minimal: 'bg-white dark:bg-gray-900',
45
+ };
46
+
47
+ // Sidebar width classes
48
+ const sidebarWidthExpanded = 'md:ml-64';
49
+ const sidebarWidthCollapsed = 'md:ml-20';
50
+
51
+ let mainMarginClass = $derived(
52
+ sidebar
53
+ ? sidebarCollapsed
54
+ ? sidebarWidthCollapsed
55
+ : sidebarWidthExpanded
56
+ : ''
57
+ );
58
+
59
+ let headerPadding = $derived(fixedHeader ? 'pt-16' : '');
60
+ let bottomPadding = $derived(showBottomNav && bottomNav ? 'pb-16 md:pb-0' : '');
61
+ </script>
62
+
63
+ <div class="min-h-screen {variantBackgrounds[variant]}">
64
+ <!-- Header -->
65
+ {#if header}
66
+ <header
67
+ class="w-full z-30"
68
+ class:fixed={fixedHeader}
69
+ class:top-0={fixedHeader}
70
+ class:left-0={fixedHeader}
71
+ >
72
+ {@render header()}
73
+ </header>
74
+ {/if}
75
+
76
+ <!-- Sidebar -->
77
+ {#if sidebar}
78
+ <aside
79
+ class="fixed top-0 left-0 z-20 h-screen transition-all duration-300 hidden md:block"
80
+ class:w-64={!sidebarCollapsed}
81
+ class:w-20={sidebarCollapsed}
82
+ >
83
+ {@render sidebar()}
84
+ </aside>
85
+ {/if}
86
+
87
+ <!-- Main Content -->
88
+ <main
89
+ class="transition-all duration-300 {headerPadding} {mainMarginClass} {bottomPadding} {className}"
90
+ >
91
+ <div class="{variantBackgrounds[variant]} min-h-screen">
92
+ {#if children}
93
+ {@render children()}
94
+ {/if}
95
+ </div>
96
+ </main>
97
+
98
+ <!-- Bottom Navigation (Mobile) -->
99
+ {#if showBottomNav && bottomNav}
100
+ <nav class="fixed bottom-0 left-0 right-0 z-30 md:hidden">
101
+ {@render bottomNav()}
102
+ </nav>
103
+ {/if}
104
+ </div>
@@ -1,80 +1,80 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
-
4
- interface Props {
5
- /** Section title */
6
- title?: string;
7
- /** Optional subtitle */
8
- subtitle?: string;
9
- /** Heading level for the title (2-6) */
10
- headingLevel?: 2 | 3 | 4 | 5 | 6;
11
- /** Size variant for title */
12
- titleSize?: 'sm' | 'base' | 'lg' | 'xl';
13
- /** Spacing below the section */
14
- spacing?: 'none' | 'sm' | 'md' | 'lg';
15
- /** Additional CSS classes */
16
- class?: string;
17
- /** Action slot (buttons, links) */
18
- actions?: Snippet;
19
- /** Child content */
20
- children?: Snippet;
21
- }
22
-
23
- let {
24
- title = '',
25
- subtitle = '',
26
- headingLevel = 2,
27
- titleSize = 'lg',
28
- spacing = 'md',
29
- class: className = '',
30
- actions,
31
- children,
32
- }: Props = $props();
33
-
34
- const titleSizeClasses = {
35
- sm: 'text-base',
36
- base: 'text-lg',
37
- lg: 'text-xl',
38
- xl: 'text-2xl',
39
- };
40
-
41
- const spacingClasses = {
42
- none: '',
43
- sm: 'mb-4',
44
- md: 'mb-6',
45
- lg: 'mb-8',
46
- };
47
-
48
- let headingElement = $derived(`h${headingLevel}` as 'h2' | 'h3' | 'h4' | 'h5' | 'h6');
49
- </script>
50
-
51
- <section class="{spacingClasses[spacing]} {className}">
52
- {#if title || actions}
53
- <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 mb-4">
54
- <div>
55
- {#if title}
56
- <svelte:element
57
- this={headingElement}
58
- class="{titleSizeClasses[titleSize]} font-semibold text-gray-900 dark:text-white"
59
- >
60
- {title}
61
- </svelte:element>
62
- {/if}
63
- {#if subtitle}
64
- <p class="text-sm text-gray-500 dark:text-gray-400 mt-1">
65
- {subtitle}
66
- </p>
67
- {/if}
68
- </div>
69
- {#if actions}
70
- <div class="flex items-center gap-3 shrink-0">
71
- {@render actions()}
72
- </div>
73
- {/if}
74
- </div>
75
- {/if}
76
-
77
- {#if children}
78
- {@render children()}
79
- {/if}
80
- </section>
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ interface Props {
5
+ /** Section title */
6
+ title?: string;
7
+ /** Optional subtitle */
8
+ subtitle?: string;
9
+ /** Heading level for the title (2-6) */
10
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
11
+ /** Size variant for title */
12
+ titleSize?: 'sm' | 'base' | 'lg' | 'xl';
13
+ /** Spacing below the section */
14
+ spacing?: 'none' | 'sm' | 'md' | 'lg';
15
+ /** Additional CSS classes */
16
+ class?: string;
17
+ /** Action slot (buttons, links) */
18
+ actions?: Snippet;
19
+ /** Child content */
20
+ children?: Snippet;
21
+ }
22
+
23
+ let {
24
+ title = '',
25
+ subtitle = '',
26
+ headingLevel = 2,
27
+ titleSize = 'lg',
28
+ spacing = 'md',
29
+ class: className = '',
30
+ actions,
31
+ children,
32
+ }: Props = $props();
33
+
34
+ const titleSizeClasses = {
35
+ sm: 'text-base',
36
+ base: 'text-lg',
37
+ lg: 'text-xl',
38
+ xl: 'text-2xl',
39
+ };
40
+
41
+ const spacingClasses = {
42
+ none: '',
43
+ sm: 'mb-4',
44
+ md: 'mb-6',
45
+ lg: 'mb-8',
46
+ };
47
+
48
+ let headingElement = $derived(`h${headingLevel}` as 'h2' | 'h3' | 'h4' | 'h5' | 'h6');
49
+ </script>
50
+
51
+ <section class="{spacingClasses[spacing]} {className}">
52
+ {#if title || actions}
53
+ <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 mb-4">
54
+ <div>
55
+ {#if title}
56
+ <svelte:element
57
+ this={headingElement}
58
+ class="{titleSizeClasses[titleSize]} font-semibold text-gray-900 dark:text-white"
59
+ >
60
+ {title}
61
+ </svelte:element>
62
+ {/if}
63
+ {#if subtitle}
64
+ <p class="text-sm text-gray-500 dark:text-gray-400 mt-1">
65
+ {subtitle}
66
+ </p>
67
+ {/if}
68
+ </div>
69
+ {#if actions}
70
+ <div class="flex items-center gap-3 shrink-0">
71
+ {@render actions()}
72
+ </div>
73
+ {/if}
74
+ </div>
75
+ {/if}
76
+
77
+ {#if children}
78
+ {@render children()}
79
+ {/if}
80
+ </section>
@@ -95,7 +95,7 @@
95
95
  ].filter(Boolean).join(' ')
96
96
  );
97
97
  </script>
98
-
99
- <svelte:element this={as} class={classes} style={gridStyle || undefined}>
100
- {@render children?.()}
101
- </svelte:element>
98
+
99
+ <svelte:element this={as} class={classes} style={gridStyle || undefined}>
100
+ {@render children?.()}
101
+ </svelte:element>