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/app-shell.css +126 -66
- package/chat.css +136 -18
- package/colors_and_type.css +14 -9
- package/community.css +5 -1
- package/dist/247420.css +316 -103
- package/dist/247420.js +13 -13
- package/package.json +1 -1
- package/src/components/chat.js +15 -2
- package/src/components/content.js +7 -4
- package/src/components/files.js +93 -41
- package/src/components/interaction-primitives.js +7 -0
- package/src/components/sessions.js +10 -2
- package/src/components/shell.js +52 -18
- package/src/components.js +1 -1
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:
|
|
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:
|
|
105
|
+
border: var(--bw-hair) solid var(--rule);
|
|
106
106
|
color: var(--fg);
|
|
107
|
-
border-radius:
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
.
|
|
301
|
-
|
|
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
|
-
|
|
304
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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(--
|
|
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(--
|
|
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:
|
|
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
|
-
|
|
795
|
-
|
|
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); }
|
package/colors_and_type.css
CHANGED
|
@@ -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:
|
|
255
|
+
--bg-3: var(--ink-3-dark);
|
|
254
256
|
--fg: var(--paper);
|
|
255
257
|
--fg-2: var(--paper-2);
|
|
256
|
-
--fg-3:
|
|
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
|
|
284
|
-
[data-theme="ink"/"dark"] block above.
|
|
285
|
-
|
|
286
|
-
|
|
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:
|
|
295
|
+
--bg-3: var(--ink-3-dark);
|
|
292
296
|
--fg: var(--paper);
|
|
293
297
|
--fg-2: var(--paper-2);
|
|
294
|
-
--fg-3:
|
|
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
|
}
|