@dorsk/tsumikit 0.78.0 → 0.80.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 (90) hide show
  1. package/dist/components/atoms/Artwork.svelte +5 -3
  2. package/dist/components/atoms/Badge.svelte +2 -5
  3. package/dist/components/atoms/Button.svelte +327 -17
  4. package/dist/components/atoms/Button.svelte.d.ts +4 -1
  5. package/dist/components/atoms/Card.svelte +160 -12
  6. package/dist/components/atoms/Checkbox.svelte +181 -3
  7. package/dist/components/atoms/Gauge.svelte +2 -2
  8. package/dist/components/atoms/Input.svelte +41 -3
  9. package/dist/components/atoms/Kbd.svelte +1 -1
  10. package/dist/components/atoms/Link.svelte +61 -0
  11. package/dist/components/atoms/Progress.svelte +75 -2
  12. package/dist/components/atoms/Progress.svelte.d.ts +1 -0
  13. package/dist/components/atoms/SegmentedProgress.svelte +2 -2
  14. package/dist/components/atoms/Select.svelte +39 -3
  15. package/dist/components/atoms/Skeleton.svelte +54 -3
  16. package/dist/components/atoms/Skeleton.svelte.d.ts +1 -0
  17. package/dist/components/atoms/Slider.svelte +8 -6
  18. package/dist/components/atoms/Spinner.svelte +152 -3
  19. package/dist/components/atoms/Spinner.svelte.d.ts +1 -1
  20. package/dist/components/atoms/Swatch.svelte +1 -1
  21. package/dist/components/atoms/Switch.svelte +138 -2
  22. package/dist/components/atoms/Textarea.svelte +42 -3
  23. package/dist/components/atoms/Thinking.svelte +130 -0
  24. package/dist/components/atoms/Thinking.svelte.d.ts +15 -0
  25. package/dist/components/layouts/AppShell.svelte +6 -6
  26. package/dist/components/layouts/MasterDetail.svelte +3 -3
  27. package/dist/components/layouts/NavBar.svelte +4 -4
  28. package/dist/components/layouts/NavSection.svelte +1 -1
  29. package/dist/components/layouts/ResizablePanel.svelte +7 -7
  30. package/dist/components/layouts/TabBar.svelte +2 -2
  31. package/dist/components/molecules/Accordion.svelte +2 -2
  32. package/dist/components/molecules/AttachmentList.svelte +2 -2
  33. package/dist/components/molecules/CapBar.svelte +2 -2
  34. package/dist/components/molecules/CodeBlock.svelte +5 -5
  35. package/dist/components/molecules/Combobox.svelte +3 -3
  36. package/dist/components/molecules/CopyButton.svelte +146 -5
  37. package/dist/components/molecules/Drawer.svelte +8 -8
  38. package/dist/components/molecules/EmojiPicker.svelte +1 -1
  39. package/dist/components/molecules/Field.svelte +55 -1
  40. package/dist/components/molecules/FileButton.svelte +20 -6
  41. package/dist/components/molecules/FilterInput.svelte +4 -4
  42. package/dist/components/molecules/GitRef.svelte +2 -2
  43. package/dist/components/molecules/GlyphStack.svelte +21 -3
  44. package/dist/components/molecules/InputGroup.svelte +3 -3
  45. package/dist/components/molecules/LookPicker.svelte +87 -0
  46. package/dist/components/molecules/LookPicker.svelte.d.ts +17 -0
  47. package/dist/components/molecules/Modal.svelte +5 -5
  48. package/dist/components/molecules/MotionSettings.svelte +166 -0
  49. package/dist/components/molecules/MotionSettings.svelte.d.ts +18 -0
  50. package/dist/components/molecules/OptionButton.svelte +8 -3
  51. package/dist/components/molecules/Pagination.svelte +3 -1
  52. package/dist/components/molecules/Popover.svelte +18 -11
  53. package/dist/components/molecules/Prose.svelte +6 -6
  54. package/dist/components/molecules/RadialMenu.svelte +3 -3
  55. package/dist/components/molecules/RadioGroup.svelte +67 -4
  56. package/dist/components/molecules/RichSelect.svelte +6 -4
  57. package/dist/components/molecules/SectionHeader.svelte +1 -1
  58. package/dist/components/molecules/SeekSlider.svelte +6 -6
  59. package/dist/components/molecules/SegmentedControl.svelte +7 -7
  60. package/dist/components/molecules/SortableList.svelte +2 -2
  61. package/dist/components/molecules/SplitButton.svelte +1 -1
  62. package/dist/components/molecules/Tabs.svelte +160 -7
  63. package/dist/components/molecules/ThemePicker.svelte +1 -1
  64. package/dist/components/molecules/Timestamp.svelte +1 -1
  65. package/dist/components/molecules/Toggle.svelte +5 -3
  66. package/dist/components/molecules/Tooltip.svelte +2 -2
  67. package/dist/components/molecules/VolumeSlider.svelte +3 -3
  68. package/dist/components/organisms/ConversationFeed.svelte +1 -1
  69. package/dist/components/organisms/ConversationPanel.svelte +3 -3
  70. package/dist/components/organisms/DataTable.svelte +18 -16
  71. package/dist/fx.d.ts +149 -0
  72. package/dist/fx.js +111 -0
  73. package/dist/fx.md +58 -0
  74. package/dist/index.d.ts +8 -2
  75. package/dist/index.js +8 -2
  76. package/dist/looks/README.md +101 -0
  77. package/dist/looks/depth.css +939 -0
  78. package/dist/looks/editorial.css +545 -0
  79. package/dist/looks/tactile.css +871 -0
  80. package/dist/pointer.d.ts +3 -0
  81. package/dist/pointer.js +40 -0
  82. package/dist/stores/fx.svelte.d.ts +17 -0
  83. package/dist/stores/fx.svelte.js +64 -0
  84. package/dist/stores/theme.svelte.d.ts +8 -2
  85. package/dist/stores/theme.svelte.js +33 -7
  86. package/dist/styles/themes.css +249 -249
  87. package/dist/styles/tokens.css +37 -2
  88. package/dist/theme-mode.d.ts +31 -0
  89. package/dist/theme-mode.js +19 -0
  90. package/package.json +3 -2
@@ -0,0 +1,166 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import Button from '../atoms/Button.svelte';
4
+ import Icon from '../atoms/Icon.svelte';
5
+ import Select from '../atoms/Select.svelte';
6
+ import Popover from './Popover.svelte';
7
+ import { FX, FX_FAMILIES, type FxFamily, type FxSettings } from '../../fx';
8
+ import { fx } from '../../stores/fx.svelte';
9
+
10
+ type TriggerChrome = Pick<
11
+ ComponentProps<typeof Popover>,
12
+ 'variant' | 'tone' | 'box' | 'pill' | 'control' | 'block' | 'bare' | 'hitArea' | 'placement' | 'disabled'
13
+ >;
14
+
15
+ let {
16
+ families = FX_FAMILIES,
17
+ size = 'md',
18
+ box = size,
19
+ placement = 'bottom-end',
20
+ variant,
21
+ tone,
22
+ pill,
23
+ control,
24
+ block,
25
+ bare,
26
+ hitArea,
27
+ disabled,
28
+ label = 'Motion',
29
+ resetLabel = 'Reset',
30
+ reducedMotionHint = 'Your system asks for reduced motion: effects show their static fallback.',
31
+ onchange,
32
+ class: klass = '',
33
+ style: styleProp = '',
34
+ }: TriggerChrome & {
35
+ /** Restrict and order the offered families. */
36
+ families?: readonly FxFamily[];
37
+ size?: 'sm' | 'md';
38
+ label?: string;
39
+ resetLabel?: string;
40
+ reducedMotionHint?: string;
41
+ onchange?: (settings: FxSettings) => void;
42
+ class?: string;
43
+ style?: string;
44
+ } = $props();
45
+
46
+ const uid = $props.id();
47
+ let reduced = $state(false);
48
+
49
+ $effect(() => {
50
+ const mq = globalThis.matchMedia?.('(prefers-reduced-motion: reduce)');
51
+ if (!mq) return;
52
+ reduced = mq.matches;
53
+ const on = (e: MediaQueryListEvent) => (reduced = e.matches);
54
+ mq.addEventListener?.('change', on);
55
+ return () => mq.removeEventListener?.('change', on);
56
+ });
57
+
58
+ const offCount = $derived(families.filter((f) => fx.settings[f] === 'none').length);
59
+
60
+ function pick(family: FxFamily, value: string) {
61
+ fx.set(family, value);
62
+ onchange?.(fx.settings);
63
+ }
64
+ </script>
65
+
66
+ <Popover
67
+ {label}
68
+ {placement}
69
+ {box}
70
+ {variant}
71
+ {tone}
72
+ {pill}
73
+ {control}
74
+ {block}
75
+ {bare}
76
+ {hitArea}
77
+ {disabled}
78
+ triggerClass={klass}
79
+ style={styleProp}
80
+ sound={false}
81
+ >
82
+ {#snippet trigger()}
83
+ <span
84
+ data-tsu="MotionSettings"
85
+ class="glyph"
86
+ title={offCount === families.length ? `${label}: off` : label}
87
+ >
88
+ <Icon name="zap" size={size === 'sm' ? 16 : 18} />
89
+ </span>
90
+ {/snippet}
91
+ <div class="panel" class:panel-sm={size === 'sm'}>
92
+ <div class="grid">
93
+ {#each families as family (family)}
94
+ <label class="name" for="{uid}-{family}">{FX[family].label}</label>
95
+ <Select
96
+ id="{uid}-{family}"
97
+ size="sm"
98
+ value={fx.settings[family]}
99
+ options={FX[family].variants.map((v) => ({ value: v.id, label: v.label }))}
100
+ onchange={(e) => pick(family, (e.currentTarget as HTMLSelectElement).value)}
101
+ />
102
+ {/each}
103
+ </div>
104
+ <div class="row">
105
+ {#if reduced}
106
+ <div class="hint" aria-live="polite">{reducedMotionHint}</div>
107
+ {/if}
108
+ <Button
109
+ size="sm"
110
+ variant="ghost"
111
+ class="reset"
112
+ disabled={fx.isDefault}
113
+ sound={false}
114
+ onclick={() => {
115
+ fx.reset();
116
+ onchange?.(fx.settings);
117
+ }}>{resetLabel}</Button
118
+ >
119
+ </div>
120
+ </div>
121
+ </Popover>
122
+
123
+ <style>
124
+ .glyph {
125
+ display: inline-flex;
126
+ line-height: var(--lh-none);
127
+ }
128
+ .panel {
129
+ width: min(19rem, calc(100vw - var(--sp-6)));
130
+ box-sizing: border-box;
131
+ display: grid;
132
+ gap: var(--sp-2);
133
+ padding: var(--sp-3);
134
+ font-size: 0.875rem;
135
+ line-height: var(--lh-snug);
136
+ }
137
+ .panel-sm {
138
+ width: min(17rem, calc(100vw - var(--sp-6)));
139
+ padding: var(--sp-2) var(--sp-3);
140
+ font-size: 0.8125rem;
141
+ }
142
+ .grid {
143
+ display: grid;
144
+ grid-template-columns: auto minmax(0, 1fr);
145
+ align-items: center;
146
+ gap: var(--sp-1) var(--sp-3);
147
+ }
148
+ .name {
149
+ color: var(--text-muted);
150
+ white-space: nowrap;
151
+ }
152
+ .row {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: var(--sp-2);
156
+ }
157
+ .row > :global(.reset) {
158
+ margin-inline-start: auto;
159
+ }
160
+ .hint {
161
+ flex: 1 1 0;
162
+ min-width: 0;
163
+ font-size: 0.75rem;
164
+ color: var(--text-muted);
165
+ }
166
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import Popover from './Popover.svelte';
3
+ import { type FxFamily, type FxSettings } from '../../fx';
4
+ type TriggerChrome = Pick<ComponentProps<typeof Popover>, 'variant' | 'tone' | 'box' | 'pill' | 'control' | 'block' | 'bare' | 'hitArea' | 'placement' | 'disabled'>;
5
+ type $$ComponentProps = TriggerChrome & {
6
+ /** Restrict and order the offered families. */
7
+ families?: readonly FxFamily[];
8
+ size?: 'sm' | 'md';
9
+ label?: string;
10
+ resetLabel?: string;
11
+ reducedMotionHint?: string;
12
+ onchange?: (settings: FxSettings) => void;
13
+ class?: string;
14
+ style?: string;
15
+ };
16
+ declare const MotionSettings: import("svelte").Component<$$ComponentProps, {}, "">;
17
+ type MotionSettings = ReturnType<typeof MotionSettings>;
18
+ export default MotionSettings;
@@ -95,9 +95,10 @@
95
95
  flex-direction: column;
96
96
  gap: var(--sp-0-5);
97
97
  padding: var(--sp-2);
98
- background: var(--bg);
99
- border: 1px solid var(--border-strong);
98
+ background: var(--control-fill);
99
+ border: var(--edge-width) solid var(--control-edge);
100
100
  border-radius: var(--r-md);
101
+ box-shadow: var(--control-shadow);
101
102
  color: var(--text);
102
103
  text-align: left;
103
104
  white-space: normal;
@@ -107,6 +108,7 @@
107
108
  background var(--dur-fast) ease,
108
109
  border-color var(--dur-fast) ease,
109
110
  color var(--dur-fast) ease,
111
+ translate var(--dur-fast) ease,
110
112
  scale var(--opt-scale-dur) var(--ease-out);
111
113
  }
112
114
  .opt:disabled {
@@ -154,8 +156,11 @@
154
156
  color: var(--oc);
155
157
  }
156
158
  @media (hover: hover) and (pointer: fine) {
159
+ .opt:hover:not(:disabled) {
160
+ translate: 0 calc(-1 * var(--hover-lift));
161
+ }
157
162
  .opt:hover:not(:disabled):not(.selected) {
158
- border-color: var(--border-strong);
163
+ border-color: var(--control-edge);
159
164
  }
160
165
  .opt.selected:hover:not(:disabled) {
161
166
  border-color: var(--oc);
@@ -189,7 +189,7 @@
189
189
  min-width: var(--box-md);
190
190
  height: var(--box-md);
191
191
  padding: 0 var(--control-px-md);
192
- border: 1px solid transparent;
192
+ border: var(--edge-width) solid transparent;
193
193
  border-radius: var(--r-md);
194
194
  background: transparent;
195
195
  color: var(--text-muted);
@@ -201,6 +201,7 @@
201
201
  background var(--dur-fast) ease,
202
202
  border-color var(--dur-fast) ease,
203
203
  color var(--dur-fast) ease,
204
+ translate var(--dur-fast) ease,
204
205
  scale var(--page-scale-dur) var(--ease-out);
205
206
  }
206
207
  .page:active {
@@ -211,6 +212,7 @@
211
212
  .page:hover {
212
213
  background: var(--bg-elevated-2);
213
214
  color: var(--text);
215
+ translate: 0 calc(-1 * var(--hover-lift));
214
216
  }
215
217
  }
216
218
  .page.on {
@@ -392,7 +392,7 @@
392
392
  min-height: var(--pop-box, var(--box-sm));
393
393
  min-width: var(--pop-box, var(--box-sm));
394
394
  padding: var(--pop-trigger-pad, var(--sp-1));
395
- border: 1px solid var(--pop-trigger-border, transparent);
395
+ border: var(--edge-width) solid var(--pop-trigger-border, transparent);
396
396
  border-radius: var(--pop-trigger-radius, var(--r-md));
397
397
  background: var(--pop-trigger-bg, transparent);
398
398
  color: var(--pop-trigger-fg, var(--text));
@@ -403,6 +403,8 @@
403
403
  background-color var(--dur-fast) var(--ease),
404
404
  border-color var(--dur-fast) var(--ease),
405
405
  color var(--dur-fast) var(--ease),
406
+ box-shadow var(--dur-fast) var(--ease),
407
+ translate var(--dur-fast) var(--ease),
406
408
  scale var(--pop-scale-dur) var(--ease-out);
407
409
  }
408
410
  .pop-trigger:not(.bare, .trigger-toggle):active:not(:disabled, .is-disabled) {
@@ -418,11 +420,14 @@
418
420
  }
419
421
  .pop-trigger.canonical:hover:not(:disabled) {
420
422
  border-color: var(--accent);
421
- background: var(--surface);
423
+ background: var(--btn-fill);
424
+ box-shadow: var(--btn-shadow-hover);
425
+ translate: 0 calc(-1 * var(--hover-lift));
422
426
  }
423
427
  .pop-trigger.trigger-primary:hover:not(:disabled) {
424
- background: var(--accent);
425
- border-color: var(--accent);
428
+ background: var(--btn-primary-fill);
429
+ border-color: var(--btn-primary-edge);
430
+ box-shadow: var(--btn-primary-shadow-hover);
426
431
  filter: brightness(1.08);
427
432
  }
428
433
  .pop-trigger.trigger-ghost:hover:not(:disabled) {
@@ -453,8 +458,9 @@
453
458
  min-width: 0;
454
459
  min-height: var(--control-height-default);
455
460
  padding: var(--pop-trigger-pad, var(--sp-2) var(--btn-px-md));
456
- border-color: var(--pop-trigger-border, var(--border-strong));
457
- background: var(--pop-trigger-bg, var(--surface));
461
+ border-color: var(--pop-trigger-border, var(--btn-edge));
462
+ background: var(--pop-trigger-bg, var(--btn-fill));
463
+ box-shadow: var(--btn-shadow);
458
464
  font-weight: var(--fw-medium);
459
465
  font-size: var(--pop-trigger-size, var(--control-fs-md));
460
466
  line-height: var(--lh-none);
@@ -462,8 +468,9 @@
462
468
  white-space: nowrap;
463
469
  }
464
470
  .pop-trigger.trigger-primary {
465
- background: var(--pop-trigger-bg, var(--accent));
466
- border-color: var(--pop-trigger-border, var(--accent));
471
+ background: var(--pop-trigger-bg, var(--btn-primary-fill));
472
+ border-color: var(--pop-trigger-border, var(--btn-primary-edge));
473
+ box-shadow: var(--btn-primary-shadow);
467
474
  color: var(--pop-trigger-fg, var(--text-on-accent));
468
475
  font-weight: var(--fw-semibold);
469
476
  }
@@ -620,11 +627,11 @@
620
627
  min-width: 10rem;
621
628
  max-width: min(22rem, calc(100vw - 2 * var(--sp-3)));
622
629
  padding: var(--sp-1);
623
- background: var(--bg-elevated);
630
+ background: var(--raised-fill);
624
631
  color: var(--text);
625
- border: 1px solid var(--border-strong);
632
+ border: var(--edge-width) solid var(--raised-edge);
626
633
  border-radius: var(--r-md);
627
- box-shadow: var(--shadow-md);
634
+ box-shadow: var(--raised-shadow);
628
635
  transform-origin: var(--tsu-origin, top left);
629
636
  opacity: 0;
630
637
  scale: var(--enter-scale);
@@ -76,15 +76,15 @@
76
76
  font-family: var(--font-mono);
77
77
  font-size: 0.92em;
78
78
  color: var(--md-code, var(--text));
79
- background: var(--md-code-bg, var(--bg-elevated-2));
79
+ background: var(--md-code-bg, var(--surface-fill-2));
80
80
  padding: 0.1em 0.35em;
81
81
  border-radius: var(--r-sm);
82
82
  }
83
83
  .prose :global(pre) {
84
84
  margin: 0;
85
85
  padding: var(--sp-3);
86
- background: var(--bg-elevated);
87
- border: 1px solid var(--border);
86
+ background: var(--surface-fill);
87
+ border: var(--edge-width) solid var(--surface-edge);
88
88
  border-radius: var(--r-md);
89
89
  overflow-x: auto;
90
90
  font-family: var(--font-mono);
@@ -119,12 +119,12 @@
119
119
  .prose :global(th),
120
120
  .prose :global(td) {
121
121
  padding: var(--sp-1) var(--sp-2);
122
- border: 1px solid var(--border);
122
+ border: var(--edge-width) solid var(--surface-edge);
123
123
  text-align: left;
124
124
  vertical-align: top;
125
125
  }
126
126
  .prose :global(th) {
127
- background: var(--bg-elevated-2);
127
+ background: var(--surface-fill-2);
128
128
  color: var(--text-muted);
129
129
  font-weight: var(--fw-semibold);
130
130
  }
@@ -135,6 +135,6 @@
135
135
  }
136
136
  .prose :global(hr) {
137
137
  border: 0;
138
- border-top: 1px solid var(--border);
138
+ border-top: var(--edge-width) solid var(--surface-edge);
139
139
  }
140
140
  </style>
@@ -542,11 +542,11 @@
542
542
  width: max(var(--radial-petal-size, 3.5rem), var(--touch-target));
543
543
  height: max(var(--radial-petal-size, 3.5rem), var(--touch-target));
544
544
  padding: 0 var(--sp-0-5);
545
- border: 1px solid var(--border-strong);
545
+ border: var(--edge-width) solid var(--raised-edge);
546
546
  border-radius: 50%;
547
- background: var(--bg-elevated);
547
+ background: var(--raised-fill);
548
548
  color: var(--text);
549
- box-shadow: var(--shadow-md);
549
+ box-shadow: var(--raised-shadow);
550
550
  font-size: var(--fs-xs);
551
551
  line-height: var(--lh-heading);
552
552
  translate: -50% -50%;
@@ -172,9 +172,10 @@
172
172
  width: var(--chip-sm);
173
173
  height: var(--chip-sm);
174
174
  margin-top: var(--sp-px);
175
- border: 1px solid var(--border-strong);
175
+ border: var(--edge-width) solid var(--control-edge);
176
176
  border-radius: var(--r-pill);
177
- background: var(--bg);
177
+ background: var(--control-fill);
178
+ box-shadow: var(--control-shadow);
178
179
  transition: border-color var(--dur-fast) var(--ease);
179
180
  }
180
181
  .dot-ctl::after {
@@ -202,9 +203,71 @@
202
203
  opacity var(--dur-spring) var(--ease-spring),
203
204
  scale var(--dur-spring) var(--ease-spring);
204
205
  }
206
+ /* Effects follow the closest data-fx-radio ancestor; spring is the default. */
207
+ .radio-group:not(:global([data-fx-radio]:not([data-fx-radio='spring'])) *),
208
+ :global([data-fx-radio='spring']) .radio-group:not(:global([data-fx-radio='spring'] [data-fx-radio]:not([data-fx-radio='spring'])) *) {
209
+ & .dot-ctl::after {
210
+ inset: 22%;
211
+ width: auto;
212
+ height: auto;
213
+ margin: 0;
214
+ opacity: 1;
215
+ scale: 0;
216
+ transition: scale var(--dur-exit-fast) var(--ease-out);
217
+ }
218
+ & input:checked + .dot-ctl::after {
219
+ scale: 1;
220
+ transition: scale var(--dur-spring) var(--ease-spring-bounce);
221
+ }
222
+ }
223
+
224
+ /* Accent rises like liquid with a wobbling surface, then the pip drops in. */
225
+ :global([data-fx-radio='liquid']) .radio-group:not(:global([data-fx-radio='liquid'] [data-fx-radio]:not([data-fx-radio='liquid'])) *) {
226
+ & .dot-ctl {
227
+ overflow: hidden;
228
+ }
229
+ & .dot-ctl::before {
230
+ content: '';
231
+ position: absolute;
232
+ left: -50%;
233
+ top: 0;
234
+ width: 200%;
235
+ height: 200%;
236
+ border-radius: 42% 46% 40% 44%;
237
+ background: var(--accent);
238
+ translate: 0 50%;
239
+ pointer-events: none;
240
+ transition:
241
+ translate var(--dur-exit) var(--ease-in-out),
242
+ rotate var(--dur-exit) var(--ease-in-out);
243
+ }
244
+ & input:checked + .dot-ctl::before {
245
+ translate: 0 -30%;
246
+ rotate: 150deg;
247
+ transition:
248
+ translate var(--dur-slow) var(--ease-out),
249
+ rotate var(--dur-slow) var(--ease-out);
250
+ }
251
+ & .dot-ctl::after {
252
+ inset: 30%;
253
+ width: auto;
254
+ height: auto;
255
+ margin: 0;
256
+ background: var(--text-on-accent);
257
+ opacity: 1;
258
+ scale: 0;
259
+ transition: scale var(--dur-exit-fast) var(--ease-out);
260
+ }
261
+ & input:checked + .dot-ctl::after {
262
+ scale: 1;
263
+ transition: scale var(--dur-exit) var(--ease-spring-bounce) var(--dur-fast);
264
+ }
265
+ }
266
+
205
267
  input:focus-visible + .dot-ctl {
206
268
  outline: var(--focus-ring);
207
269
  outline-offset: var(--focus-ring-offset);
270
+ box-shadow: var(--control-shadow), var(--focus-glow);
208
271
  }
209
272
  .texts {
210
273
  display: flex;
@@ -231,7 +294,7 @@
231
294
  min-width: 0;
232
295
  gap: var(--sp-2);
233
296
  padding: var(--pad, var(--sp-2) var(--sp-3));
234
- border: 1px solid var(--border);
297
+ border: var(--edge-width) solid var(--surface-edge);
235
298
  border-radius: var(--r-md);
236
299
  transition:
237
300
  border-color var(--dur-fast) var(--ease),
@@ -239,7 +302,7 @@
239
302
  }
240
303
  .row.selected {
241
304
  border-color: var(--accent-dim);
242
- background: var(--bg-elevated);
305
+ background: var(--surface-fill);
243
306
  }
244
307
  .row .radio {
245
308
  flex: 1 1 auto;
@@ -431,9 +431,10 @@
431
431
  min-width: 0;
432
432
  min-height: var(--rs-height);
433
433
  padding: var(--sp-1) var(--sp-2) var(--sp-1) var(--sp-1);
434
- border: 1px solid var(--border-strong);
434
+ border: var(--edge-width) solid var(--control-edge);
435
435
  border-radius: var(--r-md);
436
436
  background: var(--surface);
437
+ box-shadow: var(--control-shadow);
437
438
  color: var(--text);
438
439
  text-align: start;
439
440
  cursor: pointer;
@@ -444,6 +445,7 @@
444
445
  .rich-select :global(.pop-trigger.rs-trigger:focus-visible) {
445
446
  outline: var(--focus-ring);
446
447
  outline-offset: var(--focus-ring-offset);
448
+ box-shadow: var(--control-shadow), var(--focus-glow);
447
449
  }
448
450
  .rich-select :global(.pop-trigger.rs-trigger:active:not(:disabled)) {
449
451
  scale: var(--press-scale-lg);
@@ -534,8 +536,8 @@
534
536
  }
535
537
  .rs-row[data-dragging] {
536
538
  z-index: 1;
537
- box-shadow: var(--shadow-md);
538
- background: var(--bg-elevated);
539
+ box-shadow: var(--raised-shadow);
540
+ background: var(--raised-fill);
539
541
  transition: none;
540
542
  }
541
543
  .rs-option {
@@ -587,6 +589,6 @@
587
589
  display: flex;
588
590
  flex-direction: column;
589
591
  padding-top: var(--sp-1);
590
- border-top: 1px solid var(--border);
592
+ border-top: var(--edge-width) solid var(--surface-edge);
591
593
  }
592
594
  </style>
@@ -172,7 +172,7 @@
172
172
  }
173
173
  .sh-divider > .sh-row {
174
174
  padding-bottom: var(--sp-2);
175
- border-bottom: 1px solid var(--border);
175
+ border-bottom: var(--edge-width) solid var(--surface-edge);
176
176
  }
177
177
  .sh-group > .sh-row {
178
178
  flex-wrap: nowrap;
@@ -276,7 +276,7 @@
276
276
  height: var(--seek-track);
277
277
  margin-top: calc(var(--seek-track) / -2);
278
278
  border-radius: var(--r-pill);
279
- background: var(--bg-elevated-2);
279
+ background: var(--track-fill);
280
280
  overflow: hidden;
281
281
  transform-origin: center;
282
282
  transition: scale var(--dur-fast) var(--ease);
@@ -322,7 +322,7 @@
322
322
  border-radius: var(--r-pill);
323
323
  background: var(--seek-accent);
324
324
  border: 2px solid var(--bg);
325
- box-shadow: var(--shadow-sm);
325
+ box-shadow: var(--thumb-shadow);
326
326
  transform: translate(-50%, -50%);
327
327
  scale: 0.6;
328
328
  opacity: 0;
@@ -346,7 +346,7 @@
346
346
  .seek:not(.seek--inert):hover .seek-thumb {
347
347
  opacity: 1;
348
348
  scale: 1;
349
- box-shadow: var(--shadow-sm), var(--seek-halo);
349
+ box-shadow: var(--thumb-shadow), var(--seek-halo);
350
350
  }
351
351
  .seek--dragging .seek-thumb {
352
352
  scale: 1.15;
@@ -370,9 +370,9 @@
370
370
  gap: var(--sp-1);
371
371
  padding: var(--sp-1) var(--sp-2);
372
372
  border-radius: var(--r-sm);
373
- background: var(--bg-elevated);
374
- border: 1px solid var(--border);
375
- box-shadow: var(--shadow-md);
373
+ background: var(--raised-fill);
374
+ border: var(--edge-width) solid var(--surface-edge);
375
+ box-shadow: var(--raised-shadow);
376
376
  color: var(--text);
377
377
  font-size: var(--fs-xs);
378
378
  font-variant-numeric: tabular-nums;
@@ -238,7 +238,7 @@
238
238
  items fill the inside, which is the height minus border and padding. */
239
239
  .seg {
240
240
  --seg-h: var(--control-md);
241
- --seg-inset: calc(var(--sp-0-5) + 1px);
241
+ --seg-inset: calc(var(--sp-0-5) + var(--edge-width));
242
242
  --seg-item-h: calc(var(--seg-h) - 2 * var(--seg-inset));
243
243
  position: relative;
244
244
  display: inline-flex;
@@ -247,8 +247,8 @@
247
247
  height: var(--seg-h);
248
248
  min-height: var(--seg-h);
249
249
  padding: var(--sp-0-5);
250
- background: var(--bg-elevated-2);
251
- border: 1px solid var(--border);
250
+ background: var(--track-fill);
251
+ border: var(--edge-width) solid var(--track-edge);
252
252
  border-radius: var(--r-pill);
253
253
  max-width: 100%;
254
254
  min-width: 0;
@@ -326,8 +326,8 @@
326
326
  width: 0;
327
327
  height: 0;
328
328
  border-radius: var(--r-pill);
329
- background: var(--bg);
330
- box-shadow: var(--shadow-sm);
329
+ background: var(--thumb-fill);
330
+ box-shadow: var(--thumb-shadow);
331
331
  transform-origin: top left;
332
332
  pointer-events: none;
333
333
  transition:
@@ -430,8 +430,8 @@
430
430
  }
431
431
  .seg-item.selected {
432
432
  color: var(--text);
433
- background: var(--bg);
434
- box-shadow: var(--shadow-sm);
433
+ background: var(--thumb-fill);
434
+ box-shadow: var(--thumb-shadow);
435
435
  }
436
436
  .seg.placed .seg-item.selected {
437
437
  background: transparent;
@@ -571,7 +571,7 @@
571
571
  }
572
572
  .sl-row {
573
573
  position: relative;
574
- border-bottom: 1px solid var(--border);
574
+ border-bottom: var(--edge-width) solid var(--surface-edge);
575
575
  }
576
576
  .sl-row:last-child {
577
577
  border-bottom: 0;
@@ -609,7 +609,7 @@
609
609
  position: relative;
610
610
  z-index: 1;
611
611
  background: var(--bg-elevated-2);
612
- box-shadow: var(--shadow-md);
612
+ box-shadow: var(--raised-shadow);
613
613
  transition: none;
614
614
  }
615
615
  .sl-grip,
@@ -168,7 +168,7 @@
168
168
  position: relative;
169
169
  width: var(--split-height);
170
170
  flex: none;
171
- margin-inline-start: -1px;
171
+ margin-inline-start: calc(-1 * var(--edge-width));
172
172
  --pop-trigger-radius: 0 var(--r-md) var(--r-md) 0;
173
173
  --pop-trigger-pad: 0;
174
174
  }