@sentropic/design-system-svelte 0.3.0 → 0.4.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 (46) hide show
  1. package/dist/Accordion.svelte +187 -0
  2. package/dist/Accordion.svelte.d.ts +20 -0
  3. package/dist/Accordion.svelte.d.ts.map +1 -0
  4. package/dist/Combobox.svelte +390 -0
  5. package/dist/Combobox.svelte.d.ts +28 -0
  6. package/dist/Combobox.svelte.d.ts.map +1 -0
  7. package/dist/DataTable.svelte +543 -0
  8. package/dist/DataTable.svelte.d.ts +50 -0
  9. package/dist/DataTable.svelte.d.ts.map +1 -0
  10. package/dist/Input.svelte +9 -2
  11. package/dist/Input.svelte.d.ts +3 -2
  12. package/dist/Input.svelte.d.ts.map +1 -1
  13. package/dist/MultiSelect.svelte +427 -0
  14. package/dist/MultiSelect.svelte.d.ts +28 -0
  15. package/dist/MultiSelect.svelte.d.ts.map +1 -0
  16. package/dist/NumberInput.svelte +256 -0
  17. package/dist/NumberInput.svelte.d.ts +19 -0
  18. package/dist/NumberInput.svelte.d.ts.map +1 -0
  19. package/dist/PasswordInput.svelte +205 -0
  20. package/dist/PasswordInput.svelte.d.ts +17 -0
  21. package/dist/PasswordInput.svelte.d.ts.map +1 -0
  22. package/dist/ProgressBar.svelte +176 -0
  23. package/dist/ProgressBar.svelte.d.ts +17 -0
  24. package/dist/ProgressBar.svelte.d.ts.map +1 -0
  25. package/dist/Search.svelte +218 -0
  26. package/dist/Search.svelte.d.ts +16 -0
  27. package/dist/Search.svelte.d.ts.map +1 -0
  28. package/dist/Select.svelte +9 -2
  29. package/dist/Select.svelte.d.ts +3 -2
  30. package/dist/Select.svelte.d.ts.map +1 -1
  31. package/dist/Slider.svelte +279 -0
  32. package/dist/Slider.svelte.d.ts +20 -0
  33. package/dist/Slider.svelte.d.ts.map +1 -0
  34. package/dist/Tag.svelte +140 -0
  35. package/dist/Tag.svelte.d.ts +16 -0
  36. package/dist/Tag.svelte.d.ts.map +1 -0
  37. package/dist/Textarea.svelte +9 -2
  38. package/dist/Textarea.svelte.d.ts +3 -2
  39. package/dist/Textarea.svelte.d.ts.map +1 -1
  40. package/dist/Toggle.svelte +135 -0
  41. package/dist/Toggle.svelte.d.ts +14 -0
  42. package/dist/Toggle.svelte.d.ts.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +11 -0
  46. package/package.json +2 -2
@@ -2,12 +2,13 @@
2
2
  import type { Snippet } from "svelte";
3
3
  import type { HTMLSelectAttributes } from "svelte/elements";
4
4
 
5
- type SelectProps = Omit<HTMLSelectAttributes, "class" | "size"> & {
5
+ type SelectProps = Omit<HTMLSelectAttributes, "class" | "size" | "value"> & {
6
6
  label?: string;
7
7
  helperText?: string;
8
8
  errorText?: string;
9
9
  invalid?: boolean;
10
10
  size?: "sm" | "md" | "lg";
11
+ value?: string | string[] | number | null;
11
12
  class?: string;
12
13
  children?: Snippet;
13
14
  };
@@ -18,6 +19,7 @@
18
19
  errorText,
19
20
  invalid = false,
20
21
  size = "md",
22
+ value = $bindable(""),
21
23
  class: className,
22
24
  children,
23
25
  ...rest
@@ -31,7 +33,12 @@
31
33
  <div class={fieldClasses()}>
32
34
  <label class="st-field__control">
33
35
  {#if label}<span class="st-field__label">{label}</span>{/if}
34
- <select {...rest} class={controlClasses()} aria-invalid={isInvalid() ? "true" : undefined}>
36
+ <select
37
+ {...rest}
38
+ bind:value
39
+ class={controlClasses()}
40
+ aria-invalid={isInvalid() ? "true" : undefined}
41
+ >
35
42
  {@render children?.()}
36
43
  </select>
37
44
  </label>
@@ -1,15 +1,16 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { HTMLSelectAttributes } from "svelte/elements";
3
- type SelectProps = Omit<HTMLSelectAttributes, "class" | "size"> & {
3
+ type SelectProps = Omit<HTMLSelectAttributes, "class" | "size" | "value"> & {
4
4
  label?: string;
5
5
  helperText?: string;
6
6
  errorText?: string;
7
7
  invalid?: boolean;
8
8
  size?: "sm" | "md" | "lg";
9
+ value?: string | string[] | number | null;
9
10
  class?: string;
10
11
  children?: Snippet;
11
12
  };
12
- declare const Select: import("svelte").Component<SelectProps, {}, "">;
13
+ declare const Select: import("svelte").Component<SelectProps, {}, "value">;
13
14
  type Select = ReturnType<typeof Select>;
14
15
  export default Select;
15
16
  //# sourceMappingURL=Select.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Select.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,KAAK,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAwCJ,QAAA,MAAM,MAAM,iDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Select.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,KAAK,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAyCJ,QAAA,MAAM,MAAM,sDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,279 @@
1
+ <script lang="ts">
2
+ import type { HTMLInputAttributes } from "svelte/elements";
3
+
4
+ type SliderProps = Omit<
5
+ HTMLInputAttributes,
6
+ "class" | "size" | "type" | "value" | "onchange"
7
+ > & {
8
+ label?: string;
9
+ helperText?: string;
10
+ errorText?: string;
11
+ invalid?: boolean;
12
+ size?: "sm" | "md" | "lg";
13
+ value?: number;
14
+ min?: number;
15
+ max?: number;
16
+ step?: number;
17
+ showValue?: boolean;
18
+ valueFormatter?: (value: number) => string;
19
+ class?: string;
20
+ onchange?: (value: number) => void;
21
+ };
22
+
23
+ let {
24
+ label,
25
+ helperText,
26
+ errorText,
27
+ invalid = false,
28
+ size = "md",
29
+ value = $bindable(0),
30
+ min = 0,
31
+ max = 100,
32
+ step = 1,
33
+ showValue = true,
34
+ valueFormatter,
35
+ disabled,
36
+ class: className,
37
+ onchange,
38
+ ...rest
39
+ }: SliderProps = $props();
40
+
41
+ const fieldClasses = () => ["st-field", className].filter(Boolean).join(" ");
42
+ const groupClasses = () => ["st-slider", `st-slider--${size}`].join(" ");
43
+ const isInvalid = () => invalid || Boolean(errorText);
44
+
45
+ const safeValue = $derived.by(() => {
46
+ if (typeof value !== "number" || Number.isNaN(value)) return min;
47
+ if (value < min) return min;
48
+ if (value > max) return max;
49
+ return value;
50
+ });
51
+
52
+ const percent = $derived.by(() => {
53
+ if (max === min) return 0;
54
+ return ((safeValue - min) / (max - min)) * 100;
55
+ });
56
+
57
+ const formatted = $derived(valueFormatter ? valueFormatter(safeValue) : String(safeValue));
58
+
59
+ function onInput(event: Event) {
60
+ const next = Number((event.currentTarget as HTMLInputElement).value);
61
+ if (Number.isFinite(next)) {
62
+ value = next;
63
+ onchange?.(next);
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <div class={fieldClasses()}>
69
+ <div class="st-slider__header">
70
+ {#if label}<span class="st-field__label">{label}</span>{/if}
71
+ {#if showValue}
72
+ <output class="st-slider__value" aria-live="polite">{formatted}</output>
73
+ {/if}
74
+ </div>
75
+ <span class={groupClasses()}>
76
+ <span class="st-slider__bounds" aria-hidden="true">{min}</span>
77
+ <span class="st-slider__track">
78
+ <span class="st-slider__fill" style={`--st-slider-fill: ${percent}%`}></span>
79
+ <span
80
+ class="st-slider__thumb"
81
+ style={`left: ${percent}%`}
82
+ aria-hidden="true"
83
+ >
84
+ {#if showValue}
85
+ <span class="st-slider__tooltip">{formatted}</span>
86
+ {/if}
87
+ </span>
88
+ <input
89
+ {...rest}
90
+ type="range"
91
+ class="st-slider__input"
92
+ aria-label={label}
93
+ aria-invalid={isInvalid() ? "true" : undefined}
94
+ value={safeValue}
95
+ {min}
96
+ {max}
97
+ {step}
98
+ {disabled}
99
+ oninput={onInput}
100
+ />
101
+ </span>
102
+ <span class="st-slider__bounds" aria-hidden="true">{max}</span>
103
+ </span>
104
+ {#if errorText}
105
+ <span class="st-field__error">{errorText}</span>
106
+ {:else if helperText}
107
+ <span class="st-field__help">{helperText}</span>
108
+ {/if}
109
+ </div>
110
+
111
+ <style>
112
+ .st-field {
113
+ color: var(--st-component-field-labelText, var(--st-semantic-text-primary));
114
+ display: grid;
115
+ gap: var(--st-component-field-gap, 0.5rem);
116
+ max-width: var(--st-component-field-maxWidth, 28rem);
117
+ }
118
+
119
+ .st-field__label {
120
+ font-size: 0.875rem;
121
+ font-weight: 600;
122
+ }
123
+
124
+ .st-field__help,
125
+ .st-field__error {
126
+ font-size: 0.8125rem;
127
+ line-height: 1.4;
128
+ }
129
+
130
+ .st-field__help {
131
+ color: var(--st-component-field-helpText, var(--st-semantic-text-secondary));
132
+ }
133
+
134
+ .st-field__error {
135
+ color: var(--st-component-field-errorText, var(--st-semantic-feedback-error));
136
+ }
137
+
138
+ .st-slider__header {
139
+ align-items: baseline;
140
+ display: flex;
141
+ gap: 0.5rem;
142
+ justify-content: space-between;
143
+ }
144
+
145
+ .st-slider__value {
146
+ color: var(--st-semantic-text-secondary);
147
+ font-size: 0.875rem;
148
+ font-variant-numeric: tabular-nums;
149
+ }
150
+
151
+ .st-slider {
152
+ align-items: center;
153
+ display: flex;
154
+ gap: 0.75rem;
155
+ width: 100%;
156
+ }
157
+
158
+ .st-slider__bounds {
159
+ color: var(--st-semantic-text-muted);
160
+ flex: 0 0 auto;
161
+ font-size: 0.75rem;
162
+ font-variant-numeric: tabular-nums;
163
+ }
164
+
165
+ .st-slider__track {
166
+ background: var(--st-component-control-border, var(--st-semantic-border-subtle));
167
+ border-radius: 999px;
168
+ flex: 1 1 auto;
169
+ height: 0.25rem;
170
+ position: relative;
171
+ }
172
+
173
+ .st-slider--sm .st-slider__track {
174
+ height: 0.1875rem;
175
+ }
176
+
177
+ .st-slider--lg .st-slider__track {
178
+ height: 0.375rem;
179
+ }
180
+
181
+ .st-slider__fill {
182
+ background: var(--st-semantic-action-primary);
183
+ border-radius: 999px;
184
+ display: block;
185
+ height: 100%;
186
+ width: var(--st-slider-fill, 0%);
187
+ }
188
+
189
+ .st-slider__thumb {
190
+ background: var(--st-semantic-action-primary);
191
+ border-radius: 50%;
192
+ height: 1rem;
193
+ pointer-events: none;
194
+ position: absolute;
195
+ top: 50%;
196
+ transform: translate(-50%, -50%);
197
+ width: 1rem;
198
+ }
199
+
200
+ .st-slider--sm .st-slider__thumb {
201
+ height: 0.75rem;
202
+ width: 0.75rem;
203
+ }
204
+
205
+ .st-slider--lg .st-slider__thumb {
206
+ height: 1.25rem;
207
+ width: 1.25rem;
208
+ }
209
+
210
+ .st-slider__tooltip {
211
+ background: var(--st-semantic-text-primary);
212
+ border-radius: var(--st-component-control-radius, 0.375rem);
213
+ bottom: calc(100% + 0.375rem);
214
+ color: var(--st-semantic-surface-default);
215
+ font-size: 0.6875rem;
216
+ font-weight: 600;
217
+ left: 50%;
218
+ line-height: 1;
219
+ opacity: 0;
220
+ padding: 0.25rem 0.375rem;
221
+ pointer-events: none;
222
+ position: absolute;
223
+ transform: translateX(-50%);
224
+ transition: opacity var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
225
+ white-space: nowrap;
226
+ }
227
+
228
+ .st-slider:hover .st-slider__tooltip,
229
+ .st-slider:focus-within .st-slider__tooltip {
230
+ opacity: 1;
231
+ }
232
+
233
+ .st-slider__input {
234
+ appearance: none;
235
+ background: transparent;
236
+ height: 100%;
237
+ inset: 0;
238
+ margin: 0;
239
+ padding: 0;
240
+ position: absolute;
241
+ width: 100%;
242
+ }
243
+
244
+ .st-slider__input:focus-visible {
245
+ outline: 2px solid var(--st-component-control-focusRing, var(--st-semantic-border-interactive));
246
+ outline-offset: 4px;
247
+ }
248
+
249
+ .st-slider__input::-webkit-slider-thumb {
250
+ appearance: none;
251
+ background: transparent;
252
+ border: 0;
253
+ cursor: pointer;
254
+ height: 1.5rem;
255
+ width: 1.5rem;
256
+ }
257
+
258
+ .st-slider__input::-moz-range-thumb {
259
+ background: transparent;
260
+ border: 0;
261
+ cursor: pointer;
262
+ height: 1.5rem;
263
+ width: 1.5rem;
264
+ }
265
+
266
+ .st-slider__input:disabled {
267
+ cursor: not-allowed;
268
+ }
269
+
270
+ .st-slider:has(.st-slider__input:disabled) .st-slider__fill,
271
+ .st-slider:has(.st-slider__input:disabled) .st-slider__thumb {
272
+ background: var(--st-semantic-text-muted);
273
+ }
274
+
275
+ .st-slider:has([aria-invalid="true"]) .st-slider__fill,
276
+ .st-slider:has([aria-invalid="true"]) .st-slider__thumb {
277
+ background: var(--st-semantic-feedback-error);
278
+ }
279
+ </style>
@@ -0,0 +1,20 @@
1
+ import type { HTMLInputAttributes } from "svelte/elements";
2
+ type SliderProps = Omit<HTMLInputAttributes, "class" | "size" | "type" | "value" | "onchange"> & {
3
+ label?: string;
4
+ helperText?: string;
5
+ errorText?: string;
6
+ invalid?: boolean;
7
+ size?: "sm" | "md" | "lg";
8
+ value?: number;
9
+ min?: number;
10
+ max?: number;
11
+ step?: number;
12
+ showValue?: boolean;
13
+ valueFormatter?: (value: number) => string;
14
+ class?: string;
15
+ onchange?: (value: number) => void;
16
+ };
17
+ declare const Slider: import("svelte").Component<SliderProps, {}, "value">;
18
+ type Slider = ReturnType<typeof Slider>;
19
+ export default Slider;
20
+ //# sourceMappingURL=Slider.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Slider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,KAAK,WAAW,GAAG,IAAI,CACrB,mBAAmB,EACnB,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CACjD,GAAG;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAiFJ,QAAA,MAAM,MAAM,sDAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,140 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+
5
+ type TagProps = Omit<HTMLAttributes<HTMLSpanElement>, "class"> & {
6
+ tone?: "neutral" | "success" | "warning" | "error" | "info";
7
+ size?: "sm" | "md";
8
+ dismissible?: boolean;
9
+ dismissLabel?: string;
10
+ disabled?: boolean;
11
+ onDismiss?: (event: MouseEvent) => void;
12
+ class?: string;
13
+ children?: Snippet;
14
+ };
15
+
16
+ let {
17
+ tone = "neutral",
18
+ size = "md",
19
+ dismissible = false,
20
+ dismissLabel = "Dismiss",
21
+ disabled = false,
22
+ onDismiss,
23
+ class: className,
24
+ children,
25
+ ...rest
26
+ }: TagProps = $props();
27
+
28
+ const classes = () =>
29
+ ["st-tag", `st-tag--${tone}`, `st-tag--${size}`, disabled ? "st-tag--disabled" : null, className]
30
+ .filter(Boolean)
31
+ .join(" ");
32
+
33
+ function handleDismiss(event: MouseEvent) {
34
+ if (disabled) return;
35
+ onDismiss?.(event);
36
+ }
37
+ </script>
38
+
39
+ <span {...rest} class={classes()} aria-disabled={disabled ? "true" : undefined}>
40
+ <span class="st-tag__label">{@render children?.()}</span>
41
+ {#if dismissible}
42
+ <button
43
+ type="button"
44
+ class="st-tag__dismiss"
45
+ aria-label={dismissLabel}
46
+ {disabled}
47
+ onclick={handleDismiss}
48
+ >
49
+ <span aria-hidden="true">×</span>
50
+ </button>
51
+ {/if}
52
+ </span>
53
+
54
+ <style>
55
+ .st-tag {
56
+ align-items: center;
57
+ border-radius: var(--st-radius-pill, 999px);
58
+ display: inline-flex;
59
+ font-weight: 600;
60
+ gap: 0.25rem;
61
+ line-height: 1;
62
+ padding: 0.25rem 0.5rem;
63
+ }
64
+
65
+ .st-tag--sm {
66
+ font-size: 0.6875rem;
67
+ padding: 0.1875rem 0.5rem;
68
+ }
69
+
70
+ .st-tag--md {
71
+ font-size: 0.75rem;
72
+ padding: 0.25rem 0.625rem;
73
+ }
74
+
75
+ .st-tag--neutral {
76
+ background: var(--st-semantic-surface-subtle);
77
+ color: var(--st-semantic-text-secondary);
78
+ }
79
+
80
+ .st-tag--success {
81
+ background: color-mix(in srgb, var(--st-semantic-feedback-success) 14%, white);
82
+ color: var(--st-semantic-feedback-success);
83
+ }
84
+
85
+ .st-tag--warning {
86
+ background: color-mix(in srgb, var(--st-semantic-feedback-warning) 14%, white);
87
+ color: var(--st-semantic-feedback-warning);
88
+ }
89
+
90
+ .st-tag--error {
91
+ background: color-mix(in srgb, var(--st-semantic-feedback-error) 14%, white);
92
+ color: var(--st-semantic-feedback-error);
93
+ }
94
+
95
+ .st-tag--info {
96
+ background: color-mix(in srgb, var(--st-semantic-feedback-info) 14%, white);
97
+ color: var(--st-semantic-feedback-info);
98
+ }
99
+
100
+ .st-tag--disabled {
101
+ opacity: 0.55;
102
+ }
103
+
104
+ .st-tag__label {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ }
108
+
109
+ .st-tag__dismiss {
110
+ align-items: center;
111
+ background: transparent;
112
+ border: 0;
113
+ border-radius: 50%;
114
+ color: inherit;
115
+ cursor: pointer;
116
+ display: inline-flex;
117
+ font: inherit;
118
+ font-size: 1em;
119
+ height: 1.25em;
120
+ justify-content: center;
121
+ line-height: 1;
122
+ margin-inline-start: 0.125rem;
123
+ padding: 0;
124
+ transition: background-color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
125
+ width: 1.25em;
126
+ }
127
+
128
+ .st-tag__dismiss:hover:not(:disabled) {
129
+ background: color-mix(in srgb, currentColor 18%, transparent);
130
+ }
131
+
132
+ .st-tag__dismiss:focus-visible {
133
+ outline: 2px solid currentColor;
134
+ outline-offset: 1px;
135
+ }
136
+
137
+ .st-tag__dismiss:disabled {
138
+ cursor: not-allowed;
139
+ }
140
+ </style>
@@ -0,0 +1,16 @@
1
+ import type { Snippet } from "svelte";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ type TagProps = Omit<HTMLAttributes<HTMLSpanElement>, "class"> & {
4
+ tone?: "neutral" | "success" | "warning" | "error" | "info";
5
+ size?: "sm" | "md";
6
+ dismissible?: boolean;
7
+ dismissLabel?: string;
8
+ disabled?: boolean;
9
+ onDismiss?: (event: MouseEvent) => void;
10
+ class?: string;
11
+ children?: Snippet;
12
+ };
13
+ declare const Tag: import("svelte").Component<TagProps, {}, "">;
14
+ type Tag = ReturnType<typeof Tag>;
15
+ export default Tag;
16
+ //# sourceMappingURL=Tag.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tag.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Tag.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpD,KAAK,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,GAAG;IAC/D,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5D,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA0CJ,QAAA,MAAM,GAAG,8CAAwC,CAAC;AAClD,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;AAClC,eAAe,GAAG,CAAC"}
@@ -1,11 +1,12 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLTextareaAttributes } from "svelte/elements";
3
3
 
4
- type TextareaProps = Omit<HTMLTextareaAttributes, "class"> & {
4
+ type TextareaProps = Omit<HTMLTextareaAttributes, "class" | "value"> & {
5
5
  label?: string;
6
6
  helperText?: string;
7
7
  errorText?: string;
8
8
  invalid?: boolean;
9
+ value?: string | null;
9
10
  class?: string;
10
11
  };
11
12
 
@@ -14,6 +15,7 @@
14
15
  helperText,
15
16
  errorText,
16
17
  invalid = false,
18
+ value = $bindable(""),
17
19
  class: className,
18
20
  ...rest
19
21
  }: TextareaProps = $props();
@@ -25,7 +27,12 @@
25
27
  <div class={fieldClasses()}>
26
28
  <label class="st-field__control">
27
29
  {#if label}<span class="st-field__label">{label}</span>{/if}
28
- <textarea {...rest} class="st-textarea" aria-invalid={isInvalid() ? "true" : undefined}></textarea>
30
+ <textarea
31
+ {...rest}
32
+ bind:value
33
+ class="st-textarea"
34
+ aria-invalid={isInvalid() ? "true" : undefined}
35
+ ></textarea>
29
36
  </label>
30
37
  {#if errorText}
31
38
  <span class="st-field__error">{errorText}</span>
@@ -1,12 +1,13 @@
1
1
  import type { HTMLTextareaAttributes } from "svelte/elements";
2
- type TextareaProps = Omit<HTMLTextareaAttributes, "class"> & {
2
+ type TextareaProps = Omit<HTMLTextareaAttributes, "class" | "value"> & {
3
3
  label?: string;
4
4
  helperText?: string;
5
5
  errorText?: string;
6
6
  invalid?: boolean;
7
+ value?: string | null;
7
8
  class?: string;
8
9
  };
9
- declare const Textarea: import("svelte").Component<TextareaProps, {}, "">;
10
+ declare const Textarea: import("svelte").Component<TextareaProps, {}, "value">;
10
11
  type Textarea = ReturnType<typeof Textarea>;
11
12
  export default Textarea;
12
13
  //# sourceMappingURL=Textarea.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Textarea.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,KAAK,aAAa,GAAG,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAAG;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAkCJ,QAAA,MAAM,QAAQ,mDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Textarea.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,KAAK,aAAa,GAAG,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAmCJ,QAAA,MAAM,QAAQ,wDAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}