@getmicdrop/svelte-components 5.4.2 → 5.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) 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/Layout/Grid.svelte +4 -4
  10. package/dist/components/Layout/Section.svelte +80 -80
  11. package/dist/components/Layout/Sidebar.svelte +108 -108
  12. package/dist/components/Layout/Stack.svelte +6 -6
  13. package/dist/constants/validation.js +91 -91
  14. package/dist/constants/validation.spec.js +64 -64
  15. package/dist/index.d.ts +112 -4
  16. package/dist/index.js +225 -47
  17. package/dist/patterns/data/DataGrid.svelte +45 -45
  18. package/dist/patterns/data/DataList.svelte +24 -24
  19. package/dist/patterns/data/DataTable.svelte +36 -36
  20. package/dist/patterns/forms/FormActions.spec.js +88 -88
  21. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  22. package/dist/patterns/forms/FormActions.svelte +46 -46
  23. package/dist/patterns/forms/FormGrid.svelte +33 -33
  24. package/dist/patterns/forms/FormSection.svelte +32 -32
  25. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  26. package/dist/patterns/forms/FormValidationSummary.svelte +32 -32
  27. package/dist/patterns/layout/Sidebar.svelte +39 -39
  28. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  29. package/dist/patterns/navigation/BottomNav.svelte +20 -20
  30. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  31. package/dist/patterns/navigation/Header.svelte +193 -193
  32. package/dist/patterns/page/PageHeader.svelte +18 -18
  33. package/dist/patterns/page/PageLayout.svelte +40 -40
  34. package/dist/patterns/page/PageLoader.spec.js +54 -54
  35. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  36. package/dist/patterns/page/PageLoader.svelte +24 -24
  37. package/dist/patterns/page/SectionHeader.svelte +29 -29
  38. package/dist/presets/badges.js +112 -112
  39. package/dist/presets/buttons.js +76 -76
  40. package/dist/presets/index.js +9 -9
  41. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  42. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  43. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  44. package/dist/primitives/Alert/Alert.spec.js +170 -170
  45. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  46. package/dist/primitives/Alert/Alert.svelte +27 -27
  47. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  48. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  49. package/dist/primitives/Badges/Badge.spec.js +103 -103
  50. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  51. package/dist/primitives/Badges/Badge.svelte +79 -79
  52. package/dist/primitives/BottomSheet/BottomSheet.spec.js +127 -127
  53. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  54. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  55. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +120 -120
  56. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  57. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  58. package/dist/primitives/Button/Button.spec.js +211 -211
  59. package/dist/primitives/Button/Button.stories.svelte +76 -76
  60. package/dist/primitives/Button/Button.svelte +270 -269
  61. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  62. package/dist/primitives/Button/ButtonSaveDemo.spec.js +48 -48
  63. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  64. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  65. package/dist/primitives/Card.spec.js +49 -49
  66. package/dist/primitives/Card.stories.svelte +22 -22
  67. package/dist/primitives/Card.svelte +28 -28
  68. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  69. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  70. package/dist/primitives/DarkModeToggle.spec.js +357 -357
  71. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  72. package/dist/primitives/DarkModeToggle.svelte +136 -136
  73. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  74. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  75. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  76. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  77. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  78. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  79. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  80. package/dist/primitives/Icons/Availability.svelte +14 -14
  81. package/dist/primitives/Icons/Back.svelte +14 -14
  82. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  83. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  84. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  85. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  86. package/dist/primitives/Icons/Copy.svelte +15 -15
  87. package/dist/primitives/Icons/Cross.svelte +5 -5
  88. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  89. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  90. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  91. package/dist/primitives/Icons/Home.svelte +15 -15
  92. package/dist/primitives/Icons/Icon.spec.js +169 -169
  93. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  94. package/dist/primitives/Icons/Icon.svelte +52 -52
  95. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  96. package/dist/primitives/Icons/Info.svelte +7 -7
  97. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  98. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  99. package/dist/primitives/Icons/Message.svelte +15 -15
  100. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  101. package/dist/primitives/Icons/More.svelte +21 -21
  102. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  103. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  104. package/dist/primitives/Icons/Notification.svelte +14 -14
  105. package/dist/primitives/Icons/Payment.svelte +14 -14
  106. package/dist/primitives/Icons/Profile.svelte +21 -21
  107. package/dist/primitives/Icons/Reload.svelte +29 -29
  108. package/dist/primitives/Icons/Shows.svelte +21 -21
  109. package/dist/primitives/Icons/Signout.svelte +21 -21
  110. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  111. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  112. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  113. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  114. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  115. package/dist/primitives/Input/Input.spec.js +573 -573
  116. package/dist/primitives/Input/Input.stories.svelte +139 -139
  117. package/dist/primitives/Input/Input.svelte +391 -391
  118. package/dist/primitives/Input/Select.spec.js +218 -218
  119. package/dist/primitives/Input/Select.stories.svelte +112 -112
  120. package/dist/primitives/Input/Select.svelte +128 -128
  121. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  122. package/dist/primitives/Input/Textarea.svelte +35 -35
  123. package/dist/primitives/Label/Label.svelte +37 -37
  124. package/dist/primitives/Modal/Modal.spec.js +95 -95
  125. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  126. package/dist/primitives/Modal/Modal.svelte +158 -158
  127. package/dist/primitives/NumberInput/NumberInput.svelte +106 -0
  128. package/dist/primitives/NumberInput/NumberInput.svelte.d.ts +23 -0
  129. package/dist/primitives/NumberInput/NumberInput.svelte.d.ts.map +1 -0
  130. package/dist/primitives/NumberInput/index.d.ts +2 -0
  131. package/dist/primitives/NumberInput/index.d.ts.map +1 -0
  132. package/dist/primitives/NumberInput/index.js +1 -0
  133. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  134. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  135. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  136. package/dist/primitives/Radio/Radio.svelte +67 -67
  137. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  138. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  139. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  140. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  141. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  142. package/dist/primitives/Spinner/Spinner.spec.js +75 -75
  143. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  144. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  145. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  146. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  147. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  148. package/dist/primitives/Toggle.spec.js +127 -127
  149. package/dist/primitives/Toggle.stories.svelte +92 -92
  150. package/dist/primitives/Toggle.svelte +71 -71
  151. package/dist/primitives/Typography/Typography.svelte +53 -53
  152. package/dist/primitives/ValidationError.spec.js +103 -103
  153. package/dist/primitives/ValidationError.stories.svelte +69 -69
  154. package/dist/primitives/ValidationError.svelte +29 -29
  155. package/dist/recipes/CropImage/CropImage.spec.js +216 -216
  156. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  157. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  158. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  159. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  160. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  161. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  162. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  163. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  164. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  165. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +129 -129
  166. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  167. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  168. package/dist/recipes/fields/FormField.svelte +58 -58
  169. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  170. package/dist/recipes/fields/SelectField.svelte +80 -80
  171. package/dist/recipes/fields/TextareaField.svelte +97 -97
  172. package/dist/recipes/fields/ToggleField.svelte +60 -60
  173. package/dist/recipes/fields/index.js +7 -7
  174. package/dist/recipes/inputs/MultiSelect.spec.js +257 -257
  175. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  176. package/dist/recipes/inputs/MultiSelect.svelte +249 -276
  177. package/dist/recipes/inputs/MultiSelect.svelte.d.ts +28 -17
  178. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  179. package/dist/recipes/inputs/OTPInput.spec.js +238 -238
  180. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  181. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  182. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  183. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
  184. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +42 -42
  185. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
  186. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  187. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
  188. package/dist/recipes/inputs/Search.svelte +37 -37
  189. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  190. package/dist/recipes/modals/AlertModal.svelte +130 -130
  191. package/dist/recipes/modals/ConfirmationModal.spec.js +191 -191
  192. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  193. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  194. package/dist/recipes/modals/InputModal.svelte +182 -182
  195. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  196. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  197. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  198. package/dist/recipes/modals/StatusModal.svelte +206 -206
  199. package/dist/services/EventService.js +75 -75
  200. package/dist/services/EventService.spec.js +217 -217
  201. package/dist/services/ShowService.spec.js +342 -342
  202. package/dist/stores/auth.js +36 -36
  203. package/dist/stores/auth.spec.js +139 -139
  204. package/dist/stores/toaster.js +13 -13
  205. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  206. package/dist/stories/ButtonAuditReview.svelte +427 -427
  207. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  208. package/dist/stories/PatternsGallery.svelte +206 -206
  209. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  210. package/dist/stories/PrimitivesGallery.svelte +725 -725
  211. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  212. package/dist/stories/RecipesGallery.svelte +271 -271
  213. package/dist/stories/button-audit-manifest.json +11186 -11186
  214. package/dist/tailwind/preset.cjs +82 -82
  215. package/dist/tokens/tokens.css +87 -87
  216. package/dist/utils/utils.js +354 -354
  217. package/package.json +283 -283
@@ -1,19 +1,19 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import RecipesGallery from './RecipesGallery.svelte';
4
-
5
- const { Story } = defineMeta({
6
- title: 'Visual Galleries/Recipes',
7
- component: RecipesGallery,
8
- parameters: {
9
- layout: 'fullscreen',
10
- docs: {
11
- description: {
12
- component: 'Complete visual gallery of all recipe components (Layer 2) - Domain-agnostic compositions.',
13
- },
14
- },
15
- },
16
- });
17
- </script>
18
-
19
- <Story name="All Recipes" />
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import RecipesGallery from './RecipesGallery.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'Visual Galleries/Recipes',
7
+ component: RecipesGallery,
8
+ parameters: {
9
+ layout: 'fullscreen',
10
+ docs: {
11
+ description: {
12
+ component: 'Complete visual gallery of all recipe components (Layer 2) - Domain-agnostic compositions.',
13
+ },
14
+ },
15
+ },
16
+ });
17
+ </script>
18
+
19
+ <Story name="All Recipes" />
@@ -1,80 +1,80 @@
1
- <script lang="ts">
2
- // ============================================================================
3
- // RECIPES VISUAL GALLERY
4
- // Displays ALL recipe components (Layer 2) - Domain-agnostic compositions
5
- // ============================================================================
6
-
7
- // Feedback
8
- import EmptyState from '../recipes/feedback/EmptyState/EmptyState.svelte';
9
- import ErrorDisplay from '../recipes/feedback/ErrorDisplay.svelte';
10
- import StatusIndicator from '../recipes/feedback/StatusIndicator/StatusIndicator.svelte';
11
-
12
- // Inputs
13
- import MultiSelect from '../recipes/inputs/MultiSelect.svelte';
14
- import OTPInput from '../recipes/inputs/OTPInput.svelte';
15
- import PasswordInput from '../recipes/inputs/PasswordInput.svelte';
16
- import PasswordStrengthIndicator from '../recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte';
17
- import Search from '../recipes/inputs/Search.svelte';
18
- import SelectDropdown from '../recipes/inputs/SelectDropdown.svelte';
19
-
20
- // Modals
21
- import AlertModal from '../recipes/modals/AlertModal.svelte';
22
- import ConfirmationModal from '../recipes/modals/ConfirmationModal.svelte';
23
- import InputModal from '../recipes/modals/InputModal.svelte';
24
- import StatusModal from '../recipes/modals/StatusModal.svelte';
25
-
26
- // Fields
27
- import CheckboxField from '../recipes/fields/CheckboxField.svelte';
28
- import FormField from '../recipes/fields/FormField.svelte';
29
- import RadioGroup from '../recipes/fields/RadioGroup.svelte';
30
- import SelectField from '../recipes/fields/SelectField.svelte';
31
- import TextareaField from '../recipes/fields/TextareaField.svelte';
32
- import ToggleField from '../recipes/fields/ToggleField.svelte';
33
-
34
- // Primitives for demos
35
- import Button from '../primitives/Button/Button.svelte';
36
- import Card from '../primitives/Card.svelte';
37
-
38
- // State
39
- let isDark = $state(false);
40
-
41
- // Modal states
42
- let showAlertModal = $state(false);
43
- let showConfirmModal = $state(false);
44
- let showInputModal = $state(false);
45
- let showStatusModal = $state(false);
46
- let statusModalType = $state<'success' | 'error' | 'loading'>('success');
47
-
1
+ <script lang="ts">
2
+ // ============================================================================
3
+ // RECIPES VISUAL GALLERY
4
+ // Displays ALL recipe components (Layer 2) - Domain-agnostic compositions
5
+ // ============================================================================
6
+
7
+ // Feedback
8
+ import EmptyState from '../recipes/feedback/EmptyState/EmptyState.svelte';
9
+ import ErrorDisplay from '../recipes/feedback/ErrorDisplay.svelte';
10
+ import StatusIndicator from '../recipes/feedback/StatusIndicator/StatusIndicator.svelte';
11
+
12
+ // Inputs
13
+ import MultiSelect from '../recipes/inputs/MultiSelect.svelte';
14
+ import OTPInput from '../recipes/inputs/OTPInput.svelte';
15
+ import PasswordInput from '../recipes/inputs/PasswordInput.svelte';
16
+ import PasswordStrengthIndicator from '../recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte';
17
+ import Search from '../recipes/inputs/Search.svelte';
18
+ import SelectDropdown from '../recipes/inputs/SelectDropdown.svelte';
19
+
20
+ // Modals
21
+ import AlertModal from '../recipes/modals/AlertModal.svelte';
22
+ import ConfirmationModal from '../recipes/modals/ConfirmationModal.svelte';
23
+ import InputModal from '../recipes/modals/InputModal.svelte';
24
+ import StatusModal from '../recipes/modals/StatusModal.svelte';
25
+
26
+ // Fields
27
+ import CheckboxField from '../recipes/fields/CheckboxField.svelte';
28
+ import FormField from '../recipes/fields/FormField.svelte';
29
+ import RadioGroup from '../recipes/fields/RadioGroup.svelte';
30
+ import SelectField from '../recipes/fields/SelectField.svelte';
31
+ import TextareaField from '../recipes/fields/TextareaField.svelte';
32
+ import ToggleField from '../recipes/fields/ToggleField.svelte';
33
+
34
+ // Primitives for demos
35
+ import Button from '../primitives/Button/Button.svelte';
36
+ import Card from '../primitives/Card.svelte';
37
+
38
+ // State
39
+ let isDark = $state(false);
40
+
41
+ // Modal states
42
+ let showAlertModal = $state(false);
43
+ let showConfirmModal = $state(false);
44
+ let showInputModal = $state(false);
45
+ let showStatusModal = $state(false);
46
+ let statusModalType = $state<'success' | 'error' | 'loading'>('success');
47
+
48
48
  // Input states
49
49
  let otpValue = $state<string[]>(['', '', '', '', '', '']); // OTPInput expects string[]
50
50
  let passwordValue = $state('');
51
51
  let searchValue = $state('');
52
52
  let multiSelectValue = $state<string[]>([]);
53
53
  let selectDropdownValue = $state<{label: string, value: string} | null>(null); // SelectDropdown expects object
54
-
55
- // Field states
56
- let checkboxChecked = $state(false);
57
- let toggleChecked = $state(false);
58
- let radioValue = $state('');
59
- let textareaValue = $state('');
60
- let selectFieldValue = $state('');
61
- let formFieldValue = $state('');
62
-
63
- function toggleDark() {
64
- isDark = !isDark;
65
- document.documentElement.classList.toggle('dark', isDark);
66
- }
67
-
68
- // Section styling
69
- const sectionClass = (dark: boolean) =>
70
- `rounded-xl p-6 ${dark ? 'bg-gray-800 border-gray-700' : 'bg-white border-gray-200'} border`;
71
-
72
- const headingClass = (dark: boolean) =>
73
- `text-xl font-semibold mb-1 ${dark ? 'text-white' : 'text-gray-900'}`;
74
-
75
- const subheadingClass = (dark: boolean) =>
76
- `text-sm mb-4 ${dark ? 'text-gray-400' : 'text-gray-500'}`;
77
-
54
+
55
+ // Field states
56
+ let checkboxChecked = $state(false);
57
+ let toggleChecked = $state(false);
58
+ let radioValue = $state('');
59
+ let textareaValue = $state('');
60
+ let selectFieldValue = $state('');
61
+ let formFieldValue = $state('');
62
+
63
+ function toggleDark() {
64
+ isDark = !isDark;
65
+ document.documentElement.classList.toggle('dark', isDark);
66
+ }
67
+
68
+ // Section styling
69
+ const sectionClass = (dark: boolean) =>
70
+ `rounded-xl p-6 ${dark ? 'bg-gray-800 border-gray-700' : 'bg-white border-gray-200'} border`;
71
+
72
+ const headingClass = (dark: boolean) =>
73
+ `text-xl font-semibold mb-1 ${dark ? 'text-white' : 'text-gray-900'}`;
74
+
75
+ const subheadingClass = (dark: boolean) =>
76
+ `text-sm mb-4 ${dark ? 'text-gray-400' : 'text-gray-500'}`;
77
+
78
78
  // Demo data - MultiSelect uses 'items' with {name, value} format
79
79
  const multiSelectItems = [
80
80
  { value: 'react', name: 'React' },
@@ -98,88 +98,88 @@
98
98
  { value: 'medium', label: 'Medium Priority' },
99
99
  { value: 'high', label: 'High Priority' },
100
100
  ];
101
-
102
- const radioOptions = [
103
- { value: 'daily', label: 'Daily', description: 'Get updates every day' },
104
- { value: 'weekly', label: 'Weekly', description: 'Get updates once a week' },
105
- { value: 'monthly', label: 'Monthly', description: 'Get updates once a month' },
106
- ];
107
- </script>
108
-
109
- <div class="min-h-screen p-6 space-y-8 {isDark ? 'bg-gray-900' : 'bg-gray-50'}">
110
- <!-- Header -->
111
- <div class="flex items-center justify-between mb-8">
112
- <div>
113
- <h1 class="text-3xl font-bold {isDark ? 'text-white' : 'text-gray-900'}">Recipes Gallery</h1>
114
- <p class="{isDark ? 'text-gray-400' : 'text-gray-600'}">Domain-agnostic compositions (Layer 2)</p>
115
- </div>
116
- <button
117
- onclick={toggleDark}
118
- class="px-4 py-2 rounded-lg font-medium {isDark ? 'bg-yellow-500 text-black' : 'bg-gray-800 text-white'}"
119
- >
120
- {isDark ? '☀️ Light' : '🌙 Dark'}
121
- </button>
122
- </div>
123
-
124
- <!-- ========== FEEDBACK COMPONENTS ========== -->
125
- <section class={sectionClass(isDark)}>
126
- <h2 class={headingClass(isDark)}>Feedback Components</h2>
127
- <p class={subheadingClass(isDark)}>EmptyState, ErrorDisplay, StatusIndicator</p>
128
-
129
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
130
- <Card>
131
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">EmptyState</p>
132
- <EmptyState
133
- title="No items yet"
134
- description="Get started by creating your first item"
135
- >
136
- <Button size="sm">Create Item</Button>
137
- </EmptyState>
138
- </Card>
139
-
140
- <Card>
141
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">ErrorDisplay</p>
142
- <ErrorDisplay
143
- title="Something went wrong"
144
- message="We couldn't load the data. Please try again."
145
- >
146
- <Button size="sm" variant="outline">Retry</Button>
147
- </ErrorDisplay>
148
- </Card>
149
- </div>
150
-
151
- <div class="mt-6">
152
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-3">StatusIndicator</p>
153
- <div class="flex flex-wrap gap-6">
154
- <div class="flex items-center gap-2">
155
- <StatusIndicator status="active" />
156
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Active</span>
157
- </div>
158
- <div class="flex items-center gap-2">
159
- <StatusIndicator status="pending" />
160
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Pending</span>
161
- </div>
162
- <div class="flex items-center gap-2">
163
- <StatusIndicator status="inactive" />
164
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Inactive</span>
165
- </div>
166
- <div class="flex items-center gap-2">
167
- <StatusIndicator status="error" />
168
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Error</span>
169
- </div>
170
- <div class="flex items-center gap-2">
171
- <StatusIndicator status="success" />
172
- <span class={isDark ? 'text-white' : 'text-gray-900'}>Success</span>
173
- </div>
174
- </div>
175
- </div>
176
- </section>
177
-
178
- <!-- ========== FORM FIELDS ========== -->
179
- <section class={sectionClass(isDark)}>
180
- <h2 class={headingClass(isDark)}>Form Fields</h2>
181
- <p class={subheadingClass(isDark)}>Composed field components with labels, validation, and help text</p>
182
-
101
+
102
+ const radioOptions = [
103
+ { value: 'daily', label: 'Daily', description: 'Get updates every day' },
104
+ { value: 'weekly', label: 'Weekly', description: 'Get updates once a week' },
105
+ { value: 'monthly', label: 'Monthly', description: 'Get updates once a month' },
106
+ ];
107
+ </script>
108
+
109
+ <div class="min-h-screen p-6 space-y-8 {isDark ? 'bg-gray-900' : 'bg-gray-50'}">
110
+ <!-- Header -->
111
+ <div class="flex items-center justify-between mb-8">
112
+ <div>
113
+ <h1 class="text-3xl font-bold {isDark ? 'text-white' : 'text-gray-900'}">Recipes Gallery</h1>
114
+ <p class="{isDark ? 'text-gray-400' : 'text-gray-600'}">Domain-agnostic compositions (Layer 2)</p>
115
+ </div>
116
+ <button
117
+ onclick={toggleDark}
118
+ class="px-4 py-2 rounded-lg font-medium {isDark ? 'bg-yellow-500 text-black' : 'bg-gray-800 text-white'}"
119
+ >
120
+ {isDark ? '☀️ Light' : '🌙 Dark'}
121
+ </button>
122
+ </div>
123
+
124
+ <!-- ========== FEEDBACK COMPONENTS ========== -->
125
+ <section class={sectionClass(isDark)}>
126
+ <h2 class={headingClass(isDark)}>Feedback Components</h2>
127
+ <p class={subheadingClass(isDark)}>EmptyState, ErrorDisplay, StatusIndicator</p>
128
+
129
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
130
+ <Card>
131
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">EmptyState</p>
132
+ <EmptyState
133
+ title="No items yet"
134
+ description="Get started by creating your first item"
135
+ >
136
+ <Button size="sm">Create Item</Button>
137
+ </EmptyState>
138
+ </Card>
139
+
140
+ <Card>
141
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">ErrorDisplay</p>
142
+ <ErrorDisplay
143
+ title="Something went wrong"
144
+ message="We couldn't load the data. Please try again."
145
+ >
146
+ <Button size="sm" variant="outline">Retry</Button>
147
+ </ErrorDisplay>
148
+ </Card>
149
+ </div>
150
+
151
+ <div class="mt-6">
152
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-3">StatusIndicator</p>
153
+ <div class="flex flex-wrap gap-6">
154
+ <div class="flex items-center gap-2">
155
+ <StatusIndicator status="active" />
156
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Active</span>
157
+ </div>
158
+ <div class="flex items-center gap-2">
159
+ <StatusIndicator status="pending" />
160
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Pending</span>
161
+ </div>
162
+ <div class="flex items-center gap-2">
163
+ <StatusIndicator status="inactive" />
164
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Inactive</span>
165
+ </div>
166
+ <div class="flex items-center gap-2">
167
+ <StatusIndicator status="error" />
168
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Error</span>
169
+ </div>
170
+ <div class="flex items-center gap-2">
171
+ <StatusIndicator status="success" />
172
+ <span class={isDark ? 'text-white' : 'text-gray-900'}>Success</span>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </section>
177
+
178
+ <!-- ========== FORM FIELDS ========== -->
179
+ <section class={sectionClass(isDark)}>
180
+ <h2 class={headingClass(isDark)}>Form Fields</h2>
181
+ <p class={subheadingClass(isDark)}>Composed field components with labels, validation, and help text</p>
182
+
183
183
  <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
184
184
  <div>
185
185
  <FormField
@@ -232,67 +232,67 @@
232
232
  />
233
233
  </div>
234
234
  </div>
235
-
236
- <div class="mt-6 space-y-4">
237
- <CheckboxField
238
- label="I agree to the terms and conditions"
239
- description="You must agree to continue"
240
- bind:checked={checkboxChecked}
241
- />
242
-
243
- <ToggleField
244
- label="Enable notifications"
245
- description="Receive email updates about your account"
246
- bind:checked={toggleChecked}
247
- />
248
-
249
- <div class="max-w-md">
250
- <RadioGroup
251
- label="Update frequency"
252
- options={radioOptions}
253
- bind:value={radioValue}
254
- />
255
- </div>
256
- </div>
257
- </section>
258
-
259
- <!-- ========== SPECIAL INPUTS ========== -->
260
- <section class={sectionClass(isDark)}>
261
- <h2 class={headingClass(isDark)}>Special Inputs</h2>
262
- <p class={subheadingClass(isDark)}>Password, OTP, Search, MultiSelect, SelectDropdown</p>
263
-
264
- <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
265
- <div>
266
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordInput</p>
267
- <PasswordInput
268
- label="Password"
269
- placeholder="Enter password"
270
- bind:value={passwordValue}
271
- />
272
- </div>
273
-
274
- <div>
275
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordStrengthIndicator</p>
276
- <PasswordStrengthIndicator password={passwordValue} />
277
- </div>
278
-
279
- <div>
280
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">OTPInput (6 digits)</p>
281
- <OTPInput
282
- length={6}
283
- bind:value={otpValue}
284
- />
285
- <p class="text-sm text-gray-500 mt-2">Value: {otpValue || '(empty)'}</p>
286
- </div>
287
-
288
- <div>
289
- <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">Search</p>
290
- <Search
291
- placeholder="Search..."
292
- bind:value={searchValue}
293
- />
294
- </div>
295
-
235
+
236
+ <div class="mt-6 space-y-4">
237
+ <CheckboxField
238
+ label="I agree to the terms and conditions"
239
+ description="You must agree to continue"
240
+ bind:checked={checkboxChecked}
241
+ />
242
+
243
+ <ToggleField
244
+ label="Enable notifications"
245
+ description="Receive email updates about your account"
246
+ bind:checked={toggleChecked}
247
+ />
248
+
249
+ <div class="max-w-md">
250
+ <RadioGroup
251
+ label="Update frequency"
252
+ options={radioOptions}
253
+ bind:value={radioValue}
254
+ />
255
+ </div>
256
+ </div>
257
+ </section>
258
+
259
+ <!-- ========== SPECIAL INPUTS ========== -->
260
+ <section class={sectionClass(isDark)}>
261
+ <h2 class={headingClass(isDark)}>Special Inputs</h2>
262
+ <p class={subheadingClass(isDark)}>Password, OTP, Search, MultiSelect, SelectDropdown</p>
263
+
264
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
265
+ <div>
266
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordInput</p>
267
+ <PasswordInput
268
+ label="Password"
269
+ placeholder="Enter password"
270
+ bind:value={passwordValue}
271
+ />
272
+ </div>
273
+
274
+ <div>
275
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">PasswordStrengthIndicator</p>
276
+ <PasswordStrengthIndicator password={passwordValue} />
277
+ </div>
278
+
279
+ <div>
280
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">OTPInput (6 digits)</p>
281
+ <OTPInput
282
+ length={6}
283
+ bind:value={otpValue}
284
+ />
285
+ <p class="text-sm text-gray-500 mt-2">Value: {otpValue || '(empty)'}</p>
286
+ </div>
287
+
288
+ <div>
289
+ <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">Search</p>
290
+ <Search
291
+ placeholder="Search..."
292
+ bind:value={searchValue}
293
+ />
294
+ </div>
295
+
296
296
  <div>
297
297
  <p class="text-xs {isDark ? 'text-gray-500' : 'text-gray-400'} mb-2">MultiSelect</p>
298
298
  <MultiSelect
@@ -311,53 +311,53 @@
311
311
  placeholder="Priority"
312
312
  />
313
313
  </div>
314
- </div>
315
- </section>
316
-
317
- <!-- ========== MODALS ========== -->
318
- <section class={sectionClass(isDark)}>
319
- <h2 class={headingClass(isDark)}>Modals</h2>
320
- <p class={subheadingClass(isDark)}>AlertModal, ConfirmationModal, InputModal, StatusModal</p>
321
-
322
- <div class="flex flex-wrap gap-4">
323
- <Button onclick={() => showAlertModal = true}>
324
- Open AlertModal
325
- </Button>
326
-
327
- <Button variant="alternative" onclick={() => showConfirmModal = true}>
328
- Open ConfirmationModal
329
- </Button>
330
-
331
- <Button variant="outline" onclick={() => showInputModal = true}>
332
- Open InputModal
333
- </Button>
334
-
335
- <Button variant="ghost" onclick={() => {
336
- statusModalType = 'success';
337
- showStatusModal = true;
338
- setTimeout(() => showStatusModal = false, 2000);
339
- }}>
340
- StatusModal (Success)
341
- </Button>
342
-
343
- <Button variant="ghost" onclick={() => {
344
- statusModalType = 'error';
345
- showStatusModal = true;
346
- setTimeout(() => showStatusModal = false, 2000);
347
- }}>
348
- StatusModal (Error)
349
- </Button>
350
-
351
- <Button variant="ghost" onclick={() => {
352
- statusModalType = 'loading';
353
- showStatusModal = true;
354
- setTimeout(() => showStatusModal = false, 2000);
355
- }}>
356
- StatusModal (Loading)
357
- </Button>
358
- </div>
359
- </section>
360
-
314
+ </div>
315
+ </section>
316
+
317
+ <!-- ========== MODALS ========== -->
318
+ <section class={sectionClass(isDark)}>
319
+ <h2 class={headingClass(isDark)}>Modals</h2>
320
+ <p class={subheadingClass(isDark)}>AlertModal, ConfirmationModal, InputModal, StatusModal</p>
321
+
322
+ <div class="flex flex-wrap gap-4">
323
+ <Button onclick={() => showAlertModal = true}>
324
+ Open AlertModal
325
+ </Button>
326
+
327
+ <Button variant="alternative" onclick={() => showConfirmModal = true}>
328
+ Open ConfirmationModal
329
+ </Button>
330
+
331
+ <Button variant="outline" onclick={() => showInputModal = true}>
332
+ Open InputModal
333
+ </Button>
334
+
335
+ <Button variant="ghost" onclick={() => {
336
+ statusModalType = 'success';
337
+ showStatusModal = true;
338
+ setTimeout(() => showStatusModal = false, 2000);
339
+ }}>
340
+ StatusModal (Success)
341
+ </Button>
342
+
343
+ <Button variant="ghost" onclick={() => {
344
+ statusModalType = 'error';
345
+ showStatusModal = true;
346
+ setTimeout(() => showStatusModal = false, 2000);
347
+ }}>
348
+ StatusModal (Error)
349
+ </Button>
350
+
351
+ <Button variant="ghost" onclick={() => {
352
+ statusModalType = 'loading';
353
+ showStatusModal = true;
354
+ setTimeout(() => showStatusModal = false, 2000);
355
+ }}>
356
+ StatusModal (Loading)
357
+ </Button>
358
+ </div>
359
+ </section>
360
+
361
361
  <!-- AlertModal -->
362
362
  <AlertModal
363
363
  bind:show={showAlertModal}
@@ -407,13 +407,13 @@
407
407
  onconfirm={() => showStatusModal = false}
408
408
  onclose={() => showStatusModal = false}
409
409
  />
410
-
411
- <!-- ========== COMMON PATTERNS ========== -->
412
- <section class={sectionClass(isDark)}>
413
- <h2 class={headingClass(isDark)}>Common Recipe Patterns</h2>
414
- <p class={subheadingClass(isDark)}>How recipes compose together</p>
415
-
416
- <div class="space-y-6">
410
+
411
+ <!-- ========== COMMON PATTERNS ========== -->
412
+ <section class={sectionClass(isDark)}>
413
+ <h2 class={headingClass(isDark)}>Common Recipe Patterns</h2>
414
+ <p class={subheadingClass(isDark)}>How recipes compose together</p>
415
+
416
+ <div class="space-y-6">
417
417
  <Card>
418
418
  <h4 class="font-medium mb-4">Registration Form Pattern</h4>
419
419
  <div class="space-y-4 max-w-md">
@@ -466,6 +466,6 @@
466
466
  </div>
467
467
  </div>
468
468
  </Card>
469
- </div>
470
- </section>
471
- </div>
469
+ </div>
470
+ </section>
471
+ </div>