anentrypoint-design 0.0.219 → 0.0.221

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
@@ -1,7 +1,8 @@
1
1
  /* ============================================================
2
2
  247420 design system — component sheet
3
- Tonal surfaces over borders. Indicator rails over hairlines.
4
- Friendly rounded sans body; mono only on real code.
3
+ "Acid Editorial": Space Grotesk display + Inter body + JetBrains code.
4
+ Confident hierarchy, asymmetric grid tension, print texture over glow,
5
+ one electric lead accent. Indicator rails over hairlines.
5
6
  ============================================================ */
6
7
 
7
8
  /* ============================================================
@@ -54,10 +55,10 @@ body {
54
55
  /* ============================================================
55
56
  Typography
56
57
  ============================================================ */
57
- h1, .t-h1 { font-family: var(--ff-body); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
58
- h2, .t-h2 { font-family: var(--ff-body); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
59
- h3, .t-h3 { font-family: var(--ff-body); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
60
- h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
58
+ h1, .t-h1 { font-family: var(--ff-display); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
59
+ h2, .t-h2 { font-family: var(--ff-display); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
60
+ h3, .t-h3 { font-family: var(--ff-display); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
61
+ h4, .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
61
62
 
62
63
  /* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
63
64
  [data-typescale="app"] h1, [data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
@@ -65,10 +66,10 @@ h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: v
65
66
  [data-typescale="app"] h3, [data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
66
67
  [data-typescale="app"] h4, [data-typescale="app"] .t-h4 { font-size: var(--fs-h4-app); }
67
68
 
68
- .t-hero { font-family: var(--ff-body); font-size: var(--fs-hero); line-height: var(--lh-tight); letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
69
- .t-mega { font-family: var(--ff-body); font-size: var(--fs-mega); line-height: 0.95; letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
69
+ .t-hero { font-family: var(--ff-display); font-size: var(--fs-hero); line-height: var(--lh-tight); letter-spacing: var(--tr-tighter); font-weight: 700; margin: 0; }
70
+ .t-mega { font-family: var(--ff-display); font-size: var(--fs-mega); line-height: 0.92; letter-spacing: var(--tr-tighter); font-weight: 700; margin: 0; }
70
71
 
71
- .t-display { font-family: var(--ff-body); font-weight: 600; letter-spacing: var(--tr-tight); }
72
+ .t-display { font-family: var(--ff-display); font-weight: 600; letter-spacing: var(--tr-tight); }
72
73
  .t-mono { font-family: var(--ff-mono); }
73
74
  .t-body { font-family: var(--ff-body); }
74
75
 
@@ -83,17 +84,18 @@ h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: v
83
84
  }
84
85
 
85
86
  .eyebrow {
86
- font-family: var(--ff-body);
87
+ font-family: var(--ff-mono);
87
88
  font-size: var(--fs-tiny);
88
89
  font-weight: 600;
89
- letter-spacing: var(--tr-caps);
90
+ letter-spacing: var(--tr-label);
90
91
  text-transform: uppercase;
91
- color: var(--accent);
92
- display: inline-flex; align-items: center; gap: 10px;
92
+ color: var(--accent-ink);
93
+ display: inline-flex; align-items: center; gap: 12px;
93
94
  }
95
+ /* Editorial kicker mark — a short solid ink rule, the print-byline tell. */
94
96
  .eyebrow::before {
95
97
  content: '';
96
- width: 18px; height: 2px; background: currentColor;
98
+ width: 28px; height: 3px; background: currentColor;
97
99
  }
98
100
 
99
101
  .ds-prose {
@@ -113,7 +115,7 @@ h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: v
113
115
  /* Links */
114
116
  a { color: inherit; text-decoration: none; }
115
117
  a.ds-link-accent, .ds-prose a {
116
- color: var(--accent);
118
+ color: var(--accent-ink);
117
119
  text-decoration: underline;
118
120
  text-underline-offset: 4px;
119
121
  text-decoration-thickness: 2px;
@@ -253,18 +255,19 @@ body.canvas-host { background: transparent !important; }
253
255
  as misaligned. Same height as the inactive links — only the tint + underline
254
256
  change. */
255
257
  .app-topbar nav a.active {
256
- color: var(--accent);
258
+ color: var(--accent-ink);
257
259
  background: color-mix(in oklab, var(--accent) 16%, transparent);
258
260
  box-shadow: inset 0 -2px 0 0 var(--accent);
259
261
  font-weight: 600;
260
262
  }
261
263
 
262
264
  .brand {
263
- font-family: var(--ff-body);
264
- font-weight: 700; font-size: var(--fs-sm);
265
- letter-spacing: -0.01em;
265
+ font-family: var(--ff-display);
266
+ font-weight: 700; font-size: var(--fs-lg);
267
+ letter-spacing: var(--tr-tight);
266
268
  }
267
- .brand .slash { color: var(--fg-3); font-weight: 400; margin: 0 2px; }
269
+ /* The wordmark separator printed in the electric lead the brand tell. */
270
+ .brand .slash { color: var(--accent-ink); font-weight: 700; margin: 0 3px; }
268
271
 
269
272
  .app-search {
270
273
  display: inline-flex; align-items: center; gap: 10px;
@@ -353,7 +356,7 @@ body.canvas-host { background: transparent !important; }
353
356
  failure mode any long-scroll page (a marketing/landing route) hits. Grow
354
357
  children (.chat/.grow/etc.) re-assert flex:1 1 auto below via higher
355
358
  specificity, so a single full-height pane still fills the region. */
356
- .app-main > * { min-height: 0; flex-shrink: 0; }
359
+ .app-main > * { min-height: 0; flex: none; }
357
360
  /* The main region scrolls its own overflow at every breakpoint (previously
358
361
  only ≥901px), so a fixed-height .app never clips route content and inner
359
362
  panels don't fight the page scroll. */
@@ -393,7 +396,7 @@ body.canvas-host { background: transparent !important; }
393
396
  border-top: 1px solid var(--rule);
394
397
  }
395
398
  .app-status .item { color: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
396
- .app-status .item:first-of-type { color: var(--accent); }
399
+ .app-status .item:first-of-type { color: var(--accent-ink); }
397
400
  .app-status .spread { flex: 1; }
398
401
  /* The status bar NEVER wraps: at narrow widths the trailing items (hints,
399
402
  agent target) drop in priority order instead of breaking mid-word onto a
@@ -416,15 +419,20 @@ body.canvas-host { background: transparent !important; }
416
419
  /* Rounded-rect app chrome, not a marketing-page stadium CTA. */
417
420
  border-radius: var(--r-1);
418
421
  border: 0;
419
- transition: transform var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
422
+ transition: transform var(--dur-base) var(--ease-spring), background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
420
423
  }
421
424
  .btn { background: var(--bg-2); color: var(--fg); }
422
425
  .btn:hover { background: var(--bg-3); color: var(--fg); }
423
- .btn-primary { background: var(--accent); color: var(--accent-fg); }
424
- .btn-primary:hover { background: var(--fg); color: var(--bg); }
425
- .btn-ghost { background: transparent; color: var(--fg); box-shadow: inset 0 0 0 1.5px var(--rule-strong); }
426
- .btn-ghost:hover { background: var(--bg-2); }
427
- .btn:active, .btn-primary:active, .btn-ghost:active { transform: translateY(1px); }
426
+ /* Primary CTA the electric lead as a solid editorial block; hover inverts to
427
+ an ink block with the lead as text, a confident two-tone flip. */
428
+ .btn-primary {
429
+ background: var(--accent); color: var(--accent-fg);
430
+ font-weight: 700; letter-spacing: var(--tr-caps);
431
+ }
432
+ .btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
433
+ .btn-ghost { background: transparent; color: var(--fg); box-shadow: inset 0 0 0 2px var(--fg); }
434
+ .btn-ghost:hover { background: var(--fg); color: var(--bg); }
435
+ .btn:active, .btn-primary:active, .btn-ghost:active { transform: translateY(2px); }
428
436
  .btn:focus-visible, .btn-primary:focus-visible, .btn-ghost:focus-visible {
429
437
  outline: 2px solid var(--accent);
430
438
  outline-offset: 2px;
@@ -520,6 +528,17 @@ body.canvas-host { background: transparent !important; }
520
528
  padding: var(--space-3);
521
529
  position: relative;
522
530
  }
531
+ /* Editorial accent spine — an opt-in printed-ink rule down the left edge that
532
+ reads as a magazine pull-quote bar, not a glow card. */
533
+ .panel.panel-spine {
534
+ border-radius: 0 var(--r-2) var(--r-2) 0;
535
+ padding-left: calc(var(--space-3) + var(--bw-chunk));
536
+ }
537
+ .panel.panel-spine::before {
538
+ content: ''; position: absolute; left: 0; top: 0; bottom: 0;
539
+ width: var(--bw-chunk); background: var(--accent);
540
+ border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
541
+ }
523
542
  .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
524
543
  .panel.panel-wide { background: transparent; }
525
544
  .panel-head {
@@ -594,9 +613,13 @@ body.canvas-host { background: transparent !important; }
594
613
  row should not signal an affordance it does not have. */
595
614
  .row[role="button"]:hover, a.row:hover { background: var(--bg-2); }
596
615
  .row[role="button"]:hover::before, a.row:hover::before { height: 56%; opacity: 1; }
616
+ /* Editorial hover-reveal — the row's meta (cta) slides toward the lead accent
617
+ and nudges right, the printed-index "open ->" affordance. */
618
+ .row .meta { transition: color var(--dur-base) var(--ease), transform var(--dur-base) var(--ease-spring); }
619
+ a.row:hover .meta, .row[role="button"]:hover .meta { color: var(--accent-ink); transform: translateX(3px); }
597
620
  .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
598
621
  .row.active::before { height: 64%; opacity: 1; background: var(--accent); }
599
- .row.active .title { color: var(--accent); }
622
+ .row.active .title { color: var(--accent-ink); }
600
623
  .row.row-state-disabled { opacity: 0.5; pointer-events: none; }
601
624
  .row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
602
625
  .row.row-state-error::before { height: 64%; opacity: 1; background: var(--flame); }
@@ -638,24 +661,43 @@ a.row { text-decoration: none; }
638
661
  /* ============================================================
639
662
  Hero
640
663
  ============================================================ */
664
+ /* Signature hero — asymmetric editorial header. Title spans wide; the body +
665
+ actions sit offset in a narrower right column on desktop, stacked on mobile.
666
+ No centered stack. */
641
667
  .ds-hero {
642
668
  padding: var(--space-9) 0 var(--space-8);
643
- display: grid; gap: var(--space-5);
669
+ display: grid; gap: var(--space-5) var(--space-6);
670
+ grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
671
+ grid-template-areas: 'title title' 'body actions';
672
+ align-items: end;
644
673
  max-width: var(--measure-wide);
645
674
  }
675
+ .ds-hero-head { grid-area: title; display: grid; gap: var(--space-3); }
676
+ .ds-hero-body { grid-area: body; }
677
+ .ds-hero-actions { grid-area: actions; }
678
+ .ds-hero-badge { grid-area: actions; }
646
679
  .ds-hero-title {
647
- font-family: var(--ff-body); font-weight: 600;
648
- font-size: clamp(34px, 6.4cqi, 80px);
649
- line-height: 1.05; letter-spacing: var(--tr-tight);
650
- margin: 0; max-width: 18ch;
680
+ font-family: var(--ff-display); font-weight: 700;
681
+ font-size: clamp(40px, 9cqi, 116px);
682
+ line-height: 0.96; letter-spacing: var(--tr-tighter);
683
+ margin: 0; max-width: 16ch; text-wrap: balance;
651
684
  }
652
685
  .ds-hero-body {
653
686
  font-family: var(--ff-body); font-size: var(--fs-xl);
654
- line-height: 1.45; margin: 0; max-width: 52ch;
687
+ line-height: 1.45; margin: 0; max-width: 46ch;
655
688
  color: var(--fg-2);
656
689
  }
657
- .ds-hero-accent { color: var(--accent); font-weight: 500; }
658
- .ds-hero-actions { display: flex; gap: var(--space-2, 10px); flex-wrap: wrap; margin-top: var(--space-2, 8px); }
690
+ /* The lead phrase in the title — printed in the electric lead, not glowing. */
691
+ .ds-hero-accent { color: var(--accent-ink); font-weight: 700; }
692
+ .ds-hero-actions { display: flex; gap: var(--space-2, 10px); flex-wrap: wrap; align-self: end; }
693
+ @media (max-width: 900px) {
694
+ .ds-hero {
695
+ grid-template-columns: minmax(0, 1fr);
696
+ grid-template-areas: 'title' 'body' 'actions';
697
+ align-items: start;
698
+ padding: var(--space-7) 0 var(--space-6);
699
+ }
700
+ }
659
701
  .ds-chat-title { margin: 0; font-size: inherit; }
660
702
 
661
703
  /* ============================================================
@@ -675,6 +717,59 @@ a.row { text-decoration: none; }
675
717
  .ds-section { margin: var(--space-4) 0; }
676
718
  }
677
719
 
720
+ /* ============================================================
721
+ Print texture — the signature surface treatment. Opt-in overlay that
722
+ reads as risograph/newsprint grain, layered above the surface fill but
723
+ below content. Faint by default so type stays crisp; reduced-data and
724
+ reduced-motion are unaffected (texture is static).
725
+ ============================================================ */
726
+ .ds-grain { position: relative; isolation: isolate; }
727
+ .ds-grain::after {
728
+ content: ''; position: absolute; inset: 0; z-index: -1;
729
+ pointer-events: none;
730
+ background-image: var(--grain);
731
+ background-size: 160px 160px;
732
+ opacity: var(--grain-opacity);
733
+ mix-blend-mode: var(--grain-blend);
734
+ }
735
+ /* Halftone dot screen — a heavier print tell for accent panels/hero. */
736
+ .ds-halftone { position: relative; isolation: isolate; }
737
+ .ds-halftone::after {
738
+ content: ''; position: absolute; inset: 0; z-index: -1;
739
+ pointer-events: none;
740
+ background-image: radial-gradient(currentColor 1px, transparent 1.2px);
741
+ background-size: var(--halftone-size) var(--halftone-size);
742
+ opacity: 0.12;
743
+ }
744
+
745
+ /* ============================================================
746
+ Marquee / ticker — brand kinetic device ("always open 24/7"). The track
747
+ holds two identical runs so the loop is seamless; reduced-motion freezes it
748
+ to a single static run. Editorial, not a decorative flourish.
749
+ ============================================================ */
750
+ .ds-marquee {
751
+ overflow: hidden; width: 100%;
752
+ border-block: var(--bw-rule) solid var(--fg);
753
+ padding: var(--space-2) 0;
754
+ font-family: var(--ff-display); font-weight: 600;
755
+ text-transform: uppercase; letter-spacing: var(--tr-caps);
756
+ }
757
+ .ds-marquee-track {
758
+ display: inline-flex; gap: var(--space-5);
759
+ white-space: nowrap; will-change: transform;
760
+ animation: ds-marquee-run 28s linear infinite;
761
+ }
762
+ .ds-marquee-item { display: inline-flex; align-items: center; gap: var(--space-5); }
763
+ .ds-marquee-sep { color: var(--accent-ink); }
764
+ .ds-marquee:hover .ds-marquee-track { animation-play-state: paused; }
765
+ @keyframes ds-marquee-run {
766
+ from { transform: translateX(0); }
767
+ to { transform: translateX(-50%); }
768
+ }
769
+ @media (prefers-reduced-motion: reduce) {
770
+ .ds-marquee-track { animation: none; }
771
+ }
772
+
678
773
  /* ============================================================
679
774
  Install — single CLI command card
680
775
  ============================================================ */
@@ -1126,7 +1221,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1126
1221
  ============================================================ */
1127
1222
  .ds-chat { display: flex; flex-direction: column; gap: 12px; padding: var(--space-4); }
1128
1223
  .ds-chat-msg { padding: 12px 18px; background: var(--bg-2); border-radius: var(--r-3); max-width: min(90vw, 36em); }
1129
- .ds-chat-msg.user { background: var(--accent); color: var(--accent-fg); align-self: flex-end; }
1224
+ .ds-chat-msg.user { background: var(--accent-tint); color: var(--fg); align-self: flex-end; }
1130
1225
  .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
1131
1226
  .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
1132
1227
  .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); }
@@ -1165,7 +1260,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1165
1260
  background: none; border: none; cursor: pointer; padding: 2px 4px; border-radius: var(--r-1);
1166
1261
  }
1167
1262
  .ds-file-sort-btn:hover { color: var(--fg-2); background: var(--bg-2); }
1168
- .ds-file-sort-btn.active { color: var(--accent); }
1263
+ .ds-file-sort-btn.active { color: var(--accent-ink); }
1169
1264
  .ds-file-sort-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1170
1265
 
1171
1266
  /* Skeleton shimmer rows shown while a directory loads. */
@@ -1253,7 +1348,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1253
1348
  width: 26px; height: 26px; font-size: 15px; line-height: 1;
1254
1349
  color: var(--fg-2);
1255
1350
  }
1256
- .ds-file-row[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
1351
+ .ds-file-row[data-file-type="dir"] .ds-file-icon { color: var(--accent-ink); }
1257
1352
  .ds-file-row[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
1258
1353
  .ds-file-row[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
1259
1354
  .ds-file-row[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
@@ -1311,7 +1406,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1311
1406
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
1312
1407
  }
1313
1408
  .ds-file-check:hover { background: var(--bg-3); color: var(--fg); }
1314
- .ds-file-check.is-marked { color: var(--accent); }
1409
+ .ds-file-check.is-marked { color: var(--accent-ink); }
1315
1410
  .ds-file-check:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
1316
1411
  .ds-file-check[disabled] { opacity: 0.4; cursor: default; }
1317
1412
  .ds-file-row.is-marked { background: var(--accent-tint); border-color: var(--accent); }
@@ -1404,7 +1499,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1404
1499
  .ds-file-cell-thumb { width: 100%; height: 100%; object-fit: cover; }
1405
1500
  /* Per-type icon tints on thumb tiles so the grid keeps the colour-coding the
1406
1501
  list rows already carry (mirrors .ds-file-row[data-file-type] .ds-file-icon). */
1407
- .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent); }
1502
+ .ds-file-cell[data-file-type="dir"] .ds-file-icon { color: var(--accent-ink); }
1408
1503
  .ds-file-cell[data-file-type="image"] .ds-file-icon { color: var(--mascot); }
1409
1504
  .ds-file-cell[data-file-type="video"] .ds-file-icon { color: var(--purple-2); }
1410
1505
  .ds-file-cell[data-file-type="audio"] .ds-file-icon { color: var(--sky); }
@@ -1531,7 +1626,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1531
1626
  .ds-dropzone.dragover { animation: ds-dropzone-pulse 1.1s var(--ease) infinite; }
1532
1627
  }
1533
1628
  .ds-dropzone.dragover .ds-dropzone-glyph,
1534
- .ds-dropzone.dragover .ds-dropzone-label { color: var(--accent); }
1629
+ .ds-dropzone.dragover .ds-dropzone-label { color: var(--accent-ink); }
1535
1630
  @keyframes ds-dropzone-pulse {
1536
1631
  0%, 100% { border-color: var(--accent); }
1537
1632
  50% { border-color: color-mix(in oklab, var(--accent) 45%, transparent); }
@@ -1894,7 +1989,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1894
1989
  .chat-msg:hover .chat-avatar { transform: scale(1.03); box-shadow: 0 1px 4px color-mix(in oklab, var(--fg) 6%, transparent); }
1895
1990
  .chat-msg.you .chat-avatar {
1896
1991
  background: color-mix(in oklab, var(--accent) 26%, var(--bg-3));
1897
- color: var(--accent);
1992
+ color: var(--accent-ink);
1898
1993
  }
1899
1994
  .chat-msg.aicat .chat-avatar {
1900
1995
  background: color-mix(in oklab, var(--mascot) 26%, var(--bg-2));
@@ -1917,7 +2012,8 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1917
2012
  transition: transform 0.12s ease, box-shadow 0.12s ease;
1918
2013
  }
1919
2014
  .chat-msg:hover .chat-bubble { transform: translateY(-1px); box-shadow: 0 2px 8px color-mix(in oklab, var(--fg) 6%, transparent); transition: transform var(--dur-base) var(--ease), box-shadow var(--dur-base) var(--ease); }
1920
- .chat-msg.you .chat-bubble { background: var(--accent); color: var(--accent-fg); }
2015
+ /* Own bubble calm tinted lead, not a full electric fill (chat stays readable). */
2016
+ .chat-msg.you .chat-bubble { background: var(--accent-tint); color: var(--fg); }
1921
2017
  .chat-msg.aicat .chat-bubble {
1922
2018
  background: color-mix(in oklab, var(--mascot) 14%, var(--bg-2));
1923
2019
  border: 1px solid color-mix(in oklab, var(--mascot) 28%, transparent);
@@ -1927,7 +2023,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
1927
2023
  background: color-mix(in oklab, var(--fg) 10%, transparent);
1928
2024
  padding: 1px 6px; border-radius: 4px;
1929
2025
  }
1930
- .chat-msg.you .chat-bubble code { background: color-mix(in oklab, var(--accent-fg) 18%, transparent); }
2026
+ .chat-msg.you .chat-bubble code { background: color-mix(in oklab, var(--fg) 10%, transparent); }
1931
2027
  .chat-bubble a {
1932
2028
  color: inherit; text-decoration: underline;
1933
2029
  text-underline-offset: 2px; text-decoration-thickness: 1px;
@@ -2011,7 +2107,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2011
2107
  border-bottom: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
2012
2108
  font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3);
2013
2109
  }
2014
- .chat-code-head .lang { text-transform: uppercase; font-weight: 700; color: var(--accent); letter-spacing: 0.06em; }
2110
+ .chat-code-head .lang { text-transform: uppercase; font-weight: 700; color: var(--accent-ink); letter-spacing: 0.06em; }
2015
2111
  .chat-code-head .filename,
2016
2112
  .chat-code-head .name { color: var(--fg-2); font-weight: 500; }
2017
2113
  .chat-code-head .spread { flex: 1; }
@@ -2023,7 +2119,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2023
2119
  .chat-bubble.chat-code code { background: transparent; padding: 0; font-size: inherit; }
2024
2120
  .chat-bubble.chat-code .token.keyword,
2025
2121
  .chat-bubble.chat-code .token.atrule,
2026
- .chat-bubble.chat-code .token.selector { color: var(--accent); }
2122
+ .chat-bubble.chat-code .token.selector { color: var(--accent-ink); }
2027
2123
  .chat-bubble.chat-code .token.string,
2028
2124
  .chat-bubble.chat-code .token.attr-value { color: var(--code-str-alt, var(--mascot)); }
2029
2125
  .chat-bubble.chat-code .token.comment { color: var(--fg-3); font-style: italic; }
@@ -2064,7 +2160,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2064
2160
  font-size: 22px; width: 36px; height: 36px;
2065
2161
  display: inline-flex; align-items: center; justify-content: center;
2066
2162
  background: color-mix(in oklab, var(--accent) 18%, transparent);
2067
- color: var(--accent); border-radius: 8px; flex-shrink: 0; font-family: var(--ff-mono);
2163
+ color: var(--accent-ink); border-radius: 8px; flex-shrink: 0; font-family: var(--ff-mono);
2068
2164
  }
2069
2165
  .chat-file > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2070
2166
  .chat-file .name {
@@ -2074,7 +2170,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2074
2170
  .chat-file .meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
2075
2171
  .chat-file .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
2076
2172
  .chat-file .go { font-family: var(--ff-mono); font-size: 16px; color: var(--fg-3); flex-shrink: 0; }
2077
- .chat-file:hover .go { color: var(--accent); }
2173
+ .chat-file:hover .go { color: var(--accent-ink); }
2078
2174
 
2079
2175
  .chat-msg.you .chat-pdf,
2080
2176
  .chat-msg .chat-pdf,
@@ -2094,7 +2190,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2094
2190
  .chat-pdf-head .glyph { font-size: 18px; color: var(--mascot); flex-shrink: 0; }
2095
2191
  .chat-pdf-head .name { flex: 1; font-weight: 600; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2096
2192
  .chat-pdf-head .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
2097
- .chat-pdf-head a { color: var(--accent); font-family: var(--ff-mono); font-size: var(--fs-xs); text-decoration: none; }
2193
+ .chat-pdf-head a { color: var(--accent-ink); font-family: var(--ff-mono); font-size: var(--fs-xs); text-decoration: none; }
2098
2194
  .chat-pdf embed,
2099
2195
  .chat-pdf iframe,
2100
2196
  .chat-pdf object { width: 100%; height: 360px; border: 0; display: block; }
@@ -2131,7 +2227,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2131
2227
  .chat-meta .who::after { content: ' ·'; color: var(--fg-3); font-weight: 400; }
2132
2228
  .chat-meta .t { color: var(--fg-3); }
2133
2229
  .chat-meta .tick { color: var(--fg-3); margin-left: 2px; letter-spacing: -2px; font-family: var(--ff-mono); }
2134
- .chat-meta .tick.read { color: var(--accent); }
2230
+ .chat-meta .tick.read { color: var(--accent-ink); }
2135
2231
 
2136
2232
  .chat-reactions {
2137
2233
  display: flex; gap: 4px; flex-wrap: wrap; margin-top: 2px;
@@ -2149,11 +2245,11 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2149
2245
  .chat-reactions .rxn.you {
2150
2246
  background: color-mix(in oklab, var(--accent) 18%, var(--bg-2));
2151
2247
  border-color: color-mix(in oklab, var(--accent) 55%, transparent);
2152
- color: var(--accent);
2248
+ color: var(--accent-ink);
2153
2249
  }
2154
2250
  .chat-reactions .rxn .e { font-size: 14px; line-height: 1; }
2155
2251
  .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: 11px; color: var(--fg-2); }
2156
- .chat-reactions .rxn.you .n { color: var(--accent); }
2252
+ .chat-reactions .rxn.you .n { color: var(--accent-ink); }
2157
2253
 
2158
2254
  .chat-typing { display: inline-flex; gap: 4px; align-items: center; }
2159
2255
  .chat-typing span {
@@ -2292,7 +2388,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
2292
2388
  .app-side a:has(> .count:empty) > .count,
2293
2389
  .app-side .count:empty { display: none; }
2294
2390
  .app-side a .glyph { font-family: var(--ff-mono); font-size: 13px; font-weight: 600; color: var(--fg-3); text-align: center; }
2295
- .app-side a.active .glyph { color: var(--accent); }
2391
+ .app-side a.active .glyph { color: var(--accent-ink); }
2296
2392
 
2297
2393
  /* -- select primitive --------------------------------------------------- */
2298
2394
  .ds-select {
@@ -2476,7 +2572,7 @@ input[type="checkbox"], input[type="radio"] {
2476
2572
  .drop-zone.active {
2477
2573
  border-color: var(--accent);
2478
2574
  background: color-mix(in oklab, var(--accent) 10%, var(--bg));
2479
- color: var(--accent);
2575
+ color: var(--accent-ink);
2480
2576
  }
2481
2577
 
2482
2578
  /* List item reorder indicator */
@@ -2539,7 +2635,7 @@ input[type="checkbox"], input[type="radio"] {
2539
2635
  }
2540
2636
  .ds-context-menu-item:hover {
2541
2637
  background: var(--bg-3);
2542
- color: var(--accent);
2638
+ color: var(--accent-ink);
2543
2639
  }
2544
2640
  .ds-context-menu-item:active {
2545
2641
  background: color-mix(in oklab, var(--accent) 20%, var(--bg-3));
@@ -2631,9 +2727,13 @@ textarea::placeholder {
2631
2727
  color: var(--fg);
2632
2728
  background: var(--bg-2);
2633
2729
  border: 0;
2634
- box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
2730
+ /* Editorial field tonal fill with a printed baseline rule that thickens to
2731
+ the electric lead on focus, instead of a uniform hairline box. */
2732
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule),
2733
+ inset 0 calc(-1 * var(--bw-rule)) 0 var(--rule-strong);
2635
2734
  border-radius: var(--r-2, 10px);
2636
2735
  padding: 10px 14px;
2736
+ transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
2637
2737
  }
2638
2738
  .ds-field textarea { min-height: calc(4 * 1.5em); resize: vertical; }
2639
2739
  .ds-search-input::placeholder { color: var(--fg-3); }
@@ -2643,7 +2743,10 @@ textarea::placeholder {
2643
2743
  .ds-field .ds-select:focus-visible,
2644
2744
  .ds-search-input:focus-visible {
2645
2745
  outline: none;
2646
- box-shadow: var(--focus-ring-inset);
2746
+ background: var(--bg);
2747
+ /* Focus thickens the baseline to the lead accent — the printed-rule tell. */
2748
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule),
2749
+ inset 0 calc(-1 * var(--bw-chunk)) 0 var(--accent);
2647
2750
  }
2648
2751
  .ds-field input:disabled,
2649
2752
  .ds-field textarea:disabled,