@streamscloud/kit 0.16.1 → 0.17.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.
- package/dist/styles/_semantic.scss +3 -0
- package/dist/ui/button/cmp.button.svelte +6 -2
- package/dist/ui/button/cmp.button.svelte.d.ts +1 -1
- package/dist/ui/date-picker/cmp.date-picker.svelte +21 -18
- package/dist/ui/date-picker/cmp.date-picker.svelte.d.ts +1 -1
- package/dist/ui/form-field/cmp.form-field-validatable.svelte +1 -1
- package/dist/ui/form-field/cmp.form-field-validatable.svelte.d.ts +1 -1
- package/dist/ui/input/cmp.input.svelte +21 -18
- package/dist/ui/input/cmp.input.svelte.d.ts +1 -1
- package/dist/ui/numeral-input/cmp.numeral-input.svelte +21 -18
- package/dist/ui/numeral-input/cmp.numeral-input.svelte.d.ts +1 -1
- package/dist/ui/page-toolbar/cmp.toolbar-search-input.svelte +7 -6
- package/dist/ui/page-toolbar/cmp.toolbar-search-input.svelte.d.ts +7 -4
- package/dist/ui/page-toolbar/cmp.toolbar-value-stepper.svelte +4 -1
- package/dist/ui/rich-text-input/cmp.rich-text-input.svelte +9 -6
- package/dist/ui/rich-text-input/cmp.rich-text-input.svelte.d.ts +1 -1
- package/dist/ui/segmented-control/cmp.segmented-control.svelte +4 -2
- package/dist/ui/segmented-control/cmp.segmented-control.svelte.d.ts +1 -1
- package/dist/ui/select/_select-trigger.scss +20 -17
- package/dist/ui/select/cmp.singleselect-async.svelte +20 -17
- package/dist/ui/select/multiselect-base.svelte +21 -18
- package/dist/ui/textarea/cmp.textarea.svelte +17 -14
- package/dist/ui/textarea/cmp.textarea.svelte.d.ts +1 -1
- package/dist/ui/validatable/cmp.validatable.svelte +5 -5
- package/dist/ui/validatable/cmp.validatable.svelte.d.ts +2 -2
- package/dist/ui/validatable/cmp.validation-error.svelte +4 -4
- package/dist/ui/validatable/cmp.validation-error.svelte.d.ts +1 -1
- package/dist/ui/validatable/{cmp.field-error.svelte → field-frame.svelte} +6 -6
- package/dist/ui/validatable/{cmp.field-error.svelte.d.ts → field-frame.svelte.d.ts} +4 -4
- package/package.json +1 -1
|
@@ -121,6 +121,9 @@
|
|
|
121
121
|
--sc-kit--radius--pill: 999px;
|
|
122
122
|
--sc-kit--radius--circle: 50%;
|
|
123
123
|
|
|
124
|
+
--sc-kit--field--border-radius--sm: var(--sc-kit--radius--sm); // 4px
|
|
125
|
+
--sc-kit--field--border-radius--md: var(--sc-kit--radius--md); // 6px
|
|
126
|
+
|
|
124
127
|
// ============================================================
|
|
125
128
|
// TYPOGRAPHY
|
|
126
129
|
// ============================================================
|
|
@@ -111,7 +111,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
111
111
|
| `--sc-kit--button--padding-inline` | Inline (horizontal) padding | per size |
|
|
112
112
|
| `--sc-kit--button--font-size` | Label font size | per size |
|
|
113
113
|
| `--sc-kit--button--gap` | Gap between icon and label | per size |
|
|
114
|
-
| `--sc-kit--button--border-radius` | Corner rounding | `
|
|
114
|
+
| `--sc-kit--button--border-radius` | Corner rounding | per size — `xs`/`sm` 4px, `md`/`lg` 6px |
|
|
115
115
|
| `--sc-kit--button--font-weight` | Font weight | `var(--sc-kit--font-weight--regular)` |
|
|
116
116
|
| `--sc-kit--button--width` | Explicit width | `fit-content` |
|
|
117
117
|
| `--sc-kit--button--min-width` | Minimum width | `0` |
|
|
@@ -134,7 +134,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
134
134
|
--_btn--width: var(--sc-kit--button--width, fit-content);
|
|
135
135
|
--_btn--min-width: var(--sc-kit--button--min-width, 0);
|
|
136
136
|
--_btn--max-width: var(--sc-kit--button--max-width, 100%);
|
|
137
|
-
--_btn--border-radius: var(--sc-kit--button--border-radius, var(--sc-kit--radius--md));
|
|
137
|
+
--_btn--border-radius: var(--sc-kit--button--border-radius, var(--_btn--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
138
138
|
--_btn--font-weight: var(--sc-kit--button--font-weight, var(--sc-kit--font-weight--regular));
|
|
139
139
|
box-sizing: border-box;
|
|
140
140
|
display: flex;
|
|
@@ -207,6 +207,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
207
207
|
--_btn--size-font-size: var(--sc-kit--font-size--xs);
|
|
208
208
|
--_btn--size-gap: var(--sc-kit--space--1);
|
|
209
209
|
--_btn--size-icon-size: var(--sc-kit--field--icon--size--xs);
|
|
210
|
+
--_btn--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
210
211
|
}
|
|
211
212
|
.btn--sm {
|
|
212
213
|
--_btn--size-height: 1.75rem;
|
|
@@ -214,6 +215,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
214
215
|
--_btn--size-font-size: var(--sc-kit--font-size--sm);
|
|
215
216
|
--_btn--size-gap: var(--sc-kit--space--1);
|
|
216
217
|
--_btn--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
218
|
+
--_btn--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
217
219
|
}
|
|
218
220
|
.btn--md {
|
|
219
221
|
--_btn--size-height: 2rem;
|
|
@@ -221,6 +223,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
221
223
|
--_btn--size-font-size: var(--sc-kit--font-size--md);
|
|
222
224
|
--_btn--size-gap: var(--sc-kit--space--2);
|
|
223
225
|
--_btn--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
226
|
+
--_btn--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
224
227
|
}
|
|
225
228
|
.btn--lg {
|
|
226
229
|
--_btn--size-height: 2.5rem;
|
|
@@ -228,6 +231,7 @@ Pass `type="anchor"` to render as `<a>` with `href`, or `type="presentational"`
|
|
|
228
231
|
--_btn--size-font-size: var(--sc-kit--font-size--lg);
|
|
229
232
|
--_btn--size-gap: var(--sc-kit--space--2);
|
|
230
233
|
--_btn--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
234
|
+
--_btn--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
231
235
|
}
|
|
232
236
|
.btn--icon-only {
|
|
233
237
|
--sc-kit--button--padding-inline: 0;
|
|
@@ -68,7 +68,7 @@ type Props = ButtonModeProps | AnchorModeProps | PresentationalModeProps;
|
|
|
68
68
|
* | `--sc-kit--button--padding-inline` | Inline (horizontal) padding | per size |
|
|
69
69
|
* | `--sc-kit--button--font-size` | Label font size | per size |
|
|
70
70
|
* | `--sc-kit--button--gap` | Gap between icon and label | per size |
|
|
71
|
-
* | `--sc-kit--button--border-radius` | Corner rounding | `
|
|
71
|
+
* | `--sc-kit--button--border-radius` | Corner rounding | per size — `xs`/`sm` 4px, `md`/`lg` 6px |
|
|
72
72
|
* | `--sc-kit--button--font-weight` | Font weight | `var(--sc-kit--font-weight--regular)` |
|
|
73
73
|
* | `--sc-kit--button--width` | Explicit width | `fit-content` |
|
|
74
74
|
* | `--sc-kit--button--min-width` | Minimum width | `0` |
|
|
@@ -187,7 +187,7 @@ DatePicker — single-day calendar picker built on Floating UI for positioning.
|
|
|
187
187
|
| `--sc-kit--date-picker--background--disabled` | Trigger background when disabled | `var(--sc-kit--color--bg--field-alt)` |
|
|
188
188
|
| `--sc-kit--date-picker--border-color` | Trigger border color | `var(--sc-kit--color--border--field)` |
|
|
189
189
|
| `--sc-kit--date-picker--border-color--error` | Trigger border color in error state | `var(--sc-kit--color--danger)` |
|
|
190
|
-
| `--sc-kit--date-picker--border-radius` | Trigger border radius | `
|
|
190
|
+
| `--sc-kit--date-picker--border-radius` | Trigger border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
191
191
|
| `--sc-kit--date-picker--underline-color` | Inset bottom-underline indicator (transparent default, accent when open, danger on error) | `transparent` |
|
|
192
192
|
| `--sc-kit--date-picker--font-size` | Trigger font size | per size |
|
|
193
193
|
| `--sc-kit--date-picker--color` | Trigger text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -199,21 +199,21 @@ DatePicker — single-day calendar picker built on Floating UI for positioning.
|
|
|
199
199
|
<style>@charset "UTF-8";
|
|
200
200
|
.date-picker {
|
|
201
201
|
/* TRIGGER — public CSS API resolved with defaults (this block IS the API documentation) */
|
|
202
|
-
--_dp--height: var(--sc-kit--date-picker--height, var(--sc-kit--field--height--md));
|
|
203
|
-
--_dp--padding-inline: var(--sc-kit--date-picker--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
202
|
+
--_dp--height: var(--sc-kit--date-picker--height, var(--_dp--size-height, var(--sc-kit--field--height--md)));
|
|
203
|
+
--_dp--padding-inline: var(--sc-kit--date-picker--padding-inline, var(--_dp--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
204
204
|
--_dp--gap: var(--sc-kit--date-picker--gap, var(--sc-kit--space--2));
|
|
205
205
|
--_dp--width: var(--sc-kit--date-picker--width, 100%);
|
|
206
206
|
--_dp--background: var(--sc-kit--date-picker--background, var(--sc-kit--color--bg--field));
|
|
207
207
|
--_dp--background-disabled: var(--sc-kit--date-picker--background--disabled, var(--sc-kit--color--bg--field-alt));
|
|
208
208
|
--_dp--border-color: var(--sc-kit--date-picker--border-color, var(--sc-kit--color--border--field));
|
|
209
209
|
--_dp--border-color-error: var(--sc-kit--date-picker--border-color--error, var(--sc-kit--color--danger));
|
|
210
|
-
--_dp--border-radius: var(--sc-kit--date-picker--border-radius, var(--sc-kit--radius--
|
|
210
|
+
--_dp--border-radius: var(--sc-kit--date-picker--border-radius, var(--_dp--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
211
211
|
--_dp--underline-color: var(--sc-kit--date-picker--underline-color, transparent);
|
|
212
|
-
--_dp--font-size: var(--sc-kit--date-picker--font-size, var(--sc-kit--font-size--md));
|
|
212
|
+
--_dp--font-size: var(--sc-kit--date-picker--font-size, var(--_dp--size-font-size, var(--sc-kit--font-size--md)));
|
|
213
213
|
--_dp--color: var(--sc-kit--date-picker--color, var(--sc-kit--color--text--primary));
|
|
214
214
|
--_dp--placeholder-color: var(--sc-kit--date-picker--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
215
215
|
--_dp--icon-color: var(--sc-kit--date-picker--icon--color, var(--sc-kit--color--text--muted));
|
|
216
|
-
--_dp--icon-size: var(--sc-kit--date-picker--icon--size, var(--sc-kit--field--icon--size--md));
|
|
216
|
+
--_dp--icon-size: var(--sc-kit--date-picker--icon--size, var(--_dp--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
217
217
|
--_--input-affordance--opacity: 0;
|
|
218
218
|
--_--input-affordance--scale: 0;
|
|
219
219
|
}
|
|
@@ -232,22 +232,25 @@ DatePicker — single-day calendar picker built on Floating UI for positioning.
|
|
|
232
232
|
--_--input-affordance--scale: 1;
|
|
233
233
|
}
|
|
234
234
|
.date-picker--sm {
|
|
235
|
-
--
|
|
236
|
-
--
|
|
237
|
-
--
|
|
238
|
-
--
|
|
235
|
+
--_dp--size-height: var(--sc-kit--field--height--sm);
|
|
236
|
+
--_dp--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
237
|
+
--_dp--size-font-size: var(--sc-kit--font-size--sm);
|
|
238
|
+
--_dp--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
239
|
+
--_dp--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
239
240
|
}
|
|
240
241
|
.date-picker--md {
|
|
241
|
-
--
|
|
242
|
-
--
|
|
243
|
-
--
|
|
244
|
-
--
|
|
242
|
+
--_dp--size-height: var(--sc-kit--field--height--md);
|
|
243
|
+
--_dp--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
244
|
+
--_dp--size-font-size: var(--sc-kit--font-size--md);
|
|
245
|
+
--_dp--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
246
|
+
--_dp--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
245
247
|
}
|
|
246
248
|
.date-picker--lg {
|
|
247
|
-
--
|
|
248
|
-
--
|
|
249
|
-
--
|
|
250
|
-
--
|
|
249
|
+
--_dp--size-height: var(--sc-kit--field--height--lg);
|
|
250
|
+
--_dp--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
251
|
+
--_dp--size-font-size: var(--sc-kit--font-size--lg);
|
|
252
|
+
--_dp--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
253
|
+
--_dp--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
251
254
|
}
|
|
252
255
|
.date-picker--open {
|
|
253
256
|
--sc-kit--date-picker--underline-color: var(--sc-kit--color--accent);
|
|
@@ -69,7 +69,7 @@ type Props = ClearableProps | RequiredProps;
|
|
|
69
69
|
* | `--sc-kit--date-picker--background--disabled` | Trigger background when disabled | `var(--sc-kit--color--bg--field-alt)` |
|
|
70
70
|
* | `--sc-kit--date-picker--border-color` | Trigger border color | `var(--sc-kit--color--border--field)` |
|
|
71
71
|
* | `--sc-kit--date-picker--border-color--error` | Trigger border color in error state | `var(--sc-kit--color--danger)` |
|
|
72
|
-
* | `--sc-kit--date-picker--border-radius` | Trigger border radius | `
|
|
72
|
+
* | `--sc-kit--date-picker--border-radius` | Trigger border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
73
73
|
* | `--sc-kit--date-picker--underline-color` | Inset bottom-underline indicator (transparent default, accent when open, danger on error) | `transparent` |
|
|
74
74
|
* | `--sc-kit--date-picker--font-size` | Trigger font size | per size |
|
|
75
75
|
* | `--sc-kit--date-picker--color` | Trigger text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts" generics="T extends Record<string, unknown>, K extends keyof T & string">import { Validatable } from '../validatable';
|
|
2
2
|
import { default as FormField } from './cmp.form-field.svelte';
|
|
3
|
-
let { handler, name, label, required = false, validateOn, debounceMs, disableTouchedTracking, reserveErrorSpace, on, children } = $props();
|
|
3
|
+
let { handler, name, label, required = false, validateOn, debounceMs, disableTouchedTracking, reserveErrorSpace = false, on, children } = $props();
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<FormField label={label} required={required}>
|
|
@@ -17,7 +17,7 @@ declare function $$render<T extends Record<string, unknown>, K extends keyof T &
|
|
|
17
17
|
debounceMs?: number;
|
|
18
18
|
/** Show errors before the field has been touched. Forwarded to `<Validatable>`. @default false */
|
|
19
19
|
disableTouchedTracking?: boolean;
|
|
20
|
-
/** Reserve space below the field so a toggling error doesn't shift layout. Forwarded to `<Validatable
|
|
20
|
+
/** Reserve space below the field so a toggling error doesn't shift layout. Forwarded to `<Validatable>` (whose own default is `true`). @default false */
|
|
21
21
|
reserveErrorSpace?: boolean;
|
|
22
22
|
/** Extra consumer callbacks. Forwarded to `<Validatable>`. */
|
|
23
23
|
on?: {
|
|
@@ -161,7 +161,7 @@ or the clear button (see `HandleInput`'s availability pill).
|
|
|
161
161
|
| `--sc-kit--input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
162
162
|
| `--sc-kit--input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
163
163
|
| `--sc-kit--input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
164
|
-
| `--sc-kit--input--border-radius` | Border radius | `
|
|
164
|
+
| `--sc-kit--input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
165
165
|
| `--sc-kit--input--underline-color` | Inset bottom-underline indicator (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
166
166
|
| `--sc-kit--input--font-size` | Text font size | per size |
|
|
167
167
|
| `--sc-kit--input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -172,8 +172,8 @@ or the clear button (see `HandleInput`'s availability pill).
|
|
|
172
172
|
|
|
173
173
|
<style>.input {
|
|
174
174
|
/* Public CSS API resolved with defaults (this block IS the API documentation) */
|
|
175
|
-
--_in--height: var(--sc-kit--input--height, var(--sc-kit--field--height--md));
|
|
176
|
-
--_in--padding-inline: var(--sc-kit--input--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
175
|
+
--_in--height: var(--sc-kit--input--height, var(--_in--size-height, var(--sc-kit--field--height--md)));
|
|
176
|
+
--_in--padding-inline: var(--sc-kit--input--padding-inline, var(--_in--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
177
177
|
--_in--gap: var(--sc-kit--input--gap, var(--sc-kit--space--2));
|
|
178
178
|
--_in--width: var(--sc-kit--input--width, 100%);
|
|
179
179
|
--_in--background: var(--sc-kit--input--background, var(--sc-kit--color--bg--field));
|
|
@@ -181,13 +181,13 @@ or the clear button (see `HandleInput`'s availability pill).
|
|
|
181
181
|
--_in--border-color: var(--sc-kit--input--border-color, var(--sc-kit--color--border--field));
|
|
182
182
|
--_in--border-color-hover: var(--sc-kit--input--border-color--hover, var(--sc-kit--color--border--strong));
|
|
183
183
|
--_in--border-color-error: var(--sc-kit--input--border-color--error, var(--sc-kit--color--danger));
|
|
184
|
-
--_in--border-radius: var(--sc-kit--input--border-radius, var(--sc-kit--radius--
|
|
184
|
+
--_in--border-radius: var(--sc-kit--input--border-radius, var(--_in--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
185
185
|
--_in--underline-color: var(--sc-kit--input--underline-color, transparent);
|
|
186
|
-
--_in--font-size: var(--sc-kit--input--font-size, var(--sc-kit--font-size--md));
|
|
186
|
+
--_in--font-size: var(--sc-kit--input--font-size, var(--_in--size-font-size, var(--sc-kit--font-size--md)));
|
|
187
187
|
--_in--color: var(--sc-kit--input--color, var(--sc-kit--color--text--primary));
|
|
188
188
|
--_in--placeholder-color: var(--sc-kit--input--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
189
189
|
--_in--icon-color: var(--sc-kit--input--icon--color, var(--sc-kit--color--text--muted));
|
|
190
|
-
--_in--icon-size: var(--sc-kit--input--icon--size, var(--sc-kit--field--icon--size--md));
|
|
190
|
+
--_in--icon-size: var(--sc-kit--input--icon--size, var(--_in--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
191
191
|
--_--input-affordance--opacity: 0;
|
|
192
192
|
--_--input-affordance--scale: 0;
|
|
193
193
|
}
|
|
@@ -225,22 +225,25 @@ or the clear button (see `HandleInput`'s availability pill).
|
|
|
225
225
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
226
226
|
}
|
|
227
227
|
.input--sm {
|
|
228
|
-
--
|
|
229
|
-
--
|
|
230
|
-
--
|
|
231
|
-
--
|
|
228
|
+
--_in--size-height: var(--sc-kit--field--height--sm);
|
|
229
|
+
--_in--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
230
|
+
--_in--size-font-size: var(--sc-kit--font-size--sm);
|
|
231
|
+
--_in--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
232
|
+
--_in--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
232
233
|
}
|
|
233
234
|
.input--md {
|
|
234
|
-
--
|
|
235
|
-
--
|
|
236
|
-
--
|
|
237
|
-
--
|
|
235
|
+
--_in--size-height: var(--sc-kit--field--height--md);
|
|
236
|
+
--_in--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
237
|
+
--_in--size-font-size: var(--sc-kit--font-size--md);
|
|
238
|
+
--_in--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
239
|
+
--_in--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
238
240
|
}
|
|
239
241
|
.input--lg {
|
|
240
|
-
--
|
|
241
|
-
--
|
|
242
|
-
--
|
|
243
|
-
--
|
|
242
|
+
--_in--size-height: var(--sc-kit--field--height--lg);
|
|
243
|
+
--_in--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
244
|
+
--_in--size-font-size: var(--sc-kit--font-size--lg);
|
|
245
|
+
--_in--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
246
|
+
--_in--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
244
247
|
}
|
|
245
248
|
.input:where(:hover:not(:focus-within)) {
|
|
246
249
|
--sc-kit--input--border-color: var(--_in--border-color-hover);
|
|
@@ -22,7 +22,7 @@ import type { InputProps } from './types';
|
|
|
22
22
|
* | `--sc-kit--input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
23
23
|
* | `--sc-kit--input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
24
24
|
* | `--sc-kit--input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
25
|
-
* | `--sc-kit--input--border-radius` | Border radius | `
|
|
25
|
+
* | `--sc-kit--input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
26
26
|
* | `--sc-kit--input--underline-color` | Inset bottom-underline indicator (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
27
27
|
* | `--sc-kit--input--font-size` | Text font size | per size |
|
|
28
28
|
* | `--sc-kit--input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -197,7 +197,7 @@ requires a non-null value. CSS API mirrors `Input` for visual-language compatibi
|
|
|
197
197
|
| `--sc-kit--numeral-input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
198
198
|
| `--sc-kit--numeral-input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
199
199
|
| `--sc-kit--numeral-input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
200
|
-
| `--sc-kit--numeral-input--border-radius` | Border radius | `
|
|
200
|
+
| `--sc-kit--numeral-input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
201
201
|
| `--sc-kit--numeral-input--underline-color` | Inset bottom-underline indicator | `transparent` |
|
|
202
202
|
| `--sc-kit--numeral-input--font-size` | Text font size | per size |
|
|
203
203
|
| `--sc-kit--numeral-input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -207,8 +207,8 @@ requires a non-null value. CSS API mirrors `Input` for visual-language compatibi
|
|
|
207
207
|
-->
|
|
208
208
|
|
|
209
209
|
<style>.numeral-input {
|
|
210
|
-
--_ni--height: var(--sc-kit--numeral-input--height, var(--sc-kit--field--height--md));
|
|
211
|
-
--_ni--padding-inline: var(--sc-kit--numeral-input--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
210
|
+
--_ni--height: var(--sc-kit--numeral-input--height, var(--_ni--size-height, var(--sc-kit--field--height--md)));
|
|
211
|
+
--_ni--padding-inline: var(--sc-kit--numeral-input--padding-inline, var(--_ni--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
212
212
|
--_ni--gap: var(--sc-kit--numeral-input--gap, var(--sc-kit--space--2));
|
|
213
213
|
--_ni--width: var(--sc-kit--numeral-input--width, 100%);
|
|
214
214
|
--_ni--background: var(--sc-kit--numeral-input--background, var(--sc-kit--color--bg--field));
|
|
@@ -216,13 +216,13 @@ requires a non-null value. CSS API mirrors `Input` for visual-language compatibi
|
|
|
216
216
|
--_ni--border-color: var(--sc-kit--numeral-input--border-color, var(--sc-kit--color--border--field));
|
|
217
217
|
--_ni--border-color-hover: var(--sc-kit--numeral-input--border-color--hover, var(--sc-kit--color--border--strong));
|
|
218
218
|
--_ni--border-color-error: var(--sc-kit--numeral-input--border-color--error, var(--sc-kit--color--danger));
|
|
219
|
-
--_ni--border-radius: var(--sc-kit--numeral-input--border-radius, var(--sc-kit--radius--
|
|
219
|
+
--_ni--border-radius: var(--sc-kit--numeral-input--border-radius, var(--_ni--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
220
220
|
--_ni--underline-color: var(--sc-kit--numeral-input--underline-color, transparent);
|
|
221
|
-
--_ni--font-size: var(--sc-kit--numeral-input--font-size, var(--sc-kit--font-size--md));
|
|
221
|
+
--_ni--font-size: var(--sc-kit--numeral-input--font-size, var(--_ni--size-font-size, var(--sc-kit--font-size--md)));
|
|
222
222
|
--_ni--color: var(--sc-kit--numeral-input--color, var(--sc-kit--color--text--primary));
|
|
223
223
|
--_ni--placeholder-color: var(--sc-kit--numeral-input--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
224
224
|
--_ni--icon-color: var(--sc-kit--numeral-input--icon--color, var(--sc-kit--color--text--muted));
|
|
225
|
-
--_ni--icon-size: var(--sc-kit--numeral-input--icon--size, var(--sc-kit--field--icon--size--md));
|
|
225
|
+
--_ni--icon-size: var(--sc-kit--numeral-input--icon--size, var(--_ni--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
226
226
|
--_--input-affordance--opacity: 0;
|
|
227
227
|
--_--input-affordance--scale: 0;
|
|
228
228
|
}
|
|
@@ -249,22 +249,25 @@ requires a non-null value. CSS API mirrors `Input` for visual-language compatibi
|
|
|
249
249
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), border-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), color var(--sc-kit--duration--base) var(--sc-kit--ease--default), box-shadow var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
250
250
|
}
|
|
251
251
|
.numeral-input--sm {
|
|
252
|
-
--
|
|
253
|
-
--
|
|
254
|
-
--
|
|
255
|
-
--
|
|
252
|
+
--_ni--size-height: var(--sc-kit--field--height--sm);
|
|
253
|
+
--_ni--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
254
|
+
--_ni--size-font-size: var(--sc-kit--font-size--sm);
|
|
255
|
+
--_ni--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
256
|
+
--_ni--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
256
257
|
}
|
|
257
258
|
.numeral-input--md {
|
|
258
|
-
--
|
|
259
|
-
--
|
|
260
|
-
--
|
|
261
|
-
--
|
|
259
|
+
--_ni--size-height: var(--sc-kit--field--height--md);
|
|
260
|
+
--_ni--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
261
|
+
--_ni--size-font-size: var(--sc-kit--font-size--md);
|
|
262
|
+
--_ni--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
263
|
+
--_ni--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
262
264
|
}
|
|
263
265
|
.numeral-input--lg {
|
|
264
|
-
--
|
|
265
|
-
--
|
|
266
|
-
--
|
|
267
|
-
--
|
|
266
|
+
--_ni--size-height: var(--sc-kit--field--height--lg);
|
|
267
|
+
--_ni--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
268
|
+
--_ni--size-font-size: var(--sc-kit--font-size--lg);
|
|
269
|
+
--_ni--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
270
|
+
--_ni--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
268
271
|
}
|
|
269
272
|
.numeral-input:where(:hover:not(:focus-within)) {
|
|
270
273
|
--sc-kit--numeral-input--border-color: var(--_ni--border-color-hover);
|
|
@@ -81,7 +81,7 @@ type Props = ClearableProps | RequiredProps;
|
|
|
81
81
|
* | `--sc-kit--numeral-input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
82
82
|
* | `--sc-kit--numeral-input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
83
83
|
* | `--sc-kit--numeral-input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
84
|
-
* | `--sc-kit--numeral-input--border-radius` | Border radius | `
|
|
84
|
+
* | `--sc-kit--numeral-input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
85
85
|
* | `--sc-kit--numeral-input--underline-color` | Inset bottom-underline indicator | `transparent` |
|
|
86
86
|
* | `--sc-kit--numeral-input--font-size` | Text font size | per size |
|
|
87
87
|
* | `--sc-kit--numeral-input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { CONTROL_ICON_SIZE, scaleUp } from '../icon';
|
|
3
3
|
import { Input } from '../input';
|
|
4
4
|
import IconSearch from '@fluentui/svg-icons/icons/search_20_regular.svg?raw';
|
|
5
|
-
const { value, collapsedIconColor, collapsedIconSize, placeholder = '', size = 'sm', debounce = 0, shortcut = false, clearOnEscape = false, on } = $props();
|
|
5
|
+
const { value, collapsedIconColor, collapsedIconSize, placeholder = '', size = 'sm', debounce = 0, collapsible = true, shortcut = false, clearOnEscape = false, on } = $props();
|
|
6
6
|
let inputRef = $state.raw(undefined);
|
|
7
7
|
let focused = $state(false);
|
|
8
|
-
const expanded = $derived(focused || !!value);
|
|
8
|
+
const expanded = $derived(!collapsible || focused || !!value);
|
|
9
9
|
const collapsedSize = $derived(collapsedIconSize ?? scaleUp(CONTROL_ICON_SIZE[size]));
|
|
10
10
|
const onInput = (v) => {
|
|
11
11
|
on?.input?.(v);
|
|
@@ -47,10 +47,11 @@ const handleKeydown = (event) => {
|
|
|
47
47
|
|
|
48
48
|
<!--
|
|
49
49
|
@component
|
|
50
|
-
A
|
|
51
|
-
when empty + unfocused
|
|
52
|
-
Shares Input's size preset so it lines up with
|
|
53
|
-
for a document-wide Cmd/Ctrl+K focus-and-select,
|
|
50
|
+
A search input for toolbars. By default collapses to an icon-only square at the chosen field height
|
|
51
|
+
when empty + unfocused, and expands to the full input width when focused or when a value is present;
|
|
52
|
+
set `collapsible={false}` to keep it always expanded. Shares Input's size preset so it lines up with
|
|
53
|
+
other field-shaped controls. Opt into `shortcut` for a document-wide Cmd/Ctrl+K focus-and-select,
|
|
54
|
+
and `clearOnEscape` to clear on Escape.
|
|
54
55
|
|
|
55
56
|
### CSS Custom Properties
|
|
56
57
|
| Property | Description | Default |
|
|
@@ -7,6 +7,8 @@ type Props = {
|
|
|
7
7
|
placeholder?: string;
|
|
8
8
|
/** Size preset (shared with Input / DatePicker / Select). @default 'sm' */
|
|
9
9
|
size?: 'sm' | 'md' | 'lg';
|
|
10
|
+
/** Collapse to an icon-only square when empty + unfocused. Set false to keep the input always expanded. @default true */
|
|
11
|
+
collapsible?: boolean;
|
|
10
12
|
/** Debounce delay in ms @default 0 */
|
|
11
13
|
debounce?: number;
|
|
12
14
|
/** Bind Cmd/Ctrl+K document-wide to focus the input and select its text. Enable on a single instance per view. @default false */
|
|
@@ -18,10 +20,11 @@ type Props = {
|
|
|
18
20
|
};
|
|
19
21
|
};
|
|
20
22
|
/**
|
|
21
|
-
* A
|
|
22
|
-
* when empty + unfocused
|
|
23
|
-
* Shares Input's size preset so it lines up with
|
|
24
|
-
* for a document-wide Cmd/Ctrl+K focus-and-select,
|
|
23
|
+
* A search input for toolbars. By default collapses to an icon-only square at the chosen field height
|
|
24
|
+
* when empty + unfocused, and expands to the full input width when focused or when a value is present;
|
|
25
|
+
* set `collapsible={false}` to keep it always expanded. Shares Input's size preset so it lines up with
|
|
26
|
+
* other field-shaped controls. Opt into `shortcut` for a document-wide Cmd/Ctrl+K focus-and-select,
|
|
27
|
+
* and `clearOnEscape` to clear on Escape.
|
|
25
28
|
*
|
|
26
29
|
* ### CSS Custom Properties
|
|
27
30
|
* | Property | Description | Default |
|
|
@@ -48,20 +48,23 @@ Shares the field-height preset so it lines up with other toolbar controls.
|
|
|
48
48
|
block-size: var(--_toolbar-value-stepper--height);
|
|
49
49
|
padding-inline: var(--sc-kit--space--2);
|
|
50
50
|
border: 1px solid var(--sc-kit--color--border--field);
|
|
51
|
-
border-radius: var(--sc-kit--radius--md);
|
|
51
|
+
border-radius: var(--_toolbar-value-stepper--border-radius, var(--sc-kit--field--border-radius--md));
|
|
52
52
|
background: var(--sc-kit--color--bg--field);
|
|
53
53
|
}
|
|
54
54
|
.toolbar-value-stepper--sm {
|
|
55
55
|
--_toolbar-value-stepper--height: var(--sc-kit--field--height--sm);
|
|
56
56
|
--_toolbar-value-stepper--font-size: var(--sc-kit--font-size--sm);
|
|
57
|
+
--_toolbar-value-stepper--border-radius: var(--sc-kit--field--border-radius--sm);
|
|
57
58
|
}
|
|
58
59
|
.toolbar-value-stepper--md {
|
|
59
60
|
--_toolbar-value-stepper--height: var(--sc-kit--field--height--md);
|
|
60
61
|
--_toolbar-value-stepper--font-size: var(--sc-kit--font-size--md);
|
|
62
|
+
--_toolbar-value-stepper--border-radius: var(--sc-kit--field--border-radius--md);
|
|
61
63
|
}
|
|
62
64
|
.toolbar-value-stepper--lg {
|
|
63
65
|
--_toolbar-value-stepper--height: var(--sc-kit--field--height--lg);
|
|
64
66
|
--_toolbar-value-stepper--font-size: var(--sc-kit--font-size--lg);
|
|
67
|
+
--_toolbar-value-stepper--border-radius: var(--sc-kit--field--border-radius--md);
|
|
65
68
|
}
|
|
66
69
|
.toolbar-value-stepper__btn {
|
|
67
70
|
display: inline-flex;
|
|
@@ -172,14 +172,14 @@ body, or an external host element addressed by `options.fixedToolbarId`). Impera
|
|
|
172
172
|
| `--sc-kit--rich-text-input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
173
173
|
| `--sc-kit--rich-text-input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
174
174
|
| `--sc-kit--rich-text-input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
175
|
-
| `--sc-kit--rich-text-input--border-radius` | Border radius | `
|
|
175
|
+
| `--sc-kit--rich-text-input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
176
176
|
| `--sc-kit--rich-text-input--underline-color` | Inset bottom-underline (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
177
177
|
| `--sc-kit--rich-text-input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
178
178
|
| `--sc-kit--rich-text-input--placeholder--color` | Placeholder color | `var(--sc-kit--color--text--placeholder)` |
|
|
179
179
|
-->
|
|
180
180
|
|
|
181
181
|
<style>.rich-text-input {
|
|
182
|
-
--_rti--root-font-size: var(--sc-kit--rich-text-input--root--font-size, 1rem);
|
|
182
|
+
--_rti--root-font-size: var(--sc-kit--rich-text-input--root--font-size, var(--_rti--size-root-font-size, 1rem));
|
|
183
183
|
--_rti--padding-block: var(--sc-kit--rich-text-input--padding-block, 0.5em);
|
|
184
184
|
--_rti--padding-inline: var(--sc-kit--rich-text-input--padding-inline, 0.75em);
|
|
185
185
|
--_rti--width: var(--sc-kit--rich-text-input--width, 100%);
|
|
@@ -189,7 +189,7 @@ body, or an external host element addressed by `options.fixedToolbarId`). Impera
|
|
|
189
189
|
--_rti--border-color: var(--sc-kit--rich-text-input--border-color, var(--sc-kit--color--border--field));
|
|
190
190
|
--_rti--border-color-hover: var(--sc-kit--rich-text-input--border-color--hover, var(--sc-kit--color--border--strong));
|
|
191
191
|
--_rti--border-color-error: var(--sc-kit--rich-text-input--border-color--error, var(--sc-kit--color--danger));
|
|
192
|
-
--_rti--border-radius: var(--sc-kit--rich-text-input--border-radius, var(--sc-kit--radius--
|
|
192
|
+
--_rti--border-radius: var(--sc-kit--rich-text-input--border-radius, var(--_rti--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
193
193
|
--_rti--underline-color: var(--sc-kit--rich-text-input--underline-color, transparent);
|
|
194
194
|
--_rti--color: var(--sc-kit--rich-text-input--color, var(--sc-kit--color--text--primary));
|
|
195
195
|
--_rti--placeholder-color: var(--sc-kit--rich-text-input--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
@@ -216,13 +216,16 @@ body, or an external host element addressed by `options.fixedToolbarId`). Impera
|
|
|
216
216
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), border-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), color var(--sc-kit--duration--base) var(--sc-kit--ease--default), box-shadow var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
217
217
|
}
|
|
218
218
|
.rich-text-input--sm {
|
|
219
|
-
--
|
|
219
|
+
--_rti--size-root-font-size: 0.8125rem;
|
|
220
|
+
--_rti--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
220
221
|
}
|
|
221
222
|
.rich-text-input--md {
|
|
222
|
-
--
|
|
223
|
+
--_rti--size-root-font-size: 0.875rem;
|
|
224
|
+
--_rti--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
223
225
|
}
|
|
224
226
|
.rich-text-input--lg {
|
|
225
|
-
--
|
|
227
|
+
--_rti--size-root-font-size: 1rem;
|
|
228
|
+
--_rti--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
226
229
|
}
|
|
227
230
|
.rich-text-input:where(:hover:not(:focus-within)) {
|
|
228
231
|
--sc-kit--rich-text-input--border-color: var(--_rti--border-color-hover);
|
|
@@ -55,7 +55,7 @@ type Props = {
|
|
|
55
55
|
* | `--sc-kit--rich-text-input--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
56
56
|
* | `--sc-kit--rich-text-input--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
57
57
|
* | `--sc-kit--rich-text-input--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
58
|
-
* | `--sc-kit--rich-text-input--border-radius` | Border radius | `
|
|
58
|
+
* | `--sc-kit--rich-text-input--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
59
59
|
* | `--sc-kit--rich-text-input--underline-color` | Inset bottom-underline (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
60
60
|
* | `--sc-kit--rich-text-input--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
61
61
|
* | `--sc-kit--rich-text-input--placeholder--color` | Placeholder color | `var(--sc-kit--color--text--placeholder)` |
|
|
@@ -44,7 +44,7 @@ Each segment carries an optional `disabled` flag (non-interactive) and an option
|
|
|
44
44
|
| `--sc-kit--segmented-control--height` | Control height | per size (28 / 32 px) |
|
|
45
45
|
| `--sc-kit--segmented-control--font-size` | Label font size | per size |
|
|
46
46
|
| `--sc-kit--segmented-control--padding-inline` | Per-segment horizontal padding | per size (10 / 12 px) |
|
|
47
|
-
| `--sc-kit--segmented-control--border-radius` | Outer radius (tray) / per-segment radius (outlined) |
|
|
47
|
+
| `--sc-kit--segmented-control--border-radius` | Outer radius (tray) / per-segment radius (outlined) | per size — `sm` 4px, `md` 6px |
|
|
48
48
|
| `--sc-kit--segmented-control--color` | Default segment text color | `--sc-kit--color--text--secondary` |
|
|
49
49
|
| `--sc-kit--segmented-control--color--hover` | Hover text color | `--sc-kit--color--text--primary` |
|
|
50
50
|
| `--sc-kit--segmented-control--color--active` | Active segment text color | `--sc-kit--color--text--primary` |
|
|
@@ -62,7 +62,7 @@ Each segment carries an optional `disabled` flag (non-interactive) and an option
|
|
|
62
62
|
--_sc--height: var(--sc-kit--segmented-control--height, var(--_sc--size-height));
|
|
63
63
|
--_sc--font-size: var(--sc-kit--segmented-control--font-size, var(--_sc--size-font-size));
|
|
64
64
|
--_sc--padding-inline: var(--sc-kit--segmented-control--padding-inline, var(--_sc--size-padding-inline));
|
|
65
|
-
--_sc--radius: var(--sc-kit--segmented-control--border-radius, var(--sc-kit--radius--md));
|
|
65
|
+
--_sc--radius: var(--sc-kit--segmented-control--border-radius, var(--_sc--size-radius, var(--sc-kit--field--border-radius--md)));
|
|
66
66
|
--_sc--color: var(--sc-kit--segmented-control--color, var(--sc-kit--color--text--muted));
|
|
67
67
|
--_sc--color-hover: var(--sc-kit--segmented-control--color--hover, var(--sc-kit--color--text--primary));
|
|
68
68
|
--_sc--color-active: var(--sc-kit--segmented-control--color--active, var(--sc-kit--color--text--primary));
|
|
@@ -86,11 +86,13 @@ Each segment carries an optional `disabled` flag (non-interactive) and an option
|
|
|
86
86
|
--_sc--size-height: 1.75rem;
|
|
87
87
|
--_sc--size-font-size: var(--sc-kit--font-size--sm);
|
|
88
88
|
--_sc--size-padding-inline: 0.625rem;
|
|
89
|
+
--_sc--size-radius: var(--sc-kit--field--border-radius--sm);
|
|
89
90
|
}
|
|
90
91
|
.segmented-control--md {
|
|
91
92
|
--_sc--size-height: 2rem;
|
|
92
93
|
--_sc--size-font-size: var(--sc-kit--font-size--md);
|
|
93
94
|
--_sc--size-padding-inline: 0.75rem;
|
|
95
|
+
--_sc--size-radius: var(--sc-kit--field--border-radius--md);
|
|
94
96
|
}
|
|
95
97
|
.segmented-control--tray {
|
|
96
98
|
--_sc--background-active-default: var(--sc-kit--color--bg--panel);
|
|
@@ -56,7 +56,7 @@ interface $$IsomorphicComponent {
|
|
|
56
56
|
* | `--sc-kit--segmented-control--height` | Control height | per size (28 / 32 px) |
|
|
57
57
|
* | `--sc-kit--segmented-control--font-size` | Label font size | per size |
|
|
58
58
|
* | `--sc-kit--segmented-control--padding-inline` | Per-segment horizontal padding | per size (10 / 12 px) |
|
|
59
|
-
* | `--sc-kit--segmented-control--border-radius` | Outer radius (tray) / per-segment radius (outlined) |
|
|
59
|
+
* | `--sc-kit--segmented-control--border-radius` | Outer radius (tray) / per-segment radius (outlined) | per size — `sm` 4px, `md` 6px |
|
|
60
60
|
* | `--sc-kit--segmented-control--color` | Default segment text color | `--sc-kit--color--text--secondary` |
|
|
61
61
|
* | `--sc-kit--segmented-control--color--hover` | Hover text color | `--sc-kit--color--text--primary` |
|
|
62
62
|
* | `--sc-kit--segmented-control--color--active` | Active segment text color | `--sc-kit--color--text--primary` |
|
|
@@ -7,21 +7,21 @@
|
|
|
7
7
|
// Public CSS API lives under `--sc-kit--select--trigger--*` so consumers can override
|
|
8
8
|
// once and have all select variants pick it up.
|
|
9
9
|
@mixin select-trigger {
|
|
10
|
-
--_sel--height: var(--sc-kit--select--trigger--height, var(--sc-kit--field--height--md));
|
|
11
|
-
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
10
|
+
--_sel--height: var(--sc-kit--select--trigger--height, var(--_sel--size-height, var(--sc-kit--field--height--md)));
|
|
11
|
+
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--_sel--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
12
12
|
--_sel--gap: var(--sc-kit--select--trigger--gap, var(--sc-kit--space--2));
|
|
13
13
|
--_sel--background: var(--sc-kit--select--trigger--background, var(--sc-kit--color--bg--field));
|
|
14
14
|
--_sel--background-disabled: var(--sc-kit--select--trigger--background--disabled, var(--sc-kit--color--bg--field-alt));
|
|
15
15
|
--_sel--border-color: var(--sc-kit--select--trigger--border-color, var(--sc-kit--color--border--field));
|
|
16
16
|
--_sel--border-color-hover: var(--sc-kit--select--trigger--border-color--hover, var(--sc-kit--color--border--strong));
|
|
17
17
|
--_sel--border-color-error: var(--sc-kit--select--trigger--border-color--error, var(--sc-kit--color--danger));
|
|
18
|
-
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--sc-kit--radius--
|
|
18
|
+
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--_sel--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
19
19
|
--_sel--underline-color: var(--sc-kit--select--trigger--underline-color, transparent);
|
|
20
|
-
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--sc-kit--font-size--md));
|
|
20
|
+
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--_sel--size-font-size, var(--sc-kit--font-size--md)));
|
|
21
21
|
--_sel--color: var(--sc-kit--select--trigger--color, var(--sc-kit--color--text--primary));
|
|
22
22
|
--_sel--placeholder-color: var(--sc-kit--select--trigger--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
23
23
|
--_sel--icon-color: var(--sc-kit--select--trigger--icon--color, var(--sc-kit--color--text--muted));
|
|
24
|
-
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--sc-kit--field--icon--size--md));
|
|
24
|
+
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--_sel--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
25
25
|
|
|
26
26
|
@include affordance.host;
|
|
27
27
|
|
|
@@ -45,22 +45,25 @@
|
|
|
45
45
|
@include transitions.transition(background-color border-color color box-shadow);
|
|
46
46
|
|
|
47
47
|
&--sm {
|
|
48
|
-
--
|
|
49
|
-
--
|
|
50
|
-
--
|
|
51
|
-
--
|
|
48
|
+
--_sel--size-height: var(--sc-kit--field--height--sm);
|
|
49
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
50
|
+
--_sel--size-font-size: var(--sc-kit--font-size--sm);
|
|
51
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
52
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
52
53
|
}
|
|
53
54
|
&--md {
|
|
54
|
-
--
|
|
55
|
-
--
|
|
56
|
-
--
|
|
57
|
-
--
|
|
55
|
+
--_sel--size-height: var(--sc-kit--field--height--md);
|
|
56
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
57
|
+
--_sel--size-font-size: var(--sc-kit--font-size--md);
|
|
58
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
59
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
58
60
|
}
|
|
59
61
|
&--lg {
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
63
|
-
--
|
|
62
|
+
--_sel--size-height: var(--sc-kit--field--height--lg);
|
|
63
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
64
|
+
--_sel--size-font-size: var(--sc-kit--font-size--lg);
|
|
65
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
66
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
&:where(:hover:not(:focus-within)) {
|
|
@@ -177,21 +177,21 @@ background--hover}`.
|
|
|
177
177
|
-->
|
|
178
178
|
|
|
179
179
|
<style>.singleselect {
|
|
180
|
-
--_sel--height: var(--sc-kit--select--trigger--height, var(--sc-kit--field--height--md));
|
|
181
|
-
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
180
|
+
--_sel--height: var(--sc-kit--select--trigger--height, var(--_sel--size-height, var(--sc-kit--field--height--md)));
|
|
181
|
+
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--_sel--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
182
182
|
--_sel--gap: var(--sc-kit--select--trigger--gap, var(--sc-kit--space--2));
|
|
183
183
|
--_sel--background: var(--sc-kit--select--trigger--background, var(--sc-kit--color--bg--field));
|
|
184
184
|
--_sel--background-disabled: var(--sc-kit--select--trigger--background--disabled, var(--sc-kit--color--bg--field-alt));
|
|
185
185
|
--_sel--border-color: var(--sc-kit--select--trigger--border-color, var(--sc-kit--color--border--field));
|
|
186
186
|
--_sel--border-color-hover: var(--sc-kit--select--trigger--border-color--hover, var(--sc-kit--color--border--strong));
|
|
187
187
|
--_sel--border-color-error: var(--sc-kit--select--trigger--border-color--error, var(--sc-kit--color--danger));
|
|
188
|
-
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--sc-kit--radius--
|
|
188
|
+
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--_sel--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
189
189
|
--_sel--underline-color: var(--sc-kit--select--trigger--underline-color, transparent);
|
|
190
|
-
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--sc-kit--font-size--md));
|
|
190
|
+
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--_sel--size-font-size, var(--sc-kit--font-size--md)));
|
|
191
191
|
--_sel--color: var(--sc-kit--select--trigger--color, var(--sc-kit--color--text--primary));
|
|
192
192
|
--_sel--placeholder-color: var(--sc-kit--select--trigger--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
193
193
|
--_sel--icon-color: var(--sc-kit--select--trigger--icon--color, var(--sc-kit--color--text--muted));
|
|
194
|
-
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--sc-kit--field--icon--size--md));
|
|
194
|
+
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--_sel--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
195
195
|
--_--input-affordance--opacity: 0;
|
|
196
196
|
--_--input-affordance--scale: 0;
|
|
197
197
|
}
|
|
@@ -219,22 +219,25 @@ background--hover}`.
|
|
|
219
219
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), border-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), color var(--sc-kit--duration--base) var(--sc-kit--ease--default), box-shadow var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
220
220
|
}
|
|
221
221
|
.singleselect--sm {
|
|
222
|
-
--
|
|
223
|
-
--
|
|
224
|
-
--
|
|
225
|
-
--
|
|
222
|
+
--_sel--size-height: var(--sc-kit--field--height--sm);
|
|
223
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
224
|
+
--_sel--size-font-size: var(--sc-kit--font-size--sm);
|
|
225
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
226
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
226
227
|
}
|
|
227
228
|
.singleselect--md {
|
|
228
|
-
--
|
|
229
|
-
--
|
|
230
|
-
--
|
|
231
|
-
--
|
|
229
|
+
--_sel--size-height: var(--sc-kit--field--height--md);
|
|
230
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
231
|
+
--_sel--size-font-size: var(--sc-kit--font-size--md);
|
|
232
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
233
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
232
234
|
}
|
|
233
235
|
.singleselect--lg {
|
|
234
|
-
--
|
|
235
|
-
--
|
|
236
|
-
--
|
|
237
|
-
--
|
|
236
|
+
--_sel--size-height: var(--sc-kit--field--height--lg);
|
|
237
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
238
|
+
--_sel--size-font-size: var(--sc-kit--font-size--lg);
|
|
239
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
240
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
238
241
|
}
|
|
239
242
|
.singleselect:where(:hover:not(:focus-within)) {
|
|
240
243
|
--sc-kit--select--trigger--border-color: var(--_sel--border-color-hover);
|
|
@@ -393,21 +393,21 @@ padding-inline, font-size, gap, max-width, remove-color, remove-color--hover}`.
|
|
|
393
393
|
}
|
|
394
394
|
|
|
395
395
|
.multiselect-trigger {
|
|
396
|
-
--_sel--height: var(--sc-kit--select--trigger--height, var(--sc-kit--field--height--md));
|
|
397
|
-
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
396
|
+
--_sel--height: var(--sc-kit--select--trigger--height, var(--_sel--size-height, var(--sc-kit--field--height--md)));
|
|
397
|
+
--_sel--padding-inline: var(--sc-kit--select--trigger--padding-inline, var(--_sel--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
398
398
|
--_sel--gap: var(--sc-kit--select--trigger--gap, var(--sc-kit--space--2));
|
|
399
399
|
--_sel--background: var(--sc-kit--select--trigger--background, var(--sc-kit--color--bg--field));
|
|
400
400
|
--_sel--background-disabled: var(--sc-kit--select--trigger--background--disabled, var(--sc-kit--color--bg--field-alt));
|
|
401
401
|
--_sel--border-color: var(--sc-kit--select--trigger--border-color, var(--sc-kit--color--border--field));
|
|
402
402
|
--_sel--border-color-hover: var(--sc-kit--select--trigger--border-color--hover, var(--sc-kit--color--border--strong));
|
|
403
403
|
--_sel--border-color-error: var(--sc-kit--select--trigger--border-color--error, var(--sc-kit--color--danger));
|
|
404
|
-
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--sc-kit--radius--
|
|
404
|
+
--_sel--border-radius: var(--sc-kit--select--trigger--border-radius, var(--_sel--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
405
405
|
--_sel--underline-color: var(--sc-kit--select--trigger--underline-color, transparent);
|
|
406
|
-
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--sc-kit--font-size--md));
|
|
406
|
+
--_sel--font-size: var(--sc-kit--select--trigger--font-size, var(--_sel--size-font-size, var(--sc-kit--font-size--md)));
|
|
407
407
|
--_sel--color: var(--sc-kit--select--trigger--color, var(--sc-kit--color--text--primary));
|
|
408
408
|
--_sel--placeholder-color: var(--sc-kit--select--trigger--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
409
409
|
--_sel--icon-color: var(--sc-kit--select--trigger--icon--color, var(--sc-kit--color--text--muted));
|
|
410
|
-
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--sc-kit--field--icon--size--md));
|
|
410
|
+
--_sel--icon-size: var(--sc-kit--select--trigger--icon--size, var(--_sel--size-icon-size, var(--sc-kit--field--icon--size--md)));
|
|
411
411
|
--_--input-affordance--opacity: 0;
|
|
412
412
|
--_--input-affordance--scale: 0;
|
|
413
413
|
}
|
|
@@ -435,22 +435,25 @@ padding-inline, font-size, gap, max-width, remove-color, remove-color--hover}`.
|
|
|
435
435
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), border-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), color var(--sc-kit--duration--base) var(--sc-kit--ease--default), box-shadow var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
436
436
|
}
|
|
437
437
|
.multiselect-trigger--sm {
|
|
438
|
-
--
|
|
439
|
-
--
|
|
440
|
-
--
|
|
441
|
-
--
|
|
438
|
+
--_sel--size-height: var(--sc-kit--field--height--sm);
|
|
439
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
440
|
+
--_sel--size-font-size: var(--sc-kit--font-size--sm);
|
|
441
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--sm);
|
|
442
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
442
443
|
}
|
|
443
444
|
.multiselect-trigger--md {
|
|
444
|
-
--
|
|
445
|
-
--
|
|
446
|
-
--
|
|
447
|
-
--
|
|
445
|
+
--_sel--size-height: var(--sc-kit--field--height--md);
|
|
446
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
447
|
+
--_sel--size-font-size: var(--sc-kit--font-size--md);
|
|
448
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--md);
|
|
449
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
448
450
|
}
|
|
449
451
|
.multiselect-trigger--lg {
|
|
450
|
-
--
|
|
451
|
-
--
|
|
452
|
-
--
|
|
453
|
-
--
|
|
452
|
+
--_sel--size-height: var(--sc-kit--field--height--lg);
|
|
453
|
+
--_sel--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
454
|
+
--_sel--size-font-size: var(--sc-kit--font-size--lg);
|
|
455
|
+
--_sel--size-icon-size: var(--sc-kit--field--icon--size--lg);
|
|
456
|
+
--_sel--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
454
457
|
}
|
|
455
458
|
.multiselect-trigger:where(:hover:not(:focus-within)) {
|
|
456
459
|
--sc-kit--select--trigger--border-color: var(--_sel--border-color-hover);
|
|
@@ -570,7 +573,7 @@ padding-inline, font-size, gap, max-width, remove-color, remove-color--hover}`.
|
|
|
570
573
|
.multiselect-trigger--multi .multiselect-trigger__spinner {
|
|
571
574
|
position: absolute;
|
|
572
575
|
inset-block-start: 50%;
|
|
573
|
-
inset-inline-end: var(--
|
|
576
|
+
inset-inline-end: var(--_sel--padding-inline);
|
|
574
577
|
transform: translateY(-50%);
|
|
575
578
|
margin: 0;
|
|
576
579
|
}</style>
|
|
@@ -142,7 +142,7 @@ exposed via `bind:this`.
|
|
|
142
142
|
| `--sc-kit--textarea--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
143
143
|
| `--sc-kit--textarea--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
144
144
|
| `--sc-kit--textarea--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
145
|
-
| `--sc-kit--textarea--border-radius` | Border radius | `
|
|
145
|
+
| `--sc-kit--textarea--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
146
146
|
| `--sc-kit--textarea--underline-color` | Inset bottom-underline (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
147
147
|
| `--sc-kit--textarea--font-size` | Text font size | per size |
|
|
148
148
|
| `--sc-kit--textarea--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -150,17 +150,17 @@ exposed via `bind:this`.
|
|
|
150
150
|
-->
|
|
151
151
|
|
|
152
152
|
<style>.textarea {
|
|
153
|
-
--_ta--padding-block: var(--sc-kit--textarea--padding-block, 0.5rem);
|
|
154
|
-
--_ta--padding-inline: var(--sc-kit--textarea--padding-inline, var(--sc-kit--field--padding-inline--md));
|
|
153
|
+
--_ta--padding-block: var(--sc-kit--textarea--padding-block, var(--_ta--size-padding-block, 0.5rem));
|
|
154
|
+
--_ta--padding-inline: var(--sc-kit--textarea--padding-inline, var(--_ta--size-padding-inline, var(--sc-kit--field--padding-inline--md)));
|
|
155
155
|
--_ta--width: var(--sc-kit--textarea--width, 100%);
|
|
156
156
|
--_ta--background: var(--sc-kit--textarea--background, var(--sc-kit--color--bg--field));
|
|
157
157
|
--_ta--background-disabled: var(--sc-kit--textarea--background--disabled, var(--sc-kit--color--bg--field-alt));
|
|
158
158
|
--_ta--border-color: var(--sc-kit--textarea--border-color, var(--sc-kit--color--border--field));
|
|
159
159
|
--_ta--border-color-hover: var(--sc-kit--textarea--border-color--hover, var(--sc-kit--color--border--strong));
|
|
160
160
|
--_ta--border-color-error: var(--sc-kit--textarea--border-color--error, var(--sc-kit--color--danger));
|
|
161
|
-
--_ta--border-radius: var(--sc-kit--textarea--border-radius, var(--sc-kit--radius--
|
|
161
|
+
--_ta--border-radius: var(--sc-kit--textarea--border-radius, var(--_ta--size-border-radius, var(--sc-kit--field--border-radius--md)));
|
|
162
162
|
--_ta--underline-color: var(--sc-kit--textarea--underline-color, transparent);
|
|
163
|
-
--_ta--font-size: var(--sc-kit--textarea--font-size, var(--sc-kit--font-size--md));
|
|
163
|
+
--_ta--font-size: var(--sc-kit--textarea--font-size, var(--_ta--size-font-size, var(--sc-kit--font-size--md)));
|
|
164
164
|
--_ta--color: var(--sc-kit--textarea--color, var(--sc-kit--color--text--primary));
|
|
165
165
|
--_ta--placeholder-color: var(--sc-kit--textarea--placeholder--color, var(--sc-kit--color--text--placeholder));
|
|
166
166
|
--_--input-affordance--opacity: 0;
|
|
@@ -190,19 +190,22 @@ exposed via `bind:this`.
|
|
|
190
190
|
transition: background-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), border-color var(--sc-kit--duration--base) var(--sc-kit--ease--default), color var(--sc-kit--duration--base) var(--sc-kit--ease--default), box-shadow var(--sc-kit--duration--base) var(--sc-kit--ease--default);
|
|
191
191
|
}
|
|
192
192
|
.textarea--sm {
|
|
193
|
-
--
|
|
194
|
-
--
|
|
195
|
-
--
|
|
193
|
+
--_ta--size-padding-block: 0.375rem;
|
|
194
|
+
--_ta--size-padding-inline: var(--sc-kit--field--padding-inline--sm);
|
|
195
|
+
--_ta--size-font-size: var(--sc-kit--font-size--sm);
|
|
196
|
+
--_ta--size-border-radius: var(--sc-kit--field--border-radius--sm);
|
|
196
197
|
}
|
|
197
198
|
.textarea--md {
|
|
198
|
-
--
|
|
199
|
-
--
|
|
200
|
-
--
|
|
199
|
+
--_ta--size-padding-block: 0.5rem;
|
|
200
|
+
--_ta--size-padding-inline: var(--sc-kit--field--padding-inline--md);
|
|
201
|
+
--_ta--size-font-size: var(--sc-kit--font-size--md);
|
|
202
|
+
--_ta--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
201
203
|
}
|
|
202
204
|
.textarea--lg {
|
|
203
|
-
--
|
|
204
|
-
--
|
|
205
|
-
--
|
|
205
|
+
--_ta--size-padding-block: 0.625rem;
|
|
206
|
+
--_ta--size-padding-inline: var(--sc-kit--field--padding-inline--lg);
|
|
207
|
+
--_ta--size-font-size: var(--sc-kit--font-size--lg);
|
|
208
|
+
--_ta--size-border-radius: var(--sc-kit--field--border-radius--md);
|
|
206
209
|
}
|
|
207
210
|
.textarea:where(:hover:not(:focus-within)) {
|
|
208
211
|
--sc-kit--textarea--border-color: var(--_ta--border-color-hover);
|
|
@@ -66,7 +66,7 @@ type Props = {
|
|
|
66
66
|
* | `--sc-kit--textarea--border-color` | Border color | `var(--sc-kit--color--border--field)` |
|
|
67
67
|
* | `--sc-kit--textarea--border-color--hover` | Border color on hover | `var(--sc-kit--color--border--strong)` |
|
|
68
68
|
* | `--sc-kit--textarea--border-color--error` | Border color in error state | `var(--sc-kit--color--danger)` |
|
|
69
|
-
* | `--sc-kit--textarea--border-radius` | Border radius | `
|
|
69
|
+
* | `--sc-kit--textarea--border-radius` | Border radius | per size — `sm` 4px, `md`/`lg` 6px |
|
|
70
70
|
* | `--sc-kit--textarea--underline-color` | Inset bottom-underline (transparent default, accent on focus-within, danger on error) | `transparent` |
|
|
71
71
|
* | `--sc-kit--textarea--font-size` | Text font size | per size |
|
|
72
72
|
* | `--sc-kit--textarea--color` | Text color | `var(--sc-kit--color--text--primary)` |
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
</script>
|
|
3
3
|
|
|
4
4
|
<script lang="ts" generics="T extends Record<string, unknown>, K extends keyof T & string">import { Utils } from '../../core/utils';
|
|
5
|
-
import { default as
|
|
6
|
-
let { handler, name, validateOn = ['input', 'change', 'blur'], debounceMs = 0, disableTouchedTracking = false, reserveErrorSpace =
|
|
5
|
+
import { default as FieldFrame } from './field-frame.svelte';
|
|
6
|
+
let { handler, name, validateOn = ['input', 'change', 'blur'], debounceMs = 0, disableTouchedTracking = false, reserveErrorSpace = false, on, children } = $props();
|
|
7
7
|
// True between a value change and the next completed validation. Hides the stale error in the
|
|
8
8
|
// UI without mutating handler.errors — the model keeps the last known result, the view just
|
|
9
9
|
// doesn't trust it until the validator has caught up.
|
|
@@ -59,15 +59,15 @@ const field = $derived({
|
|
|
59
59
|
});
|
|
60
60
|
</script>
|
|
61
61
|
|
|
62
|
-
<
|
|
62
|
+
<FieldFrame error={showErrors ? handler.errors[name] : null} reserveErrorSpace={reserveErrorSpace}>
|
|
63
63
|
{@render children(field)}
|
|
64
|
-
</
|
|
64
|
+
</FieldFrame>
|
|
65
65
|
|
|
66
66
|
<!--
|
|
67
67
|
@component
|
|
68
68
|
Binds a form field to any kit input via a render-prop snippet. The base inputs stay unchanged;
|
|
69
69
|
`Validatable` is the only place that knows about `FormValidationHandler`. Wraps children in an
|
|
70
|
-
internal `
|
|
70
|
+
internal `FieldFrame` that reserves space for the error message so toggling doesn't shift
|
|
71
71
|
layout; `reserveErrorSpace={false}` drops the reserve — the message overlays content below.
|
|
72
72
|
|
|
73
73
|
### Usage
|
|
@@ -33,7 +33,7 @@ declare function $$render<T extends Record<string, unknown>, K extends keyof T &
|
|
|
33
33
|
/**
|
|
34
34
|
* Reserve space below the field for the error message. Turn off when a sibling must align to
|
|
35
35
|
* the field's real bottom edge — the message then overlays whatever sits below the field.
|
|
36
|
-
* @default
|
|
36
|
+
* @default false
|
|
37
37
|
*/
|
|
38
38
|
reserveErrorSpace?: boolean;
|
|
39
39
|
/**
|
|
@@ -70,7 +70,7 @@ interface $$IsomorphicComponent {
|
|
|
70
70
|
/**
|
|
71
71
|
* Binds a form field to any kit input via a render-prop snippet. The base inputs stay unchanged;
|
|
72
72
|
* `Validatable` is the only place that knows about `FormValidationHandler`. Wraps children in an
|
|
73
|
-
* internal `
|
|
73
|
+
* internal `FieldFrame` that reserves space for the error message so toggling doesn't shift
|
|
74
74
|
* layout; `reserveErrorSpace={false}` drops the reserve — the message overlays content below.
|
|
75
75
|
*
|
|
76
76
|
* ### Usage
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends Record<string, unknown>">import { default as
|
|
2
|
-
let { name, validationResult, reserveErrorSpace =
|
|
1
|
+
<script lang="ts" generics="T extends Record<string, unknown>">import { default as FieldFrame } from './field-frame.svelte';
|
|
2
|
+
let { name, validationResult, reserveErrorSpace = false, children } = $props();
|
|
3
3
|
const errorText = $derived(validationResult?.errors[name] ?? null);
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
|
-
<
|
|
6
|
+
<FieldFrame error={errorText} reserveErrorSpace={reserveErrorSpace}>
|
|
7
7
|
{@render children()}
|
|
8
|
-
</
|
|
8
|
+
</FieldFrame>
|
|
9
9
|
|
|
10
10
|
<!--
|
|
11
11
|
@component
|
|
@@ -9,7 +9,7 @@ declare function $$render<T extends Record<string, unknown>>(): {
|
|
|
9
9
|
/**
|
|
10
10
|
* Reserve space below the field for the error message. Turn off when a sibling must align to
|
|
11
11
|
* the field's real bottom edge — the message then overlays whatever sits below the field.
|
|
12
|
-
* @default
|
|
12
|
+
* @default false
|
|
13
13
|
*/
|
|
14
14
|
reserveErrorSpace?: boolean;
|
|
15
15
|
children: Snippet;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
<script lang="ts">let { error, reserveErrorSpace =
|
|
1
|
+
<script lang="ts">let { error, reserveErrorSpace = false, children } = $props();
|
|
2
2
|
export {};
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
|
-
<div class="field-
|
|
5
|
+
<div class="field-frame" class:field-frame--errored={!!error} class:field-frame--no-reserve={!reserveErrorSpace}>
|
|
6
6
|
{@render children()}
|
|
7
7
|
{#if error}
|
|
8
|
-
<small class="field-
|
|
8
|
+
<small class="field-frame__message">{error}</small>
|
|
9
9
|
{/if}
|
|
10
10
|
</div>
|
|
11
11
|
|
|
@@ -20,15 +20,15 @@ any other field-shaped kit consumer that needs the same visual contract).
|
|
|
20
20
|
Not exported from `index.ts` — for kit-internal use only.
|
|
21
21
|
-->
|
|
22
22
|
|
|
23
|
-
<style>.field-
|
|
23
|
+
<style>.field-frame {
|
|
24
24
|
position: relative;
|
|
25
25
|
margin-bottom: 1.1em;
|
|
26
26
|
display: block;
|
|
27
27
|
}
|
|
28
|
-
.field-
|
|
28
|
+
.field-frame--no-reserve {
|
|
29
29
|
margin-bottom: 0;
|
|
30
30
|
}
|
|
31
|
-
.field-
|
|
31
|
+
.field-frame__message {
|
|
32
32
|
position: absolute;
|
|
33
33
|
top: calc(100% + 0.1em);
|
|
34
34
|
left: 0;
|
|
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
|
|
|
2
2
|
type Props = {
|
|
3
3
|
/** Error message to display below the field. Falsy hides the message and the `--errored` flag. */
|
|
4
4
|
error?: string | null | undefined;
|
|
5
|
-
/** Reserve space below the field for the error message. Off drops the reserve — the message overlays content below. @default
|
|
5
|
+
/** Reserve space below the field for the error message. Off drops the reserve — the message overlays content below. @default false */
|
|
6
6
|
reserveErrorSpace?: boolean;
|
|
7
7
|
children: Snippet;
|
|
8
8
|
};
|
|
@@ -15,6 +15,6 @@ type Props = {
|
|
|
15
15
|
*
|
|
16
16
|
* Not exported from `index.ts` — for kit-internal use only.
|
|
17
17
|
*/
|
|
18
|
-
declare const
|
|
19
|
-
type
|
|
20
|
-
export default
|
|
18
|
+
declare const FieldFrame: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type FieldFrame = ReturnType<typeof FieldFrame>;
|
|
20
|
+
export default FieldFrame;
|