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/app-shell.css CHANGED
@@ -30,8 +30,8 @@ button, input, select, textarea { font: inherit; }
30
30
  }
31
31
  .skip-link:focus {
32
32
  top: 10px;
33
- outline: 2px solid var(--accent-ink);
34
- outline-offset: 2px;
33
+ outline: var(--focus-w) solid var(--focus-color);
34
+ outline-offset: var(--focus-offset);
35
35
  }
36
36
  body {
37
37
  background: var(--bg);
@@ -42,7 +42,12 @@ body {
42
42
  -webkit-font-smoothing: antialiased;
43
43
  text-rendering: optimizeLegibility;
44
44
  }
45
- ::selection { background: color-mix(in oklab, var(--accent) 24%, var(--bg-2)); color: var(--fg); }
45
+ /* Light (paper, the default theme) needs a stronger accent share than dark to
46
+ clear a visible selection tint against --bg-2 -- the dark-theme value (24%)
47
+ read too weak on paper. Dark/ink keeps its existing 24% mix, restored below
48
+ in the ink/dark + auto-dark blocks (mirrors the --danger/--flame pattern of
49
+ scoping a value per theme rather than sharing one across both). */
50
+ ::selection { background: color-mix(in oklab, var(--accent) 46%, var(--bg-2)); color: var(--fg); }
46
51
 
47
52
  /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
48
53
  .app, .ds-stage {
@@ -247,8 +252,8 @@ body.canvas-host { background: transparent !important; }
247
252
  }
248
253
  .app-topbar nav a:hover { background: var(--bg-2); color: var(--fg); }
249
254
  .app-topbar nav a:focus-visible {
250
- outline: 2px solid var(--accent-ink);
251
- outline-offset: 2px;
255
+ outline: var(--focus-w) solid var(--focus-color);
256
+ outline-offset: var(--focus-offset);
252
257
  }
253
258
  /* Active tab reads as a subtle tinted pill with an accent underline rather than
254
259
  an oversized filled oval that sits taller than its inactive siblings and reads
@@ -283,8 +288,8 @@ body.canvas-host { background: transparent !important; }
283
288
  width: 100%;
284
289
  }
285
290
  .app-search:focus-within {
286
- outline: 2px solid var(--accent-ink);
287
- outline-offset: 2px;
291
+ outline: var(--focus-w) solid var(--focus-color);
292
+ outline-offset: var(--focus-offset);
288
293
  }
289
294
 
290
295
  .app-crumb {
@@ -325,8 +330,8 @@ body.canvas-host { background: transparent !important; }
325
330
  }
326
331
  .app-side a:hover { background: var(--bg-2); color: var(--fg); }
327
332
  .app-side a:focus-visible {
328
- outline: 2px solid var(--accent-ink);
329
- outline-offset: 2px;
333
+ outline: var(--focus-w) solid var(--focus-color);
334
+ outline-offset: var(--focus-offset);
330
335
  }
331
336
  .app-side a.active {
332
337
  color: var(--accent-fg);
@@ -499,7 +504,7 @@ body.canvas-host { background: transparent !important; }
499
504
  .ds-icon-btn-ghost { background: transparent; }
500
505
  .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
501
506
  .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
502
- .ds-icon-btn-primary:hover { background: var(--fg); color: var(--bg); }
507
+ .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
503
508
  /* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
504
509
  .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
505
510
  .ds-icon-btn-danger:hover { filter: brightness(0.92); }
@@ -518,19 +523,27 @@ body.canvas-host { background: transparent !important; }
518
523
  border-radius: var(--r-pill);
519
524
  background: var(--bg-3); color: var(--fg-2);
520
525
  }
521
- .ds-badge.tone-green { background: var(--green-tint); color: var(--green-deep); }
526
+ /* Canonical tone names are tone-success / tone-error / tone-neutral. Every
527
+ other tone name grouped into the same rule below (tone-green/tone-live,
528
+ tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
529
+ true-synonym legacy alias, kept working but sharing one declaration so the
530
+ tone-family colors can't drift apart across names. */
531
+ .ds-badge.tone-green, .ds-badge.tone-live, .ds-badge.tone-success {
532
+ background: var(--green-tint); color: var(--green-deep);
533
+ }
534
+ .ds-badge.tone-flame, .ds-badge.tone-error {
535
+ background: var(--flame); color: var(--on-color);
536
+ }
537
+ .ds-badge.tone-wip, .ds-badge.tone-neutral {
538
+ background: var(--bg-3); color: var(--fg-2);
539
+ }
522
540
  .ds-badge.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
523
541
  .ds-badge.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
524
- .ds-badge.tone-sun { background: var(--sun); color: var(--ink); }
525
- .ds-badge.tone-flame { background: var(--flame); color: var(--on-color); }
526
- .ds-badge.tone-live { background: var(--green-tint); color: var(--green-deep); }
527
- .ds-badge.tone-wip { background: var(--bg-3); color: var(--fg-2); }
528
- .ds-badge.tone-error { background: var(--flame); color: var(--on-color); }
529
- .ds-badge.tone-success { background: var(--green-tint); color: var(--green-deep); }
530
- .ds-badge.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
542
+ .ds-badge.tone-sun, .ds-badge.tone-yellow {
543
+ background: var(--sun); color: var(--ink);
544
+ }
531
545
  .ds-badge.tone-blue { background: var(--accent-tint); color: var(--accent-ink); }
532
546
  .ds-badge.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
533
- .ds-badge.tone-yellow { background: var(--sun); color: var(--ink); }
534
547
 
535
548
  .chip {
536
549
  display: inline-flex; align-items: center; gap: 6px;
@@ -541,19 +554,22 @@ body.canvas-host { background: transparent !important; }
541
554
  letter-spacing: var(--tr-caps); text-transform: uppercase;
542
555
  border-radius: var(--r-pill);
543
556
  }
544
- .chip.tone-green { background: var(--green-tint); color: var(--green-deep); }
557
+ /* Same canonical/legacy-alias grouping as .ds-badge above. */
558
+ .chip.tone-green, .chip.tone-live, .chip.tone-success, .chip.tone-ok {
559
+ background: var(--green-tint); color: var(--green-deep);
560
+ }
561
+ .chip.tone-flame, .chip.tone-error, .chip.tone-miss {
562
+ background: var(--flame); color: var(--on-color);
563
+ }
564
+ .chip.tone-wip, .chip.tone-neutral {
565
+ background: var(--bg-3); color: var(--fg-2);
566
+ }
545
567
  .chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
546
568
  .chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
547
- .chip.tone-sun { background: var(--sun); color: var(--ink); }
548
- .chip.tone-flame { background: var(--flame); color: var(--on-color); }
549
- .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
550
- .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
551
- .chip.tone-error { background: var(--flame); color: var(--on-color); }
552
- .chip.tone-success { background: var(--green-tint); color: var(--green-deep); }
569
+ .chip.tone-sun, .chip.tone-yellow {
570
+ background: var(--sun); color: var(--ink);
571
+ }
553
572
  .chip.tone-disabled { background: var(--bg-3); color: var(--fg-3); }
554
- .chip.tone-ok { background: var(--green-tint); color: var(--green-deep); }
555
- .chip.tone-miss { background: var(--flame); color: var(--on-color); }
556
- .chip.tone-neutral { background: var(--bg-3); color: var(--fg-2); }
557
573
  .chip.tone-blue { background: var(--accent-tint); color: var(--accent-ink); }
558
574
  .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
559
575
  .chip.tone-yellow { background: var(--sun); color: var(--ink); }
@@ -1004,7 +1020,7 @@ table td { padding: 14px 16px; border-top: 1px solid var(--rule); }
1004
1020
  table tr.clickable { cursor: pointer; }
1005
1021
  table tr.clickable:hover td { background: var(--bg-2); }
1006
1022
  table tr.clickable:focus-visible {
1007
- outline: 2px solid var(--accent-ink);
1023
+ outline: var(--focus-w) solid var(--focus-color);
1008
1024
  outline-offset: -2px;
1009
1025
  }
1010
1026
  table tr.clickable:focus-visible td { background: var(--bg-2); }
@@ -1445,7 +1461,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1445
1461
  flex-direction: column;
1446
1462
  gap: 4px;
1447
1463
  }
1448
- .ds-file-grid:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-2); }
1464
+ .ds-file-grid:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); border-radius: var(--r-2); }
1449
1465
 
1450
1466
  /* Listing wrapper holds the optional filter + sort header above the grid. */
1451
1467
  .ds-file-listing { display: flex; flex-direction: column; gap: var(--space-2); min-height: 0; }
@@ -1467,7 +1483,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1467
1483
  }
1468
1484
  .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1469
1485
  .ds-file-sort-btn.active { color: var(--accent-ink); }
1470
- .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1486
+ .ds-file-sort-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1471
1487
 
1472
1488
  /* Skeleton shimmer rows shown while a directory loads. */
1473
1489
  .ds-file-row-skeleton { cursor: default; pointer-events: none; }
@@ -1515,7 +1531,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1515
1531
  color: inherit; font: inherit; text-align: left; cursor: pointer;
1516
1532
  }
1517
1533
  .ds-file-open[disabled] { cursor: default; }
1518
- .ds-file-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; border-radius: var(--r-1); }
1534
+ .ds-file-open:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); border-radius: var(--r-1); }
1519
1535
  .ds-file-row:hover {
1520
1536
  background: var(--bg-2);
1521
1537
  border-color: var(--rule);
@@ -1619,7 +1635,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1619
1635
  }
1620
1636
  .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1621
1637
  .ds-file-check.is-marked { color: var(--accent-ink); }
1622
- .ds-file-check:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1638
+ .ds-file-check:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1623
1639
  .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1624
1640
  .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
1625
1641
  .ds-file-selectall {
@@ -1629,7 +1645,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1629
1645
  padding: var(--space-1); border-radius: var(--r-1);
1630
1646
  }
1631
1647
  .ds-file-selectall:hover { background: var(--bg-2); color: var(--fg); }
1632
- .ds-file-selectall:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1648
+ .ds-file-selectall:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1633
1649
  .ds-file-controls { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); flex-wrap: wrap; }
1634
1650
  .ds-file-controls .spread { flex: 1 1 auto; }
1635
1651
  .ds-file-controls .ds-file-sort { padding: 0; }
@@ -1667,7 +1683,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1667
1683
  }
1668
1684
  .ds-density-btn:hover { color: var(--fg); }
1669
1685
  .ds-density-btn.active { background: var(--accent-tint); color: var(--fg); }
1670
- .ds-density-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1686
+ .ds-density-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1671
1687
 
1672
1688
  /* Compact density — tighter rows for long listings. */
1673
1689
  .ds-file-grid[data-density="compact"] { gap: 2px; }
@@ -1705,7 +1721,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1705
1721
  background: none; border: none; cursor: pointer; color: var(--fg);
1706
1722
  }
1707
1723
  .ds-file-cell-open[disabled] { cursor: default; }
1708
- .ds-file-cell-open:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; border-radius: var(--r-2); }
1724
+ .ds-file-cell-open:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; border-radius: var(--r-2); }
1709
1725
  .ds-file-cell-media {
1710
1726
  display: flex; align-items: center; justify-content: center;
1711
1727
  width: 100%; aspect-ratio: 4 / 3;
@@ -1945,7 +1961,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1945
1961
  color: var(--fg-2); font-family: var(--ff-body); font-size: var(--fs-micro);
1946
1962
  }
1947
1963
  .ds-upload-act:hover { background: var(--bg-3); color: var(--fg); }
1948
- .ds-upload-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
1964
+ .ds-upload-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
1949
1965
  @media (hover: none), (pointer: coarse) {
1950
1966
  .ds-upload-act { min-height: 44px; min-width: 44px; }
1951
1967
  /* 44px floor for file controls on ANY touch device, not only narrow ones
@@ -2016,7 +2032,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2016
2032
  border-radius: var(--r-2); color: var(--fg);
2017
2033
  font-family: inherit; font-size: var(--fs-sm);
2018
2034
  }
2019
- .ds-modal-input:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
2035
+ .ds-modal-input:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2020
2036
  /* iOS auto-zooms inputs under 16px on focus, breaking the modal layout. */
2021
2037
  @media (hover: none), (pointer: coarse) {
2022
2038
  .ds-modal-input { font-size: 16px; min-height: 44px; }
@@ -2203,7 +2219,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2203
2219
  transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
2204
2220
  }
2205
2221
  .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
2206
- .ds-segmented .ds-seg-btn:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
2222
+ .ds-segmented .ds-seg-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
2207
2223
  .ds-segmented .ds-seg-btn.is-on {
2208
2224
  background: var(--bg); color: var(--fg);
2209
2225
  box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
@@ -2653,8 +2669,8 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2653
2669
  .chat-composer .send:active { filter: brightness(0.94); }
2654
2670
  .chat-composer .send:focus-visible,
2655
2671
  .composer-btn:focus-visible {
2656
- outline: 2px solid var(--accent-ink);
2657
- outline-offset: 2px;
2672
+ outline: var(--focus-w) solid var(--focus-color);
2673
+ outline-offset: var(--focus-offset);
2658
2674
  }
2659
2675
  .chat-composer .send:disabled {
2660
2676
  background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
@@ -3195,8 +3211,8 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3195
3211
 
3196
3212
  /* Base focus-visible: 2px ring + 2px offset clears dark bg-3 surfaces (WCAG 1.4.11) */
3197
3213
  :focus-visible {
3198
- outline: 2px solid var(--accent-ink);
3199
- outline-offset: 2px;
3214
+ outline: var(--focus-w) solid var(--focus-color);
3215
+ outline-offset: var(--focus-offset);
3200
3216
  }
3201
3217
 
3202
3218
  /* Enhanced focus-visible for all interactive elements */
@@ -3205,8 +3221,8 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3205
3221
  [role="tab"]:focus-visible,
3206
3222
  .row:focus-visible,
3207
3223
  .row[tabindex]:focus-visible {
3208
- outline: 2px solid var(--accent-ink);
3209
- outline-offset: 2px;
3224
+ outline: var(--focus-w) solid var(--focus-color);
3225
+ outline-offset: var(--focus-offset);
3210
3226
  }
3211
3227
 
3212
3228
  /* Skip to main content link */
@@ -3598,7 +3614,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3598
3614
  border-radius: var(--r-1, 6px);
3599
3615
  cursor: pointer;
3600
3616
  }
3601
- .app-side-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3617
+ .app-side-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3602
3618
  @container (max-width: 900px) {
3603
3619
  .app-side-toggle { display: inline-flex; }
3604
3620
  .app-topbar .brand { margin-left: 44px; }
@@ -3692,7 +3708,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3692
3708
  .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; }
3693
3709
  .ws-resizer::after { content: ""; display: block; width: 2px; height: 100%; margin: 0 auto; background: transparent; transition: background var(--dur-snap) var(--ease); }
3694
3710
  .ws-resizer:hover::after, .ws-resizer:focus-visible::after { background: var(--accent); }
3695
- .ws-resizer:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
3711
+ .ws-resizer:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; }
3696
3712
  .ws-resizer.ws-resizer-rail { grid-column: 1; }
3697
3713
  .ws-resizer.ws-resizer-sessions { grid-column: 2; }
3698
3714
  .ws-resizer.ws-resizer-pane { grid-column: 3; justify-self: end; }
@@ -3744,7 +3760,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3744
3760
  border-radius: var(--r-1); cursor: pointer;
3745
3761
  }
3746
3762
  .ws-rail-toggle:hover { background: var(--bg-3); color: var(--fg); }
3747
- .ws-rail-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3763
+ .ws-rail-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3748
3764
  .ws-rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; padding: var(--space-3) var(--space-2); gap: var(--space-2); }
3749
3765
  .ws-rail-head { display: flex; align-items: center; min-height: 36px; padding: 0 var(--space-2); }
3750
3766
  .ws-rail-brand { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-body); color: var(--fg); white-space: nowrap; overflow: hidden; }
@@ -3757,7 +3773,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3757
3773
  min-height: 40px; white-space: nowrap; overflow: hidden;
3758
3774
  }
3759
3775
  .ws-rail-action:hover { filter: brightness(0.92); }
3760
- .ws-rail-action:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3776
+ .ws-rail-action:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3761
3777
  .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; }
3762
3778
  .ws-rail-item {
3763
3779
  display: flex; align-items: center; gap: var(--space-2);
@@ -3767,7 +3783,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3767
3783
  font-family: var(--ff-body); font-size: var(--fs-sm); white-space: nowrap; overflow: hidden;
3768
3784
  }
3769
3785
  .ws-rail-item:hover { background: var(--bg-3); color: var(--fg); }
3770
- .ws-rail-item:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
3786
+ .ws-rail-item:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; }
3771
3787
  .ws-rail-item.active { background: var(--accent-tint); color: var(--fg); box-shadow: inset 2px 0 0 var(--accent); }
3772
3788
  .ws-rail-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }
3773
3789
  .ws-rail-item-count { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
@@ -3840,7 +3856,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3840
3856
  /* Desktop-only chrome toggle (sessions collapse): inverse of the mobile drawer-toggle. */
3841
3857
  .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); }
3842
3858
  .ws-desktop-toggle:hover { background: var(--bg-2); color: var(--fg); }
3843
- .ws-desktop-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3859
+ .ws-desktop-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3844
3860
  @media (max-width: 900px) { .ws-desktop-toggle { display: none; } }
3845
3861
  /* The pane collapse toggle is meaningless once the pane TRACK is dropped (the
3846
3862
  pane becomes a mobile overlay drawer at <=1480px, reached via its own
@@ -3964,7 +3980,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3964
3980
  .ws-crumb .app-crumb .crumb-right { margin-left: 0; flex-wrap: wrap; min-width: 0; display: inline-flex; }
3965
3981
  }
3966
3982
  .ws-drawer-toggle:hover { background: var(--bg-2); color: var(--fg); }
3967
- .ws-drawer-toggle:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
3983
+ .ws-drawer-toggle:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3968
3984
 
3969
3985
  @media (prefers-reduced-motion: reduce) {
3970
3986
  .ws-shell, .ws-rail, .ws-pane, .ws-sessions, .ws-scrim { transition: none; }
@@ -3989,7 +4005,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
3989
4005
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
3990
4006
  }
3991
4007
  .row-act:hover { background: var(--bg-3); color: var(--fg); }
3992
- .row-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4008
+ .row-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
3993
4009
 
3994
4010
  /* FilterPills - a group of pill toggle buttons (aria-pressed). */
3995
4011
  .ds-filter-pills { display: flex; flex-wrap: wrap; gap: var(--space-2); }
@@ -4002,7 +4018,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
4002
4018
  }
4003
4019
  .ds-filter-pill:hover { background: var(--bg-3); color: var(--fg); }
4004
4020
  .ds-filter-pill.active { background: var(--accent-tint); color: var(--fg); border-color: var(--accent); }
4005
- .ds-filter-pill:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4021
+ .ds-filter-pill:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4006
4022
 
4007
4023
  /* Touch floor for the new small controls. */
4008
4024
  @media (pointer: coarse) {
@@ -4012,7 +4028,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
4012
4028
  /* Disabled file actions (read-only row / in-flight mutation) stay visible but inert. */
4013
4029
  .ds-file-act:disabled { opacity: .45; cursor: default; }
4014
4030
  .ds-file-act:disabled:hover { background: transparent; color: var(--fg-3); }
4015
- .ds-file-act:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 1px; }
4031
+ .ds-file-act:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4016
4032
 
4017
4033
  /* ============================================================
4018
4034
  Print — linearize WorkspaceShell so main content prints in full.
@@ -4337,7 +4353,7 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
4337
4353
  .ds-feature above), so the hover affordance is a lift, matching the same
4338
4354
  translateY + shadow idiom .chat-msg:hover .chat-bubble already uses. */
4339
4355
  .ds-gallery-tile:hover { transform: translateY(-2px); box-shadow: 0 2px 8px color-mix(in oklab, var(--fg) 10%, transparent); }
4340
- .ds-gallery-tile:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
4356
+ .ds-gallery-tile:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
4341
4357
  .ds-gallery-tile--tight { min-height: clamp(96px, 14vw, 120px); }
4342
4358
  .ds-lightbox {
4343
4359
  position: fixed; inset: 0; background: var(--scrim);
@@ -90,7 +90,11 @@
90
90
  --accent-fg: var(--ink);
91
91
  --accent-ink: var(--acid-deep);
92
92
  --accent-bright: var(--acid); /* base value so var(--accent-bright) never falls back empty; ink + [data-accent] retune it */
93
- --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
93
+ /* Blends --accent-ink (the readable/darker ink variant), not the raw
94
+ --accent fill, so light-theme active states clear contrast against --bg;
95
+ dark/ink and auto-dark restate the prior --accent-based value explicitly
96
+ below so this change does not leak into them via inheritance. */
97
+ --accent-tint: color-mix(in oklab, var(--accent-ink) 22%, var(--bg));
94
98
 
95
99
  /* On-color foregrounds — text/icons that sit ON a saturated fill (accent,
96
100
  danger, category chips). Theme-driven so white-on-color never hard-codes
@@ -327,6 +331,9 @@ select:focus-visible {
327
331
  --accent-fg: var(--ink);
328
332
  --accent-ink: var(--acid); /* on ink, the lime itself reads as bright text */
329
333
  --accent-bright: var(--acid);
334
+ /* Preserves the prior --accent-based blend for dark; the :root light-theme
335
+ value above was retuned to blend --accent-ink instead. */
336
+ --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
330
337
  --danger: oklch(0.68 0.19 25);
331
338
  --flame: #FF5A1F;
332
339
  --amber: #D9A93A;
@@ -341,6 +348,14 @@ select:focus-visible {
341
348
  --code-num: var(--sun);
342
349
  }
343
350
 
351
+ /* Restores the pre-existing (weaker) dark-theme selection tint after the
352
+ light-theme-only bump in app-shell.css's base ::selection rule. */
353
+ [data-theme="ink"] ::selection,
354
+ [data-theme="dark"] ::selection {
355
+ background: color-mix(in oklab, var(--accent) 24%, var(--bg-2));
356
+ color: var(--fg);
357
+ }
358
+
344
359
  /* NOTE: the [data-theme="auto"] block below mirrors the
345
360
  [data-theme="ink"/"dark"] block above token-for-token. 'auto + OS-dark' and
346
361
  'explicit dark' are the same visual context and resolve every token —
@@ -368,6 +383,7 @@ select:focus-visible {
368
383
  --accent-fg: var(--ink);
369
384
  --accent-ink: var(--acid);
370
385
  --accent-bright: var(--acid);
386
+ --accent-tint: color-mix(in oklab, var(--accent) 30%, var(--bg));
371
387
  --danger: oklch(0.68 0.19 25);
372
388
  --flame: #FF5A1F;
373
389
  --amber: #D9A93A;
@@ -379,6 +395,10 @@ select:focus-visible {
379
395
  --code-str-alt: var(--mascot);
380
396
  --code-num: var(--sun);
381
397
  }
398
+ [data-theme="auto"] ::selection {
399
+ background: color-mix(in oklab, var(--accent) 24%, var(--bg-2));
400
+ color: var(--fg);
401
+ }
382
402
  }
383
403
 
384
404
  /* Nested-scope safety: if .ds-247420 appears under another .ds-247420 (e.g.
@@ -438,6 +458,7 @@ select:focus-visible {
438
458
  --bg: var(--paper); --bg-2: var(--paper-2); --bg-3: var(--paper-3);
439
459
  --fg: var(--ink); --fg-2: var(--ink-2); --fg-3: var(--ink-3);
440
460
  --accent: var(--acid); --accent-fg: var(--ink); --accent-ink: var(--acid-deep);
461
+ --accent-tint: color-mix(in oklab, var(--accent-ink) 22%, var(--bg));
441
462
  /* A paper island under a dark ancestor must not inherit the dark signal pair. */
442
463
  --flame: #C53E00; --amber: #7C570F; --warn: #E0241A; --sky: #3A6EFF;
443
464
  }