@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,545 @@
1
+ /* Editorial (experimental): display type, rules instead of boxes, ink-wipe buttons,
2
+ hard offset shadows, solid tone blocks. Every color comes from the active theme;
3
+ ink on a tone fill is black or white picked from the fill's lightness. */
4
+
5
+ :root[data-look="editorial"] {
6
+ --ed-font-display:
7
+ "Iowan Old Style", "New York", ui-serif, "Noto Serif Display", "Noto Serif",
8
+ Charter, Georgia, serif;
9
+ --ed-rule: 3px;
10
+ --ed-rule-heavy: 6px;
11
+ --ed-hard: var(--text);
12
+ --ed-dur-settle: 150ms;
13
+
14
+ --fs-xl: calc(1.5rem * var(--fs-scale));
15
+ --fs-2xl: calc(2rem * var(--fs-scale));
16
+ --fs-3xl: calc(3rem * var(--fs-scale));
17
+
18
+ --r-sm: 2px;
19
+ --r-md: 3px;
20
+ --r-lg: 4px;
21
+
22
+ --shadow-sm: 0 1px 0 color-mix(in oklab, var(--text) 22%, transparent);
23
+ --shadow-md: 4px 4px 0 var(--ed-hard);
24
+ --shadow-lg: 8px 8px 0 var(--ed-hard);
25
+
26
+ --focus-ring-width: 3px;
27
+ --focus-ring: 3px solid var(--accent);
28
+
29
+ --surface-shadow: inset 0 var(--ed-rule) 0 0 var(--text);
30
+ --raised-fill: var(--bg-elevated);
31
+ --raised-edge: var(--text);
32
+ --raised-shadow: 5px 5px 0 var(--accent);
33
+ --overlay-fill: var(--bg-elevated);
34
+ --overlay-edge: var(--text);
35
+ --overlay-shadow: 8px 8px 0 var(--accent);
36
+ --control-edge: var(--text);
37
+ --control-edge-hover: var(--text);
38
+ --track-fill: var(--bg-elevated-2);
39
+ --track-edge: var(--border-strong);
40
+ --thumb-fill: var(--text);
41
+ --thumb-shadow: 0 0 0 0 transparent;
42
+ --btn-fill: transparent;
43
+ --btn-edge: var(--text);
44
+ --btn-primary-shadow-hover: 4px 4px 0 var(--ed-hard);
45
+ --hover-lift: 2px;
46
+ --focus-glow: 0 0 0 4px color-mix(in oklab, var(--accent) 28%, transparent);
47
+ --press-scale: 0.97;
48
+ }
49
+
50
+ @property --ed-wipe {
51
+ syntax: "<color>";
52
+ inherits: false;
53
+ initial-value: transparent;
54
+ }
55
+
56
+ :root[data-look="editorial"] body {
57
+ font-feature-settings: "kern", "liga", "tnum";
58
+ }
59
+
60
+ :root[data-look="editorial"] :is(.btn, .badge, .card, .metric-chip, .role-pill) {
61
+ --ed-ink: color(from var(--ed-tone, var(--text)) srgb-linear clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 1000, 1) clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 1000, 1) clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 1000, 1));
62
+ }
63
+
64
+ /* ---------- Display type ---------- */
65
+ :root[data-look="editorial"] :is(.sh-title, .sheet-title) {
66
+ font-family: var(--ed-font-display);
67
+ font-weight: 800;
68
+ letter-spacing: -0.02em;
69
+ }
70
+ :root[data-look="editorial"] .section-header .sh-count {
71
+ font-family: var(--ed-font-display);
72
+ }
73
+
74
+ /* ---------- Buttons: ink wipes up on hover ---------- */
75
+ :root[data-look="editorial"] .btn {
76
+ --ed-btn-ink: var(--text);
77
+ --ed-tone: var(--ed-btn-fill, var(--btn-tone, var(--text)));
78
+ border-width: 2px;
79
+ background-color: transparent;
80
+ background-image: linear-gradient(var(--ed-wipe), var(--ed-wipe));
81
+ background-repeat: no-repeat;
82
+ background-position: 0 100%;
83
+ background-size: 100% 0%;
84
+ font-weight: var(--fw-semibold);
85
+ transition:
86
+ background-size var(--dur-fast) var(--ease-out),
87
+ --ed-wipe var(--dur-fast) var(--ease-out),
88
+ color var(--dur-fast) var(--ease),
89
+ box-shadow var(--dur-fast) var(--ease-out),
90
+ translate var(--ed-dur-settle) var(--ease-spring),
91
+ scale var(--ed-dur-settle) var(--ease-spring),
92
+ opacity var(--dur-fast) var(--ease);
93
+ }
94
+ :root[data-look="editorial"] .btn-ghost {
95
+ --ed-btn-ink: var(--bg-elevated-2);
96
+ border-color: transparent;
97
+ background-position: 0 0;
98
+ background-size: 0% 100%;
99
+ }
100
+ :root[data-look="editorial"] :is(.btn-primary, .btn-danger, .btn-tone-accent, .btn-tone-success, .btn-tone-info, .btn-tone-warn, .btn-tone-danger):not(.btn-ghost, .btn-link) {
101
+ --ed-btn-fill: var(--btn-tone, var(--accent));
102
+ --ed-btn-on: var(--ed-ink);
103
+ border-color: var(--ed-btn-fill);
104
+ background-color: var(--ed-btn-fill);
105
+ background-image: none;
106
+ color: var(--ed-btn-on);
107
+ font-weight: var(--fw-bold);
108
+ }
109
+ :root[data-look="editorial"] :is(.btn-primary, .btn-tone-accent):not(.btn-ghost, .btn-link) {
110
+ --ed-btn-fill: var(--accent);
111
+ --ed-btn-on: var(--text-on-accent);
112
+ }
113
+ :root[data-look="editorial"] .btn-danger:not(.btn-ghost, .btn-link) {
114
+ --ed-btn-fill: var(--danger);
115
+ }
116
+ :root[data-look="editorial"] .btn-ghost:is(.btn-tone-accent, .btn-tone-success, .btn-tone-info, .btn-tone-warn, .btn-tone-danger) {
117
+ --ed-btn-ink: var(--btn-tone);
118
+ --ed-btn-on: var(--ed-ink);
119
+ }
120
+ :root[data-look="editorial"] .btn-link {
121
+ border: 0;
122
+ border-radius: 0;
123
+ background-image: none;
124
+ text-decoration: underline 1px;
125
+ text-underline-offset: 0.2em;
126
+ transition:
127
+ text-decoration-thickness var(--dur-fast) var(--ease-out),
128
+ color var(--dur-fast) var(--ease);
129
+ }
130
+ :root[data-look="editorial"] :is(.btn-icon-inline, .btn-icon:not(.btn-primary)) {
131
+ border-color: transparent;
132
+ }
133
+ :root[data-look="editorial"] .btn .btn-shortcut {
134
+ color: inherit;
135
+ opacity: 0.7;
136
+ }
137
+ :root[data-look="editorial"] .btn:active:not(:disabled, [aria-disabled="true"], .loading, .btn-link) {
138
+ translate: 0 0;
139
+ box-shadow: none;
140
+ transition-duration: var(--dur-press);
141
+ }
142
+
143
+ /* ---------- Floating surfaces ---------- */
144
+ :root[data-look="editorial"] :is(.pop-panel, .modal .sheet) {
145
+ border-width: 2px;
146
+ }
147
+ :root[data-look="editorial"] .modal .sheet-head {
148
+ border-bottom: 0;
149
+ box-shadow: inset 0 calc(-1 * var(--ed-rule)) 0 0 var(--text);
150
+ }
151
+ :root[data-look="editorial"] .menu-item {
152
+ background-image: linear-gradient(var(--accent), var(--accent));
153
+ background-repeat: no-repeat;
154
+ background-size: 0% 100%;
155
+ transition:
156
+ background-size var(--dur-fast) var(--ease-out),
157
+ color var(--dur-fast) var(--ease);
158
+ }
159
+
160
+ /* ---------- Cards: a rule, not a box ---------- */
161
+ :root[data-look="editorial"] .card {
162
+ --ed-rule-c: var(--text);
163
+ --ed-rule-w: var(--ed-rule);
164
+ border-color: transparent;
165
+ border-radius: 0;
166
+ background: transparent;
167
+ box-shadow: inset 0 var(--ed-rule-w) 0 0 var(--ed-rule-c);
168
+ padding-top: calc(var(--card-pad) + var(--ed-rule-w));
169
+ padding-inline: 0;
170
+ }
171
+ :root[data-look="editorial"] .card.card-framed {
172
+ padding: 0;
173
+ }
174
+ :root[data-look="editorial"] .card.card-framed > :is(.card-head, .card-body, .card-foot) {
175
+ padding-inline: 0;
176
+ }
177
+ :root[data-look="editorial"] .card.card-framed > .card-head {
178
+ padding-top: calc(var(--card-pad) + var(--ed-rule-w));
179
+ padding-bottom: 0;
180
+ border-bottom: 0;
181
+ }
182
+ :root[data-look="editorial"] :is(.card.surface-raised, .card.surface-sunken, .card.border-dashed, .card.card-stacked) {
183
+ border-radius: var(--r-md);
184
+ box-shadow: none;
185
+ padding-inline: var(--card-pad);
186
+ }
187
+ :root[data-look="editorial"] .card.card-framed:is(.surface-raised, .surface-sunken, .border-dashed, .card-stacked) > :is(.card-head, .card-body, .card-foot) {
188
+ padding-inline: var(--card-pad);
189
+ }
190
+ :root[data-look="editorial"] .card.surface-raised {
191
+ background: var(--bg-elevated);
192
+ }
193
+ :root[data-look="editorial"] .card.card-stacked {
194
+ background: var(--bg-elevated);
195
+ }
196
+ :root[data-look="editorial"] .card.surface-sunken {
197
+ box-shadow: inset 0 0 0 1px var(--border-strong);
198
+ }
199
+ :root[data-look="editorial"] .card.border-dashed {
200
+ border: 2px dashed var(--border-strong);
201
+ }
202
+ :root[data-look="editorial"] .card.card-stacked {
203
+ box-shadow:
204
+ 5px 5px 0 0 var(--accent),
205
+ 10px 10px 0 0 var(--text);
206
+ }
207
+ :root[data-look="editorial"] .card.card-stacked::before,
208
+ :root[data-look="editorial"] .card.card-stacked::after {
209
+ display: none;
210
+ }
211
+ :root[data-look="editorial"] .card-tap {
212
+ transition:
213
+ box-shadow var(--dur-fast) var(--ease-out),
214
+ scale var(--ed-dur-settle) var(--ease-spring);
215
+ }
216
+ :root[data-look="editorial"] .card-tap:active {
217
+ background: transparent;
218
+ scale: 0.99;
219
+ transition-duration: var(--dur-press);
220
+ }
221
+
222
+ /* toned cards & callouts: solid blocks; tokens re-pointed so children inherit */
223
+ :root[data-look="editorial"] :is(.card-accent, .card-ok, .card-warn, .card-danger, .card-info):not(.toast) {
224
+ --ed-fill: var(--c-accent);
225
+ --ed-tone: var(--ed-fill);
226
+ --ed-on: var(--text-on-accent);
227
+ --text: var(--ed-on);
228
+ --text-muted: var(--ed-on);
229
+ --text-faint: var(--ed-on);
230
+ --border-strong: var(--ed-on);
231
+ --accent: var(--ed-on);
232
+ border-color: transparent;
233
+ border-radius: var(--r-md);
234
+ background: var(--ed-fill);
235
+ color: var(--ed-on);
236
+ box-shadow: none;
237
+ padding-inline: var(--card-pad);
238
+ }
239
+ :root[data-look="editorial"] .card-ok:not(.toast) {
240
+ --ed-fill: var(--ok);
241
+ --ed-on: var(--ed-ink);
242
+ }
243
+ :root[data-look="editorial"] .card-warn:not(.toast) {
244
+ --ed-fill: var(--warn);
245
+ --ed-on: var(--ed-ink);
246
+ }
247
+ :root[data-look="editorial"] .card-danger:not(.toast) {
248
+ --ed-fill: var(--danger);
249
+ --ed-on: var(--ed-ink);
250
+ }
251
+ :root[data-look="editorial"] .card-info:not(.toast) {
252
+ --ed-fill: var(--info);
253
+ --ed-on: var(--ed-ink);
254
+ }
255
+ :root[data-look="editorial"] .card.card-framed:is(.card-accent, .card-ok, .card-warn, .card-danger, .card-info) > :is(.card-head, .card-body, .card-foot) {
256
+ padding-inline: var(--card-pad);
257
+ }
258
+ :root[data-look="editorial"] .card.callout {
259
+ padding: var(--sp-4);
260
+ }
261
+ :root[data-look="editorial"] .card.callout.callout-neutral {
262
+ --ed-on: var(--bg);
263
+ --text: var(--ed-on);
264
+ --text-muted: var(--ed-on);
265
+ border-color: transparent;
266
+ border-radius: var(--r-md);
267
+ background: var(--c-text, currentColor);
268
+ color: var(--ed-on);
269
+ box-shadow: none;
270
+ }
271
+ :root[data-look="editorial"] .card.callout :is(.callout-icon, .callout-body) {
272
+ color: inherit;
273
+ }
274
+ :root[data-look="editorial"] .card.callout .callout-title {
275
+ font-weight: var(--fw-bold);
276
+ }
277
+ :root[data-look="editorial"] .card.callout .btn:not(.btn-primary) {
278
+ --ed-btn-ink: var(--text);
279
+ border-color: var(--text);
280
+ color: inherit;
281
+ }
282
+
283
+ /* ---------- Metrics: big numerals on a tone rule ---------- */
284
+ :root[data-look="editorial"] .card.metric {
285
+ --ed-rule-c: var(--metric-tone, var(--text));
286
+ --ed-rule-w: var(--ed-rule-heavy);
287
+ padding-bottom: 0;
288
+ }
289
+ :root[data-look="editorial"] .metric-label {
290
+ font-weight: var(--fw-bold);
291
+ letter-spacing: 0.1em;
292
+ color: var(--text);
293
+ }
294
+ :root[data-look="editorial"] .metric-chip {
295
+ --ed-tone: var(--metric-tone, var(--text));
296
+ border-color: transparent;
297
+ border-radius: var(--r-xs);
298
+ background: var(--metric-tone, var(--text));
299
+ color: var(--ed-ink);
300
+ }
301
+ :root[data-look="editorial"] .metric:not(.metric-sm, .metric-inline) .metric-num {
302
+ font-size: calc(var(--fs-2xl) * 1.5);
303
+ }
304
+ :root[data-look="editorial"] .metric-num {
305
+ font-weight: 800;
306
+ letter-spacing: -0.04em;
307
+ line-height: 1.1;
308
+ }
309
+
310
+ /* ---------- Badges ---------- */
311
+ :root[data-look="editorial"] .badge {
312
+ --badge-radius: var(--r-xs);
313
+ font-weight: var(--fw-bold);
314
+ }
315
+ :root[data-look="editorial"] .badge.toned:not(.text) {
316
+ --ed-tone: var(--badge-tone);
317
+ border-color: transparent;
318
+ background: var(--badge-tone);
319
+ color: var(--ed-ink);
320
+ }
321
+ :root[data-look="editorial"] .badge.toned:not(.text) .dot {
322
+ background: currentColor;
323
+ box-shadow: none;
324
+ }
325
+
326
+ /* ---------- Form controls: underlined fields ---------- */
327
+ :root[data-look="editorial"] :is(.input, .select, .textarea, .rich-select .rs-trigger) {
328
+ border-color: transparent;
329
+ border-radius: var(--r-xs) var(--r-xs) 0 0;
330
+ box-shadow: inset 0 -2px 0 0 var(--text);
331
+ transition:
332
+ box-shadow var(--dur-fast) var(--ease-out),
333
+ background-color var(--dur-fast) var(--ease);
334
+ }
335
+ :root[data-look="editorial"] :is(.input, .select, .textarea, .rich-select .rs-trigger):focus,
336
+ :root[data-look="editorial"] .rich-select .rs-trigger[aria-expanded="true"] {
337
+ box-shadow: inset 0 -4px 0 0 var(--accent);
338
+ }
339
+ :root[data-look="editorial"] :is(.input, .select, .textarea)[aria-invalid="true"] {
340
+ box-shadow: inset 0 -4px 0 0 var(--danger);
341
+ }
342
+ :root[data-look="editorial"] .field .label {
343
+ font-size: var(--fs-xs);
344
+ font-weight: var(--fw-bold);
345
+ text-transform: uppercase;
346
+ letter-spacing: 0.08em;
347
+ color: var(--text);
348
+ }
349
+ :root[data-look="editorial"] :is(.checkbox .box, .radio .dot-ctl) {
350
+ background: transparent;
351
+ box-shadow: inset 0 0 0 1px var(--text);
352
+ }
353
+ :root[data-look="editorial"] .checkbox .box {
354
+ border-radius: var(--r-xs);
355
+ }
356
+ :root[data-look="editorial"] .checkbox input:is(:checked, :indeterminate) + .box {
357
+ border-color: var(--accent);
358
+ background: var(--accent);
359
+ box-shadow: none;
360
+ }
361
+ :root[data-look="editorial"] .radio input:checked + .dot-ctl {
362
+ border-color: var(--accent);
363
+ box-shadow: inset 0 0 0 1px var(--accent);
364
+ }
365
+ :root[data-look="editorial"] .switch {
366
+ border-color: var(--text);
367
+ border-radius: var(--r-md);
368
+ background: transparent;
369
+ box-shadow: inset 0 0 0 1px var(--text);
370
+ }
371
+ :root[data-look="editorial"] .switch .knob {
372
+ border-radius: var(--r-xs);
373
+ background: var(--text);
374
+ }
375
+ :root[data-look="editorial"] .switch.on {
376
+ border-color: var(--accent);
377
+ background: var(--accent);
378
+ box-shadow: none;
379
+ }
380
+ :root[data-look="editorial"] .switch.on .knob {
381
+ background: var(--text-on-accent);
382
+ }
383
+
384
+ /* segmented control: an ink block slides under the selection; the label turns once it lands */
385
+ :root[data-look="editorial"] .seg {
386
+ border: 2px solid var(--text);
387
+ background: transparent;
388
+ }
389
+ :root[data-look="editorial"] .seg .seg-item {
390
+ font-weight: var(--fw-semibold);
391
+ }
392
+ :root[data-look="editorial"] .seg .seg-item.selected {
393
+ color: var(--bg);
394
+ }
395
+ :root[data-look="editorial"] .seg:not(.placed) .seg-item.selected,
396
+ :root[data-look="editorial"] .seg.placed .seg-thumb ~ .seg-item.selected {
397
+ background: var(--text);
398
+ }
399
+ :root[data-look="editorial"] .seg.placed .seg-thumb ~ .seg-item.selected {
400
+ transition:
401
+ background 0s linear var(--dur-spring),
402
+ color 0s linear var(--dur-spring);
403
+ }
404
+
405
+ /* ---------- Tabs, tables, accordions: heavy top rules ---------- */
406
+ :root[data-look="editorial"] .tablist {
407
+ border-bottom-color: var(--border-strong);
408
+ }
409
+ :root[data-look="editorial"] .tablist .indicator {
410
+ height: 4px;
411
+ }
412
+ :root[data-look="editorial"] .tab {
413
+ font-weight: var(--fw-semibold);
414
+ }
415
+ :root[data-look="editorial"] :is(.dt-scroll, .accordion) {
416
+ border-color: transparent;
417
+ border-radius: 0;
418
+ box-shadow: inset 0 var(--ed-rule) 0 0 var(--text);
419
+ padding-top: var(--ed-rule);
420
+ }
421
+ :root[data-look="editorial"] .dt {
422
+ background: transparent;
423
+ }
424
+ :root[data-look="editorial"] .dt th {
425
+ background: transparent;
426
+ color: var(--text);
427
+ font-weight: var(--fw-bold);
428
+ letter-spacing: 0.08em;
429
+ border-bottom: 1px solid var(--text);
430
+ }
431
+ :root[data-look="editorial"] .accordion > .acc-item {
432
+ border-bottom: 1px solid var(--border-strong);
433
+ }
434
+ :root[data-look="editorial"] .disclosure__button {
435
+ border-radius: 0;
436
+ font-size: var(--fs-lg);
437
+ font-weight: var(--fw-bold);
438
+ }
439
+
440
+ /* ---------- Chat, progress, kbd ---------- */
441
+ :root[data-look="editorial"] .bubble {
442
+ border-color: transparent;
443
+ border-inline-start: 4px solid var(--role);
444
+ border-radius: 0 var(--r-md) var(--r-md) 0;
445
+ background: var(--bg-elevated-2);
446
+ }
447
+ :root[data-look="editorial"] .bubble .role-pill {
448
+ --ed-tone: var(--role);
449
+ border-color: transparent;
450
+ background: var(--role);
451
+ color: var(--ed-ink);
452
+ }
453
+ :root[data-look="editorial"] :is(.progress, .progress .bar) {
454
+ border-radius: 0;
455
+ }
456
+ :root[data-look="editorial"] .kbd {
457
+ border-color: var(--text-muted);
458
+ border-bottom-width: 2px;
459
+ background: transparent;
460
+ color: var(--text);
461
+ }
462
+
463
+ /* ---------- Focus ---------- */
464
+ :root[data-look="editorial"] :is(.btn, .pop-trigger, .tab, .seg-item, .switch, .disclosure__button, .card-tap):focus-visible {
465
+ animation: ed-focus var(--ed-dur-settle) var(--ease-out);
466
+ }
467
+ @keyframes ed-focus {
468
+ from {
469
+ box-shadow: 0 0 0 10px color-mix(in oklab, var(--accent) 35%, transparent);
470
+ }
471
+ }
472
+
473
+ /* ---------- Hover (fine pointers only) ---------- */
474
+ @media (hover: hover) and (pointer: fine) {
475
+ :root[data-look="editorial"] .btn:hover:not(:disabled, [aria-disabled="true"]) {
476
+ border-color: var(--ed-btn-ink);
477
+ background-color: transparent;
478
+ background-size: 100% 100%;
479
+ color: var(--bg);
480
+ --ed-wipe: var(--ed-btn-ink);
481
+ }
482
+ :root[data-look="editorial"] .btn-ghost:hover:not(:disabled, [aria-disabled="true"]) {
483
+ border-color: transparent;
484
+ color: var(--text);
485
+ }
486
+ :root[data-look="editorial"] .btn-ghost:is(.btn-tone-accent, .btn-tone-success, .btn-tone-info, .btn-tone-warn, .btn-tone-danger):hover:not(:disabled, [aria-disabled="true"]) {
487
+ color: var(--ed-btn-on);
488
+ }
489
+ :root[data-look="editorial"] .btn-ghost.btn-tone-accent:hover:not(:disabled, [aria-disabled="true"]) {
490
+ color: var(--text-on-accent);
491
+ }
492
+ :root[data-look="editorial"] :is(.btn-primary, .btn-danger, .btn-tone-accent, .btn-tone-success, .btn-tone-info, .btn-tone-warn, .btn-tone-danger):not(.btn-ghost, .btn-link):hover:not(:disabled, [aria-disabled="true"]) {
493
+ border-color: var(--ed-btn-fill);
494
+ background-color: var(--ed-btn-fill);
495
+ color: var(--ed-btn-on);
496
+ filter: none;
497
+ box-shadow: 4px 4px 0 var(--ed-hard);
498
+ }
499
+ :root[data-look="editorial"] .btn-link:hover:not(:disabled, [aria-disabled="true"]) {
500
+ text-decoration-thickness: 3px;
501
+ color: var(--btn-tone, var(--accent));
502
+ }
503
+ :root[data-look="editorial"] .card.callout .btn:not(.btn-primary):hover:not(:disabled) {
504
+ color: var(--ed-fill, var(--bg));
505
+ }
506
+ :root[data-look="editorial"] .menu-item:hover:not(:disabled) {
507
+ background-color: transparent;
508
+ background-size: 100% 100%;
509
+ color: var(--text-on-accent);
510
+ }
511
+ :root[data-look="editorial"] .card-tap:hover {
512
+ --ed-rule-c: var(--accent);
513
+ --ed-rule-w: var(--ed-rule-heavy);
514
+ background: radial-gradient(
515
+ 18rem circle at var(--pointer-x, 50%) var(--pointer-y, 0%),
516
+ color-mix(in oklab, var(--accent) 16%, transparent),
517
+ transparent 70%
518
+ );
519
+ }
520
+ :root[data-look="editorial"] :is(.input, .select, .textarea, .rich-select .rs-trigger):hover:not(:disabled, :focus, [aria-invalid="true"]) {
521
+ background-color: var(--bg-elevated);
522
+ box-shadow: inset 0 -3px 0 0 var(--text);
523
+ }
524
+ :root[data-look="editorial"] .seg .seg-item:hover:not(:disabled, .selected) {
525
+ background: var(--bg-elevated-2);
526
+ color: var(--text);
527
+ }
528
+ :root[data-look="editorial"] .dt tr.clickable:hover td:first-child {
529
+ box-shadow: inset 4px 0 0 var(--accent);
530
+ }
531
+ :root[data-look="editorial"] .disclosure__button:hover:not(:disabled) {
532
+ background: transparent;
533
+ color: var(--accent);
534
+ }
535
+ }
536
+
537
+ @media (prefers-reduced-motion: reduce) {
538
+ :root[data-look="editorial"] :is(.btn, .card-tap) {
539
+ translate: none !important;
540
+ scale: none !important;
541
+ }
542
+ :root[data-look="editorial"] :focus-visible {
543
+ animation: none !important;
544
+ }
545
+ }