anentrypoint-design 0.0.206 → 0.0.207

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
@@ -464,7 +464,10 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
464
464
  /* --- C5: active dashboard card (current conversation). --- */
465
465
  .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
466
466
  .ds-dash-card.is-selected { background: var(--accent-tint); }
467
- .ds-dash-card.is-stale { opacity: .92; }
467
+ /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
468
+ agent is flagged in a dense grid, not merely faded near-invisibly. The word
469
+ 'idle' co-carries state, so this stays colour-blind safe. */
470
+ .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
468
471
 
469
472
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
470
473
 
@@ -550,7 +553,7 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
550
553
  /* Enter-to-send hint: visible while the composer is focused or carries a
551
554
  draft; hidden under 420px to save rows. */
552
555
  .chat-composer-hint {
553
- display: none; padding: 2px var(--space-3) 0;
556
+ display: none; width: 100%; order: 5; padding: 2px var(--space-1) 0;
554
557
  font-size: var(--fs-micro); color: var(--fg-3);
555
558
  }
556
559
  .chat-composer:focus-within .chat-composer-hint,
@@ -632,3 +635,137 @@ button.chat-composer-context:focus-visible { outline: 2px solid var(--accent); o
632
635
 
633
636
  /* One connection vocabulary: offline (is-lost kept as legacy alias). */
634
637
  .ds-dash-stream.is-offline { color: var(--flame); }
638
+
639
+ /* ============================================================
640
+ 10th run - Claude-Code-web design-language parity
641
+ ============================================================ */
642
+
643
+ /* Flat full-width chat turns (claude.ai/code), replacing the messenger
644
+ avatar-disc + colored-bubble layout. AgentChat passes flat:true; the demo
645
+ Chat keeps the bubble layout. Turns are full-width to --measure; the user vs
646
+ assistant distinction is a role label + a faint assistant background. */
647
+ .chat-msg-flat { display: block; padding: var(--space-3) var(--space-4); margin: 0; background: none; border-radius: var(--r-2); }
648
+ .chat-msg-flat.them { background: color-mix(in oklab, var(--fg) 3%, transparent); }
649
+ .chat-msg-flat.you { background: none; }
650
+ .chat-msg-flat .chat-stack { max-width: var(--measure); width: 100%; margin: 0; align-items: stretch; }
651
+ .chat-msg-flat.you .chat-stack { align-items: stretch; }
652
+ .chat-role { font-size: var(--fs-tiny); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); margin-bottom: var(--space-1); }
653
+ .chat-msg-flat.you .chat-role { color: var(--accent); }
654
+ .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
655
+ .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
656
+ .chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
657
+ .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
658
+ .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
659
+ .chat-msg-flat .chat-avatar { display: none; }
660
+
661
+ /* Tool-call card: a bordered, status-toned, scannable card (claude.ai/code),
662
+ not the raw mascot-tinted details dump. The node keeps the .chat-bubble
663
+ class, so these rules de-frame it and restyle. Placed after the flat-bubble
664
+ reset so they win on equal specificity. */
665
+ .chat-msg .chat-tool {
666
+ display: block; max-width: 100%; padding: 0; margin: var(--space-1) 0;
667
+ background: var(--bg); color: var(--fg);
668
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
669
+ box-shadow: none; overflow: hidden;
670
+ }
671
+ .chat-msg .chat-tool[open] { background: var(--bg); }
672
+ .chat-msg .chat-tool .chat-tool-head {
673
+ display: flex; align-items: center; gap: var(--space-2);
674
+ padding: var(--space-2) var(--space-3); cursor: pointer;
675
+ font-size: var(--fs-sm); list-style: none;
676
+ }
677
+ .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
678
+ .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
679
+ .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
680
+ .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
681
+ .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
682
+ .chat-tool-status {
683
+ margin-left: auto; flex: 0 0 auto;
684
+ font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
685
+ color: var(--fg-3);
686
+ padding: 2px var(--space-2); border-radius: var(--r-pill);
687
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
688
+ }
689
+ .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
690
+ .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
691
+ .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); }
692
+ .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
693
+ .chat-tool-section-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-3); }
694
+ .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; }
695
+ .chat-tool-pre.is-error { color: var(--flame); }
696
+ .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
697
+
698
+ /* Fenced-code language tab on every rendered-markdown block (not just the
699
+ structured CodeNode). injectCodeCopy reads the language- class. */
700
+ .chat-code-block { position: relative; }
701
+ .chat-code-lang {
702
+ position: absolute; top: 0; left: 0; z-index: 2;
703
+ padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
704
+ font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: .04em;
705
+ color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
706
+ pointer-events: none;
707
+ }
708
+ .chat-code-block pre { padding-top: calc(var(--space-3) + 4px); }
709
+
710
+ /* Motion + microinteraction polish (all reduced-motion guarded). */
711
+ .ds-session-row { transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease); }
712
+ @media (prefers-reduced-motion: no-preference) {
713
+ .agentchat-thread { scroll-behavior: smooth; }
714
+ .ds-alert { animation: ds-alert-in var(--dur-base) var(--ease); }
715
+ }
716
+ @keyframes ds-alert-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
717
+ .chat-code-copy { transition: opacity var(--dur-snap, .12s) var(--ease, ease), color var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease); }
718
+ .chat-msg-action { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
719
+ .agentchat-install-copy { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
720
+ @media (prefers-reduced-motion: no-preference) {
721
+ .btn.is-armed, .btn-primary.is-armed { animation: ds-arm-pulse var(--dur-slow) var(--ease); }
722
+ }
723
+ @keyframes ds-arm-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 55%, transparent); } 100% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); } }
724
+ .ds-dash-card.is-new { box-shadow: inset 2px 0 0 var(--accent), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
725
+ @media (prefers-reduced-motion: no-preference) {
726
+ .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
727
+ }
728
+ @keyframes ds-card-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
729
+
730
+ /* Live command-center: status-bucket groups + header breakdown + heartbeat. */
731
+ .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
732
+ .ds-dash-group-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); padding: 0 var(--space-1); }
733
+ .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
734
+ .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
735
+ .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
736
+ .ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
737
+ .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
738
+ .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); }
739
+ .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
740
+ .ds-dash-clear { background: none; border: none; color: var(--fg-3); cursor: pointer; font-size: var(--fs-tiny); text-decoration: underline dotted; padding: var(--space-1); }
741
+
742
+ /* Conversation-rail loading skeleton (cold ccsniff walk). */
743
+ .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
744
+ .ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
745
+ .ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
746
+ .ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
747
+ @media (prefers-reduced-motion: no-preference) {
748
+ .ds-session-row-skeleton .ds-skel { animation: ds-skel-shimmer 1.3s ease-in-out infinite; background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%); background-size: 200% 100%; }
749
+ }
750
+ @keyframes ds-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
751
+
752
+ /* File code preview: paint Prism tokens (the bundle scoped them to the chat
753
+ block only) + an optional non-selectable line-number gutter. */
754
+ .ds-preview-code code { color: var(--fg); }
755
+ .ds-preview-code .token.comment, .ds-preview-code .token.prolog, .ds-preview-code .token.doctype, .ds-preview-code .token.cdata { color: var(--fg-3); }
756
+ .ds-preview-code .token.punctuation { color: var(--fg-2); }
757
+ .ds-preview-code .token.property, .ds-preview-code .token.tag, .ds-preview-code .token.boolean, .ds-preview-code .token.number, .ds-preview-code .token.constant, .ds-preview-code .token.symbol { color: var(--purple-2, #7F18A4); }
758
+ .ds-preview-code .token.selector, .ds-preview-code .token.attr-name, .ds-preview-code .token.string, .ds-preview-code .token.char, .ds-preview-code .token.builtin { color: var(--green-2, #3A9A34); }
759
+ .ds-preview-code .token.atrule, .ds-preview-code .token.attr-value, .ds-preview-code .token.keyword { color: var(--sky, #3A6EFF); }
760
+ .ds-preview-code .token.function, .ds-preview-code .token.class-name { color: var(--flame); }
761
+ .ds-preview-code.has-gutter { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-2); }
762
+ .ds-preview-code.has-gutter code { display: block; min-width: 0; overflow-x: auto; }
763
+ .ds-preview-gutter { user-select: none; text-align: right; padding: 0 var(--space-2) 0 0; color: var(--fg-3); border-right: var(--bw-hair) solid var(--rule); font-family: var(--ff-mono); white-space: pre; line-height: inherit; }
764
+
765
+ /* Image preview: fit/actual control + alpha checkerboard. */
766
+ .ds-preview-media-controls { display: flex; gap: var(--space-2); padding: var(--space-2); justify-content: center; }
767
+ .ds-preview-media-alpha {
768
+ background-image: linear-gradient(45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(-45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--bg-3) 75%), linear-gradient(-45deg, transparent 75%, var(--bg-3) 75%);
769
+ background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
770
+ }
771
+ .ds-preview-media.is-actual { max-width: none; max-height: none; }
package/dist/247420.css CHANGED
@@ -5422,7 +5422,10 @@
5422
5422
  /* --- C5: active dashboard card (current conversation). --- */
5423
5423
  .ds-247420 .ds-dash-card.is-active { box-shadow: inset 2px 0 0 var(--accent); }
5424
5424
  .ds-247420 .ds-dash-card.is-selected { background: var(--accent-tint); }
5425
- .ds-247420 .ds-dash-card.is-stale { opacity: .92; }
5425
+ /* Stale/idle card: a positive amber inset bar (mirrors is-active) so a stuck
5426
+ agent is flagged in a dense grid, not merely faded near-invisibly. The word
5427
+ 'idle' co-carries state, so this stays colour-blind safe. */
5428
+ .ds-247420 .ds-dash-card.is-stale { box-shadow: inset 2px 0 0 var(--amber, #d9a93a); }
5426
5429
 
5427
5430
  /* --- H3: dashboard live disc pulses; stale/error do not (handled by H1). --- */
5428
5431
 
@@ -5508,7 +5511,7 @@
5508
5511
  /* Enter-to-send hint: visible while the composer is focused or carries a
5509
5512
  draft; hidden under 420px to save rows. */
5510
5513
  .ds-247420 .chat-composer-hint {
5511
- display: none; padding: 2px var(--space-3) 0;
5514
+ display: none; width: 100%; order: 5; padding: 2px var(--space-1) 0;
5512
5515
  font-size: var(--fs-micro); color: var(--fg-3);
5513
5516
  }
5514
5517
  .ds-247420 .chat-composer:focus-within .chat-composer-hint,
@@ -5591,6 +5594,140 @@
5591
5594
  /* One connection vocabulary: offline (is-lost kept as legacy alias). */
5592
5595
  .ds-247420 .ds-dash-stream.is-offline { color: var(--flame); }
5593
5596
 
5597
+ /* ============================================================
5598
+ 10th run - Claude-Code-web design-language parity
5599
+ ============================================================ */
5600
+
5601
+ /* Flat full-width chat turns (claude.ai/code), replacing the messenger
5602
+ avatar-disc + colored-bubble layout. AgentChat passes flat:true; the demo
5603
+ Chat keeps the bubble layout. Turns are full-width to --measure; the user vs
5604
+ assistant distinction is a role label + a faint assistant background. */
5605
+ .ds-247420 .chat-msg-flat { display: block; padding: var(--space-3) var(--space-4); margin: 0; background: none; border-radius: var(--r-2); }
5606
+ .ds-247420 .chat-msg-flat.them { background: color-mix(in oklab, var(--fg) 3%, transparent); }
5607
+ .ds-247420 .chat-msg-flat.you { background: none; }
5608
+ .ds-247420 .chat-msg-flat .chat-stack { max-width: var(--measure); width: 100%; margin: 0; align-items: stretch; }
5609
+ .ds-247420 .chat-msg-flat.you .chat-stack { align-items: stretch; }
5610
+ .ds-247420 .chat-role { font-size: var(--fs-tiny); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); margin-bottom: var(--space-1); }
5611
+ .ds-247420 .chat-msg-flat.you .chat-role { color: var(--accent); }
5612
+ .ds-247420 .chat-msg-flat .chat-bubble { background: none; border: none; border-radius: 0; padding: 0; max-width: 100%; box-shadow: none; transform: none; }
5613
+ .ds-247420 .chat-msg-flat.you .chat-bubble { background: none; color: inherit; }
5614
+ .ds-247420 .chat-msg-flat:hover { background: color-mix(in oklab, var(--fg) 3%, transparent); }
5615
+ .ds-247420 .chat-msg-flat.you:hover { background: color-mix(in oklab, var(--fg) 2%, transparent); }
5616
+ .ds-247420 .chat-msg-flat:hover .chat-bubble { transform: none; box-shadow: none; background: none; }
5617
+ .ds-247420 .chat-msg-flat .chat-avatar { display: none; }
5618
+
5619
+ /* Tool-call card: a bordered, status-toned, scannable card (claude.ai/code),
5620
+ not the raw mascot-tinted details dump. The node keeps the .chat-bubble
5621
+ class, so these rules de-frame it and restyle. Placed after the flat-bubble
5622
+ reset so they win on equal specificity. */
5623
+ .ds-247420 .chat-msg .chat-tool {
5624
+ display: block; max-width: 100%; padding: 0; margin: var(--space-1) 0;
5625
+ background: var(--bg); color: var(--fg);
5626
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
5627
+ box-shadow: none; overflow: hidden;
5628
+ }
5629
+ .ds-247420 .chat-msg .chat-tool[open] { background: var(--bg); }
5630
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head {
5631
+ display: flex; align-items: center; gap: var(--space-2);
5632
+ padding: var(--space-2) var(--space-3); cursor: pointer;
5633
+ font-size: var(--fs-sm); list-style: none;
5634
+ }
5635
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head::-webkit-details-marker { display: none; }
5636
+ .ds-247420 .chat-msg .chat-tool .chat-tool-head:hover { background: var(--bg-2); }
5637
+ .ds-247420 .chat-tool-icon { display: inline-flex; color: var(--fg-3); }
5638
+ .ds-247420 .chat-tool-name { font-family: var(--ff-mono); font-weight: 600; color: var(--fg); }
5639
+ .ds-247420 .chat-tool-label { color: var(--fg-3); font-size: var(--fs-tiny); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
5640
+ .ds-247420 .chat-tool-status {
5641
+ margin-left: auto; flex: 0 0 auto;
5642
+ font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
5643
+ color: var(--fg-3);
5644
+ padding: 2px var(--space-2); border-radius: var(--r-pill);
5645
+ background: color-mix(in oklab, var(--fg) 6%, transparent);
5646
+ }
5647
+ .ds-247420 .chat-msg .chat-tool.tool-running .chat-tool-status { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
5648
+ .ds-247420 .chat-msg .chat-tool.tool-error .chat-tool-status { color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent); }
5649
+ .ds-247420 .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); }
5650
+ .ds-247420 .chat-tool-section { display: flex; flex-direction: column; gap: var(--space-1); }
5651
+ .ds-247420 .chat-tool-section-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-3); }
5652
+ .ds-247420 .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; }
5653
+ .ds-247420 .chat-tool-pre.is-error { color: var(--flame); }
5654
+ .ds-247420 .chat-tool-pre.chat-tool-empty { color: var(--fg-3); }
5655
+
5656
+ /* Fenced-code language tab on every rendered-markdown block (not just the
5657
+ structured CodeNode). injectCodeCopy reads the language- class. */
5658
+ .ds-247420 .chat-code-block { position: relative; }
5659
+ .ds-247420 .chat-code-lang {
5660
+ position: absolute; top: 0; left: 0; z-index: 2;
5661
+ padding: 2px var(--space-2); border-bottom-right-radius: var(--r-1);
5662
+ font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: .04em;
5663
+ color: var(--fg-3); background: color-mix(in oklab, var(--fg) 6%, transparent);
5664
+ pointer-events: none;
5665
+ }
5666
+ .ds-247420 .chat-code-block pre { padding-top: calc(var(--space-3) + 4px); }
5667
+
5668
+ /* Motion + microinteraction polish (all reduced-motion guarded). */
5669
+ .ds-247420 .ds-session-row { transition: background var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease); }
5670
+ @media (prefers-reduced-motion: no-preference) {
5671
+ .ds-247420 .agentchat-thread { scroll-behavior: smooth; }
5672
+ .ds-247420 .ds-alert { animation: ds-alert-in var(--dur-base) var(--ease); }
5673
+ }
5674
+ @keyframes ds-alert-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
5675
+ .ds-247420 .chat-code-copy { transition: opacity var(--dur-snap, .12s) var(--ease, ease), color var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease); }
5676
+ .ds-247420 .chat-msg-action { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
5677
+ .ds-247420 .agentchat-install-copy { transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease); }
5678
+ @media (prefers-reduced-motion: no-preference) {
5679
+ .ds-247420 .btn.is-armed, .ds-247420 .btn-primary.is-armed { animation: ds-arm-pulse var(--dur-slow) var(--ease); }
5680
+ }
5681
+ @keyframes ds-arm-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in oklab, var(--warn) 55%, transparent); } 100% { box-shadow: 0 0 0 6px color-mix(in oklab, var(--warn) 0%, transparent); } }
5682
+ .ds-247420 .ds-dash-card.is-new { box-shadow: inset 2px 0 0 var(--accent), 0 0 0 1px color-mix(in oklab, var(--accent) 40%, transparent); }
5683
+ @media (prefers-reduced-motion: no-preference) {
5684
+ .ds-247420 .ds-dash-card.is-new { animation: ds-card-in var(--dur-slow) var(--ease); }
5685
+ }
5686
+ @keyframes ds-card-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
5687
+
5688
+ /* Live command-center: status-bucket groups + header breakdown + heartbeat. */
5689
+ .ds-247420 .ds-dash-group { display: flex; flex-direction: column; gap: var(--space-2); }
5690
+ .ds-247420 .ds-dash-group-label { font-size: var(--fs-micro); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--fg-3); padding: 0 var(--space-1); }
5691
+ .ds-247420 .ds-dash-breakdown { display: flex; align-items: center; gap: var(--space-1); font-size: var(--fs-sm); color: var(--fg-2); }
5692
+ .ds-247420 .ds-dash-breakdown .seg.is-running { color: var(--green); font-weight: 600; }
5693
+ .ds-247420 .ds-dash-breakdown .seg.is-error { color: var(--flame); font-weight: 600; }
5694
+ .ds-247420 .ds-dash-breakdown .seg.is-idle { color: var(--amber, #d9a93a); }
5695
+ .ds-247420 .ds-dash-stream-disc { display: inline-flex; align-items: center; gap: var(--space-1); }
5696
+ .ds-247420 .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); }
5697
+ .ds-247420 .ds-dash-selectall:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
5698
+ .ds-247420 .ds-dash-clear { background: none; border: none; color: var(--fg-3); cursor: pointer; font-size: var(--fs-tiny); text-decoration: underline dotted; padding: var(--space-1); }
5699
+
5700
+ /* Conversation-rail loading skeleton (cold ccsniff walk). */
5701
+ .ds-247420 .ds-session-row-skeleton { display: flex; flex-direction: column; gap: 6px; padding: var(--space-2) var(--space-3); }
5702
+ .ds-247420 .ds-session-row-skeleton .ds-skel { background: var(--bg-3); border-radius: var(--r-1); }
5703
+ .ds-247420 .ds-session-row-skeleton .ds-skel-title { height: 12px; width: 70%; }
5704
+ .ds-247420 .ds-session-row-skeleton .ds-skel-meta { height: 9px; width: 45%; }
5705
+ @media (prefers-reduced-motion: no-preference) {
5706
+ .ds-247420 .ds-session-row-skeleton .ds-skel { animation: ds-skel-shimmer 1.3s ease-in-out infinite; background: linear-gradient(90deg, var(--bg-3) 0%, var(--bg-2) 50%, var(--bg-3) 100%); background-size: 200% 100%; }
5707
+ }
5708
+ @keyframes ds-skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
5709
+
5710
+ /* File code preview: paint Prism tokens (the bundle scoped them to the chat
5711
+ block only) + an optional non-selectable line-number gutter. */
5712
+ .ds-247420 .ds-preview-code code { color: var(--fg); }
5713
+ .ds-247420 .ds-preview-code .token.comment, .ds-247420 .ds-preview-code .token.prolog, .ds-247420 .ds-preview-code .token.doctype, .ds-247420 .ds-preview-code .token.cdata { color: var(--fg-3); }
5714
+ .ds-247420 .ds-preview-code .token.punctuation { color: var(--fg-2); }
5715
+ .ds-247420 .ds-preview-code .token.property, .ds-247420 .ds-preview-code .token.tag, .ds-247420 .ds-preview-code .token.boolean, .ds-247420 .ds-preview-code .token.number, .ds-247420 .ds-preview-code .token.constant, .ds-247420 .ds-preview-code .token.symbol { color: var(--purple-2, #7F18A4); }
5716
+ .ds-247420 .ds-preview-code .token.selector, .ds-247420 .ds-preview-code .token.attr-name, .ds-247420 .ds-preview-code .token.string, .ds-247420 .ds-preview-code .token.char, .ds-247420 .ds-preview-code .token.builtin { color: var(--green-2, #3A9A34); }
5717
+ .ds-247420 .ds-preview-code .token.atrule, .ds-247420 .ds-preview-code .token.attr-value, .ds-247420 .ds-preview-code .token.keyword { color: var(--sky, #3A6EFF); }
5718
+ .ds-247420 .ds-preview-code .token.function, .ds-247420 .ds-preview-code .token.class-name { color: var(--flame); }
5719
+ .ds-247420 .ds-preview-code.has-gutter { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 var(--space-2); }
5720
+ .ds-247420 .ds-preview-code.has-gutter code { display: block; min-width: 0; overflow-x: auto; }
5721
+ .ds-247420 .ds-preview-gutter { user-select: none; text-align: right; padding: 0 var(--space-2) 0 0; color: var(--fg-3); border-right: var(--bw-hair) solid var(--rule); font-family: var(--ff-mono); white-space: pre; line-height: inherit; }
5722
+
5723
+ /* Image preview: fit/actual control + alpha checkerboard. */
5724
+ .ds-247420 .ds-preview-media-controls { display: flex; gap: var(--space-2); padding: var(--space-2); justify-content: center; }
5725
+ .ds-247420 .ds-preview-media-alpha {
5726
+ background-image: linear-gradient(45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(-45deg, var(--bg-3) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--bg-3) 75%), linear-gradient(-45deg, transparent 75%, var(--bg-3) 75%);
5727
+ background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
5728
+ }
5729
+ .ds-247420 .ds-preview-media.is-actual { max-width: none; max-height: none; }
5730
+
5594
5731
  /* editor-primitives.css */
5595
5732
  /* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
5596
5733
  debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens