@dorsk/tsumikit 0.78.0 → 0.79.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 (57) hide show
  1. package/dist/components/atoms/Artwork.svelte +5 -3
  2. package/dist/components/atoms/Badge.svelte +1 -1
  3. package/dist/components/atoms/Button.svelte +24 -8
  4. package/dist/components/atoms/Card.svelte +18 -12
  5. package/dist/components/atoms/Checkbox.svelte +4 -2
  6. package/dist/components/atoms/Gauge.svelte +2 -2
  7. package/dist/components/atoms/Input.svelte +6 -3
  8. package/dist/components/atoms/Kbd.svelte +1 -1
  9. package/dist/components/atoms/Progress.svelte +1 -1
  10. package/dist/components/atoms/SegmentedProgress.svelte +2 -2
  11. package/dist/components/atoms/Select.svelte +9 -3
  12. package/dist/components/atoms/Slider.svelte +8 -6
  13. package/dist/components/atoms/Swatch.svelte +1 -1
  14. package/dist/components/atoms/Switch.svelte +3 -2
  15. package/dist/components/atoms/Textarea.svelte +6 -3
  16. package/dist/components/layouts/AppShell.svelte +6 -6
  17. package/dist/components/layouts/MasterDetail.svelte +3 -3
  18. package/dist/components/layouts/NavBar.svelte +4 -4
  19. package/dist/components/layouts/NavSection.svelte +1 -1
  20. package/dist/components/layouts/ResizablePanel.svelte +7 -7
  21. package/dist/components/layouts/TabBar.svelte +2 -2
  22. package/dist/components/molecules/Accordion.svelte +2 -2
  23. package/dist/components/molecules/AttachmentList.svelte +2 -2
  24. package/dist/components/molecules/CapBar.svelte +2 -2
  25. package/dist/components/molecules/CodeBlock.svelte +5 -5
  26. package/dist/components/molecules/Combobox.svelte +3 -3
  27. package/dist/components/molecules/Drawer.svelte +8 -8
  28. package/dist/components/molecules/EmojiPicker.svelte +1 -1
  29. package/dist/components/molecules/FileButton.svelte +16 -4
  30. package/dist/components/molecules/FilterInput.svelte +4 -4
  31. package/dist/components/molecules/GitRef.svelte +2 -2
  32. package/dist/components/molecules/GlyphStack.svelte +21 -3
  33. package/dist/components/molecules/InputGroup.svelte +2 -2
  34. package/dist/components/molecules/Modal.svelte +5 -5
  35. package/dist/components/molecules/OptionButton.svelte +8 -3
  36. package/dist/components/molecules/Pagination.svelte +3 -1
  37. package/dist/components/molecules/Popover.svelte +18 -11
  38. package/dist/components/molecules/Prose.svelte +6 -6
  39. package/dist/components/molecules/RadialMenu.svelte +3 -3
  40. package/dist/components/molecules/RadioGroup.svelte +6 -4
  41. package/dist/components/molecules/RichSelect.svelte +6 -4
  42. package/dist/components/molecules/SectionHeader.svelte +1 -1
  43. package/dist/components/molecules/SeekSlider.svelte +6 -6
  44. package/dist/components/molecules/SegmentedControl.svelte +7 -7
  45. package/dist/components/molecules/SortableList.svelte +2 -2
  46. package/dist/components/molecules/SplitButton.svelte +1 -1
  47. package/dist/components/molecules/Tabs.svelte +3 -3
  48. package/dist/components/molecules/ThemePicker.svelte +1 -1
  49. package/dist/components/molecules/Timestamp.svelte +1 -1
  50. package/dist/components/molecules/Toggle.svelte +5 -3
  51. package/dist/components/molecules/Tooltip.svelte +2 -2
  52. package/dist/components/molecules/VolumeSlider.svelte +3 -3
  53. package/dist/components/organisms/ConversationFeed.svelte +1 -1
  54. package/dist/components/organisms/ConversationPanel.svelte +3 -3
  55. package/dist/components/organisms/DataTable.svelte +18 -16
  56. package/dist/styles/tokens.css +34 -0
  57. package/package.json +1 -1
@@ -102,13 +102,14 @@
102
102
  justify-content: center;
103
103
  overflow: hidden;
104
104
  flex: none;
105
- background: var(--bg-elevated-2);
106
- border: 1px solid var(--border);
105
+ background: var(--surface-fill-2);
106
+ border: var(--edge-width) solid var(--surface-edge);
107
107
  color: var(--text-muted);
108
108
  container-type: inline-size;
109
109
  transition:
110
110
  border-color var(--dur-fast) var(--ease),
111
111
  box-shadow var(--dur-fast) var(--ease),
112
+ translate var(--dur-fast) var(--ease-out),
112
113
  scale var(--dur-fast) var(--ease-out);
113
114
  }
114
115
  .r-sm {
@@ -125,8 +126,9 @@
125
126
  }
126
127
  @media (hover: hover) and (pointer: fine) {
127
128
  .hover:hover {
128
- border-color: var(--border-strong);
129
+ border-color: var(--surface-edge-strong);
129
130
  box-shadow: var(--shadow-md);
131
+ translate: 0 calc(-1 * var(--hover-lift));
130
132
  }
131
133
  }
132
134
  .hover:active {
@@ -195,7 +195,7 @@
195
195
  --icon-size: var(--icon-xs);
196
196
  background: var(--badge-bg, var(--bg-elevated-2));
197
197
  color: var(--badge-fg, var(--text-muted));
198
- border: 1px solid var(--badge-border, var(--border));
198
+ border: var(--edge-width) solid var(--badge-border, var(--border));
199
199
  white-space: nowrap;
200
200
  max-width: var(--badge-max-width, 100%);
201
201
  }
@@ -242,9 +242,12 @@
242
242
  padding: var(--sp-2) var(--btn-px-md);
243
243
  min-height: var(--btn-size, var(--control-height-default));
244
244
  max-width: 100%;
245
- border: 1px solid var(--btn-border, var(--border-strong));
245
+ border: var(--edge-width) solid var(--btn-border, var(--btn-edge));
246
246
  border-radius: var(--btn-radius, var(--r-md));
247
- background: var(--btn-bg, var(--surface));
247
+ background: var(--btn-bg, var(--btn-fill));
248
+ --btn-shadow-rest: var(--btn-shadow);
249
+ --btn-shadow-lift: var(--btn-shadow-hover);
250
+ box-shadow: var(--btn-shadow-rest);
248
251
  color: var(--btn-fg, var(--text));
249
252
  font-weight: var(--fw-medium);
250
253
  font-size: var(--control-fs-md);
@@ -254,8 +257,10 @@
254
257
  transition:
255
258
  background var(--dur-fast) ease,
256
259
  border-color var(--dur-fast) ease,
260
+ box-shadow var(--dur-fast) ease,
257
261
  color var(--dur-fast) ease,
258
262
  opacity var(--dur-fast) ease,
263
+ translate var(--dur-fast) var(--ease-out),
259
264
  scale var(--btn-scale-dur) var(--ease-out);
260
265
  user-select: none;
261
266
  white-space: normal;
@@ -265,6 +270,9 @@
265
270
  opacity: var(--disabled-opacity);
266
271
  cursor: not-allowed;
267
272
  }
273
+ .btn:focus-visible:not(.btn-link, .btn-icon-inline, [aria-pressed='true']) {
274
+ box-shadow: var(--btn-shadow-rest), var(--focus-glow);
275
+ }
268
276
  /* Press: scale in over --dur-press, release over --dur-fast. */
269
277
  .btn:active:not(:disabled, [aria-disabled='true'], .loading, .btn-link) {
270
278
  --btn-scale-dur: var(--dur-press);
@@ -277,8 +285,10 @@
277
285
  scale: var(--press-scale-sm);
278
286
  }
279
287
  .btn-primary {
280
- background: var(--btn-bg, var(--accent));
281
- border-color: var(--btn-border, var(--accent));
288
+ background: var(--btn-bg, var(--btn-primary-fill));
289
+ border-color: var(--btn-border, var(--btn-primary-edge));
290
+ --btn-shadow-rest: var(--btn-primary-shadow);
291
+ --btn-shadow-lift: var(--btn-primary-shadow-hover);
282
292
  color: var(--btn-fg, var(--text-on-accent));
283
293
  font-weight: var(--fw-semibold);
284
294
  }
@@ -289,6 +299,8 @@
289
299
  .btn-ghost {
290
300
  background: var(--btn-bg, transparent);
291
301
  border-color: var(--btn-border, transparent);
302
+ --btn-shadow-rest: none;
303
+ --btn-shadow-lift: none;
292
304
  }
293
305
  .btn-sm {
294
306
  min-height: var(--btn-size, var(--control-height-compact));
@@ -372,9 +384,9 @@
372
384
  height: var(--btn-size, var(--control-height));
373
385
  min-height: var(--btn-size, var(--control-height));
374
386
  padding: 0 var(--control-px-md);
375
- border: 1px solid var(--btn-border, var(--border-strong));
387
+ border: var(--edge-width) solid var(--btn-border, var(--btn-edge));
376
388
  border-radius: var(--btn-radius, var(--r-md));
377
- background: var(--btn-bg, var(--surface));
389
+ background: var(--btn-bg, var(--btn-fill));
378
390
  color: var(--btn-fg, var(--text));
379
391
  font-weight: var(--fw-medium);
380
392
  font-size: var(--control-fs-md);
@@ -390,8 +402,8 @@
390
402
  the primary action with the neutral --surface; restore the accent fill when
391
403
  both are present. */
392
404
  .btn-control.btn-primary {
393
- background: var(--btn-bg, var(--accent));
394
- border-color: var(--btn-border, var(--accent));
405
+ background: var(--btn-bg, var(--btn-primary-fill));
406
+ border-color: var(--btn-border, var(--btn-primary-edge));
395
407
  color: var(--btn-fg, var(--text-on-accent));
396
408
  }
397
409
  .btn-control.btn-tone-success {
@@ -730,6 +742,8 @@
730
742
  @media (hover: hover) and (pointer: fine) {
731
743
  .btn:hover:not(:disabled) {
732
744
  border-color: var(--accent);
745
+ translate: 0 calc(-1 * var(--hover-lift));
746
+ --btn-shadow-rest: var(--btn-shadow-lift);
733
747
  }
734
748
  .btn-primary:hover:not(:disabled) {
735
749
  filter: brightness(1.08);
@@ -782,11 +796,13 @@
782
796
  .btn-link:hover:not(:disabled) {
783
797
  background: none;
784
798
  border: none;
799
+ translate: none;
785
800
  text-decoration: underline;
786
801
  }
787
802
  .btn-icon-inline:hover:not(:disabled) {
788
803
  border: none;
789
804
  background: none;
805
+ translate: none;
790
806
  color: var(--text);
791
807
  }
792
808
  .btn-icon-inline.hover-danger:hover:not(:disabled) {
@@ -174,10 +174,12 @@
174
174
  .card {
175
175
  --card-pad: var(--sp-4);
176
176
  min-width: 0;
177
- background: var(--bg-elevated);
177
+ background: var(--surface-fill);
178
178
  --card-border-style: solid;
179
- border: 1px var(--card-border-style) var(--border);
179
+ border: var(--edge-width) var(--card-border-style) var(--surface-edge);
180
180
  border-radius: var(--r-lg);
181
+ --card-shadow-rest: var(--surface-shadow);
182
+ box-shadow: var(--card-shadow-rest);
181
183
  padding: var(--card-pad);
182
184
  }
183
185
  .card-gap {
@@ -194,10 +196,10 @@
194
196
  padding: var(--card-pad);
195
197
  }
196
198
  .card-head {
197
- border-bottom: 1px solid var(--border);
199
+ border-bottom: var(--edge-width) solid var(--surface-edge);
198
200
  }
199
201
  .card-foot {
200
- border-top: 1px solid var(--border);
202
+ border-top: var(--edge-width) solid var(--surface-edge);
201
203
  }
202
204
  /* Theme-aware surface shade, selected by prop so it adapts across themes
203
205
  instead of being overridden with app-level :global hacks. `base` is the
@@ -206,7 +208,7 @@
206
208
  background: var(--surface);
207
209
  }
208
210
  .surface-sunken {
209
- background: var(--bg-elevated-2);
211
+ background: var(--surface-fill-2);
210
212
  }
211
213
  .border-dashed {
212
214
  --card-border-style: dashed;
@@ -237,16 +239,19 @@
237
239
  border-color var(--dur-fast) var(--ease),
238
240
  background var(--dur-fast) var(--ease),
239
241
  box-shadow var(--dur-fast) var(--ease),
242
+ translate var(--dur-fast) var(--ease-out),
240
243
  scale var(--dur-fast) var(--ease-out);
241
244
  }
242
245
  .card-tap:active {
243
- background: var(--bg-elevated-2);
246
+ background: var(--surface-fill-2);
244
247
  scale: var(--press-scale-lg);
245
248
  transition-duration: var(--dur-press);
246
249
  }
247
250
  @media (hover: hover) and (pointer: fine) {
248
251
  .card-tap:hover {
249
- border-color: var(--border-strong);
252
+ border-color: var(--surface-edge-strong);
253
+ translate: 0 calc(-1 * var(--hover-lift));
254
+ --card-shadow-rest: var(--surface-shadow-hover);
250
255
  }
251
256
  }
252
257
  .card-max {
@@ -275,9 +280,10 @@
275
280
  .card-warn,
276
281
  .card-danger,
277
282
  .card-info,
283
+ .card-accent,
278
284
  .card-attention {
279
- border-color: color-mix(in srgb, var(--card-tone) 55%, var(--border));
280
- background: color-mix(in srgb, var(--card-tone) 8%, var(--bg-elevated));
285
+ border-color: color-mix(in srgb, var(--card-tone) 55%, var(--surface-edge));
286
+ background: color-mix(in srgb, var(--card-tone) 8%, var(--surface-fill));
281
287
  }
282
288
  .card-attention {
283
289
  background: var(--attention-bg);
@@ -291,8 +297,8 @@
291
297
  /* Defaults; overridden inline by the stackY/stackX props. */
292
298
  --stack-y: 8px;
293
299
  --stack-x: 2px;
294
- --stack-bg: var(--bg-elevated-2);
295
- --stack-border: var(--border);
300
+ --stack-bg: var(--surface-fill-2);
301
+ --stack-border: var(--surface-edge);
296
302
  /* Reserve room for the two peeking layers so they aren't clipped. */
297
303
  margin-right: calc(var(--stack-x) * 2);
298
304
  margin-bottom: calc(var(--stack-y) * 2);
@@ -306,7 +312,7 @@
306
312
  /* Opaque fill so each layer fully hides the one behind it — only the
307
313
  bottom-right peek (and its single border line) stays visible. */
308
314
  background: var(--stack-bg);
309
- border: 1px var(--card-border-style) var(--stack-border);
315
+ border: var(--edge-width) var(--card-border-style) var(--stack-border);
310
316
  }
311
317
  /* Nearest back layer — sits just under the front surface. */
312
318
  .card-stacked::before {
@@ -106,9 +106,10 @@
106
106
  flex: none;
107
107
  width: var(--cb-box, var(--chip-sm));
108
108
  height: var(--cb-box, var(--chip-sm));
109
- border: 1px solid var(--border-strong);
109
+ border: var(--edge-width) solid var(--control-edge);
110
110
  border-radius: var(--r-sm);
111
- background: var(--bg);
111
+ background: var(--control-fill);
112
+ box-shadow: var(--control-shadow);
112
113
  transition:
113
114
  background var(--dur-fast) var(--ease),
114
115
  border-color var(--dur-fast) var(--ease),
@@ -158,6 +159,7 @@
158
159
  input:focus-visible + .box {
159
160
  outline: var(--focus-ring);
160
161
  outline-offset: var(--focus-ring-offset);
162
+ box-shadow: var(--control-shadow), var(--focus-glow);
161
163
  }
162
164
  input[aria-invalid='true']:not(:checked):not(:indeterminate) + .box {
163
165
  border-color: var(--danger);
@@ -108,9 +108,9 @@
108
108
  height: var(--gauge-h, 1.25rem);
109
109
  margin: 0;
110
110
  padding: 0;
111
- border: 1px solid var(--border);
111
+ border: var(--edge-width) solid var(--track-edge);
112
112
  border-radius: var(--r-sm);
113
- background: var(--bg-elevated-2);
113
+ background: var(--track-fill);
114
114
  overflow: visible;
115
115
  color: inherit;
116
116
  font: inherit;
@@ -142,9 +142,10 @@
142
142
  padding: var(--sp-2) var(--control-px-md);
143
143
  font-size: var(--control-fs-md);
144
144
  line-height: var(--lh-tight);
145
- background: var(--input-bg, var(--bg));
146
- border: 1px solid var(--input-border, var(--border-strong));
145
+ background: var(--input-bg, var(--control-fill));
146
+ border: var(--edge-width) solid var(--input-border, var(--control-edge));
147
147
  border-radius: var(--input-radius, var(--r-md));
148
+ box-shadow: var(--control-shadow);
148
149
  color: var(--input-fg, var(--text));
149
150
  transition: border-color var(--dur-fast) ease;
150
151
  }
@@ -155,6 +156,7 @@
155
156
  .input:focus-visible {
156
157
  outline: var(--focus-ring);
157
158
  outline-offset: var(--focus-ring-offset);
159
+ box-shadow: var(--control-shadow), var(--focus-glow);
158
160
  }
159
161
  .input:disabled {
160
162
  opacity: var(--disabled-opacity);
@@ -216,6 +218,7 @@
216
218
  }
217
219
  .input.grouped:focus-visible {
218
220
  outline: none;
221
+ box-shadow: var(--control-shadow);
219
222
  }
220
223
  .input.grouped:disabled {
221
224
  opacity: 1;
@@ -296,7 +299,7 @@
296
299
  }
297
300
  @media (hover: hover) and (pointer: fine) {
298
301
  .input:hover:not(:disabled, :focus, [aria-invalid='true']) {
299
- border-color: var(--text-faint);
302
+ border-color: var(--control-edge-hover);
300
303
  }
301
304
  .input-clear:hover {
302
305
  color: var(--text);
@@ -108,7 +108,7 @@
108
108
  font-size: inherit;
109
109
  line-height: var(--lh-snug);
110
110
  padding: 0 var(--sp-1);
111
- border: 1px solid var(--border-strong);
111
+ border: var(--edge-width) solid var(--border-strong);
112
112
  border-bottom-width: 2px;
113
113
  border-radius: var(--r-sm);
114
114
  background: var(--bg-elevated-2);
@@ -146,7 +146,7 @@
146
146
  position: relative;
147
147
  width: 100%;
148
148
  height: 0.5rem;
149
- background: var(--bg-elevated-2);
149
+ background: var(--track-fill);
150
150
  border-radius: var(--r-pill);
151
151
  overflow: hidden;
152
152
  }
@@ -168,7 +168,7 @@
168
168
  flex: 0 1 0%;
169
169
  min-width: 3px;
170
170
  height: 100%;
171
- background: var(--bg-elevated-2);
171
+ background: var(--track-fill);
172
172
  overflow: hidden;
173
173
  }
174
174
  .segment:first-child {
@@ -206,7 +206,7 @@
206
206
 
207
207
  .stacked {
208
208
  overflow: hidden;
209
- background: var(--bg-elevated-2);
209
+ background: var(--track-fill);
210
210
  }
211
211
  .stacked .segment {
212
212
  min-width: 0;
@@ -217,9 +217,10 @@
217
217
  padding: var(--sp-2) var(--control-px-md);
218
218
  font-size: var(--control-fs-md);
219
219
  line-height: var(--lh-tight);
220
- background: var(--select-bg, var(--bg));
221
- border: 1px solid var(--select-border, var(--border-strong));
220
+ background: var(--select-bg, var(--control-fill));
221
+ border: var(--edge-width) solid var(--select-border, var(--control-edge));
222
222
  border-radius: var(--select-radius, var(--r-md));
223
+ box-shadow: var(--control-shadow);
223
224
  color: var(--select-fg, var(--text));
224
225
  transition: border-color var(--dur-fast) ease;
225
226
  }
@@ -261,11 +262,15 @@
261
262
  background: var(--select-bg, var(--bg-elevated-2));
262
263
  border: none;
263
264
  border-radius: var(--select-radius, var(--r-sm));
265
+ box-shadow: none;
264
266
  }
265
267
  .select:focus {
266
268
  outline: none;
267
269
  border-color: var(--accent);
268
270
  }
271
+ .select:focus-visible:not(.embedded, .ghost) {
272
+ box-shadow: var(--control-shadow), var(--focus-glow);
273
+ }
269
274
  .select:focus-visible {
270
275
  outline: var(--focus-ring);
271
276
  outline-offset: var(--focus-ring-offset);
@@ -367,7 +372,7 @@
367
372
  }
368
373
  @media (hover: hover) and (pointer: fine) {
369
374
  .select:hover:not(:disabled, :focus, [aria-invalid='true'], .ghost, .embedded) {
370
- border-color: var(--text-faint);
375
+ border-color: var(--control-edge-hover);
371
376
  }
372
377
  }
373
378
  /* Transparent overlay: fills the positioned parent, the trigger shows through. */
@@ -380,6 +385,7 @@
380
385
  opacity: 0;
381
386
  border: none;
382
387
  background: none;
388
+ box-shadow: none;
383
389
  cursor: pointer;
384
390
  }
385
391
  </style>
@@ -210,13 +210,13 @@
210
210
  background: linear-gradient(
211
211
  to right,
212
212
  var(--slider-accent, var(--accent)) var(--pct),
213
- var(--bg-elevated-2) var(--pct)
213
+ var(--track-fill) var(--pct)
214
214
  );
215
215
  }
216
216
  input[type='range']::-moz-range-track {
217
217
  height: var(--track);
218
218
  border-radius: var(--r-pill);
219
- background: var(--bg-elevated-2);
219
+ background: var(--track-fill);
220
220
  }
221
221
  input[type='range']::-moz-range-progress {
222
222
  height: var(--track);
@@ -233,7 +233,7 @@
233
233
  border-radius: var(--r-pill);
234
234
  background: var(--slider-accent, var(--accent));
235
235
  border: 2px solid var(--bg);
236
- box-shadow: var(--shadow-sm);
236
+ box-shadow: var(--thumb-shadow);
237
237
  transition:
238
238
  scale var(--dur-press) var(--ease-out),
239
239
  box-shadow var(--dur-fast) var(--ease);
@@ -244,17 +244,17 @@
244
244
  border-radius: var(--r-pill);
245
245
  background: var(--slider-accent, var(--accent));
246
246
  border: 2px solid var(--bg);
247
- box-shadow: var(--shadow-sm);
247
+ box-shadow: var(--thumb-shadow);
248
248
  transition:
249
249
  scale var(--dur-press) var(--ease-out),
250
250
  box-shadow var(--dur-fast) var(--ease);
251
251
  }
252
252
  @media (hover: hover) and (pointer: fine) {
253
253
  input[type='range']:not(:disabled):hover::-webkit-slider-thumb {
254
- box-shadow: var(--shadow-sm), var(--halo);
254
+ box-shadow: var(--thumb-shadow), var(--halo);
255
255
  }
256
256
  input[type='range']:not(:disabled):hover::-moz-range-thumb {
257
- box-shadow: var(--shadow-sm), var(--halo);
257
+ box-shadow: var(--thumb-shadow), var(--halo);
258
258
  }
259
259
  }
260
260
  input[type='range']:not(:disabled):active::-webkit-slider-thumb {
@@ -269,10 +269,12 @@
269
269
  input[type='range']:focus-visible::-webkit-slider-thumb {
270
270
  outline: var(--focus-ring);
271
271
  outline-offset: var(--focus-ring-offset);
272
+ box-shadow: var(--thumb-shadow), var(--focus-glow);
272
273
  }
273
274
  input[type='range']:focus-visible::-moz-range-thumb {
274
275
  outline: var(--focus-ring);
275
276
  outline-offset: var(--focus-ring-offset);
277
+ box-shadow: var(--thumb-shadow), var(--focus-glow);
276
278
  }
277
279
  @media (pointer: coarse) {
278
280
  input[type='range'] {
@@ -70,7 +70,7 @@
70
70
  height: var(--swatch-size);
71
71
  padding: 0;
72
72
  margin: 0;
73
- border: 1px solid var(--border);
73
+ border: var(--edge-width) solid var(--border);
74
74
  border-radius: var(--r-pill);
75
75
  background: var(--swatch-color);
76
76
  color: var(--text);
@@ -86,8 +86,8 @@
86
86
  width: var(--sw-w);
87
87
  height: var(--sw-h);
88
88
  border-radius: var(--r-pill);
89
- border: 1px solid var(--border-strong);
90
- background: var(--bg-elevated-2);
89
+ border: var(--edge-width) solid var(--border-strong);
90
+ background: var(--track-fill);
91
91
  padding: var(--sp-0-5);
92
92
  display: flex;
93
93
  align-items: center;
@@ -125,6 +125,7 @@
125
125
  .switch:focus-visible {
126
126
  outline: var(--focus-ring);
127
127
  outline-offset: var(--focus-ring-offset);
128
+ box-shadow: var(--focus-glow);
128
129
  }
129
130
  .switch:disabled {
130
131
  opacity: var(--disabled-opacity);
@@ -278,9 +278,10 @@
278
278
  --sp-3 top+bottom would overshoot it and a `rows={1}` textarea would
279
279
  render taller than the buttons it sits beside. */
280
280
  padding: var(--sp-2) var(--control-px-md);
281
- background: var(--textarea-bg, var(--bg));
282
- border: 1px solid var(--textarea-border, var(--border-strong));
281
+ background: var(--textarea-bg, var(--control-fill));
282
+ border: var(--edge-width) solid var(--textarea-border, var(--control-edge));
283
283
  border-radius: var(--textarea-radius, var(--r-md));
284
+ box-shadow: var(--control-shadow);
284
285
  color: var(--textarea-fg, var(--text));
285
286
  transition: border-color var(--dur-fast) ease;
286
287
  /* Custom handle replaces the native grip; never show the native one. */
@@ -299,6 +300,7 @@
299
300
  .textarea:focus-visible {
300
301
  outline: var(--focus-ring);
301
302
  outline-offset: var(--focus-ring-offset);
303
+ box-shadow: var(--control-shadow), var(--focus-glow);
302
304
  }
303
305
  .textarea:disabled {
304
306
  cursor: not-allowed;
@@ -347,6 +349,7 @@
347
349
  }
348
350
  .textarea.grouped:focus-visible {
349
351
  outline: none;
352
+ box-shadow: var(--control-shadow);
350
353
  }
351
354
  .textarea.grouped.bar {
352
355
  padding-inline: var(--ig-pad-x);
@@ -408,7 +411,7 @@
408
411
  }
409
412
  @media (hover: hover) and (pointer: fine) {
410
413
  .textarea:hover:not(:disabled, :focus, [aria-invalid='true']) {
411
- border-color: var(--text-faint);
414
+ border-color: var(--control-edge-hover);
412
415
  }
413
416
  .resize-handle:hover::after {
414
417
  background: var(--accent);
@@ -276,7 +276,7 @@
276
276
  padding-top: var(--safe-top);
277
277
  background: color-mix(in srgb, var(--bg) 88%, transparent);
278
278
  backdrop-filter: blur(8px);
279
- border-bottom: 1px solid var(--border);
279
+ border-bottom: var(--edge-width) solid var(--surface-edge);
280
280
  }
281
281
  .shell-header > :global(*) {
282
282
  min-width: 0;
@@ -302,7 +302,7 @@
302
302
  }
303
303
  .shell-footer {
304
304
  grid-area: footer;
305
- border-top: 1px solid var(--border);
305
+ border-top: var(--edge-width) solid var(--surface-edge);
306
306
  padding: var(--sp-4) max(var(--sp-4), var(--safe-right)) calc(var(--sp-4) + var(--safe-bottom))
307
307
  max(var(--sp-4), var(--safe-left));
308
308
  }
@@ -318,8 +318,8 @@
318
318
  overflow-y: auto;
319
319
  overflow-x: hidden; /* overflow-y:auto would otherwise make x auto too */
320
320
  -webkit-overflow-scrolling: touch;
321
- background: var(--bg-elevated);
322
- border-right: 1px solid var(--border);
321
+ background: var(--surface-fill);
322
+ border-right: var(--edge-width) solid var(--surface-edge);
323
323
  --shell-sidebar-pad: var(--sp-3);
324
324
  padding: var(--shell-sidebar-pad);
325
325
  padding-top: max(var(--shell-sidebar-pad), var(--safe-top));
@@ -338,7 +338,7 @@
338
338
  }
339
339
  .shell-sidebar.open {
340
340
  translate: 0 0;
341
- box-shadow: var(--shadow-lg);
341
+ box-shadow: var(--overlay-shadow);
342
342
  transition-duration: var(--dur-sheet);
343
343
  }
344
344
  .shell-scrim {
@@ -396,7 +396,7 @@
396
396
  transition: none;
397
397
  z-index: auto;
398
398
  box-shadow: none;
399
- border-right: 1px solid var(--border);
399
+ border-right: var(--edge-width) solid var(--surface-edge);
400
400
  }
401
401
  .shell.sticky-sidebar .shell-sidebar {
402
402
  position: sticky;
@@ -107,7 +107,7 @@
107
107
  class:selected
108
108
  style="--md-list-w: {listWidth}; --md-gap: {gap}; --md-divider: {divider === 'none'
109
109
  ? 'none'
110
- : '1px solid var(--border)'};{style ? ` ${style}` : ''}"
110
+ : 'var(--edge-width) solid var(--surface-edge)'};{style ? ` ${style}` : ''}"
111
111
  data-tsu="MasterDetail"
112
112
  {...rest}
113
113
  >
@@ -159,7 +159,7 @@
159
159
  -webkit-overflow-scrolling: touch;
160
160
  }
161
161
  .md-list {
162
- border-right: var(--md-divider, 1px solid var(--border));
162
+ border-right: var(--md-divider, var(--edge-width) solid var(--surface-edge));
163
163
  }
164
164
  .md-detail {
165
165
  display: flex;
@@ -180,7 +180,7 @@
180
180
  padding-inline: var(--sp-3);
181
181
  background: color-mix(in srgb, var(--bg) 88%, transparent);
182
182
  backdrop-filter: blur(8px);
183
- border-bottom: 1px solid var(--border);
183
+ border-bottom: var(--edge-width) solid var(--surface-edge);
184
184
  }
185
185
  .md-detail-header-content {
186
186
  flex: 1;
@@ -239,14 +239,14 @@
239
239
  padding-inline: max(var(--safe-left), var(--sp-1)) max(var(--safe-right), var(--sp-1));
240
240
  background: color-mix(in srgb, var(--bg-elevated) 88%, transparent);
241
241
  backdrop-filter: blur(12px);
242
- border-top: 1px solid var(--border);
242
+ border-top: var(--edge-width) solid var(--surface-edge);
243
243
  }
244
244
  .floating {
245
245
  padding: var(--sp-1);
246
- border: 1px solid var(--border-strong);
246
+ border: var(--edge-width) solid var(--raised-edge);
247
247
  border-radius: var(--r-md);
248
- background: var(--bg-elevated);
249
- box-shadow: var(--shadow-md);
248
+ background: var(--raised-fill);
249
+ box-shadow: var(--raised-shadow);
250
250
  }
251
251
  .bar.floating {
252
252
  left: calc(var(--sp-2) + var(--safe-left));
@@ -74,7 +74,7 @@
74
74
  .nav-section:not(:first-child) {
75
75
  margin-top: var(--sp-2);
76
76
  padding-top: var(--sp-2);
77
- border-top: 1px solid var(--border);
77
+ border-top: var(--edge-width) solid var(--surface-edge);
78
78
  }
79
79
  }
80
80
  </style>
@@ -401,8 +401,8 @@
401
401
  min-width: 0;
402
402
  min-height: 0;
403
403
  width: var(--panel-current-width);
404
- background: var(--bg-elevated);
405
- border-right: 1px solid var(--border);
404
+ background: var(--surface-fill);
405
+ border-right: var(--edge-width) solid var(--surface-edge);
406
406
  transition:
407
407
  width var(--dur-base) var(--ease),
408
408
  box-shadow var(--dur-base) var(--ease);
@@ -414,7 +414,7 @@
414
414
  grid-column: 2;
415
415
  grid-row: 1;
416
416
  border-right: 0;
417
- border-left: 1px solid var(--border);
417
+ border-left: var(--edge-width) solid var(--surface-edge);
418
418
  }
419
419
  .main {
420
420
  min-width: 0;
@@ -449,7 +449,7 @@
449
449
  font: inherit;
450
450
  font-size: var(--icon-sm);
451
451
  background: transparent;
452
- border: 1px solid transparent;
452
+ border: var(--edge-width) solid transparent;
453
453
  border-radius: var(--r-sm);
454
454
  cursor: pointer;
455
455
  transition:
@@ -475,7 +475,7 @@
475
475
  .collapse-control:hover {
476
476
  color: var(--text);
477
477
  background: var(--bg-elevated-2);
478
- border-color: var(--border);
478
+ border-color: var(--surface-edge);
479
479
  }
480
480
  }
481
481
  .collapse-control:focus-visible,
@@ -547,7 +547,7 @@
547
547
  left: 0;
548
548
  z-index: 1;
549
549
  width: min(var(--panel-current-width), 85cqw);
550
- box-shadow: var(--shadow-md);
550
+ box-shadow: var(--raised-shadow);
551
551
  }
552
552
  .right .panel {
553
553
  right: 0;
@@ -581,7 +581,7 @@
581
581
  left: 0;
582
582
  z-index: var(--z-drawer);
583
583
  width: min(var(--panel-current-width), 100%);
584
- box-shadow: var(--shadow-md);
584
+ box-shadow: var(--raised-shadow);
585
585
  outline: none;
586
586
  animation: panel-slide-left var(--dur-base) var(--ease);
587
587
  }