@aspect-ops/exon-ui 0.0.3 → 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 (65) 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/Carousel/Carousel.svelte +454 -0
  9. package/dist/components/Carousel/Carousel.svelte.d.ts +14 -0
  10. package/dist/components/Carousel/CarouselSlide.svelte +22 -0
  11. package/dist/components/Carousel/CarouselSlide.svelte.d.ts +7 -0
  12. package/dist/components/Carousel/index.d.ts +2 -0
  13. package/dist/components/Carousel/index.js +2 -0
  14. package/dist/components/Chip/Chip.svelte +461 -0
  15. package/dist/components/Chip/Chip.svelte.d.ts +17 -0
  16. package/dist/components/Chip/ChipGroup.svelte +76 -0
  17. package/dist/components/Chip/ChipGroup.svelte.d.ts +9 -0
  18. package/dist/components/Chip/index.d.ts +2 -0
  19. package/dist/components/Chip/index.js +2 -0
  20. package/dist/components/DatePicker/DatePicker.svelte +746 -0
  21. package/dist/components/DatePicker/DatePicker.svelte.d.ts +19 -0
  22. package/dist/components/DatePicker/index.d.ts +1 -0
  23. package/dist/components/DatePicker/index.js +1 -0
  24. package/dist/components/FileUpload/FileUpload.svelte +484 -0
  25. package/dist/components/FileUpload/FileUpload.svelte.d.ts +16 -0
  26. package/dist/components/FileUpload/index.d.ts +1 -0
  27. package/dist/components/FileUpload/index.js +1 -0
  28. package/dist/components/Image/Image.svelte +223 -0
  29. package/dist/components/Image/Image.svelte.d.ts +19 -0
  30. package/dist/components/Image/index.d.ts +1 -0
  31. package/dist/components/Image/index.js +1 -0
  32. package/dist/components/OTPInput/OTPInput.svelte +312 -0
  33. package/dist/components/OTPInput/OTPInput.svelte.d.ts +57 -0
  34. package/dist/components/OTPInput/index.d.ts +1 -0
  35. package/dist/components/OTPInput/index.js +1 -0
  36. package/dist/components/Rating/Rating.svelte +316 -0
  37. package/dist/components/Rating/Rating.svelte.d.ts +16 -0
  38. package/dist/components/Rating/index.d.ts +1 -0
  39. package/dist/components/Rating/index.js +1 -0
  40. package/dist/components/SearchInput/SearchInput.svelte +480 -0
  41. package/dist/components/SearchInput/SearchInput.svelte.d.ts +22 -0
  42. package/dist/components/SearchInput/index.d.ts +1 -0
  43. package/dist/components/SearchInput/index.js +1 -0
  44. package/dist/components/Slider/Slider.svelte +324 -0
  45. package/dist/components/Slider/Slider.svelte.d.ts +14 -0
  46. package/dist/components/Slider/index.d.ts +1 -0
  47. package/dist/components/Slider/index.js +1 -0
  48. package/dist/components/Stepper/Stepper.svelte +100 -0
  49. package/dist/components/Stepper/Stepper.svelte.d.ts +11 -0
  50. package/dist/components/Stepper/StepperStep.svelte +391 -0
  51. package/dist/components/Stepper/StepperStep.svelte.d.ts +13 -0
  52. package/dist/components/Stepper/index.d.ts +2 -0
  53. package/dist/components/Stepper/index.js +2 -0
  54. package/dist/components/TimePicker/TimePicker.svelte +803 -0
  55. package/dist/components/TimePicker/TimePicker.svelte.d.ts +17 -0
  56. package/dist/components/TimePicker/index.d.ts +1 -0
  57. package/dist/components/TimePicker/index.js +1 -0
  58. package/dist/index.d.ts +10 -1
  59. package/dist/index.js +9 -0
  60. package/dist/types/data-display.d.ts +68 -0
  61. package/dist/types/index.d.ts +3 -2
  62. package/dist/types/input.d.ts +67 -0
  63. package/dist/types/input.js +2 -0
  64. package/dist/types/navigation.d.ts +15 -0
  65. 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';