@getmicdrop/svelte-components 5.3.6 → 5.3.10

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 (121) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +9 -8
  2. package/dist/calendar/AboutShow/AboutShow.svelte.d.ts.map +1 -1
  3. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +9 -8
  4. package/dist/calendar/Calendar/MiniMonthCalendar.svelte.d.ts.map +1 -1
  5. package/dist/calendar/FAQs/FAQs.svelte +6 -5
  6. package/dist/calendar/FAQs/FAQs.svelte.d.ts.map +1 -1
  7. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +3 -2
  8. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte.d.ts.map +1 -1
  9. package/dist/calendar/OrderSummary/OrderSummary.svelte +19 -18
  10. package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
  11. package/dist/calendar/PublicCard/PublicCard.svelte +7 -9
  12. package/dist/calendar/PublicCard/PublicCard.svelte.d.ts.map +1 -1
  13. package/dist/calendar/ShowCard/ShowCard.svelte +11 -10
  14. package/dist/calendar/ShowCard/ShowCard.svelte.d.ts.map +1 -1
  15. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +5 -3
  16. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte.d.ts.map +1 -1
  17. package/dist/components/Layout/Section.svelte +4 -4
  18. package/dist/components/Layout/Section.svelte.d.ts.map +1 -1
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.js +9 -0
  21. package/dist/patterns/data/DataTable.svelte +4 -2
  22. package/dist/patterns/data/DataTable.svelte.d.ts.map +1 -1
  23. package/dist/patterns/forms/FormSection.svelte +4 -2
  24. package/dist/patterns/forms/FormSection.svelte.d.ts.map +1 -1
  25. package/dist/patterns/navigation/BottomNav.svelte +4 -3
  26. package/dist/patterns/navigation/BottomNav.svelte.d.ts.map +1 -1
  27. package/dist/patterns/navigation/Header.svelte +11 -10
  28. package/dist/patterns/navigation/Header.svelte.d.ts.map +1 -1
  29. package/dist/patterns/page/PageHeader.svelte +3 -2
  30. package/dist/patterns/page/PageHeader.svelte.d.ts.map +1 -1
  31. package/dist/patterns/page/PageLayout.svelte +2 -1
  32. package/dist/patterns/page/PageLayout.svelte.d.ts.map +1 -1
  33. package/dist/patterns/page/PageLoader.svelte +2 -1
  34. package/dist/patterns/page/PageLoader.svelte.d.ts.map +1 -1
  35. package/dist/patterns/page/SectionHeader.svelte +5 -3
  36. package/dist/patterns/page/SectionHeader.svelte.d.ts.map +1 -1
  37. package/dist/primitives/Accordion/Accordion.svelte +2 -1
  38. package/dist/primitives/Accordion/Accordion.svelte.d.ts.map +1 -1
  39. package/dist/primitives/Accordion/AccordionItem.svelte +5 -4
  40. package/dist/primitives/Accordion/AccordionItem.svelte.d.ts.map +1 -1
  41. package/dist/primitives/BottomSheet/BottomSheet.svelte +2 -1
  42. package/dist/primitives/BottomSheet/BottomSheet.svelte.d.ts.map +1 -1
  43. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +6 -5
  44. package/dist/primitives/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -1
  45. package/dist/primitives/Button/Button.svelte +16 -8
  46. package/dist/primitives/Button/Button.svelte.d.ts.map +1 -1
  47. package/dist/primitives/Button/ButtonSaveDemo.svelte +2 -1
  48. package/dist/primitives/Button/ButtonSaveDemo.svelte.d.ts.map +1 -1
  49. package/dist/primitives/Card.svelte +1 -1
  50. package/dist/primitives/DarkModeToggle.svelte +43 -44
  51. package/dist/primitives/DarkModeToggle.svelte.d.ts.map +1 -1
  52. package/dist/primitives/Drawer/Drawer.svelte +121 -47
  53. package/dist/primitives/Drawer/Drawer.svelte.d.ts +4 -0
  54. package/dist/primitives/Drawer/Drawer.svelte.d.ts.map +1 -1
  55. package/dist/primitives/Input/Input.svelte +41 -80
  56. package/dist/primitives/Input/Input.svelte.d.ts +4 -6
  57. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  58. package/dist/primitives/Input/Select.svelte +66 -13
  59. package/dist/primitives/Input/Select.svelte.d.ts +2 -0
  60. package/dist/primitives/Input/Select.svelte.d.ts.map +1 -1
  61. package/dist/primitives/Input/Textarea.svelte +5 -3
  62. package/dist/primitives/Input/Textarea.svelte.d.ts.map +1 -1
  63. package/dist/primitives/Modal/Modal.svelte +13 -1
  64. package/dist/primitives/Modal/Modal.svelte.d.ts.map +1 -1
  65. package/dist/primitives/Pagination/Pagination.svelte +3 -2
  66. package/dist/primitives/Pagination/Pagination.svelte.d.ts.map +1 -1
  67. package/dist/primitives/Tabs/Tabs.svelte +4 -3
  68. package/dist/primitives/Tabs/Tabs.svelte.d.ts.map +1 -1
  69. package/dist/recipes/CropImage/CropImage.svelte +10 -5
  70. package/dist/recipes/CropImage/CropImage.svelte.d.ts.map +1 -1
  71. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -0
  72. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte.d.ts +28 -0
  73. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte.d.ts.map +1 -0
  74. package/dist/recipes/ImageUploader/ImageUploader.svelte +939 -0
  75. package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts +60 -0
  76. package/dist/recipes/ImageUploader/ImageUploader.svelte.d.ts.map +1 -0
  77. package/dist/recipes/SuperLogin/SuperLogin.svelte +37 -40
  78. package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
  79. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +3 -2
  80. package/dist/recipes/feedback/EmptyState/EmptyState.svelte.d.ts.map +1 -1
  81. package/dist/recipes/fields/CheckboxField.svelte +3 -2
  82. package/dist/recipes/fields/CheckboxField.svelte.d.ts.map +1 -1
  83. package/dist/recipes/fields/FormField.svelte +12 -4
  84. package/dist/recipes/fields/FormField.svelte.d.ts +3 -1
  85. package/dist/recipes/fields/FormField.svelte.d.ts.map +1 -1
  86. package/dist/recipes/fields/RadioGroup.svelte +13 -4
  87. package/dist/recipes/fields/RadioGroup.svelte.d.ts +4 -1
  88. package/dist/recipes/fields/RadioGroup.svelte.d.ts.map +1 -1
  89. package/dist/recipes/fields/SelectField.svelte +12 -3
  90. package/dist/recipes/fields/SelectField.svelte.d.ts +4 -1
  91. package/dist/recipes/fields/SelectField.svelte.d.ts.map +1 -1
  92. package/dist/recipes/fields/TextareaField.svelte +2 -1
  93. package/dist/recipes/fields/TextareaField.svelte.d.ts.map +1 -1
  94. package/dist/recipes/fields/ToggleField.svelte +3 -2
  95. package/dist/recipes/fields/ToggleField.svelte.d.ts.map +1 -1
  96. package/dist/recipes/inputs/MultiSelect.svelte +8 -7
  97. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  98. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +9 -9
  99. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
  100. package/dist/recipes/inputs/Search.svelte +7 -6
  101. package/dist/recipes/inputs/Search.svelte.d.ts.map +1 -1
  102. package/dist/recipes/modals/AlertModal.svelte +3 -2
  103. package/dist/recipes/modals/AlertModal.svelte.d.ts.map +1 -1
  104. package/dist/recipes/modals/ConfirmationModal.svelte +4 -3
  105. package/dist/recipes/modals/ConfirmationModal.svelte.d.ts.map +1 -1
  106. package/dist/recipes/modals/InputModal.svelte +9 -8
  107. package/dist/recipes/modals/InputModal.svelte.d.ts.map +1 -1
  108. package/dist/recipes/modals/ModalStateManager.svelte +4 -3
  109. package/dist/recipes/modals/ModalStateManager.svelte.d.ts.map +1 -1
  110. package/dist/recipes/modals/StatusModal.svelte +5 -4
  111. package/dist/recipes/modals/StatusModal.svelte.d.ts.map +1 -1
  112. package/dist/stories/ButtonAuditReview.svelte +361 -397
  113. package/dist/stories/ButtonAuditReview.svelte.d.ts +24 -4
  114. package/dist/stories/ButtonAuditReview.svelte.d.ts.map +1 -1
  115. package/dist/tokens/index.d.ts +4 -8
  116. package/dist/tokens/index.d.ts.map +1 -1
  117. package/dist/tokens/index.js +4 -8
  118. package/dist/tokens/typography.d.ts +76 -169
  119. package/dist/tokens/typography.d.ts.map +1 -1
  120. package/dist/tokens/typography.js +93 -62
  121. package/package.json +4 -2
@@ -1,6 +1,8 @@
1
1
  <script>
2
- import { onMount } from "svelte";
3
- import { ChevronDownOutline, CheckOutline } from "../Icons";
2
+ import { onMount, tick } from "svelte";
3
+ import { ChevronDownOutline } from "../Icons";
4
+ import { portal as portalAction } from "../../utils/portal.js";
5
+ import { typography } from "../../tokens/typography";
4
6
 
5
7
  let {
6
8
  value = $bindable(""),
@@ -13,6 +15,7 @@
13
15
  name = "",
14
16
  id = "",
15
17
  size = "md",
18
+ portal = false,
16
19
  onchange,
17
20
  ...restProps
18
21
  } = $props();
@@ -21,6 +24,7 @@
21
24
  let triggerElement = $state(null);
22
25
  let dropdownElement = $state(null);
23
26
  let focusedIndex = $state(-1);
27
+ let dropdownPosition = $state({ top: 0, left: 0, width: 0 });
24
28
 
25
29
  const instanceId = Math.random().toString(36).substring(2, 9);
26
30
 
@@ -35,12 +39,26 @@
35
39
 
36
40
  let sizeClass = $derived(sizeClasses[size] || sizeClasses.md);
37
41
 
38
- function toggle() {
42
+ function updateDropdownPosition() {
43
+ if (!triggerElement || !portal) return;
44
+ const rect = triggerElement.getBoundingClientRect();
45
+ dropdownPosition = {
46
+ top: rect.bottom + 4,
47
+ left: rect.left,
48
+ width: rect.width
49
+ };
50
+ }
51
+
52
+ async function toggle() {
39
53
  if (disabled) return;
40
54
  isOpen = !isOpen;
41
55
  if (isOpen) {
42
56
  focusedIndex = items.findIndex((item) => item.value === value);
43
57
  window.dispatchEvent(new CustomEvent('select-opened', { detail: { instanceId } }));
58
+ if (portal) {
59
+ await tick();
60
+ updateDropdownPosition();
61
+ }
44
62
  }
45
63
  }
46
64
 
@@ -112,9 +130,20 @@
112
130
  onMount(() => {
113
131
  document.addEventListener("click", handleClickOutside, true);
114
132
  window.addEventListener("select-opened", handleOtherSelectOpened);
133
+
134
+ // Update position on scroll/resize when portal is enabled
135
+ if (portal) {
136
+ window.addEventListener("scroll", updateDropdownPosition, true);
137
+ window.addEventListener("resize", updateDropdownPosition);
138
+ }
139
+
115
140
  return () => {
116
141
  document.removeEventListener("click", handleClickOutside, true);
117
142
  window.removeEventListener("select-opened", handleOtherSelectOpened);
143
+ if (portal) {
144
+ window.removeEventListener("scroll", updateDropdownPosition, true);
145
+ window.removeEventListener("resize", updateDropdownPosition);
146
+ }
118
147
  };
119
148
  });
120
149
  </script>
@@ -122,7 +151,7 @@
122
151
  <div class="w-full flex flex-col gap-2" {...restProps}>
123
152
  {#if label}
124
153
  <div class="flex justify-start items-center gap-1">
125
- <label for={id || name} class="text-sm font-medium text-gray-900 dark:text-white">
154
+ <label for={id || name} class={typography.label}>
126
155
  {label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
127
156
  </label>
128
157
  </div>
@@ -134,7 +163,7 @@
134
163
  bind:this={triggerElement}
135
164
  {id}
136
165
  {name}
137
- class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-700 border rounded-lg cursor-pointer transition-colors text-left focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ? 'text-gray-500 dark:text-gray-400' : 'text-gray-900 dark:text-white'}"
166
+ class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-700 border rounded-lg cursor-pointer transition-colors text-left focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ? `${typography.textMuted}` : `${typography.body}`}"
138
167
  {disabled}
139
168
  aria-haspopup="listbox"
140
169
  aria-expanded={isOpen}
@@ -142,10 +171,10 @@
142
171
  onkeydown={handleKeydown}
143
172
  >
144
173
  <span class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap">{displayText}</span>
145
- <ChevronDownOutline class="w-4 h-4 shrink-0 text-gray-500 dark:text-gray-400 transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
174
+ <ChevronDownOutline class="w-4 h-4 shrink-0 {typography.iconMuted} transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
146
175
  </button>
147
176
 
148
- {#if isOpen}
177
+ {#if isOpen && !portal}
149
178
  <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
150
179
  <ul
151
180
  bind:this={dropdownElement}
@@ -157,16 +186,13 @@
157
186
  <!-- svelte-ignore a11y_click_events_have_key_events -->
158
187
  <li
159
188
  id="{id || name}-option-{index}"
160
- class="flex items-center justify-between px-4 py-2 cursor-pointer text-sm transition-colors {item.value === value ? 'font-semibold text-gray-900 dark:text-white' : 'text-gray-700 dark:text-gray-300'} {index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}"
189
+ class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
161
190
  role="option"
162
191
  aria-selected={item.value === value}
163
192
  onclick={() => selectItem(item)}
164
193
  onmouseenter={() => (focusedIndex = index)}
165
194
  >
166
- <span class="flex-1">{item.name}</span>
167
- {#if item.value === value}
168
- <CheckOutline class="w-4 h-4 shrink-0 text-blue-600" />
169
- {/if}
195
+ {item.name}
170
196
  </li>
171
197
  {/each}
172
198
  </ul>
@@ -174,6 +200,33 @@
174
200
  </div>
175
201
 
176
202
  {#if error}
177
- <p class="text-sm text-red-500">{error}</p>
203
+ <p class={typography.error}>{error}</p>
178
204
  {/if}
179
205
  </div>
206
+
207
+ {#if isOpen && portal}
208
+ <!-- Portal dropdown - truly moved to document.body to escape overflow containers and transforms -->
209
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
210
+ <ul
211
+ bind:this={dropdownElement}
212
+ use:portalAction
213
+ class="fixed z-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
214
+ style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
215
+ role="listbox"
216
+ tabindex="-1"
217
+ >
218
+ {#each items as item, index}
219
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
220
+ <li
221
+ id="{id || name}-option-{index}"
222
+ class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
223
+ role="option"
224
+ aria-selected={item.value === value}
225
+ onclick={() => selectItem(item)}
226
+ onmouseenter={() => (focusedIndex = index)}
227
+ >
228
+ {item.name}
229
+ </li>
230
+ {/each}
231
+ </ul>
232
+ {/if}
@@ -14,6 +14,7 @@ declare const Select: import("svelte").Component<{
14
14
  name?: string;
15
15
  id?: string;
16
16
  size?: string;
17
+ portal?: boolean;
17
18
  onchange: any;
18
19
  } & Record<string, any>, {}, "value">;
19
20
  type $$ComponentProps = {
@@ -27,6 +28,7 @@ type $$ComponentProps = {
27
28
  name?: string;
28
29
  id?: string;
29
30
  size?: string;
31
+ portal?: boolean;
30
32
  onchange: any;
31
33
  } & Record<string, any>;
32
34
  //# sourceMappingURL=Select.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Select.svelte.js"],"names":[],"mappings":";;;;;AAqKA;YA3J6B,MAAM;YAAU,GAAG,EAAE;kBAAgB,MAAM;YAAU,MAAM;eAAa,OAAO;eAAa,OAAO;YAAU,MAAM;WAAS,MAAM;SAAO,MAAM;WAAS,MAAM;cAAY,GAAG;sCA2JrJ;wBA3JlC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
1
+ {"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Select.svelte.js"],"names":[],"mappings":";;;;;AA8MA;YAhM6B,MAAM;YAAU,GAAG,EAAE;kBAAgB,MAAM;YAAU,MAAM;eAAa,OAAO;eAAa,OAAO;YAAU,MAAM;WAAS,MAAM;SAAO,MAAM;WAAS,MAAM;aAAW,OAAO;cAAY,GAAG;sCAgMvK;wBAhMlC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
@@ -1,4 +1,6 @@
1
1
  <script>
2
+ import { typography } from "../../tokens/typography";
3
+
2
4
  let {
3
5
  value = $bindable(""),
4
6
  placeholder = "",
@@ -43,7 +45,7 @@
43
45
 
44
46
  <div class="flex flex-col gap-2 w-full">
45
47
  {#if label}
46
- <label for={id || name} class="text-sm font-medium text-gray-900 dark:text-white leading-tight">
48
+ <label for={id || name} class={`${typography.label} leading-tight`}>
47
49
  {label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
48
50
  </label>
49
51
  {/if}
@@ -57,7 +59,7 @@
57
59
  {readonly}
58
60
  {maxlength}
59
61
  {minlength}
60
- class="w-full p-2.5 bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white text-sm leading-normal border rounded-lg resize-y transition-colors focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 placeholder-gray-500 dark:placeholder-gray-400 {error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {className}"
62
+ class="{typography.sm} w-full p-2.5 bg-gray-50 dark:bg-gray-700 leading-normal border rounded-lg resize-y transition-colors focus:outline-none focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 placeholder-gray-500 dark:placeholder-gray-400 {error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {className}"
61
63
  bind:value
62
64
  oninput={handleInput}
63
65
  onchange={handleChange}
@@ -72,6 +74,6 @@
72
74
  ></textarea>
73
75
 
74
76
  {#if error}
75
- <p class="text-sm text-red-500">{error}</p>
77
+ <p class={typography.error}>{error}</p>
76
78
  {/if}
77
79
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Textarea.svelte.js"],"names":[],"mappings":";;;;;AA8DA;YA1D6B,MAAM;kBAAgB,MAAM;WAAS,MAAM;eAAa,OAAO;eAAa,OAAO;eAAa,OAAO;SAAO,MAAM;WAAS,MAAM;YAAU,MAAM;YAAU,MAAM;gBAAc,GAAG;gBAAc,GAAG;YAAU,MAAM;aAAW,GAAG;cAAY,GAAG;YAAU,GAAG;aAAW,GAAG;eAAa,GAAG;aAAW,GAAG;gBAAc,GAAG;sCA0DlS;wBA1DpC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
1
+ {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Input/Textarea.svelte.js"],"names":[],"mappings":";;;;;AAkEA;YA1D6B,MAAM;kBAAgB,MAAM;WAAS,MAAM;eAAa,OAAO;eAAa,OAAO;eAAa,OAAO;SAAO,MAAM;WAAS,MAAM;YAAU,MAAM;YAAU,MAAM;gBAAc,GAAG;gBAAc,GAAG;YAAU,MAAM;aAAW,GAAG;cAAY,GAAG;YAAU,GAAG;aAAW,GAAG;eAAa,GAAG;aAAW,GAAG;gBAAc,GAAG;sCA0DlS;wBA1DpC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC"}
@@ -99,7 +99,19 @@
99
99
  <!-- svelte-ignore a11y_no_static_element_interactions -->
100
100
  <div
101
101
  class="fixed inset-0 flex bg-black/50 z-50 items-end justify-center md:items-center md:p-4 touch-none overscroll-none"
102
- onclick={persistent ? null : resetModal}
102
+ onmousedown={(e) => {
103
+ // Only track direct clicks on backdrop, not drags that end on backdrop
104
+ if (e.target === e.currentTarget && !persistent) {
105
+ e.currentTarget.dataset.clickStartedOnBackdrop = 'true';
106
+ }
107
+ }}
108
+ onmouseup={(e) => {
109
+ // Only close if both mousedown and mouseup were on the backdrop
110
+ if (e.target === e.currentTarget && e.currentTarget.dataset.clickStartedOnBackdrop === 'true' && !persistent) {
111
+ resetModal();
112
+ }
113
+ delete e.currentTarget.dataset.clickStartedOnBackdrop;
114
+ }}
103
115
  transition:fade={{ duration: 300 }}
104
116
  role="dialog"
105
117
  aria-modal="true"
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA0JA;;WAZW,OAAO;mBACC,OAAO;gBACV,OAAO;WACZ,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ;iBAClC,OAAO;eACT,MAAM,IAAI;aACZ,GAAG;WACL,GAAG;aACD,GAAG;YACJ,MAAM;eAGkC"}
1
+ {"version":3,"file":"Modal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Modal/Modal.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAqKA;;WAZW,OAAO;mBACC,OAAO;gBACV,OAAO;WACZ,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ;iBAClC,OAAO;eACT,MAAM,IAAI;aACZ,GAAG;WACL,GAAG;aACD,GAAG;YACJ,MAAM;eAGkC"}
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import { ChevronLeftOutline, ChevronRightOutline } from "../Icons";
4
+ import { typography } from "../../tokens/typography";
4
5
 
5
6
  interface Props {
6
7
  currentPage?: number;
@@ -112,8 +113,8 @@
112
113
 
113
114
  {#if variant === 'table'}
114
115
  <div class="flex flex-col items-center gap-3 sm:flex-row sm:justify-between {className}" {...restProps}>
115
- <span class="text-sm text-gray-700 dark:text-gray-400">
116
- Showing <span class="font-semibold text-gray-900 dark:text-white">{startItem}</span> to <span class="font-semibold text-gray-900 dark:text-white">{endItem}</span> of <span class="font-semibold text-gray-900 dark:text-white">{totalItems}</span> entries
116
+ <span class={`${typography.sm} text-gray-700 dark:text-gray-400`}>
117
+ Showing <span class={`font-semibold ${typography.sm}`}>{startItem}</span> to <span class={`font-semibold ${typography.sm}`}>{endItem}</span> of <span class={`font-semibold ${typography.sm}`}>{totalItems}</span> entries
117
118
  </span>
118
119
  <nav class="inline-flex -space-x-px rtl:space-x-reverse" aria-label="Pagination">
119
120
  {#if effectiveShowPrevNext}
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Pagination/Pagination.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAmMH,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Pagination/Pagination.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKpC,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAoMH,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import type { Snippet } from 'svelte';
3
3
  import { setContext } from "svelte";
4
4
  import { writable } from "svelte/store";
5
+ import { typography } from "../../tokens/typography";
5
6
 
6
7
  interface Props {
7
8
  tabStyle?: 'underline' | 'pills' | 'full';
@@ -74,9 +75,9 @@
74
75
 
75
76
  // Tab list classes by style
76
77
  const tabListClasses = {
77
- underline: "flex flex-wrap -mb-px text-sm font-medium text-center border-b border-gray-200 dark:border-gray-700 overflow-x-auto scrollbar-none",
78
- pills: "flex flex-wrap text-sm font-medium text-center text-gray-500 dark:text-gray-400 gap-2",
79
- full: "flex flex-wrap text-sm font-medium text-center text-gray-500 dark:text-gray-400 divide-x divide-gray-200 dark:divide-gray-700 rounded-lg shadow overflow-hidden"
78
+ underline: `flex flex-wrap -mb-px ${typography.sm} font-medium text-center border-b border-gray-200 dark:border-gray-700 overflow-x-auto scrollbar-none`,
79
+ pills: `flex flex-wrap ${typography.smMuted} font-medium text-center gap-2`,
80
+ full: `flex flex-wrap ${typography.smMuted} font-medium text-center divide-x divide-gray-200 dark:divide-gray-700 rounded-lg shadow overflow-hidden`
80
81
  };
81
82
 
82
83
  // Tab button classes by style
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAKpC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAoHH,QAAA,MAAM,IAAI,yDAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/primitives/Tabs/Tabs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMpC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAqHH,QAAA,MAAM,IAAI,yDAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import Cropper from 'svelte-easy-crop';
3
3
  import { CloseOutline, MinusOutline, PlusOutline } from "../../primitives/Icons";
4
4
  import Button from '../../primitives/Button/Button.svelte';
5
+ import { typography } from '../../tokens/typography';
5
6
 
6
7
  interface Props {
7
8
  /** Whether to show the modal */
@@ -36,6 +37,7 @@
36
37
  zoom = 1;
37
38
  croppedAreaPixels = null;
38
39
  isLoading = true;
40
+ isSaving = false; // Reset saving state when modal opens with new image
39
41
  }
40
42
  });
41
43
 
@@ -67,7 +69,10 @@
67
69
  const image = new Image();
68
70
  image.addEventListener('load', () => resolve(image));
69
71
  image.addEventListener('error', (error) => reject(error));
70
- image.setAttribute('crossOrigin', 'anonymous');
72
+ // Only set crossOrigin for non-blob URLs (blob URLs don't need CORS)
73
+ if (!url.startsWith('blob:')) {
74
+ image.setAttribute('crossOrigin', 'anonymous');
75
+ }
71
76
  image.src = url;
72
77
  });
73
78
  }
@@ -133,7 +138,7 @@
133
138
  <div class="relative w-full max-w-lg max-h-full">
134
139
  <div class="relative bg-white rounded-lg shadow-xl dark:bg-gray-800">
135
140
  <div class="flex items-center justify-between p-4 border-b border-gray-200 rounded-t-lg dark:border-gray-600">
136
- <h3 class="text-xl font-semibold text-gray-900 dark:text-white">
141
+ <h3 class={typography.h2}>
137
142
  Crop image
138
143
  </h3>
139
144
  <Button
@@ -150,7 +155,7 @@
150
155
  <div class="relative w-full aspect-square sm:aspect-[4/3] max-h-80 sm:max-h-96 bg-gray-800 rounded-lg overflow-hidden">
151
156
  {#if isLoading}
152
157
  <div class="absolute inset-0 flex items-center justify-center bg-gray-200 dark:bg-gray-700 z-10">
153
- <span class="text-sm text-gray-500 dark:text-gray-400">Loading...</span>
158
+ <span class={typography.smMuted}>Loading...</span>
154
159
  </div>
155
160
  {/if}
156
161
  <Cropper
@@ -161,11 +166,11 @@
161
166
  minZoom={1}
162
167
  maxZoom={3}
163
168
  showGrid={true}
164
- onCropComplete={handleCropComplete}
169
+ oncropcomplete={handleCropComplete}
165
170
  />
166
171
  </div>
167
172
 
168
- <p class="text-sm text-gray-500 dark:text-gray-400 text-center">
173
+ <p class={`${typography.smMuted} text-center`}>
169
174
  Drag to position. Pinch or use slider to zoom.
170
175
  </p>
171
176
 
@@ -1 +1 @@
1
- {"version":3,"file":"CropImage.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/CropImage/CropImage.svelte.ts"],"names":[],"mappings":"AAQE,UAAU,KAAK;IACb,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA2KH,QAAA,MAAM,SAAS,iEAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"CropImage.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/CropImage/CropImage.svelte.ts"],"names":[],"mappings":"AASE,UAAU,KAAK;IACb,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAgLH,QAAA,MAAM,SAAS,iEAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -0,0 +1,125 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import ImageUploader from './ImageUploader.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'Recipes/ImageUploader',
7
+ component: ImageUploader,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ shape: {
11
+ control: 'select',
12
+ options: ['square', 'wide'],
13
+ description: 'Shape of the dropzone/images',
14
+ },
15
+ maxImages: {
16
+ control: { type: 'number', min: 1, max: 12 },
17
+ description: 'Maximum number of images (1 for single mode)',
18
+ },
19
+ enableCrop: {
20
+ control: 'boolean',
21
+ description: 'Enable cropping step after file selection',
22
+ },
23
+ enableReorder: {
24
+ control: 'boolean',
25
+ description: 'Enable drag-to-reorder in multi-image mode',
26
+ },
27
+ showMainBadge: {
28
+ control: 'boolean',
29
+ description: 'Show "Main" badge on first image in multi mode',
30
+ },
31
+ },
32
+ });
33
+
34
+ // Mock upload function
35
+ async function mockUpload(file) {
36
+ await new Promise((resolve) => setTimeout(resolve, 1000));
37
+ return URL.createObjectURL(file);
38
+ }
39
+
40
+ // Sample images for demo
41
+ const sampleImages = [
42
+ 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop',
43
+ 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop',
44
+ 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=400&fit=crop',
45
+ ];
46
+ </script>
47
+
48
+ <!-- Single Square (Default) - Uses args pattern -->
49
+ <Story
50
+ name="Single Square (Default)"
51
+ args={{
52
+ images: '',
53
+ maxImages: 1,
54
+ shape: 'square',
55
+ onUpload: mockUpload,
56
+ helperText: 'Upload a profile picture',
57
+ }}
58
+ />
59
+
60
+ <!-- Wide Dropzone (Event Poster) -->
61
+ <Story
62
+ name="Wide Dropzone (Event Poster)"
63
+ args={{
64
+ images: '',
65
+ maxImages: 1,
66
+ shape: 'wide',
67
+ enableCrop: true,
68
+ cropAspectRatio: '16:9',
69
+ onUpload: mockUpload,
70
+ helperText: 'Recommended size: 1920x1080 or 16:9 aspect ratio',
71
+ }}
72
+ />
73
+
74
+ <!-- Multi-Image Grid (Performer Photos) -->
75
+ <Story
76
+ name="Multi-Image Grid (Performer Photos)"
77
+ args={{
78
+ images: [],
79
+ maxImages: 6,
80
+ shape: 'square',
81
+ enableCrop: true,
82
+ enableReorder: true,
83
+ showMainBadge: true,
84
+ onUpload: mockUpload,
85
+ helperText: 'Upload up to 6 photos. Drag to reorder.',
86
+ }}
87
+ />
88
+
89
+ <!-- Pre-populated -->
90
+ <Story
91
+ name="Pre-populated"
92
+ args={{
93
+ images: sampleImages,
94
+ maxImages: 6,
95
+ shape: 'square',
96
+ enableReorder: true,
97
+ showMainBadge: true,
98
+ onUpload: mockUpload,
99
+ helperText: 'These images came from props',
100
+ }}
101
+ />
102
+
103
+ <!-- Disabled State -->
104
+ <Story
105
+ name="Disabled"
106
+ args={{
107
+ images: sampleImages.slice(0, 2),
108
+ maxImages: 6,
109
+ shape: 'square',
110
+ disabled: true,
111
+ helperText: 'This uploader is disabled',
112
+ }}
113
+ />
114
+
115
+ <!-- With Error -->
116
+ <Story
117
+ name="With Error"
118
+ args={{
119
+ images: '',
120
+ maxImages: 1,
121
+ shape: 'square',
122
+ onUpload: mockUpload,
123
+ error: 'File is too large. Maximum size is 10MB.',
124
+ }}
125
+ />
@@ -0,0 +1,28 @@
1
+ export default ImageUploader;
2
+ type ImageUploader = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const ImageUploader: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import ImageUploader from './ImageUploader.svelte';
15
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
28
+ //# sourceMappingURL=ImageUploader.stories.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploader.stories.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/ImageUploader/ImageUploader.stories.svelte.js"],"names":[],"mappings":";;;;;;;;AAyHA;;;;mBAAyH;0BArH7F,wBAAwB;6CA4GP,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,eAAe,QAAQ,CAAC"}