@aspect-ops/exon-ui 0.0.2 → 0.1.0

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 (237) hide show
  1. package/README.md +793 -43
  2. package/dist/components/Accordion/Accordion.svelte +79 -0
  3. package/dist/components/Accordion/Accordion.svelte.d.ts +10 -0
  4. package/dist/components/Accordion/AccordionItem.svelte +198 -0
  5. package/dist/components/Accordion/AccordionItem.svelte.d.ts +10 -0
  6. package/dist/components/Accordion/index.d.ts +2 -0
  7. package/dist/components/Accordion/index.js +2 -0
  8. package/dist/components/ActionSheet/ActionSheet.svelte +270 -0
  9. package/dist/components/ActionSheet/ActionSheet.svelte.d.ts +12 -0
  10. package/dist/components/ActionSheet/ActionSheetItem.svelte +151 -0
  11. package/dist/components/ActionSheet/ActionSheetItem.svelte.d.ts +10 -0
  12. package/dist/components/ActionSheet/index.d.ts +3 -0
  13. package/dist/components/ActionSheet/index.js +2 -0
  14. package/dist/components/Alert/Alert.svelte +165 -0
  15. package/dist/components/Alert/Alert.svelte.d.ts +11 -0
  16. package/dist/components/Alert/index.d.ts +1 -0
  17. package/dist/components/Alert/index.js +1 -0
  18. package/dist/components/AspectRatio/AspectRatio.svelte +42 -0
  19. package/dist/components/AspectRatio/AspectRatio.svelte.d.ts +9 -0
  20. package/dist/components/AspectRatio/index.d.ts +1 -0
  21. package/dist/components/AspectRatio/index.js +1 -0
  22. package/dist/components/Avatar/Avatar.svelte +147 -0
  23. package/dist/components/Avatar/Avatar.svelte.d.ts +12 -0
  24. package/dist/components/Avatar/AvatarGroup.svelte +153 -0
  25. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +12 -0
  26. package/dist/components/Avatar/index.d.ts +2 -0
  27. package/dist/components/Avatar/index.js +2 -0
  28. package/dist/components/BottomSheet/BottomSheet.svelte +230 -0
  29. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +7 -0
  30. package/dist/components/BottomSheet/BottomSheetBody.svelte +20 -0
  31. package/dist/components/BottomSheet/BottomSheetBody.svelte.d.ts +7 -0
  32. package/dist/components/BottomSheet/BottomSheetHeader.svelte +27 -0
  33. package/dist/components/BottomSheet/BottomSheetHeader.svelte.d.ts +7 -0
  34. package/dist/components/BottomSheet/index.d.ts +3 -0
  35. package/dist/components/BottomSheet/index.js +3 -0
  36. package/dist/components/Box/Box.svelte +41 -0
  37. package/dist/components/Box/Box.svelte.d.ts +7 -0
  38. package/dist/components/Box/index.d.ts +1 -0
  39. package/dist/components/Box/index.js +1 -0
  40. package/dist/components/Card/Card.svelte +95 -0
  41. package/dist/components/Card/Card.svelte.d.ts +10 -0
  42. package/dist/components/Card/CardBody.svelte +32 -0
  43. package/dist/components/Card/CardBody.svelte.d.ts +7 -0
  44. package/dist/components/Card/CardFooter.svelte +34 -0
  45. package/dist/components/Card/CardFooter.svelte.d.ts +7 -0
  46. package/dist/components/Card/CardHeader.svelte +67 -0
  47. package/dist/components/Card/CardHeader.svelte.d.ts +9 -0
  48. package/dist/components/Card/index.d.ts +4 -0
  49. package/dist/components/Card/index.js +4 -0
  50. package/dist/components/Carousel/Carousel.svelte +454 -0
  51. package/dist/components/Carousel/Carousel.svelte.d.ts +14 -0
  52. package/dist/components/Carousel/CarouselSlide.svelte +22 -0
  53. package/dist/components/Carousel/CarouselSlide.svelte.d.ts +7 -0
  54. package/dist/components/Carousel/index.d.ts +2 -0
  55. package/dist/components/Carousel/index.js +2 -0
  56. package/dist/components/Center/Center.svelte +28 -0
  57. package/dist/components/Center/Center.svelte.d.ts +8 -0
  58. package/dist/components/Center/index.d.ts +1 -0
  59. package/dist/components/Center/index.js +1 -0
  60. package/dist/components/Chip/Chip.svelte +461 -0
  61. package/dist/components/Chip/Chip.svelte.d.ts +17 -0
  62. package/dist/components/Chip/ChipGroup.svelte +76 -0
  63. package/dist/components/Chip/ChipGroup.svelte.d.ts +9 -0
  64. package/dist/components/Chip/index.d.ts +2 -0
  65. package/dist/components/Chip/index.js +2 -0
  66. package/dist/components/Container/Container.svelte +58 -0
  67. package/dist/components/Container/Container.svelte.d.ts +10 -0
  68. package/dist/components/Container/index.d.ts +1 -0
  69. package/dist/components/Container/index.js +1 -0
  70. package/dist/components/DatePicker/DatePicker.svelte +746 -0
  71. package/dist/components/DatePicker/DatePicker.svelte.d.ts +19 -0
  72. package/dist/components/DatePicker/index.d.ts +1 -0
  73. package/dist/components/DatePicker/index.js +1 -0
  74. package/dist/components/Divider/Divider.svelte +38 -0
  75. package/dist/components/Divider/Divider.svelte.d.ts +9 -0
  76. package/dist/components/Divider/index.d.ts +1 -0
  77. package/dist/components/Divider/index.js +1 -0
  78. package/dist/components/EmptyState/EmptyState.svelte +164 -0
  79. package/dist/components/EmptyState/EmptyState.svelte.d.ts +12 -0
  80. package/dist/components/EmptyState/index.d.ts +1 -0
  81. package/dist/components/EmptyState/index.js +1 -0
  82. package/dist/components/FAB/FAB.svelte +242 -0
  83. package/dist/components/FAB/FAB.svelte.d.ts +9 -0
  84. package/dist/components/FAB/FABGroup.svelte +449 -0
  85. package/dist/components/FAB/FABGroup.svelte.d.ts +9 -0
  86. package/dist/components/FAB/index.d.ts +3 -0
  87. package/dist/components/FAB/index.js +2 -0
  88. package/dist/components/FileUpload/FileUpload.svelte +484 -0
  89. package/dist/components/FileUpload/FileUpload.svelte.d.ts +16 -0
  90. package/dist/components/FileUpload/index.d.ts +1 -0
  91. package/dist/components/FileUpload/index.js +1 -0
  92. package/dist/components/Grid/Grid.svelte +136 -0
  93. package/dist/components/Grid/Grid.svelte.d.ts +12 -0
  94. package/dist/components/Grid/GridItem.svelte +21 -0
  95. package/dist/components/Grid/GridItem.svelte.d.ts +7 -0
  96. package/dist/components/Grid/index.d.ts +2 -0
  97. package/dist/components/Grid/index.js +2 -0
  98. package/dist/components/Image/Image.svelte +223 -0
  99. package/dist/components/Image/Image.svelte.d.ts +19 -0
  100. package/dist/components/Image/index.d.ts +1 -0
  101. package/dist/components/Image/index.js +1 -0
  102. package/dist/components/List/List.svelte +42 -0
  103. package/dist/components/List/List.svelte.d.ts +18 -0
  104. package/dist/components/List/ListItem.svelte +139 -0
  105. package/dist/components/List/ListItem.svelte.d.ts +36 -0
  106. package/dist/components/List/index.d.ts +2 -0
  107. package/dist/components/List/index.js +2 -0
  108. package/dist/components/Modal/Modal.svelte +204 -0
  109. package/dist/components/Modal/Modal.svelte.d.ts +7 -0
  110. package/dist/components/Modal/ModalBody.svelte +50 -0
  111. package/dist/components/Modal/ModalBody.svelte.d.ts +7 -0
  112. package/dist/components/Modal/ModalFooter.svelte +37 -0
  113. package/dist/components/Modal/ModalFooter.svelte.d.ts +7 -0
  114. package/dist/components/Modal/ModalHeader.svelte +73 -0
  115. package/dist/components/Modal/ModalHeader.svelte.d.ts +7 -0
  116. package/dist/components/Modal/index.d.ts +4 -0
  117. package/dist/components/Modal/index.js +4 -0
  118. package/dist/components/OTPInput/OTPInput.svelte +312 -0
  119. package/dist/components/OTPInput/OTPInput.svelte.d.ts +57 -0
  120. package/dist/components/OTPInput/index.d.ts +1 -0
  121. package/dist/components/OTPInput/index.js +1 -0
  122. package/dist/components/Popover/Popover.svelte +14 -0
  123. package/dist/components/Popover/Popover.svelte.d.ts +7 -0
  124. package/dist/components/Popover/PopoverContent.svelte +63 -0
  125. package/dist/components/Popover/PopoverContent.svelte.d.ts +7 -0
  126. package/dist/components/Popover/PopoverTrigger.svelte +14 -0
  127. package/dist/components/Popover/PopoverTrigger.svelte.d.ts +7 -0
  128. package/dist/components/Popover/index.d.ts +3 -0
  129. package/dist/components/Popover/index.js +3 -0
  130. package/dist/components/Progress/ProgressBar.svelte +86 -0
  131. package/dist/components/Progress/ProgressBar.svelte.d.ts +11 -0
  132. package/dist/components/Progress/ProgressCircle.svelte +134 -0
  133. package/dist/components/Progress/ProgressCircle.svelte.d.ts +12 -0
  134. package/dist/components/Progress/Spinner.svelte +68 -0
  135. package/dist/components/Progress/Spinner.svelte.d.ts +8 -0
  136. package/dist/components/Progress/index.d.ts +3 -0
  137. package/dist/components/Progress/index.js +3 -0
  138. package/dist/components/PullToRefresh/PullToRefresh.svelte +304 -0
  139. package/dist/components/PullToRefresh/PullToRefresh.svelte.d.ts +20 -0
  140. package/dist/components/PullToRefresh/index.d.ts +1 -0
  141. package/dist/components/PullToRefresh/index.js +1 -0
  142. package/dist/components/Rating/Rating.svelte +316 -0
  143. package/dist/components/Rating/Rating.svelte.d.ts +16 -0
  144. package/dist/components/Rating/index.d.ts +1 -0
  145. package/dist/components/Rating/index.js +1 -0
  146. package/dist/components/SafeArea/SafeArea.svelte +33 -0
  147. package/dist/components/SafeArea/SafeArea.svelte.d.ts +7 -0
  148. package/dist/components/SearchInput/SearchInput.svelte +480 -0
  149. package/dist/components/SearchInput/SearchInput.svelte.d.ts +22 -0
  150. package/dist/components/SearchInput/index.d.ts +1 -0
  151. package/dist/components/SearchInput/index.js +1 -0
  152. package/dist/components/Select/Select.svelte +55 -12
  153. package/dist/components/Skeleton/Skeleton.svelte +59 -0
  154. package/dist/components/Skeleton/Skeleton.svelte.d.ts +10 -0
  155. package/dist/components/Skeleton/index.d.ts +1 -0
  156. package/dist/components/Skeleton/index.js +1 -0
  157. package/dist/components/Slider/Slider.svelte +324 -0
  158. package/dist/components/Slider/Slider.svelte.d.ts +14 -0
  159. package/dist/components/Slider/index.d.ts +1 -0
  160. package/dist/components/Slider/index.js +1 -0
  161. package/dist/components/Spacer/Spacer.svelte +56 -0
  162. package/dist/components/Spacer/Spacer.svelte.d.ts +6 -0
  163. package/dist/components/Spacer/index.d.ts +1 -0
  164. package/dist/components/Spacer/index.js +1 -0
  165. package/dist/components/Stack/Stack.svelte +117 -0
  166. package/dist/components/Stack/Stack.svelte.d.ts +13 -0
  167. package/dist/components/Stack/index.d.ts +1 -0
  168. package/dist/components/Stack/index.js +1 -0
  169. package/dist/components/Stepper/Stepper.svelte +100 -0
  170. package/dist/components/Stepper/Stepper.svelte.d.ts +11 -0
  171. package/dist/components/Stepper/StepperStep.svelte +391 -0
  172. package/dist/components/Stepper/StepperStep.svelte.d.ts +13 -0
  173. package/dist/components/Stepper/index.d.ts +2 -0
  174. package/dist/components/Stepper/index.js +2 -0
  175. package/dist/components/SwipeActions/SwipeAction.svelte +43 -0
  176. package/dist/components/SwipeActions/SwipeAction.svelte.d.ts +8 -0
  177. package/dist/components/SwipeActions/SwipeActions.svelte +193 -0
  178. package/dist/components/SwipeActions/SwipeActions.svelte.d.ts +9 -0
  179. package/dist/components/SwipeActions/index.d.ts +2 -0
  180. package/dist/components/SwipeActions/index.js +2 -0
  181. package/dist/components/Switch/Switch.svelte +29 -9
  182. package/dist/components/Table/Table.svelte +175 -0
  183. package/dist/components/Table/Table.svelte.d.ts +38 -0
  184. package/dist/components/Table/TableBody.svelte +26 -0
  185. package/dist/components/Table/TableBody.svelte.d.ts +13 -0
  186. package/dist/components/Table/TableCell.svelte +85 -0
  187. package/dist/components/Table/TableCell.svelte.d.ts +28 -0
  188. package/dist/components/Table/TableHead.svelte +36 -0
  189. package/dist/components/Table/TableHead.svelte.d.ts +13 -0
  190. package/dist/components/Table/TableHeader.svelte +217 -0
  191. package/dist/components/Table/TableHeader.svelte.d.ts +32 -0
  192. package/dist/components/Table/TableRow.svelte +92 -0
  193. package/dist/components/Table/TableRow.svelte.d.ts +28 -0
  194. package/dist/components/Table/index.d.ts +6 -0
  195. package/dist/components/Table/index.js +6 -0
  196. package/dist/components/Tag/Tag.svelte +189 -0
  197. package/dist/components/Tag/Tag.svelte.d.ts +13 -0
  198. package/dist/components/Tag/index.d.ts +1 -0
  199. package/dist/components/Tag/index.js +1 -0
  200. package/dist/components/TimePicker/TimePicker.svelte +803 -0
  201. package/dist/components/TimePicker/TimePicker.svelte.d.ts +17 -0
  202. package/dist/components/TimePicker/index.d.ts +1 -0
  203. package/dist/components/TimePicker/index.js +1 -0
  204. package/dist/components/Toast/Toast.svelte +241 -0
  205. package/dist/components/Toast/Toast.svelte.d.ts +18 -0
  206. package/dist/components/Toast/ToastContainer.svelte +110 -0
  207. package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
  208. package/dist/components/Toast/index.d.ts +3 -0
  209. package/dist/components/Toast/index.js +3 -0
  210. package/dist/components/Toast/toast.d.ts +13 -0
  211. package/dist/components/Toast/toast.js +55 -0
  212. package/dist/components/Tooltip/Tooltip.svelte +71 -0
  213. package/dist/components/Tooltip/Tooltip.svelte.d.ts +7 -0
  214. package/dist/components/Tooltip/index.d.ts +2 -0
  215. package/dist/components/Tooltip/index.js +1 -0
  216. package/dist/index.d.ts +38 -1
  217. package/dist/index.js +41 -0
  218. package/dist/styles/tokens.css +5 -0
  219. package/dist/types/data-display.d.ts +161 -0
  220. package/dist/types/data-display.js +1 -0
  221. package/dist/types/feedback.d.ts +92 -0
  222. package/dist/types/feedback.js +1 -0
  223. package/dist/types/index.d.ts +6 -1
  224. package/dist/types/input.d.ts +67 -0
  225. package/dist/types/input.js +2 -0
  226. package/dist/types/layout.d.ts +57 -0
  227. package/dist/types/layout.js +1 -0
  228. package/dist/types/mobile.d.ts +91 -0
  229. package/dist/types/mobile.js +1 -0
  230. package/dist/types/navigation.d.ts +15 -0
  231. package/dist/utils/gestures.d.ts +219 -0
  232. package/dist/utils/gestures.js +492 -0
  233. package/dist/utils/haptics.d.ts +89 -0
  234. package/dist/utils/haptics.js +198 -0
  235. package/dist/utils/platform.d.ts +47 -0
  236. package/dist/utils/platform.js +156 -0
  237. package/package.json +1 -1
@@ -0,0 +1,391 @@
1
+ <script lang="ts">
2
+ import { getContext, onMount } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ interface Props {
6
+ label: string;
7
+ description?: string;
8
+ optional?: boolean;
9
+ error?: boolean;
10
+ disabled?: boolean;
11
+ icon?: Snippet;
12
+ class?: string;
13
+ }
14
+
15
+ let {
16
+ label,
17
+ description,
18
+ optional = false,
19
+ error = false,
20
+ disabled = false,
21
+ icon,
22
+ class: className = ''
23
+ }: Props = $props();
24
+
25
+ const context = getContext<{
26
+ activeStep: number;
27
+ orientation: 'horizontal' | 'vertical';
28
+ linear: boolean;
29
+ totalSteps: number;
30
+ completedSteps: Set<number>;
31
+ registerStep: () => number;
32
+ setActiveStep: (index: number) => void;
33
+ completeStep: (index: number) => void;
34
+ }>('stepper');
35
+
36
+ let stepIndex = $state(0);
37
+
38
+ onMount(() => {
39
+ stepIndex = context.registerStep();
40
+ });
41
+
42
+ const isActive = $derived(context.activeStep === stepIndex);
43
+ const isCompleted = $derived(context.completedSteps.has(stepIndex));
44
+ const isPending = $derived(!isActive && !isCompleted);
45
+ const isClickable = $derived(
46
+ !disabled && (!context.linear || isCompleted || context.activeStep >= stepIndex)
47
+ );
48
+
49
+ function handleClick() {
50
+ if (isClickable) {
51
+ context.setActiveStep(stepIndex);
52
+ }
53
+ }
54
+
55
+ function handleKeyDown(event: KeyboardEvent) {
56
+ if (event.key === 'Enter' || event.key === ' ') {
57
+ event.preventDefault();
58
+ handleClick();
59
+ }
60
+ }
61
+ </script>
62
+
63
+ <li
64
+ class="stepper-step stepper-step--{context.orientation} {className}"
65
+ class:stepper-step--active={isActive}
66
+ class:stepper-step--completed={isCompleted}
67
+ class:stepper-step--pending={isPending}
68
+ class:stepper-step--error={error}
69
+ class:stepper-step--disabled={disabled}
70
+ role="listitem"
71
+ aria-current={isActive ? 'step' : undefined}
72
+ >
73
+ {#if isClickable}
74
+ <button
75
+ class="stepper-step__button stepper-step__button--clickable"
76
+ onclick={handleClick}
77
+ onkeydown={handleKeyDown}
78
+ type="button"
79
+ aria-disabled={disabled}
80
+ >
81
+ <div class="stepper-step__indicator">
82
+ {#if icon}
83
+ {@render icon()}
84
+ {:else if isCompleted}
85
+ <svg
86
+ class="stepper-step__icon"
87
+ viewBox="0 0 20 20"
88
+ fill="currentColor"
89
+ aria-hidden="true"
90
+ >
91
+ <path
92
+ fill-rule="evenodd"
93
+ d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
94
+ clip-rule="evenodd"
95
+ />
96
+ </svg>
97
+ {:else if error}
98
+ <svg
99
+ class="stepper-step__icon"
100
+ viewBox="0 0 20 20"
101
+ fill="currentColor"
102
+ aria-hidden="true"
103
+ >
104
+ <path
105
+ fill-rule="evenodd"
106
+ d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z"
107
+ clip-rule="evenodd"
108
+ />
109
+ </svg>
110
+ {:else}
111
+ <span class="stepper-step__number">{stepIndex + 1}</span>
112
+ {/if}
113
+ </div>
114
+
115
+ <div class="stepper-step__content">
116
+ <div class="stepper-step__label">
117
+ {label}
118
+ {#if optional}
119
+ <span class="stepper-step__optional">(Optional)</span>
120
+ {/if}
121
+ </div>
122
+ {#if description}
123
+ <div class="stepper-step__description">{description}</div>
124
+ {/if}
125
+ </div>
126
+ </button>
127
+ {:else}
128
+ <div class="stepper-step__button">
129
+ <div class="stepper-step__indicator">
130
+ {#if icon}
131
+ {@render icon()}
132
+ {:else if isCompleted}
133
+ <svg
134
+ class="stepper-step__icon"
135
+ viewBox="0 0 20 20"
136
+ fill="currentColor"
137
+ aria-hidden="true"
138
+ >
139
+ <path
140
+ fill-rule="evenodd"
141
+ d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
142
+ clip-rule="evenodd"
143
+ />
144
+ </svg>
145
+ {:else if error}
146
+ <svg
147
+ class="stepper-step__icon"
148
+ viewBox="0 0 20 20"
149
+ fill="currentColor"
150
+ aria-hidden="true"
151
+ >
152
+ <path
153
+ fill-rule="evenodd"
154
+ d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z"
155
+ clip-rule="evenodd"
156
+ />
157
+ </svg>
158
+ {:else}
159
+ <span class="stepper-step__number">{stepIndex + 1}</span>
160
+ {/if}
161
+ </div>
162
+
163
+ <div class="stepper-step__content">
164
+ <div class="stepper-step__label">
165
+ {label}
166
+ {#if optional}
167
+ <span class="stepper-step__optional">(Optional)</span>
168
+ {/if}
169
+ </div>
170
+ {#if description}
171
+ <div class="stepper-step__description">{description}</div>
172
+ {/if}
173
+ </div>
174
+ </div>
175
+ {/if}
176
+
177
+ {#if stepIndex < context.totalSteps - 1}
178
+ <div class="stepper-step__connector" aria-hidden="true"></div>
179
+ {/if}
180
+ </li>
181
+
182
+ <style>
183
+ .stepper-step {
184
+ position: relative;
185
+ display: flex;
186
+ }
187
+
188
+ /* Horizontal orientation */
189
+ .stepper-step--horizontal {
190
+ flex-direction: column;
191
+ flex: 1;
192
+ align-items: flex-start;
193
+ }
194
+
195
+ .stepper-step--horizontal .stepper-step__button {
196
+ flex-direction: column;
197
+ align-items: center;
198
+ text-align: center;
199
+ }
200
+
201
+ .stepper-step--horizontal .stepper-step__connector {
202
+ position: absolute;
203
+ top: 1.25rem;
204
+ left: calc(50% + 1.5rem);
205
+ right: calc(-50% + 1.5rem);
206
+ height: 2px;
207
+ background: var(--color-border, #d9d9d9);
208
+ }
209
+
210
+ .stepper-step--horizontal.stepper-step--completed .stepper-step__connector,
211
+ .stepper-step--horizontal.stepper-step--active .stepper-step__connector {
212
+ background: var(--color-primary, #0090ff);
213
+ }
214
+
215
+ /* Vertical orientation */
216
+ .stepper-step--vertical {
217
+ flex-direction: row;
218
+ align-items: flex-start;
219
+ }
220
+
221
+ .stepper-step--vertical .stepper-step__button {
222
+ flex-direction: row;
223
+ align-items: flex-start;
224
+ text-align: left;
225
+ gap: var(--space-md, 1rem);
226
+ }
227
+
228
+ .stepper-step--vertical .stepper-step__connector {
229
+ position: absolute;
230
+ top: 2.5rem;
231
+ left: 1.25rem;
232
+ bottom: -0.25rem;
233
+ width: 2px;
234
+ background: var(--color-border, #d9d9d9);
235
+ }
236
+
237
+ .stepper-step--vertical.stepper-step--completed .stepper-step__connector,
238
+ .stepper-step--vertical.stepper-step--active .stepper-step__connector {
239
+ background: var(--color-primary, #0090ff);
240
+ }
241
+
242
+ /* Button */
243
+ .stepper-step__button {
244
+ display: flex;
245
+ gap: var(--space-sm, 0.5rem);
246
+ background: none;
247
+ border: none;
248
+ padding: 0;
249
+ font-family: inherit;
250
+ width: 100%;
251
+ }
252
+
253
+ .stepper-step__button--clickable {
254
+ cursor: pointer;
255
+ }
256
+
257
+ .stepper-step__button--clickable:focus-visible {
258
+ outline: 2px solid var(--color-primary, #0090ff);
259
+ outline-offset: 2px;
260
+ border-radius: var(--radius-md, 0.375rem);
261
+ }
262
+
263
+ /* Indicator */
264
+ .stepper-step__indicator {
265
+ display: flex;
266
+ align-items: center;
267
+ justify-content: center;
268
+ width: 2.5rem;
269
+ height: 2.5rem;
270
+ min-width: 2.5rem;
271
+ min-height: 2.5rem;
272
+ border-radius: var(--radius-full, 9999px);
273
+ background: var(--color-bg-muted, #f9f9f9);
274
+ border: 2px solid var(--color-border, #d9d9d9);
275
+ color: var(--color-text-muted, #646464);
276
+ font-size: var(--text-sm, 0.875rem);
277
+ font-weight: var(--font-semibold, 600);
278
+ transition:
279
+ background var(--transition-fast, 150ms ease),
280
+ border-color var(--transition-fast, 150ms ease),
281
+ color var(--transition-fast, 150ms ease);
282
+ }
283
+
284
+ /* Pending state */
285
+ .stepper-step--pending .stepper-step__indicator {
286
+ background: var(--color-bg-muted, #f9f9f9);
287
+ border-color: var(--color-border, #d9d9d9);
288
+ color: var(--color-text-muted, #646464);
289
+ }
290
+
291
+ /* Active state */
292
+ .stepper-step--active .stepper-step__indicator {
293
+ background: var(--color-primary, #0090ff);
294
+ border-color: var(--color-primary, #0090ff);
295
+ color: var(--color-text-inverse, #ffffff);
296
+ }
297
+
298
+ /* Completed state */
299
+ .stepper-step--completed .stepper-step__indicator {
300
+ background: var(--color-primary, #0090ff);
301
+ border-color: var(--color-primary, #0090ff);
302
+ color: var(--color-text-inverse, #ffffff);
303
+ }
304
+
305
+ /* Error state */
306
+ .stepper-step--error .stepper-step__indicator {
307
+ background: var(--color-error, #e5484d);
308
+ border-color: var(--color-error, #e5484d);
309
+ color: var(--color-text-inverse, #ffffff);
310
+ }
311
+
312
+ /* Disabled state */
313
+ .stepper-step--disabled .stepper-step__indicator {
314
+ opacity: 0.5;
315
+ cursor: not-allowed;
316
+ }
317
+
318
+ /* Icon */
319
+ .stepper-step__icon {
320
+ width: 1.25rem;
321
+ height: 1.25rem;
322
+ }
323
+
324
+ /* Number */
325
+ .stepper-step__number {
326
+ line-height: 1;
327
+ }
328
+
329
+ /* Content */
330
+ .stepper-step__content {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: var(--space-xs, 0.25rem);
334
+ padding-top: 0.25rem;
335
+ }
336
+
337
+ /* Label */
338
+ .stepper-step__label {
339
+ font-size: var(--text-sm, 0.875rem);
340
+ font-weight: var(--font-medium, 500);
341
+ color: var(--color-text-muted, #646464);
342
+ transition: color var(--transition-fast, 150ms ease);
343
+ }
344
+
345
+ .stepper-step--active .stepper-step__label {
346
+ color: var(--color-text, #202020);
347
+ font-weight: var(--font-semibold, 600);
348
+ }
349
+
350
+ .stepper-step--completed .stepper-step__label {
351
+ color: var(--color-text, #202020);
352
+ }
353
+
354
+ .stepper-step--error .stepper-step__label {
355
+ color: var(--color-error, #e5484d);
356
+ }
357
+
358
+ /* Optional */
359
+ .stepper-step__optional {
360
+ font-size: var(--text-xs, 0.69rem);
361
+ font-weight: var(--font-normal, 400);
362
+ color: var(--color-text-subtle, #838383);
363
+ margin-left: var(--space-xs, 0.25rem);
364
+ }
365
+
366
+ /* Description */
367
+ .stepper-step__description {
368
+ font-size: var(--text-xs, 0.69rem);
369
+ color: var(--color-text-subtle, #838383);
370
+ line-height: var(--leading-normal, 1.5);
371
+ }
372
+
373
+ /* Touch targets for mobile */
374
+ @media (hover: none) and (pointer: coarse) {
375
+ .stepper-step__button {
376
+ min-height: var(--touch-target-min, 44px);
377
+ }
378
+ }
379
+
380
+ /* Responsive adjustments */
381
+ @media (max-width: 640px) {
382
+ .stepper-step--horizontal .stepper-step__content {
383
+ display: none;
384
+ }
385
+
386
+ .stepper-step--horizontal .stepper-step__connector {
387
+ left: calc(50% + 1.25rem);
388
+ right: calc(-50% + 1.25rem);
389
+ }
390
+ }
391
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ label: string;
4
+ description?: string;
5
+ optional?: boolean;
6
+ error?: boolean;
7
+ disabled?: boolean;
8
+ icon?: Snippet;
9
+ class?: string;
10
+ }
11
+ declare const StepperStep: import("svelte").Component<Props, {}, "">;
12
+ type StepperStep = ReturnType<typeof StepperStep>;
13
+ export default StepperStep;
@@ -0,0 +1,2 @@
1
+ export { default as Stepper } from './Stepper.svelte';
2
+ export { default as StepperStep } from './StepperStep.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Stepper } from './Stepper.svelte';
2
+ export { default as StepperStep } from './StepperStep.svelte';
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import type { SwipeActionProps } from '../../types/index.js';
3
+
4
+ interface Props extends SwipeActionProps {
5
+ children?: import('svelte').Snippet;
6
+ onclick?: () => void;
7
+ }
8
+
9
+ let {
10
+ color = 'var(--color-primary, #3b82f6)',
11
+ class: className = '',
12
+ onclick,
13
+ children
14
+ }: Props = $props();
15
+ </script>
16
+
17
+ <button class="swipe-action-item {className}" style="background: {color}" {onclick}>
18
+ {@render children?.()}
19
+ </button>
20
+
21
+ <style>
22
+ .swipe-action-item {
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ justify-content: center;
27
+ gap: 0.25rem;
28
+ min-width: 80px;
29
+ height: 100%;
30
+ border: none;
31
+ color: white;
32
+ font-family: inherit;
33
+ font-size: var(--text-xs, 0.75rem);
34
+ cursor: pointer;
35
+ min-height: 44px;
36
+ padding: var(--space-sm, 0.5rem);
37
+ }
38
+
39
+ .swipe-action-item:focus-visible {
40
+ outline: 2px solid white;
41
+ outline-offset: -2px;
42
+ }
43
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { SwipeActionProps } from '../../types/index.js';
2
+ interface Props extends SwipeActionProps {
3
+ children?: import('svelte').Snippet;
4
+ onclick?: () => void;
5
+ }
6
+ declare const SwipeAction: import("svelte").Component<Props, {}, "">;
7
+ type SwipeAction = ReturnType<typeof SwipeAction>;
8
+ export default SwipeAction;
@@ -0,0 +1,193 @@
1
+ <script lang="ts">
2
+ import type { SwipeActionsProps, SwipeActionData } from '../../types/index.js';
3
+ import { hapticImpact } from '../../utils/haptics.js';
4
+
5
+ interface Props extends SwipeActionsProps {
6
+ children?: import('svelte').Snippet;
7
+ leftActionsSnippet?: import('svelte').Snippet;
8
+ rightActionsSnippet?: import('svelte').Snippet;
9
+ }
10
+
11
+ let {
12
+ leftActions = [],
13
+ rightActions = [],
14
+ threshold = 60,
15
+ disabled = false,
16
+ class: className = '',
17
+ children,
18
+ leftActionsSnippet,
19
+ rightActionsSnippet
20
+ }: Props = $props();
21
+
22
+ let translateX = $state(0);
23
+ let isDragging = $state(false);
24
+ let startX = 0;
25
+ let containerRef: HTMLDivElement;
26
+
27
+ const leftWidth = $derived(leftActions.length * 80);
28
+ const rightWidth = $derived(rightActions.length * 80);
29
+
30
+ function handleTouchStart(e: TouchEvent) {
31
+ if (disabled) return;
32
+ isDragging = true;
33
+ startX = e.touches[0].clientX - translateX;
34
+ }
35
+
36
+ function handleTouchMove(e: TouchEvent) {
37
+ if (!isDragging || disabled) return;
38
+ const currentX = e.touches[0].clientX;
39
+ let newTranslateX = currentX - startX;
40
+
41
+ // Limit to action widths with resistance beyond
42
+ if (newTranslateX > leftWidth) {
43
+ newTranslateX = leftWidth + (newTranslateX - leftWidth) * 0.2;
44
+ } else if (newTranslateX < -rightWidth) {
45
+ newTranslateX = -rightWidth + (newTranslateX + rightWidth) * 0.2;
46
+ }
47
+
48
+ translateX = newTranslateX;
49
+ }
50
+
51
+ function handleTouchEnd() {
52
+ if (!isDragging) return;
53
+ isDragging = false;
54
+
55
+ // Snap to revealed or closed state
56
+ if (translateX > threshold && leftActions.length > 0) {
57
+ translateX = leftWidth;
58
+ hapticImpact('light');
59
+ } else if (translateX < -threshold && rightActions.length > 0) {
60
+ translateX = -rightWidth;
61
+ hapticImpact('light');
62
+ } else {
63
+ translateX = 0;
64
+ }
65
+ }
66
+
67
+ function executeAction(action: SwipeActionData, side: 'left' | 'right') {
68
+ hapticImpact('medium');
69
+ action.onAction?.();
70
+ translateX = 0;
71
+ }
72
+
73
+ function close() {
74
+ translateX = 0;
75
+ }
76
+ </script>
77
+
78
+ <div class="swipe-actions {className}" bind:this={containerRef}>
79
+ <!-- Left actions (revealed on swipe right) -->
80
+ {#if leftActions.length > 0}
81
+ <div class="swipe-actions__left" style="width: {leftWidth}px">
82
+ {#if leftActionsSnippet}
83
+ {@render leftActionsSnippet()}
84
+ {:else}
85
+ {#each leftActions as action}
86
+ <button
87
+ class="swipe-action"
88
+ style="background: {action.color || 'var(--color-primary, #3b82f6)'}"
89
+ onclick={() => executeAction(action, 'left')}
90
+ >
91
+ {#if action.icon}
92
+ <span class="swipe-action__icon">{action.icon}</span>
93
+ {/if}
94
+ <span class="swipe-action__label">{action.label}</span>
95
+ </button>
96
+ {/each}
97
+ {/if}
98
+ </div>
99
+ {/if}
100
+
101
+ <!-- Main content -->
102
+ <div
103
+ class="swipe-actions__content"
104
+ style="transform: translateX({translateX}px); transition: {isDragging
105
+ ? 'none'
106
+ : 'transform 0.3s cubic-bezier(0.32, 0.72, 0, 1)'};"
107
+ ontouchstart={handleTouchStart}
108
+ ontouchmove={handleTouchMove}
109
+ ontouchend={handleTouchEnd}
110
+ ontouchcancel={handleTouchEnd}
111
+ role="group"
112
+ >
113
+ {@render children?.()}
114
+ </div>
115
+
116
+ <!-- Right actions (revealed on swipe left) -->
117
+ {#if rightActions.length > 0}
118
+ <div class="swipe-actions__right" style="width: {rightWidth}px">
119
+ {#if rightActionsSnippet}
120
+ {@render rightActionsSnippet()}
121
+ {:else}
122
+ {#each rightActions as action}
123
+ <button
124
+ class="swipe-action"
125
+ style="background: {action.color || 'var(--color-destructive, #ef4444)'}"
126
+ onclick={() => executeAction(action, 'right')}
127
+ >
128
+ {#if action.icon}
129
+ <span class="swipe-action__icon">{action.icon}</span>
130
+ {/if}
131
+ <span class="swipe-action__label">{action.label}</span>
132
+ </button>
133
+ {/each}
134
+ {/if}
135
+ </div>
136
+ {/if}
137
+ </div>
138
+
139
+ <style>
140
+ .swipe-actions {
141
+ position: relative;
142
+ overflow: hidden;
143
+ touch-action: pan-y;
144
+ }
145
+
146
+ .swipe-actions__left,
147
+ .swipe-actions__right {
148
+ position: absolute;
149
+ top: 0;
150
+ bottom: 0;
151
+ display: flex;
152
+ }
153
+
154
+ .swipe-actions__left {
155
+ left: 0;
156
+ transform: translateX(-100%);
157
+ }
158
+
159
+ .swipe-actions__right {
160
+ right: 0;
161
+ transform: translateX(100%);
162
+ }
163
+
164
+ .swipe-actions__content {
165
+ position: relative;
166
+ background: var(--color-bg, #ffffff);
167
+ z-index: 1;
168
+ }
169
+
170
+ .swipe-action {
171
+ display: flex;
172
+ flex-direction: column;
173
+ align-items: center;
174
+ justify-content: center;
175
+ gap: 0.25rem;
176
+ width: 80px;
177
+ height: 100%;
178
+ border: none;
179
+ color: white;
180
+ font-family: inherit;
181
+ font-size: var(--text-xs, 0.75rem);
182
+ cursor: pointer;
183
+ min-height: 44px;
184
+ }
185
+
186
+ .swipe-action__icon {
187
+ font-size: 1.25rem;
188
+ }
189
+
190
+ .swipe-action__label {
191
+ font-weight: 500;
192
+ }
193
+ </style>
@@ -0,0 +1,9 @@
1
+ import type { SwipeActionsProps } from '../../types/index.js';
2
+ interface Props extends SwipeActionsProps {
3
+ children?: import('svelte').Snippet;
4
+ leftActionsSnippet?: import('svelte').Snippet;
5
+ rightActionsSnippet?: import('svelte').Snippet;
6
+ }
7
+ declare const SwipeActions: import("svelte").Component<Props, {}, "">;
8
+ type SwipeActions = ReturnType<typeof SwipeActions>;
9
+ export default SwipeActions;
@@ -0,0 +1,2 @@
1
+ export { default as SwipeActions } from './SwipeActions.svelte';
2
+ export { default as SwipeAction } from './SwipeAction.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as SwipeActions } from './SwipeActions.svelte';
2
+ export { default as SwipeAction } from './SwipeAction.svelte';