anentrypoint-design 0.0.211 → 0.0.213

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/chat.css CHANGED
@@ -97,17 +97,19 @@
97
97
  font: inherit;
98
98
  }
99
99
  .agentchat-cwd-btn:hover { border-color: var(--accent); }
100
- .agentchat-cwd-btn:focus-visible { outline: 2px solid var(--accent, var(--fg)); outline-offset: 2px; }
100
+ .agentchat-cwd-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
101
101
  .agentchat-cwd-input {
102
102
  flex: 1;
103
103
  min-width: 12ch;
104
104
  background: var(--bg-2);
105
- border: 1px solid var(--rule);
105
+ border: var(--bw-hair) solid var(--rule);
106
106
  color: var(--fg);
107
- border-radius: 6px;
107
+ border-radius: var(--r-1);
108
108
  padding: 4px 8px;
109
109
  font: inherit;
110
110
  }
111
+ .agentchat-cwd-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
112
+ .agentchat-cwd-input[aria-invalid='true'] { border-color: var(--flame); box-shadow: inset 0 0 0 var(--bw-hair) var(--flame); }
111
113
 
112
114
  /* head + thread */
113
115
  .agentchat-head {
@@ -268,6 +270,23 @@
268
270
  @media (prefers-reduced-motion: reduce) {
269
271
  .agentchat-working .chat-thinking-dots span { animation: none; opacity: .7; }
270
272
  }
273
+ /* Standalone thinking part (ThinkingNode renders .chat-bubble.chat-thinking with
274
+ .chat-thinking-dots + .chat-thinking-text OUTSIDE the .agentchat-working tail).
275
+ Without these base rules the dots are invisible empty spans and the text has
276
+ no muted tone. Reuse the agentchat-dot-bounce keyframe. */
277
+ .chat-thinking { display: flex; align-items: center; gap: .5em; color: var(--fg-3); font-size: var(--fs-tiny); background: none; padding: .3em .2em; }
278
+ .chat-thinking-text { color: var(--fg-3); }
279
+ .chat-thinking-dots { display: inline-flex; gap: 3px; }
280
+ .chat-thinking-dots span {
281
+ width: 5px; height: 5px; border-radius: 50%;
282
+ background: var(--fg); opacity: .4;
283
+ animation: agentchat-dot-bounce 1.2s infinite ease-in-out;
284
+ }
285
+ .chat-thinking-dots span:nth-child(2) { animation-delay: .15s; }
286
+ .chat-thinking-dots span:nth-child(3) { animation-delay: .3s; }
287
+ @media (prefers-reduced-motion: reduce) {
288
+ .chat-thinking-dots span { animation: none; opacity: .7; }
289
+ }
271
290
 
272
291
  /* Responsive: the control cluster + cwd bar must stay usable on phones/tablets.
273
292
  The cwd path can't eat the row beside its label + buttons on a narrow screen. */
@@ -295,15 +314,30 @@
295
314
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
296
315
  background: var(--fg-3); flex: 0 0 auto;
297
316
  }
298
- .status-dot-disc.status-dot-live { background: var(--accent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
299
- .status-dot-disc.status-dot-error { background: var(--flame); }
300
- .status-dot-disc.status-dot-connecting { background: var(--amber); }
301
- .status-dot-disc.status-dot-stale { background: var(--amber); }
317
+ /* Each variant carries a non-colour channel (fill vs halo vs hollow ring) so the
318
+ states stay distinguishable for colour-blind users and when stale/connecting
319
+ would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
320
+ /* One canonical stale tone (disc + word + rail share it) — a muted grey-warn,
321
+ deliberately desaturated so it is NOT the saturated --amber used by
322
+ connecting/connecting-stream (which would re-collide hues). */
323
+ :root { --stale: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
324
+ /* Live: a persistent faint concentric ring (resting shape channel, independent
325
+ of motion) with the pulse layered on top — so even at the pulse trough the
326
+ disc reads as solid-fill + ring, never a bare solid that aliases stale. */
327
+ .status-dot-disc.status-dot-live { background: var(--accent); box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent); animation: status-disc-pulse 1.8s ease-in-out infinite; }
328
+ .status-dot-disc.status-dot-error { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
329
+ .status-dot-disc.status-dot-connecting { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
330
+ /* Stale: a muted ring with a hollow centre — silhouette distinct from live's
331
+ filled disc and connecting's amber hollow ring (hue + inset core). */
332
+ .status-dot-disc.status-dot-stale { background: transparent; box-shadow: inset 0 0 0 1px var(--stale), inset 0 0 0 3px var(--bg); }
302
333
  @keyframes status-disc-pulse {
303
- 0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent); }
304
- 50% { box-shadow: 0 0 0 4px color-mix(in oklab, var(--accent) 0%, transparent); }
334
+ /* First shadow is the persistent resting ring; second is the animated halo —
335
+ the ring is always present so the trough never collapses to a bare solid. */
336
+ 0%, 100% { box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent), 0 0 0 2px color-mix(in oklab, var(--accent) 55%, transparent); }
337
+ 50% { box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 30%, transparent), 0 0 0 6px color-mix(in oklab, var(--accent) 0%, transparent); }
305
338
  }
306
339
  @media (prefers-reduced-motion: reduce) {
340
+ /* The base rule already carries the persistent ring; just stop the pulse. */
307
341
  .status-dot-disc.status-dot-live { animation: none; }
308
342
  }
309
343
 
@@ -367,7 +401,9 @@
367
401
  .ds-session-sub { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
368
402
  .ds-session-meta { display: flex; align-items: center; gap: var(--space-2); flex: 0 0 auto; }
369
403
  .ds-session-agent { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); }
370
- .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: inline-block; }
404
+ /* New-activity cue is a hollow accent RING so it stays shape-distinct from the
405
+ running live disc (a solid pulsing accent dot) for colour-blind / reduced-motion users. */
406
+ .ds-session-unread { width: 8px; height: 8px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 2px var(--accent); display: inline-block; }
371
407
  .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
372
408
  .ds-session-state-error { color: var(--flame); }
373
409
 
@@ -397,13 +433,15 @@
397
433
  .ds-dash-card.is-error { border-color: var(--flame); }
398
434
  .ds-dash-card-head { display: flex; align-items: center; gap: var(--space-2); }
399
435
  .ds-dash-status { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
400
- .ds-dash-status.is-running { color: var(--green); }
436
+ /* running tone unified on --accent (the later is-running rule + the live disc all
437
+ use --accent); the dead var(--green) duplicate that lived here was removed. */
401
438
  .ds-dash-status.is-error { color: var(--flame); }
402
439
  .ds-dash-agent { font-size: var(--fs-body); font-weight: 600; color: var(--fg); }
403
440
  .ds-dash-model { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); margin-left: auto; }
404
441
  .ds-dash-meta { display: flex; flex-direction: column; gap: 2px; }
405
442
  .ds-dash-cwd { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
406
443
  .ds-dash-stat { font-family: var(--ff-mono); font-size: var(--fs-tiny); color: var(--fg-2); }
444
+ .ds-dash-stat-cost { color: var(--fg); font-weight: 600; }
407
445
  .ds-dash-activity { font-size: var(--fs-tiny); color: var(--fg-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
408
446
  .ds-dash-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
409
447
  .ds-dash-state { padding: var(--space-6) var(--space-4); text-align: center; color: var(--fg-3); font-size: var(--fs-body); }
@@ -450,6 +488,13 @@
450
488
  /* --- B1: streaming pre shell — monospaced bubble while a fenced block streams,
451
489
  so it does not reflow prose->block on settle. --- */
452
490
  .chat-stream-pre pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: var(--ff-mono); font-size: var(--fs-sm); }
491
+ /* Persistent minimal chrome so a fenced block does not pop a border + lang tab +
492
+ copy button only on settle - the streaming slab already reads as a code block. */
493
+ .chat-stream-pre { position: relative; }
494
+ .chat-stream-pre pre {
495
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
496
+ padding: var(--space-3); background: color-mix(in oklab, var(--fg) 4%, transparent);
497
+ }
453
498
 
454
499
  /* --- A5: composer context line (agent / model / cwd at point of typing). --- */
455
500
  .chat-composer-context {
@@ -460,18 +505,27 @@
460
505
  }
461
506
  button.chat-composer-context { cursor: pointer; }
462
507
  button.chat-composer-context:hover { color: var(--fg-2); }
463
- button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
508
+ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
464
509
 
465
510
  /* Composer send/cancel button row: a non-wrapping cluster pinned to the
466
511
  bottom-right of the flex-end composer (was unstyled, so the send button
467
512
  could wrap below the textarea instead of anchoring like claude.ai/code). */
468
513
  .chat-composer-toolbar { display: flex; align-items: center; gap: var(--space-1); flex: 0 0 auto; margin-left: auto; align-self: flex-end; }
514
+ /* Unify the toolbar cluster on one 32px / --r-1 square metric (the round 40px
515
+ ghost buttons + 36px square send read as two button systems; the kit moved
516
+ .btn* off --r-pill). chat.css loads after app-shell.css so this wins by order. */
517
+ .chat-composer-toolbar .composer-btn,
518
+ .chat-composer-toolbar .send { width: 32px; height: 32px; border-radius: var(--r-1); }
519
+ @media (pointer: coarse) {
520
+ .chat-composer-toolbar .composer-btn,
521
+ .chat-composer-toolbar .send { width: 44px; height: 44px; }
522
+ }
469
523
 
470
524
  /* --- B2: follow-up chips below the last settled assistant turn. --- */
471
525
  .agentchat-followups { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-2) var(--space-3); }
472
526
 
473
527
  /* --- C1: stale/idle dashboard status (static, NOT pulsing). --- */
474
- .ds-dash-status.is-stale { color: var(--amber); }
528
+ .ds-dash-status.is-stale { color: var(--stale); }
475
529
  .ds-dash-status.is-running { color: var(--accent); }
476
530
 
477
531
  /* --- C2: dashboard sort/filter toolbar + stream-state line. --- */
@@ -515,7 +569,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
515
569
  /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
516
570
  agent is flagged in a dense grid, not merely faded near-invisibly. The word
517
571
  'idle' co-carries state, so this stays colour-blind safe. */
518
- .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber); }
572
+ .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--stale); }
519
573
 
520
574
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
521
575
 
@@ -625,7 +679,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
625
679
  font: inherit; color: inherit; text-decoration: underline dotted;
626
680
  }
627
681
  .chat-composer-context-bit:hover { color: var(--fg-2); }
628
- .chat-composer-context-bit:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
682
+ .chat-composer-context-bit:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
629
683
  @media (pointer: coarse) {
630
684
  .chat-composer-context-bit { min-height: 44px; }
631
685
  }
@@ -704,10 +758,44 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
704
758
  .chat-msg-flat.you .chat-role { color: var(--accent); }
705
759
  .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
706
760
  .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
761
+ /* Flat user turns reset their bubble to transparent, but the messenger rule
762
+ (.chat-msg.you .chat-bubble code) tints inline code on --accent-fg, which is
763
+ invisible/wrong on the bare page surface. Reset to the neutral fg-10% tint the
764
+ sibling assistant turns get (wins over app-shell.css by later source order). */
765
+ .chat-msg-flat.you .chat-bubble code { background: color-mix(in oklab, var(--fg) 10%, transparent); }
766
+ /* Flat turns strip the bubble padding, so the role label sat 4px above the first
767
+ paragraph and the .them tint hugged text flush. Restore reading rhythm + give
768
+ the tinted assistant row inner breathing room so it reads as a card. */
769
+ .chat-msg-flat .chat-role { margin-bottom: var(--space-2); }
770
+ .chat-msg-flat .chat-md { line-height: 1.65; }
771
+ .chat-msg-flat .chat-md p { margin: 8px 0; }
772
+ .chat-msg-flat.them { padding-block: calc(var(--space-3) * var(--density, 1) + 2px); }
773
+ /* Inline backtick code (renderInline tags <code class=chat-tick>) - was a dead
774
+ class relying on the generic .chat-bubble code rule, so notices / non-bubble
775
+ surfaces got unstyled monospace. Self-style it regardless of container. */
776
+ .chat-tick { font-family: var(--ff-mono); font-size: .92em; background: color-mix(in oklab, var(--fg) 10%, transparent); padding: 1px 6px; border-radius: var(--r-1); }
777
+ /* Structured tool/code output earns more width than running prose (claude.ai/code
778
+ lets diffs/tables break out wider than the reading measure). A flat turn that
779
+ contains a tool card or code block widens itself AND its stack past --measure;
780
+ prose-only turns stay clamped. */
781
+ .chat-msg-flat:has(.chat-tool),
782
+ .chat-msg-flat:has(.chat-bubble.chat-code) { max-width: calc(var(--measure) + 14ch); }
783
+ .chat-msg-flat:has(.chat-tool) .chat-stack,
784
+ .chat-msg-flat:has(.chat-bubble.chat-code) .chat-stack { max-width: calc(var(--measure) + 14ch); }
707
785
  /* Hover tint exceeds each role's REST tint so the row gives feedback (and the
708
786
  ladder stays monotonic): assistant 5% > its 3% rest; user 4% > transparent. */
709
787
  .chat-msg-flat.them:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
710
788
  .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 4%, transparent); }
789
+ /* A turn whose only assistant content is a bordered tool card or code block
790
+ already carries its own --bg surface + rule border; the turn-level .them tint
791
+ would stack a second, wider-than-measure surface behind it. Suppress it so the
792
+ card is the single surface (claude.ai/code keeps tool cards on bare canvas).
793
+ Selectors mirror the breakout pair above so suppression + widening always
794
+ cover the same turns. */
795
+ .chat-msg-flat.them:has(.chat-tool),
796
+ .chat-msg-flat.them:has(.chat-bubble.chat-code),
797
+ .chat-msg-flat.them:has(.chat-tool):hover,
798
+ .chat-msg-flat.them:has(.chat-bubble.chat-code):hover { background: none; }
711
799
  .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
712
800
  .chat-msg-flat .chat-avatar { display: none; }
713
801
 
@@ -746,7 +834,9 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
746
834
  .chat-msg .chat-tool.tool-done .chat-tool-status { color: var(--success); background: color-mix(in oklab, var(--success) 12%, transparent); }
747
835
  .chat-tool-body { border-top: var(--bw-hair) solid var(--rule); padding: var(--space-2) var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); }
748
836
  .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
749
- .chat-tool-section-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
837
+ .chat-tool-section-label { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); }
838
+ .chat-tool-copy { position: static; opacity: 0; }
839
+ .chat-tool-section:hover .chat-tool-copy, .chat-tool-section:focus-within .chat-tool-copy { opacity: 1; }
750
840
  .chat-tool-pre { margin: 0; padding: var(--space-2); background: var(--bg-2); border-radius: var(--r-1); font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.45; overflow-x: auto; max-height: 320px; overflow-y: auto; }
751
841
  .chat-tool-pre.is-error { color: var(--flame); }
752
842
  .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
@@ -782,6 +872,11 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
782
872
  accent), placed last so its inset bar wins source order over is-active/is-stale.
783
873
  The full-perimeter border-color (line ~396) stays for extra severity emphasis. */
784
874
  .ds-dash-card.is-error { box-shadow: inset 2px 0 0 var(--flame); }
875
+ /* A newly-arrived AND errored card: keep the LEFT inset bar flame (severity
876
+ precedence, never accent) while restoring the is-new arrival outline as a
877
+ full-perimeter accent glow that does not collide with the flame bar. Placed
878
+ after both is-new and is-error so it wins source order. */
879
+ .ds-dash-card.is-new.is-error { box-shadow: inset 2px 0 0 var(--flame), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
785
880
  @media (prefers-reduced-motion: no-preference) {
786
881
  .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
787
882
  }
@@ -791,9 +886,17 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
791
886
  .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
792
887
  .ds-dash-group-label { font-size: var(--fs-tiny); font-weight: 600; text-transform: uppercase; letter-spacing: var(--tr-caps); color: var(--fg-3); padding: 0 var(--space-1); }
793
888
  .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
794
- .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
795
- .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
889
+ /* Shape-channel discs mirror the .status-dot-disc vocabulary (solid /
890
+ solid+halo / hollow ring) so a colour-blind user can scan the breakdown by
891
+ shape, not hue alone. CSS-drawn discs, not glyphs (glyph policy clean). */
892
+ .ds-dash-breakdown .seg { display: inline-flex; align-items: center; gap: var(--space-1); font-weight: 600; }
893
+ .ds-dash-breakdown .seg::before { content: ''; width: 7px; height: 7px; border-radius: 50%; flex: none; }
894
+ .ds-dash-breakdown .seg.is-running { color: var(--accent); }
895
+ .ds-dash-breakdown .seg.is-running::before { background: var(--accent); }
896
+ .ds-dash-breakdown .seg.is-error { color: var(--flame); }
897
+ .ds-dash-breakdown .seg.is-error::before { background: var(--flame); box-shadow: 0 0 0 1.5px color-mix(in oklab, var(--flame) 38%, transparent); }
796
898
  .ds-dash-breakdown .seg.is-idle { color: var(--amber); }
899
+ .ds-dash-breakdown .seg.is-idle::before { background: transparent; box-shadow: inset 0 0 0 2px var(--amber); }
797
900
  .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
798
901
  .ds-dash-selectall { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--fs-tiny); color: var(--fg-2); cursor: pointer; background: none; border: none; padding: var(--space-1); }
799
902
  .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
@@ -865,3 +968,18 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
865
968
  @media (min-width: 1600px) {
866
969
  .agentchat-thread { --measure: 84ch; }
867
970
  }
971
+
972
+ /* Stop/cancel composer control: re-tone the accent send button as a quiet
973
+ neutral control so 'stop generating' reads as distinct from accent send.
974
+ Flame/warn stay reserved (flame=error STATUS, warn=destructive ACTION); a
975
+ neutral quiet tone is the claude-code-aligned read for an in-flight stop. */
976
+ .chat-composer .send.cancel {
977
+ background: var(--bg-3);
978
+ color: var(--fg);
979
+ box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule-strong, var(--rule));
980
+ }
981
+ .chat-composer .send.cancel:hover {
982
+ background: color-mix(in oklab, var(--fg) 8%, var(--bg-3));
983
+ filter: none;
984
+ }
985
+ .chat-composer .send.cancel:active { filter: brightness(0.96); }
@@ -18,6 +18,8 @@
18
18
  --ink: #131318;
19
19
  --ink-2: #25252C;
20
20
  --ink-3: #54545A; /* WCAG AAA on --paper (~7.1:1); was #6A6A70 (AA only) */
21
+ --ink-3-dark: #464650; /* dark theme bg-3 (tier-3 surface) */
22
+ --paper-3-dark: #B4B4BC; /* dark theme fg-3 (tier-3 text) */
21
23
 
22
24
  /* Lore palette */
23
25
  --green: #247420;
@@ -250,10 +252,10 @@ select:focus-visible {
250
252
  color-scheme: dark;
251
253
  --bg: var(--ink);
252
254
  --bg-2: var(--ink-2);
253
- --bg-3: #464650;
255
+ --bg-3: var(--ink-3-dark);
254
256
  --fg: var(--paper);
255
257
  --fg-2: var(--paper-2);
256
- --fg-3: #B4B4BC;
258
+ --fg-3: var(--paper-3-dark);
257
259
  --panel-bg: var(--bg);
258
260
  --panel-bg-2: var(--bg-2);
259
261
  --panel-0: var(--bg);
@@ -280,18 +282,20 @@ select:focus-visible {
280
282
  --code-num: var(--sun);
281
283
  }
282
284
 
283
- /* NOTE: the [data-theme="auto"] block below intentionally duplicates the
284
- [data-theme="ink"/"dark"] block above. They are NOT literally identical —
285
- the explicit-dark block also overrides --danger for contrast so they are
286
- kept separate rather than consolidated to avoid a behavior change. */
285
+ /* NOTE: the [data-theme="auto"] block below mirrors the
286
+ [data-theme="ink"/"dark"] block above token-for-token. 'auto + OS-dark' and
287
+ 'explicit dark' are the same visual context and resolve every token
288
+ including --danger identically. The two are kept as separate selectors
289
+ only because one is media-gated; a future de-drift can consolidate them into
290
+ a shared selector list once a build step can hoist the media query. */
287
291
  @media (prefers-color-scheme: dark) {
288
292
  [data-theme="auto"] {
289
293
  --bg: var(--ink);
290
294
  --bg-2: var(--ink-2);
291
- --bg-3: #464650;
295
+ --bg-3: var(--ink-3-dark);
292
296
  --fg: var(--paper);
293
297
  --fg-2: var(--paper-2);
294
- --fg-3: #B4B4BC;
298
+ --fg-3: var(--paper-3-dark);
295
299
  --panel-bg: var(--bg);
296
300
  --panel-bg-2: var(--bg-2);
297
301
  --panel-0: var(--bg);
@@ -304,6 +308,7 @@ select:focus-visible {
304
308
  --accent: var(--accent-bright, var(--green-2));
305
309
  --accent-fg: var(--ink);
306
310
  --accent-bright: var(--green-2);
311
+ --danger: oklch(0.68 0.19 25);
307
312
  --flame: #FF5A1F;
308
313
  --amber: #D9A93A;
309
314
  --warn: #FF5A52;
@@ -373,7 +378,7 @@ select:focus-visible {
373
378
  --fg: var(--ink); --fg-2: var(--ink-2); --fg-3: var(--ink-3);
374
379
  --accent: var(--green); --accent-fg: var(--paper);
375
380
  /* A paper island under a dark ancestor must not inherit the dark signal pair. */
376
- --flame: #C53E00; --amber: #8A6512;
381
+ --flame: #C53E00; --amber: #8A6512; --warn: #E0241A; --sky: #3A6EFF;
377
382
  }
378
383
 
379
384
  /* thebird — warm-paper brand preset. A first-class swappable theme: it lives
package/community.css CHANGED
@@ -1166,7 +1166,11 @@
1166
1166
  .cm-vs-btn,
1167
1167
  .cm-user-btn,
1168
1168
  .cm-ch-spinner,
1169
- .cm-ch-voice-badge {
1169
+ .cm-ch-voice-badge,
1170
+ .vx-ptt,
1171
+ .vx-ptt-glow,
1172
+ .vx-vad-meter,
1173
+ .vx-vad-fill {
1170
1174
  transition: none !important;
1171
1175
  animation: none !important;
1172
1176
  }