@getmicdrop/svelte-components 5.8.0 → 5.8.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 (243) 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 +60 -58
  10. package/dist/components/Heading.svelte.d.ts +1 -0
  11. package/dist/components/Heading.svelte.d.ts.map +1 -1
  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/Text.svelte +53 -53
  27. package/dist/constants/validation.js +91 -91
  28. package/dist/constants/validation.spec.js +64 -64
  29. package/dist/datetime/__tests__/format.test.js +1 -1
  30. package/dist/datetime/__tests__/parse.test.js +1 -1
  31. package/dist/datetime/__tests__/timezone.test.js +1 -1
  32. package/dist/datetime/parse.js +1 -1
  33. package/dist/forms/createFormStore.svelte.js +1 -0
  34. package/dist/index.js +50 -50
  35. package/dist/patterns/data/DataGrid.svelte +45 -45
  36. package/dist/patterns/data/DataList.svelte +24 -24
  37. package/dist/patterns/data/DataTable.svelte +36 -36
  38. package/dist/patterns/forms/FormActions.spec.js +95 -95
  39. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  40. package/dist/patterns/forms/FormActions.svelte +46 -46
  41. package/dist/patterns/forms/FormGrid.svelte +33 -33
  42. package/dist/patterns/forms/FormSection.svelte +32 -32
  43. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  44. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  45. package/dist/patterns/layout/Sidebar.svelte +39 -39
  46. package/dist/patterns/layout/index.js +29 -29
  47. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  48. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  49. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  50. package/dist/patterns/navigation/Header.svelte +193 -193
  51. package/dist/patterns/page/PageHeader.svelte +18 -18
  52. package/dist/patterns/page/PageLayout.svelte +40 -40
  53. package/dist/patterns/page/PageLoader.spec.js +57 -57
  54. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  55. package/dist/patterns/page/PageLoader.svelte +24 -24
  56. package/dist/patterns/page/SectionHeader.svelte +29 -29
  57. package/dist/presets/badges.js +112 -112
  58. package/dist/presets/buttons.js +76 -76
  59. package/dist/presets/index.js +9 -9
  60. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  61. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  62. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  63. package/dist/primitives/Alert/Alert.spec.js +173 -173
  64. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  65. package/dist/primitives/Alert/Alert.svelte +27 -27
  66. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  67. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  68. package/dist/primitives/Badges/Badge.spec.js +144 -144
  69. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  70. package/dist/primitives/Badges/Badge.svelte +79 -79
  71. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  72. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  73. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  74. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  75. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  76. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  77. package/dist/primitives/Button/Button.spec.js +223 -223
  78. package/dist/primitives/Button/Button.stories.svelte +76 -76
  79. package/dist/primitives/Button/Button.svelte +270 -270
  80. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  81. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  82. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  83. package/dist/primitives/Card.spec.js +49 -49
  84. package/dist/primitives/Card.stories.svelte +22 -22
  85. package/dist/primitives/Card.svelte +28 -28
  86. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  87. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  88. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  89. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  90. package/dist/primitives/DarkModeToggle.svelte +136 -136
  91. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  92. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  93. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  94. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  95. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  96. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  97. package/dist/primitives/Helper/Helper.svelte +33 -33
  98. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  99. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  100. package/dist/primitives/Icons/Availability.svelte +14 -14
  101. package/dist/primitives/Icons/Back.svelte +14 -14
  102. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  103. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  104. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  105. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  106. package/dist/primitives/Icons/Copy.svelte +15 -15
  107. package/dist/primitives/Icons/Cross.svelte +5 -5
  108. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  109. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  110. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  111. package/dist/primitives/Icons/Home.svelte +15 -15
  112. package/dist/primitives/Icons/Icon.spec.js +169 -169
  113. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  114. package/dist/primitives/Icons/Icon.svelte +52 -52
  115. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  116. package/dist/primitives/Icons/Info.svelte +7 -7
  117. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  118. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  119. package/dist/primitives/Icons/Message.svelte +15 -15
  120. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  121. package/dist/primitives/Icons/More.svelte +21 -21
  122. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  123. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  124. package/dist/primitives/Icons/Notification.svelte +14 -14
  125. package/dist/primitives/Icons/Payment.svelte +14 -14
  126. package/dist/primitives/Icons/Profile.svelte +21 -21
  127. package/dist/primitives/Icons/Reload.svelte +29 -29
  128. package/dist/primitives/Icons/Shows.svelte +21 -21
  129. package/dist/primitives/Icons/Signout.svelte +21 -21
  130. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  131. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  132. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  133. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  134. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  135. package/dist/primitives/Input/Input.spec.js +573 -573
  136. package/dist/primitives/Input/Input.stories.svelte +139 -139
  137. package/dist/primitives/Input/Select.spec.js +212 -212
  138. package/dist/primitives/Input/Select.stories.svelte +112 -112
  139. package/dist/primitives/Input/Select.svelte +128 -128
  140. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  141. package/dist/primitives/Input/Textarea.svelte +35 -35
  142. package/dist/primitives/Label/Label.svelte +37 -37
  143. package/dist/primitives/Modal/Modal.spec.js +99 -99
  144. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  145. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  146. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  147. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  148. package/dist/primitives/Radio/Radio.svelte +67 -67
  149. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  150. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  151. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  152. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  153. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  154. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  155. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  156. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  157. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  158. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  159. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  160. package/dist/primitives/Toggle.spec.js +143 -143
  161. package/dist/primitives/Toggle.stories.svelte +92 -92
  162. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  163. package/dist/primitives/Typography/Typography.svelte +53 -53
  164. package/dist/primitives/ValidationError.spec.js +103 -103
  165. package/dist/primitives/ValidationError.stories.svelte +69 -69
  166. package/dist/primitives/ValidationError.svelte +29 -29
  167. package/dist/primitives/index.js +91 -91
  168. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  169. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  170. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  171. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  172. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  173. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  174. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  175. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  176. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  177. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  178. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  179. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  180. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  181. package/dist/recipes/fields/FormField.svelte +58 -58
  182. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  183. package/dist/recipes/fields/SelectField.svelte +80 -80
  184. package/dist/recipes/fields/TextareaField.svelte +97 -97
  185. package/dist/recipes/fields/ToggleField.svelte +60 -60
  186. package/dist/recipes/fields/index.js +7 -7
  187. package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
  188. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  189. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  190. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  191. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  192. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  193. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
  194. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  195. package/dist/recipes/inputs/Search.svelte +37 -37
  196. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  197. package/dist/recipes/modals/AlertModal.svelte +130 -130
  198. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  199. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  200. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  201. package/dist/recipes/modals/InputModal.svelte +182 -182
  202. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  203. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  204. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  205. package/dist/recipes/modals/StatusModal.svelte +206 -206
  206. package/dist/services/EventService.js +75 -75
  207. package/dist/services/EventService.spec.js +217 -217
  208. package/dist/services/ShowService.spec.js +345 -345
  209. package/dist/stores/index.d.ts +4 -4
  210. package/dist/stores/index.js +6 -7
  211. package/dist/stores/toaster.js +13 -13
  212. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  213. package/dist/stories/ButtonAuditReview.svelte +427 -427
  214. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  215. package/dist/stories/PatternsGallery.svelte +206 -206
  216. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  217. package/dist/stories/PrimitivesGallery.svelte +725 -725
  218. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  219. package/dist/stories/RecipesGallery.svelte +271 -271
  220. package/dist/stories/button-audit-manifest.json +11186 -11186
  221. package/dist/tailwind/preset.cjs +82 -82
  222. package/dist/telemetry.js +405 -405
  223. package/dist/telemetry.spec.js +1169 -1169
  224. package/dist/tokens/tokens.css +87 -87
  225. package/dist/tokens/typography-base.css +163 -163
  226. package/dist/tokens/utilities.css +353 -0
  227. package/dist/utils/apiConfig.spec.js +219 -219
  228. package/dist/utils/transitions.js +62 -62
  229. package/dist/utils/utils.js +354 -354
  230. package/package.json +296 -295
  231. package/dist/stores/auth.js +0 -44
  232. package/dist/stores/createFormStore.d.ts +0 -77
  233. package/dist/stores/createFormStore.d.ts.map +0 -1
  234. package/dist/stores/createFormStore.js +0 -410
  235. package/dist/stores/formDataStore.d.ts +0 -17
  236. package/dist/stores/formDataStore.d.ts.map +0 -1
  237. package/dist/stores/formDataStore.js +0 -33
  238. package/dist/stores/formSave.d.ts +0 -24
  239. package/dist/stores/formSave.d.ts.map +0 -1
  240. package/dist/stores/formSave.js +0 -140
  241. package/dist/stores/navigation.d.ts +0 -5
  242. package/dist/stores/navigation.d.ts.map +0 -1
  243. package/dist/stores/navigation.js +0 -20
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module datetime/parse
8
8
  */
9
- import { format } from 'date-fns';
9
+ import { format, parse } from 'date-fns';
10
10
  import { fromZonedTime, toZonedTime } from 'date-fns-tz';
11
11
  import { DATE_FORMATS } from './constants';
12
12
  import { isValidTimezone } from './timezone';
@@ -7,6 +7,7 @@
7
7
  * - UI states (loading, saving, saved)
8
8
  * - Section-level validation for progressive forms
9
9
  */
10
+ import { z } from 'zod';
10
11
  // ============================================================================
11
12
  // Implementation
12
13
  // ============================================================================
package/dist/index.js CHANGED
@@ -1,50 +1,50 @@
1
- // =============================================================================
2
- // PRIMITIVES - Pure visual components (Layer 1)
3
- // =============================================================================
4
-
5
- export * from './primitives/index.js';
6
-
7
- // =============================================================================
8
- // COMPONENTS - Semantic wrappers and layout components
9
- // =============================================================================
10
-
11
- export * from './components/index.js';
12
-
13
- // =============================================================================
14
- // RECIPES - Domain-agnostic compositions (Layer 2)
15
- // =============================================================================
16
-
17
- export * from './recipes/index.js';
18
-
19
- // =============================================================================
20
- // PATTERNS - Layout & flow components (Layer 3)
21
- // =============================================================================
22
-
23
- export * from './patterns/index.js';
24
-
25
- // =============================================================================
26
- // CALENDAR - Domain components (deferred migration to apps)
27
- // =============================================================================
28
-
29
- export * from './calendar/index.js';
30
-
31
- // =============================================================================
32
- // NON-COMPONENT EXPORTS
33
- // =============================================================================
34
-
35
- // Note: config.js and telemetry.js removed - they use import.meta.env which
36
- // is Vite-specific. Apps should define their own config/telemetry locally.
37
-
38
- // Constants
39
- export * from './constants/formOptions.js';
40
- export * from './constants/validation.js';
41
-
42
- // Presets - Domain-to-color mappings for migration
43
- export * from './presets/index.js';
44
-
45
- // Utils / Actions
46
- export { portal } from './utils/portal.js';
47
- export { safeSlide } from './utils/transitions.js';
48
-
49
- // Design Tokens
50
- export { typography } from './tokens/typography.js';
1
+ // =============================================================================
2
+ // PRIMITIVES - Pure visual components (Layer 1)
3
+ // =============================================================================
4
+
5
+ export * from './primitives/index.js';
6
+
7
+ // =============================================================================
8
+ // COMPONENTS - Semantic wrappers and layout components
9
+ // =============================================================================
10
+
11
+ export * from './components/index.js';
12
+
13
+ // =============================================================================
14
+ // RECIPES - Domain-agnostic compositions (Layer 2)
15
+ // =============================================================================
16
+
17
+ export * from './recipes/index.js';
18
+
19
+ // =============================================================================
20
+ // PATTERNS - Layout & flow components (Layer 3)
21
+ // =============================================================================
22
+
23
+ export * from './patterns/index.js';
24
+
25
+ // =============================================================================
26
+ // CALENDAR - Domain components (deferred migration to apps)
27
+ // =============================================================================
28
+
29
+ export * from './calendar/index.js';
30
+
31
+ // =============================================================================
32
+ // NON-COMPONENT EXPORTS
33
+ // =============================================================================
34
+
35
+ // Note: config.js and telemetry.js removed - they use import.meta.env which
36
+ // is Vite-specific. Apps should define their own config/telemetry locally.
37
+
38
+ // Constants
39
+ export * from './constants/formOptions.js';
40
+ export * from './constants/validation.js';
41
+
42
+ // Presets - Domain-to-color mappings for migration
43
+ export * from './presets/index.js';
44
+
45
+ // Utils / Actions
46
+ export { portal } from './utils/portal.js';
47
+ export { safeSlide } from './utils/transitions.js';
48
+
49
+ // Design Tokens
50
+ export { typography } from './tokens/typography.js';
@@ -1,45 +1,45 @@
1
- <script>
2
- let {
3
- items = [],
4
- cols = 3,
5
- gap = 4,
6
- minWidth = null,
7
- class: className = '',
8
- children,
9
- } = $props();
10
-
11
- const colsClasses = {
12
- 1: 'grid-cols-1',
13
- 2: 'grid-cols-1 sm:grid-cols-2',
14
- 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',
15
- 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',
16
- 5: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5',
17
- 6: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6'
18
- };
19
-
20
- const gapClasses = {
21
- 2: 'gap-2',
22
- 3: 'gap-3',
23
- 4: 'gap-4',
24
- 5: 'gap-5',
25
- 6: 'gap-6',
26
- 8: 'gap-8'
27
- };
28
-
29
- let gridCols = $derived(colsClasses[cols] || colsClasses[3]);
30
- let gridGap = $derived(gapClasses[gap] || gapClasses[4]);
31
- let gridStyle = $derived(minWidth ? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr))` : '');
32
- </script>
33
-
34
- <div
35
- class="grid {minWidth ? '' : gridCols} {gridGap} {className}"
36
- style={gridStyle}
37
- >
38
- {#if items.length > 0}
39
- {#each items as item, index}
40
- {@render children?.(item, index)}
41
- {/each}
42
- {:else}
43
- {@render children?.()}
44
- {/if}
45
- </div>
1
+ <script>
2
+ let {
3
+ items = [],
4
+ cols = 3,
5
+ gap = 4,
6
+ minWidth = null,
7
+ class: className = '',
8
+ children,
9
+ } = $props();
10
+
11
+ const colsClasses = {
12
+ 1: 'grid-cols-1',
13
+ 2: 'grid-cols-1 sm:grid-cols-2',
14
+ 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',
15
+ 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',
16
+ 5: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5',
17
+ 6: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6'
18
+ };
19
+
20
+ const gapClasses = {
21
+ 2: 'gap-2',
22
+ 3: 'gap-3',
23
+ 4: 'gap-4',
24
+ 5: 'gap-5',
25
+ 6: 'gap-6',
26
+ 8: 'gap-8'
27
+ };
28
+
29
+ let gridCols = $derived(colsClasses[cols] || colsClasses[3]);
30
+ let gridGap = $derived(gapClasses[gap] || gapClasses[4]);
31
+ let gridStyle = $derived(minWidth ? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr))` : '');
32
+ </script>
33
+
34
+ <div
35
+ class="grid {minWidth ? '' : gridCols} {gridGap} {className}"
36
+ style={gridStyle}
37
+ >
38
+ {#if items.length > 0}
39
+ {#each items as item, index}
40
+ {@render children?.(item, index)}
41
+ {/each}
42
+ {:else}
43
+ {@render children?.()}
44
+ {/if}
45
+ </div>
@@ -1,24 +1,24 @@
1
- <script>
2
- let {
3
- items = [],
4
- dividers = true,
5
- gap = 0,
6
- class: className = '',
7
- children,
8
- } = $props();
9
-
10
- let gapClass = $derived(gap > 0 ? `space-y-${gap}` : '');
11
- let dividerClass = $derived(dividers && gap === 0 ? 'divide-y divide-gray-200 dark:divide-gray-700' : '');
12
- </script>
13
-
14
- <ul class="{dividerClass} {gapClass} {className}" role="list">
15
- {#if items.length > 0}
16
- {#each items as item, index}
17
- <li class="py-3 first:pt-0 last:pb-0">
18
- {@render children?.(item, index)}
19
- </li>
20
- {/each}
21
- {:else}
22
- {@render children?.()}
23
- {/if}
24
- </ul>
1
+ <script>
2
+ let {
3
+ items = [],
4
+ dividers = true,
5
+ gap = 0,
6
+ class: className = '',
7
+ children,
8
+ } = $props();
9
+
10
+ let gapClass = $derived(gap > 0 ? `space-y-${gap}` : '');
11
+ let dividerClass = $derived(dividers && gap === 0 ? 'divide-y divide-gray-200 dark:divide-gray-700' : '');
12
+ </script>
13
+
14
+ <ul class="{dividerClass} {gapClass} {className}" role="list">
15
+ {#if items.length > 0}
16
+ {#each items as item, index}
17
+ <li class="py-3 first:pt-0 last:pb-0">
18
+ {@render children?.(item, index)}
19
+ </li>
20
+ {/each}
21
+ {:else}
22
+ {@render children?.()}
23
+ {/if}
24
+ </ul>
@@ -1,39 +1,39 @@
1
- <script>
2
- import { typography } from '../../tokens/typography';
3
-
4
- let {
5
- striped = false,
6
- hoverable = true,
7
- bordered = false,
8
- size = 'md',
9
- class: className = '',
10
- header,
11
- children,
12
- } = $props();
13
-
14
- const sizeClasses = {
15
- sm: 'px-3 py-2 text-xs',
16
- md: 'px-4 py-3 text-sm',
17
- lg: 'px-6 py-4 text-base'
18
- };
19
-
20
- let cellSize = $derived(sizeClasses[size] || sizeClasses.md);
21
- </script>
22
-
23
- <div class="overflow-x-auto rounded-lg border border-gray-200 dark:border-gray-700 {className}">
24
- <table class={`w-full text-left ${typography.textMuted}`}>
25
- {#if header}
26
- <thead class={`text-xs uppercase bg-gray-50 dark:bg-gray-700 ${typography.textMuted}`}>
27
- {@render header(cellSize)}
28
- </thead>
29
- {/if}
30
-
31
- <tbody class="divide-y divide-gray-200 dark:divide-gray-700 {striped ? '[&>tr:nth-child(odd)]:bg-gray-50 dark:[&>tr:nth-child(odd)]:bg-gray-800' : ''} {hoverable ? '[&>tr]:hover:bg-gray-50 dark:[&>tr]:hover:bg-gray-700' : ''} {bordered ? '[&_td]:border-x [&_td]:border-gray-200 dark:[&_td]:border-gray-700' : ''}">
32
- {@render children?.(cellSize)}
33
- </tbody>
34
- </table>
35
- </div>
36
-
1
+ <script>
2
+ import { typography } from '../../tokens/typography';
3
+
4
+ let {
5
+ striped = false,
6
+ hoverable = true,
7
+ bordered = false,
8
+ size = 'md',
9
+ class: className = '',
10
+ header,
11
+ children,
12
+ } = $props();
13
+
14
+ const sizeClasses = {
15
+ sm: 'px-3 py-2 text-xs',
16
+ md: 'px-4 py-3 text-sm',
17
+ lg: 'px-6 py-4 text-base'
18
+ };
19
+
20
+ let cellSize = $derived(sizeClasses[size] || sizeClasses.md);
21
+ </script>
22
+
23
+ <div class="overflow-x-auto rounded-lg border border-gray-200 dark:border-gray-700 {className}">
24
+ <table class={`w-full text-left ${typography.textMuted}`}>
25
+ {#if header}
26
+ <thead class={`text-xs uppercase bg-gray-50 dark:bg-gray-700 ${typography.textMuted}`}>
27
+ {@render header(cellSize)}
28
+ </thead>
29
+ {/if}
30
+
31
+ <tbody class="divide-y divide-gray-200 dark:divide-gray-700 {striped ? '[&>tr:nth-child(odd)]:bg-gray-50 dark:[&>tr:nth-child(odd)]:bg-gray-800' : ''} {hoverable ? '[&>tr]:hover:bg-gray-50 dark:[&>tr]:hover:bg-gray-700' : ''} {bordered ? '[&_td]:border-x [&_td]:border-gray-200 dark:[&_td]:border-gray-700' : ''}">
32
+ {@render children?.(cellSize)}
33
+ </tbody>
34
+ </table>
35
+ </div>
36
+
37
37
  <style>
38
38
  :global(table th),
39
39
  :global(table td) {
@@ -1,95 +1,95 @@
1
- import { render, screen, fireEvent } from "@testing-library/svelte";
2
- import userEvent from "@testing-library/user-event";
3
- import { expect, describe, test, vi } from "vitest";
4
- import FormActions from "./FormActions.svelte";
5
-
6
- function setupTest(args = {}) {
7
- const user = userEvent.setup();
8
- const { component, container } = render(FormActions, {
9
- props: {
10
- onCancel: vi.fn(),
11
- onSubmit: vi.fn(),
12
- ...args,
13
- },
14
- });
15
- return { user, component, container };
16
- }
17
-
18
- describe("FormActions Component Tests", () => {
19
- test("Renders submit and cancel buttons", () => {
20
- setupTest();
21
- expect(screen.getByText("Save")).toBeInTheDocument();
22
- expect(screen.getByText("Cancel")).toBeInTheDocument();
23
- });
24
-
25
- test("Uses custom button labels", () => {
26
- setupTest({ submitLabel: "Update", cancelLabel: "Discard" });
27
- expect(screen.getByText("Update")).toBeInTheDocument();
28
- expect(screen.getByText("Discard")).toBeInTheDocument();
29
- });
30
-
31
- test("Calls onSubmit when submit button clicked", async () => {
32
- const onSubmit = vi.fn();
33
- const { user } = setupTest({ onSubmit });
34
-
35
- await user.click(screen.getByText("Save"));
36
- expect(onSubmit).toHaveBeenCalledTimes(1);
37
- });
38
-
39
- test("Calls onCancel when cancel button clicked", async () => {
40
- const onCancel = vi.fn();
41
- const { user } = setupTest({ onCancel });
42
-
43
- await user.click(screen.getByText("Cancel"));
44
- expect(onCancel).toHaveBeenCalledTimes(1);
45
- });
46
-
47
- test("Submit button shows loading state", () => {
48
- setupTest({ isSubmitting: true });
49
- const submitBtn = screen.getByText("Save").closest("button, a");
50
- expect(submitBtn).toBeDisabled();
51
- });
52
-
53
- test("Submit button shows success state", () => {
54
- setupTest({ isSuccess: true });
55
- const submitBtn = screen.getByText("Save").closest("button, a");
56
- // Check for success variant classes (green background)
57
- expect(submitBtn).toHaveClass("bg-green-600");
58
- expect(submitBtn).toHaveClass("border-green-600");
59
- });
60
-
61
- test("Submit button is disabled when disabled prop is true", () => {
62
- setupTest({ disabled: true });
63
- const submitBtn = screen.getByText("Save").closest("button, a");
64
- expect(submitBtn).toBeDisabled();
65
- });
66
-
67
- test("Hides cancel button when showCancel is false", () => {
68
- setupTest({ showCancel: false });
69
- expect(screen.queryByText("Cancel")).not.toBeInTheDocument();
70
- });
71
-
72
- test("Uses custom submit variant", () => {
73
- setupTest({ submitVariant: "red-solid" });
74
- const submitBtn = screen.getByText("Save").closest("button, a");
75
- // Check for red variant classes (red-solid maps to "red" variant)
76
- expect(submitBtn).toHaveClass("bg-red-700");
77
- expect(submitBtn).toHaveClass("border-red-700");
78
- });
79
-
80
- test("Uses custom cancel variant", () => {
81
- setupTest({ cancelVariant: "blue-outline" });
82
- const cancelBtn = screen.getByText("Cancel").closest("button, a");
83
- // Check for outline variant classes (blue-outline maps to "outline" variant)
84
- expect(cancelBtn).toHaveClass("text-blue-700");
85
- expect(cancelBtn).toHaveClass("border-blue-700");
86
- expect(cancelBtn).toHaveClass("bg-transparent");
87
- });
88
-
89
- test("Has responsive layout classes", () => {
90
- const { container } = setupTest();
91
- const wrapper = container.firstChild;
92
- expect(wrapper).toHaveClass("w-full");
93
- expect(wrapper).toHaveClass("flex");
94
- });
95
- });
1
+ import { render, screen, fireEvent } from "@testing-library/svelte";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { expect, describe, test, vi } from "vitest";
4
+ import FormActions from "./FormActions.svelte";
5
+
6
+ function setupTest(args = {}) {
7
+ const user = userEvent.setup();
8
+ const { component, container } = render(FormActions, {
9
+ props: {
10
+ onCancel: vi.fn(),
11
+ onSubmit: vi.fn(),
12
+ ...args,
13
+ },
14
+ });
15
+ return { user, component, container };
16
+ }
17
+
18
+ describe("FormActions Component Tests", () => {
19
+ test("Renders submit and cancel buttons", () => {
20
+ setupTest();
21
+ expect(screen.getByText("Save")).toBeInTheDocument();
22
+ expect(screen.getByText("Cancel")).toBeInTheDocument();
23
+ });
24
+
25
+ test("Uses custom button labels", () => {
26
+ setupTest({ submitLabel: "Update", cancelLabel: "Discard" });
27
+ expect(screen.getByText("Update")).toBeInTheDocument();
28
+ expect(screen.getByText("Discard")).toBeInTheDocument();
29
+ });
30
+
31
+ test("Calls onSubmit when submit button clicked", async () => {
32
+ const onSubmit = vi.fn();
33
+ const { user } = setupTest({ onSubmit });
34
+
35
+ await user.click(screen.getByText("Save"));
36
+ expect(onSubmit).toHaveBeenCalledTimes(1);
37
+ });
38
+
39
+ test("Calls onCancel when cancel button clicked", async () => {
40
+ const onCancel = vi.fn();
41
+ const { user } = setupTest({ onCancel });
42
+
43
+ await user.click(screen.getByText("Cancel"));
44
+ expect(onCancel).toHaveBeenCalledTimes(1);
45
+ });
46
+
47
+ test("Submit button shows loading state", () => {
48
+ setupTest({ isSubmitting: true });
49
+ const submitBtn = screen.getByText("Save").closest("button, a");
50
+ expect(submitBtn).toBeDisabled();
51
+ });
52
+
53
+ test("Submit button shows success state", () => {
54
+ setupTest({ isSuccess: true });
55
+ const submitBtn = screen.getByText("Save").closest("button, a");
56
+ // Check for success variant classes (green background)
57
+ expect(submitBtn).toHaveClass("bg-green-600");
58
+ expect(submitBtn).toHaveClass("border-green-600");
59
+ });
60
+
61
+ test("Submit button is disabled when disabled prop is true", () => {
62
+ setupTest({ disabled: true });
63
+ const submitBtn = screen.getByText("Save").closest("button, a");
64
+ expect(submitBtn).toBeDisabled();
65
+ });
66
+
67
+ test("Hides cancel button when showCancel is false", () => {
68
+ setupTest({ showCancel: false });
69
+ expect(screen.queryByText("Cancel")).not.toBeInTheDocument();
70
+ });
71
+
72
+ test("Uses custom submit variant", () => {
73
+ setupTest({ submitVariant: "red-solid" });
74
+ const submitBtn = screen.getByText("Save").closest("button, a");
75
+ // Check for red variant classes (red-solid maps to "red" variant)
76
+ expect(submitBtn).toHaveClass("bg-red-700");
77
+ expect(submitBtn).toHaveClass("border-red-700");
78
+ });
79
+
80
+ test("Uses custom cancel variant", () => {
81
+ setupTest({ cancelVariant: "blue-outline" });
82
+ const cancelBtn = screen.getByText("Cancel").closest("button, a");
83
+ // Check for outline variant classes (blue-outline maps to "outline" variant)
84
+ expect(cancelBtn).toHaveClass("text-blue-700");
85
+ expect(cancelBtn).toHaveClass("border-blue-700");
86
+ expect(cancelBtn).toHaveClass("bg-transparent");
87
+ });
88
+
89
+ test("Has responsive layout classes", () => {
90
+ const { container } = setupTest();
91
+ const wrapper = container.firstChild;
92
+ expect(wrapper).toHaveClass("w-full");
93
+ expect(wrapper).toHaveClass("flex");
94
+ });
95
+ });