anentrypoint-design 0.0.292 → 0.0.294

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/247420.css CHANGED
@@ -92,7 +92,11 @@
92
92
  --accent-fg: var(--ink);
93
93
  --accent-ink: var(--acid-deep);
94
94
  --accent-bright: var(--acid); /* base value so var(--accent-bright) never falls back empty; ink + [data-accent] retune it */
95
- --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
95
+ /* Blends --accent-ink (the readable/darker ink variant), not the raw
96
+ --accent fill, so light-theme active states clear contrast against --bg;
97
+ dark/ink and auto-dark restate the prior --accent-based value explicitly
98
+ below so this change does not leak into them via inheritance. */
99
+ --accent-tint: color-mix(in oklab, var(--accent-ink) 22%, var(--bg));
96
100
 
97
101
  /* On-color foregrounds — text/icons that sit ON a saturated fill (accent,
98
102
  danger, category chips). Theme-driven so white-on-color never hard-codes
@@ -329,6 +333,9 @@
329
333
  --accent-fg: var(--ink);
330
334
  --accent-ink: var(--acid); /* on ink, the lime itself reads as bright text */
331
335
  --accent-bright: var(--acid);
336
+ /* Preserves the prior --accent-based blend for dark; the :root light-theme
337
+ value above was retuned to blend --accent-ink instead. */
338
+ --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
332
339
  --danger: oklch(0.68 0.19 25);
333
340
  --flame: #FF5A1F;
334
341
  --amber: #D9A93A;
@@ -343,6 +350,14 @@
343
350
  --code-num: var(--sun);
344
351
  }
345
352
 
353
+ /* Restores the pre-existing (weaker) dark-theme selection tint after the
354
+ light-theme-only bump in app-shell.css's base ::selection rule. */
355
+ .ds-247420[data-theme="ink"] ::selection,
356
+ .ds-247420[data-theme="dark"] ::selection {
357
+ background: color-mix(in oklab, var(--accent) 24%, var(--bg-2));
358
+ color: var(--fg);
359
+ }
360
+
346
361
  /* NOTE: the [data-theme="auto"] block below mirrors the
347
362
  [data-theme="ink"/"dark"] block above token-for-token. 'auto + OS-dark' and
348
363
  'explicit dark' are the same visual context and resolve every token —
@@ -370,6 +385,7 @@
370
385
  --accent-fg: var(--ink);
371
386
  --accent-ink: var(--acid);
372
387
  --accent-bright: var(--acid);
388
+ --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
373
389
  --danger: oklch(0.68 0.19 25);
374
390
  --flame: #FF5A1F;
375
391
  --amber: #D9A93A;
@@ -381,6 +397,10 @@
381
397
  --code-str-alt: var(--mascot);
382
398
  --code-num: var(--sun);
383
399
  }
400
+ .ds-247420[data-theme="auto"] ::selection {
401
+ background: color-mix(in oklab, var(--accent) 24%, var(--bg-2));
402
+ color: var(--fg);
403
+ }
384
404
  }
385
405
 
386
406
  /* Nested-scope safety: if .ds-247420 appears under another .ds-247420 (e.g.
@@ -440,6 +460,7 @@
440
460
  --bg: var(--paper); --bg-2: var(--paper-2); --bg-3: var(--paper-3);
441
461
  --fg: var(--ink); --fg-2: var(--ink-2); --fg-3: var(--ink-3);
442
462
  --accent: var(--acid); --accent-fg: var(--ink); --accent-ink: var(--acid-deep);
463
+ --accent-tint: color-mix(in oklab, var(--accent-ink) 22%, var(--bg));
443
464
  /* A paper island under a dark ancestor must not inherit the dark signal pair. */
444
465
  --flame: #C53E00; --amber: #7C570F; --warn: #E0241A; --sky: #3A6EFF;
445
466
  }
@@ -546,8 +567,8 @@
546
567
  }
547
568
  .ds-247420 .skip-link:focus {
548
569
  top: 10px;
549
- outline: 2px solid var(--accent-ink);
550
- outline-offset: 2px;
570
+ outline: var(--focus-w) solid var(--focus-color);
571
+ outline-offset: var(--focus-offset);
551
572
  }
552
573
  .ds-247420 body {
553
574
  background: var(--bg);
@@ -558,7 +579,12 @@
558
579
  -webkit-font-smoothing: antialiased;
559
580
  text-rendering: optimizeLegibility;
560
581
  }
561
- .ds-247420 ::selection { background: color-mix(in oklab, var(--accent) 24%, var(--bg-2)); color: var(--fg); }
582
+ /* Light (paper, the default theme) needs a stronger accent share than dark to
583
+ clear a visible selection tint against --bg-2 -- the dark-theme value (24%)
584
+ read too weak on paper. Dark/ink keeps its existing 24% mix, restored below
585
+ in the ink/dark + auto-dark blocks (mirrors the --danger/--flame pattern of
586
+ scoping a value per theme rather than sharing one across both). */
587
+ .ds-247420 ::selection { background: color-mix(in oklab, var(--accent) 46%, var(--bg-2)); color: var(--fg); }
562
588
 
563
589
  /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
564
590
  .ds-247420 .app, .ds-247420 .ds-stage {
@@ -763,8 +789,8 @@
763
789
  }
764
790
  .ds-247420 .app-topbar nav a:hover { background: var(--bg-2); color: var(--fg); }
765
791
  .ds-247420 .app-topbar nav a:focus-visible {
766
- outline: 2px solid var(--accent-ink);
767
- outline-offset: 2px;
792
+ outline: var(--focus-w) solid var(--focus-color);
793
+ outline-offset: var(--focus-offset);
768
794
  }
769
795
  /* Active tab reads as a subtle tinted pill with an accent underline rather than
770
796
  an oversized filled oval that sits taller than its inactive siblings and reads
@@ -799,8 +825,8 @@
799
825
  width: 100%;
800
826
  }
801
827
  .ds-247420 .app-search:focus-within {
802
- outline: 2px solid var(--accent-ink);
803
- outline-offset: 2px;
828
+ outline: var(--focus-w) solid var(--focus-color);
829
+ outline-offset: var(--focus-offset);
804
830
  }
805
831
 
806
832
  .ds-247420 .app-crumb {
@@ -841,8 +867,8 @@
841
867
  }
842
868
  .ds-247420 .app-side a:hover { background: var(--bg-2); color: var(--fg); }
843
869
  .ds-247420 .app-side a:focus-visible {
844
- outline: 2px solid var(--accent-ink);
845
- outline-offset: 2px;
870
+ outline: var(--focus-w) solid var(--focus-color);
871
+ outline-offset: var(--focus-offset);
846
872
  }
847
873
  .ds-247420 .app-side a.active {
848
874
  color: var(--accent-fg);
@@ -1015,7 +1041,7 @@
1015
1041
  .ds-247420 .ds-icon-btn-ghost { background: transparent; }
1016
1042
  .ds-247420 .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
1017
1043
  .ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
1018
- .ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
1044
+ .ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
1019
1045
  /* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
1020
1046
  .ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
1021
1047
  .ds-247420 .ds-icon-btn-danger:hover { filter: brightness(0.92); }
@@ -1034,19 +1060,27 @@
1034
1060
  border-radius: var(--r-pill);
1035
1061
  background: var(--bg-3); color: var(--fg-2);
1036
1062
  }
1037
- .ds-247420 .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
1063
+ /* Canonical tone names are tone-success / tone-error / tone-neutral. Every
1064
+ other tone name grouped into the same rule below (tone-green/tone-live,
1065
+ tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
1066
+ true-synonym legacy alias, kept working but sharing one declaration so the
1067
+ tone-family colors can't drift apart across names. */
1068
+ .ds-247420 .ds-badge.tone-green, .ds-247420 .ds-badge.tone-live, .ds-247420 .ds-badge.tone-success {
1069
+ background: var(--green-tint); color: var(--green-deep);
1070
+ }
1071
+ .ds-247420 .ds-badge.tone-flame, .ds-247420 .ds-badge.tone-error {
1072
+ background: var(--flame); color: var(--on-color);
1073
+ }
1074
+ .ds-247420 .ds-badge.tone-wip, .ds-247420 .ds-badge.tone-neutral {
1075
+ background: var(--bg-3); color: var(--fg-2);
1076
+ }
1038
1077
  .ds-247420 .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
1039
1078
  .ds-247420 .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
1040
- .ds-247420 .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
1041
- .ds-247420 .ds-badge.tone-flame { background: var(--flame); color: var(--on-color); }
1042
- .ds-247420 .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
1043
- .ds-247420 .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
1044
- .ds-247420 .ds-badge.tone-error { background: var(--flame); color: var(--on-color); }
1045
- .ds-247420 .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
1046
- .ds-247420 .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
1079
+ .ds-247420 .ds-badge.tone-sun, .ds-247420 .ds-badge.tone-yellow {
1080
+ background: var(--sun); color: var(--ink);
1081
+ }
1047
1082
  .ds-247420 .ds-badge.tone-blue { background: var(--accent-tint); color: var(--accent-ink); }
1048
1083
  .ds-247420 .ds-badge.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
1049
- .ds-247420 .ds-badge.tone-yellow { background: var(--sun); color: var(--ink); }
1050
1084
 
1051
1085
  .ds-247420 .chip {
1052
1086
  display: inline-flex; align-items: center; gap: 6px;
@@ -1057,19 +1091,22 @@
1057
1091
  letter-spacing: var(--tr-caps); text-transform: uppercase;
1058
1092
  border-radius: var(--r-pill);
1059
1093
  }
1060
- .ds-247420 .chip.tone-green { background: var(--green-tint); color: var(--green-deep); }
1094
+ /* Same canonical/legacy-alias grouping as .ds-badge above. */
1095
+ .ds-247420 .chip.tone-green, .ds-247420 .chip.tone-live, .ds-247420 .chip.tone-success, .ds-247420 .chip.tone-ok {
1096
+ background: var(--green-tint); color: var(--green-deep);
1097
+ }
1098
+ .ds-247420 .chip.tone-flame, .ds-247420 .chip.tone-error, .ds-247420 .chip.tone-miss {
1099
+ background: var(--flame); color: var(--on-color);
1100
+ }
1101
+ .ds-247420 .chip.tone-wip, .ds-247420 .chip.tone-neutral {
1102
+ background: var(--bg-3); color: var(--fg-2);
1103
+ }
1061
1104
  .ds-247420 .chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
1062
1105
  .ds-247420 .chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
1063
- .ds-247420 .chip.tone-sun { background: var(--sun); color: var(--ink); }
1064
- .ds-247420 .chip.tone-flame { background: var(--flame); color: var(--on-color); }
1065
- .ds-247420 .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
1066
- .ds-247420 .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
1067
- .ds-247420 .chip.tone-error { background: var(--flame); color: var(--on-color); }
1068
- .ds-247420 .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
1106
+ .ds-247420 .chip.tone-sun, .ds-247420 .chip.tone-yellow {
1107
+ background: var(--sun); color: var(--ink);
1108
+ }
1069
1109
  .ds-247420 .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
1070
- .ds-247420 .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
1071
- .ds-247420 .chip.tone-miss { background: var(--flame); color: var(--on-color); }
1072
- .ds-247420 .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
1073
1110
  .ds-247420 .chip.tone-blue { background: var(--accent-tint); color: var(--accent-ink); }
1074
1111
  .ds-247420 .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
1075
1112
  .ds-247420 .chip.tone-yellow { background: var(--sun); color: var(--ink); }
@@ -1520,7 +1557,7 @@
1520
1557
  .ds-247420 table tr.clickable { cursor: pointer; }
1521
1558
  .ds-247420 table tr.clickable:hover td { background: var(--bg-2); }
1522
1559
  .ds-247420 table tr.clickable:focus-visible {
1523
- outline: 2px solid var(--accent-ink);
1560
+ outline: var(--focus-w) solid var(--focus-color);
1524
1561
  outline-offset: -2px;
1525
1562
  }
1526
1563
  .ds-247420 table tr.clickable:focus-visible td { background: var(--bg-2); }
@@ -1961,7 +1998,7 @@
1961
1998
  flex-direction: column;
1962
1999
  gap: 4px;
1963
2000
  }
1964
- .ds-247420 .ds-file-grid:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-2); }
2001
+ .ds-247420 .ds-file-grid:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); border-radius: var(--r-2); }
1965
2002
 
1966
2003
  /* Listing wrapper holds the optional filter + sort header above the grid. */
1967
2004
  .ds-247420 .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
@@ -1983,7 +2020,7 @@
1983
2020
  }
1984
2021
  .ds-247420 .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1985
2022
  .ds-247420 .ds-file-sort-btn.active { color: var(--accent-ink); }
1986
- .ds-247420 .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2023
+ .ds-247420 .ds-file-sort-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1987
2024
 
1988
2025
  /* Skeleton shimmer rows shown while a directory loads. */
1989
2026
  .ds-247420 .ds-file-row-skeleton { cursor: default; pointer-events: none; }
@@ -2031,7 +2068,7 @@
2031
2068
  color: inherit; font: inherit; text-align: left; cursor: pointer;
2032
2069
  }
2033
2070
  .ds-247420 .ds-file-open[disabled] { cursor: default; }
2034
- .ds-247420 .ds-file-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-1); }
2071
+ .ds-247420 .ds-file-open:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); border-radius: var(--r-1); }
2035
2072
  .ds-247420 .ds-file-row:hover {
2036
2073
  background: var(--bg-2);
2037
2074
  border-color: var(--rule);
@@ -2135,7 +2172,7 @@
2135
2172
  }
2136
2173
  .ds-247420 .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
2137
2174
  .ds-247420 .ds-file-check.is-marked { color: var(--accent-ink); }
2138
- .ds-247420 .ds-file-check:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2175
+ .ds-247420 .ds-file-check:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2139
2176
  .ds-247420 .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
2140
2177
  .ds-247420 .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
2141
2178
  .ds-247420 .ds-file-selectall {
@@ -2145,7 +2182,7 @@
2145
2182
  padding: var(--space-1); border-radius: var(--r-1);
2146
2183
  }
2147
2184
  .ds-247420 .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
2148
- .ds-247420 .ds-file-selectall:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2185
+ .ds-247420 .ds-file-selectall:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2149
2186
  .ds-247420 .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
2150
2187
  .ds-247420 .ds-file-controls .spread { flex: 1 1 auto; }
2151
2188
  .ds-247420 .ds-file-controls .ds-file-sort { padding: 0; }
@@ -2183,7 +2220,7 @@
2183
2220
  }
2184
2221
  .ds-247420 .ds-density-btn:hover { color: var(--fg); }
2185
2222
  .ds-247420 .ds-density-btn.active { background: var(--accent-tint); color: var(--fg); }
2186
- .ds-247420 .ds-density-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2223
+ .ds-247420 .ds-density-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2187
2224
 
2188
2225
  /* Compact density — tighter rows for long listings. */
2189
2226
  .ds-247420 .ds-file-grid[data-density="compact"] { gap: 2px; }
@@ -2221,7 +2258,7 @@
2221
2258
  background: none; border: none; cursor: pointer; color: var(--fg);
2222
2259
  }
2223
2260
  .ds-247420 .ds-file-cell-open[disabled] { cursor: default; }
2224
- .ds-247420 .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-2); }
2261
+ .ds-247420 .ds-file-cell-open:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; border-radius: var(--r-2); }
2225
2262
  .ds-247420 .ds-file-cell-media {
2226
2263
  display: flex; align-items: center; justify-content: center;
2227
2264
  width: 100%; aspect-ratio: 4 / 3;
@@ -2461,7 +2498,7 @@
2461
2498
  color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-micro);
2462
2499
  }
2463
2500
  .ds-247420 .ds-upload-act:hover { background: var(--bg-3); color: var(--fg); }
2464
- .ds-247420 .ds-upload-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2501
+ .ds-247420 .ds-upload-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2465
2502
  @media (hover: none), (pointer: coarse) {
2466
2503
  .ds-247420 .ds-upload-act { min-height: 44px; min-width: 44px; }
2467
2504
  /* 44px floor for file controls on ANY touch device, not only narrow ones
@@ -2532,7 +2569,7 @@
2532
2569
  border-radius: var(--r-2); color: var(--fg);
2533
2570
  font-family: inherit; font-size: var(--fs-sm);
2534
2571
  }
2535
- .ds-247420 .ds-modal-input:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
2572
+ .ds-247420 .ds-modal-input:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2536
2573
  /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout. */
2537
2574
  @media (hover: none), (pointer: coarse) {
2538
2575
  .ds-247420 .ds-modal-input { font-size: 16px; min-height: 44px; }
@@ -2719,7 +2756,7 @@
2719
2756
  transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
2720
2757
  }
2721
2758
  .ds-247420 .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
2722
- .ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2759
+ .ds-247420 .ds-segmented .ds-seg-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2723
2760
  .ds-247420 .ds-segmented .ds-seg-btn.is-on {
2724
2761
  background: var(--bg); color: var(--fg);
2725
2762
  box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
@@ -3169,8 +3206,8 @@
3169
3206
  .ds-247420 .chat-composer .send:active { filter: brightness(0.94); }
3170
3207
  .ds-247420 .chat-composer .send:focus-visible,
3171
3208
  .ds-247420 .composer-btn:focus-visible {
3172
- outline: 2px solid var(--accent-ink);
3173
- outline-offset: 2px;
3209
+ outline: var(--focus-w) solid var(--focus-color);
3210
+ outline-offset: var(--focus-offset);
3174
3211
  }
3175
3212
  .ds-247420 .chat-composer .send:disabled {
3176
3213
  background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
@@ -3703,8 +3740,8 @@
3703
3740
 
3704
3741
  /* Base focus-visible: 2px ring + 2px offset clears dark bg-3 surfaces (WCAG 1.4.11) */
3705
3742
  .ds-247420 :focus-visible {
3706
- outline: 2px solid var(--accent-ink);
3707
- outline-offset: 2px;
3743
+ outline: var(--focus-w) solid var(--focus-color);
3744
+ outline-offset: var(--focus-offset);
3708
3745
  }
3709
3746
 
3710
3747
  /* Enhanced focus-visible for all interactive elements */
@@ -3713,8 +3750,8 @@
3713
3750
  .ds-247420[role="tab"]:focus-visible,
3714
3751
  .ds-247420 .row:focus-visible,
3715
3752
  .ds-247420 .row[tabindex]:focus-visible {
3716
- outline: 2px solid var(--accent-ink);
3717
- outline-offset: 2px;
3753
+ outline: var(--focus-w) solid var(--focus-color);
3754
+ outline-offset: var(--focus-offset);
3718
3755
  }
3719
3756
 
3720
3757
  /* Skip to main content link */
@@ -4103,7 +4140,7 @@
4103
4140
  border-radius: var(--r-1, 6px);
4104
4141
  cursor: pointer;
4105
4142
  }
4106
- .ds-247420 .app-side-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4143
+ .ds-247420 .app-side-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4107
4144
  @container (max-width: 900px) {
4108
4145
  .ds-247420 .app-side-toggle { display: inline-flex; }
4109
4146
  .ds-247420 .app-topbar .brand { margin-left: 44px; }
@@ -4197,7 +4234,7 @@
4197
4234
  .ds-247420 .ws-resizer { grid-row: 1 / -1; align-self: stretch; justify-self: end; width: 8px; margin-right: -4px; z-index: 5; cursor: col-resize; background: transparent; border: none; padding: 0; touch-action: none; }
4198
4235
  .ds-247420 .ws-resizer::after { content: ""; display: block; width: 2px; height: 100%; margin: 0 auto; background: transparent; transition: background var(--dur-snap) var(--ease); }
4199
4236
  .ds-247420 .ws-resizer:hover::after, .ds-247420 .ws-resizer:focus-visible::after { background: var(--accent); }
4200
- .ds-247420 .ws-resizer:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
4237
+ .ds-247420 .ws-resizer:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; }
4201
4238
  .ds-247420 .ws-resizer.ws-resizer-rail { grid-column: 1; }
4202
4239
  .ds-247420 .ws-resizer.ws-resizer-sessions { grid-column: 2; }
4203
4240
  .ds-247420 .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
@@ -4249,7 +4286,7 @@
4249
4286
  border-radius: var(--r-1); cursor: pointer;
4250
4287
  }
4251
4288
  .ds-247420 .ws-rail-toggle:hover { background: var(--bg-3); color: var(--fg); }
4252
- .ds-247420 .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4289
+ .ds-247420 .ws-rail-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4253
4290
  .ds-247420 .ws-rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; padding: var(--space-3) var(--space-2); gap: var(--space-2); }
4254
4291
  .ds-247420 .ws-rail-head { display: flex; align-items: center; min-height: 36px; padding: 0 var(--space-2); }
4255
4292
  .ds-247420 .ws-rail-brand { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-body); color: var(--fg); white-space: nowrap; overflow: hidden; }
@@ -4262,7 +4299,7 @@
4262
4299
  min-height: 40px; white-space: nowrap; overflow: hidden;
4263
4300
  }
4264
4301
  .ds-247420 .ws-rail-action:hover { filter: brightness(0.92); }
4265
- .ds-247420 .ws-rail-action:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4302
+ .ds-247420 .ws-rail-action:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4266
4303
  .ds-247420 .ws-rail-nav { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
4267
4304
  .ds-247420 .ws-rail-item {
4268
4305
  display: flex; align-items: center; gap: var(--space-2);
@@ -4272,7 +4309,7 @@
4272
4309
  font-family: var(--ff-body); font-size: var(--fs-sm); white-space: nowrap; overflow: hidden;
4273
4310
  }
4274
4311
  .ds-247420 .ws-rail-item:hover { background: var(--bg-3); color: var(--fg); }
4275
- .ds-247420 .ws-rail-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
4312
+ .ds-247420 .ws-rail-item:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; }
4276
4313
  .ds-247420 .ws-rail-item.active { background: var(--accent-tint); color: var(--fg); box-shadow: inset 2px 0 0 var(--accent); }
4277
4314
  .ds-247420 .ws-rail-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
4278
4315
  .ds-247420 .ws-rail-item-count { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
@@ -4345,7 +4382,7 @@
4345
4382
  /* Desktop-only chrome toggle (sessions collapse): inverse of the mobile drawer-toggle. */
4346
4383
  .ds-247420 .ws-desktop-toggle { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: none; background: none; color: var(--fg-2); cursor: pointer; border-radius: var(--r-1); }
4347
4384
  .ds-247420 .ws-desktop-toggle:hover { background: var(--bg-2); color: var(--fg); }
4348
- .ds-247420 .ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4385
+ .ds-247420 .ws-desktop-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4349
4386
  @media (max-width: 900px) { .ds-247420 .ws-desktop-toggle { display: none; } }
4350
4387
  /* The pane collapse toggle is meaningless once the pane TRACK is dropped (the
4351
4388
  pane becomes a mobile overlay drawer at <=1480px, reached via its own
@@ -4469,7 +4506,7 @@
4469
4506
  .ds-247420 .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
4470
4507
  }
4471
4508
  .ds-247420 .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
4472
- .ds-247420 .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4509
+ .ds-247420 .ws-drawer-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4473
4510
 
4474
4511
  @media (prefers-reduced-motion: reduce) {
4475
4512
  .ds-247420 .ws-shell, .ds-247420 .ws-rail, .ds-247420 .ws-pane, .ds-247420 .ws-sessions, .ds-247420 .ws-scrim { transition: none; }
@@ -4494,7 +4531,7 @@
4494
4531
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
4495
4532
  }
4496
4533
  .ds-247420 .row-act:hover { background: var(--bg-3); color: var(--fg); }
4497
- .ds-247420 .row-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4534
+ .ds-247420 .row-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4498
4535
 
4499
4536
  /* FilterPills - a group of pill toggle buttons (aria-pressed). */
4500
4537
  .ds-247420 .ds-filter-pills { display: flex; flex-wrap: wrap; gap: var(--space-2); }
@@ -4507,7 +4544,7 @@
4507
4544
  }
4508
4545
  .ds-247420 .ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
4509
4546
  .ds-247420 .ds-filter-pill.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
4510
- .ds-247420 .ds-filter-pill:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4547
+ .ds-247420 .ds-filter-pill:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4511
4548
 
4512
4549
  /* Touch floor for the new small controls. */
4513
4550
  @media (pointer: coarse) {
@@ -4517,7 +4554,7 @@
4517
4554
  /* Disabled file actions (read-only row / in-flight mutation) stay visible but inert. */
4518
4555
  .ds-247420 .ds-file-act:disabled { opacity: .45; cursor: default; }
4519
4556
  .ds-247420 .ds-file-act:disabled:hover { background: transparent; color: var(--fg-3); }
4520
- .ds-247420 .ds-file-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4557
+ .ds-247420 .ds-file-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4521
4558
 
4522
4559
  /* ============================================================
4523
4560
  Print — linearize WorkspaceShell so main content prints in full.
@@ -4841,7 +4878,7 @@
4841
4878
  .ds-feature above), so the hover affordance is a lift, matching the same
4842
4879
  translateY + shadow idiom .chat-msg:hover .chat-bubble already uses. */
4843
4880
  .ds-247420 .ds-gallery-tile:hover { transform: translateY(-2px); box-shadow: 0 2px 8px color-mix(in oklab, var(--fg) 10%, transparent); }
4844
- .ds-247420 .ds-gallery-tile:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4881
+ .ds-247420 .ds-gallery-tile:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4845
4882
  .ds-247420 .ds-gallery-tile--tight { min-height: clamp(96px, 14vw, 120px); }
4846
4883
  .ds-247420 .ds-lightbox {
4847
4884
  position: fixed; inset: 0; background: var(--scrim);