anentrypoint-design 0.0.369 → 0.0.370

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
@@ -503,6 +503,55 @@
503
503
  .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
504
504
  .ds-session-state-error { color: var(--flame); }
505
505
 
506
+ /* Fork/branch tree nesting — child sessions indent under their parent with a
507
+ collapse toggle and a small branch glyph, mirroring pi-web's SessionSidebar
508
+ tree without reimplementing its inline-style React component. */
509
+ .ds-session-row-nested { position: relative; }
510
+ .ds-session-tree-toggle {
511
+ flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
512
+ width: 16px; height: 16px; padding: 0; background: none; border: none;
513
+ color: var(--fg-3); cursor: pointer; transform: rotate(0deg); transition: transform var(--dur-snap) var(--ease);
514
+ }
515
+ .ds-session-tree-toggle.open { transform: rotate(90deg); }
516
+ .ds-session-tree-toggle:hover { color: var(--fg); }
517
+ .ds-session-fork-icon { flex: 0 0 auto; display: inline-flex; color: var(--fg-3); }
518
+
519
+ /* Hover-revealed rename/delete row actions. */
520
+ .ds-session-row-actions { flex: 0 0 auto; display: none; align-items: center; gap: var(--space-1); }
521
+ .ds-session-row:hover .ds-session-row-actions,
522
+ .ds-session-row:focus-within .ds-session-row-actions { display: flex; }
523
+ .ds-session-row-action {
524
+ display: inline-flex; align-items: center; justify-content: center;
525
+ width: 24px; height: 24px; padding: 0; background: var(--bg-2); border: var(--border-w) solid var(--border);
526
+ border-radius: var(--r-1); color: var(--fg-3); cursor: pointer;
527
+ }
528
+ .ds-session-row-action:hover { background: var(--bg-3); color: var(--fg); border-color: var(--fg-3); }
529
+ .ds-session-row-action-danger:hover { background: color-mix(in srgb, var(--flame) 12%, var(--bg-2)); color: var(--flame); border-color: var(--flame); }
530
+ @media (pointer: coarse) { .ds-session-row-action { min-width: 44px; min-height: 44px; } }
531
+
532
+ /* Inline rename — the row's title area swaps for a text input at the same
533
+ height; no modal, matches the row-in-place edit pattern used elsewhere. */
534
+ .ds-session-rename-input {
535
+ flex: 1; min-width: 0; font-size: var(--fs-sm); font-family: inherit; color: var(--fg);
536
+ background: var(--bg); border: var(--border-w) solid var(--accent); border-radius: var(--r-1);
537
+ padding: var(--space-1) var(--space-2);
538
+ }
539
+ .ds-session-rename-input:focus { outline: none; }
540
+
541
+ /* Inline delete confirm — same row height, two flat buttons, no modal;
542
+ mirrors SessionDashboard's arm-then-confirm bulk-stop control. */
543
+ .ds-session-confirm-msg { flex: 1; min-width: 0; font-size: var(--fs-sm); color: var(--fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
544
+ .ds-session-confirm-actions { flex: 0 0 auto; display: flex; gap: var(--space-1); }
545
+ .ds-session-confirm-delete, .ds-session-confirm-cancel {
546
+ font-size: var(--fs-tiny); font-weight: 600; padding: var(--space-1) var(--space-2);
547
+ border-radius: var(--r-1); cursor: pointer;
548
+ }
549
+ .ds-session-confirm-delete { background: var(--flame); border: none; color: var(--bg); }
550
+ .ds-session-confirm-delete:hover { filter: brightness(1.1); }
551
+ .ds-session-confirm-cancel { background: var(--bg-2); border: var(--border-w) solid var(--border); color: var(--fg-2); }
552
+ .ds-session-confirm-cancel:hover { background: var(--bg-3); color: var(--fg); }
553
+ @media (pointer: coarse) { .ds-session-confirm-delete, .ds-session-confirm-cancel { min-height: 44px; } }
554
+
506
555
  /* ----------------------------------------------------------------------------
507
556
  SessionDashboard — grid of live-session cards.
508
557
  ---------------------------------------------------------------------------- */
@@ -1212,3 +1261,82 @@ button.chat-composer-context:focus-visible { outline: var(--focus-w) solid var(-
1212
1261
  filter: none;
1213
1262
  }
1214
1263
  .chat-composer .send.cancel:active { filter: brightness(0.96); }
1264
+
1265
+ /* ChatMinimap — scroll-position density overview beside a chat thread.
1266
+ Purely token-driven (no raw color literals — see lintTokensOrThrow). Dot
1267
+ position/tooltip offsets are set imperatively in JS (chat-minimap.js) since
1268
+ they are per-render numeric layout, not a static rule. */
1269
+ .chat-minimap {
1270
+ position: relative;
1271
+ flex-shrink: 0;
1272
+ align-self: stretch;
1273
+ cursor: default;
1274
+ user-select: none;
1275
+ border-left: var(--bw-hair) solid var(--rule);
1276
+ background: var(--bg-2);
1277
+ overflow: visible;
1278
+ }
1279
+ .chat-minimap-viewport {
1280
+ position: absolute;
1281
+ left: 0;
1282
+ right: 0;
1283
+ background: color-mix(in oklab, var(--fg-3) 12%, transparent);
1284
+ border-top: var(--bw-hair) solid var(--rule);
1285
+ border-bottom: var(--bw-hair) solid var(--rule);
1286
+ pointer-events: none;
1287
+ z-index: 1;
1288
+ }
1289
+ .chat-minimap-centerline {
1290
+ position: absolute;
1291
+ left: 50%;
1292
+ top: 0;
1293
+ bottom: 0;
1294
+ width: 1px;
1295
+ background: var(--rule);
1296
+ transform: translateX(-50%);
1297
+ z-index: 0;
1298
+ }
1299
+ .chat-minimap-dot {
1300
+ position: absolute;
1301
+ left: 50%;
1302
+ width: 6px;
1303
+ height: 6px;
1304
+ border-radius: var(--r-pill, 999px);
1305
+ transform: translate(-50%, -50%) scale(1);
1306
+ transition: transform 0.1s;
1307
+ z-index: 2;
1308
+ }
1309
+ .chat-minimap-dot.is-user {
1310
+ background: color-mix(in oklab, var(--accent) 18%, transparent);
1311
+ border: 1.5px solid color-mix(in oklab, var(--accent) 70%, transparent);
1312
+ }
1313
+ .chat-minimap-dot.is-assistant {
1314
+ background: color-mix(in oklab, var(--fg-3) 12%, transparent);
1315
+ border: 1.5px solid color-mix(in oklab, var(--fg-3) 50%, transparent);
1316
+ }
1317
+ .chat-minimap-dot.is-nearest { transform: translate(-50%, -50%) scale(1.6); }
1318
+ .chat-minimap-tooltip {
1319
+ position: absolute;
1320
+ right: 100%;
1321
+ margin-right: var(--space-1);
1322
+ background: var(--bg);
1323
+ border-top: var(--bw-hair) solid var(--rule);
1324
+ border-right: var(--bw-hair) solid var(--rule);
1325
+ border-bottom: var(--bw-hair) solid var(--rule);
1326
+ border-left: 2px solid var(--fg-3);
1327
+ border-radius: var(--r-1);
1328
+ padding: calc(var(--space-1) / 2) var(--space-2);
1329
+ z-index: 100;
1330
+ pointer-events: none;
1331
+ opacity: 0.45;
1332
+ font-size: var(--fs-tiny);
1333
+ color: var(--fg-3);
1334
+ line-height: 1.4;
1335
+ white-space: nowrap;
1336
+ overflow: hidden;
1337
+ text-overflow: ellipsis;
1338
+ transition: top 0.1s, opacity 0.1s;
1339
+ }
1340
+ .chat-minimap-tooltip.is-user { border-left-color: color-mix(in oklab, var(--accent) 70%, transparent); }
1341
+ .chat-minimap-tooltip.is-assistant { border-left-color: color-mix(in oklab, var(--fg-3) 50%, transparent); }
1342
+ .chat-minimap-tooltip.is-nearest { opacity: 1; color: var(--fg); }
package/dist/247420.css CHANGED
@@ -2812,6 +2812,24 @@
2812
2812
  }
2813
2813
  .ds-247420 .ds-preview-text { white-space: pre-wrap; word-break: break-word; }
2814
2814
  .ds-247420 .ds-preview-code code, .ds-247420 .ds-preview-text code { font: inherit; color: inherit; background: none; }
2815
+ /* wrap-lines toggle (ported from pi-web's DisplayMode word-wrap control) */
2816
+ .ds-247420 .ds-preview-code.is-wrapped { white-space: pre-wrap; overflow-wrap: anywhere; }
2817
+ .ds-247420 .ds-preview-wrap-toggle.active { color: var(--paper); background: color-mix(in oklab, var(--paper) 18%, transparent); }
2818
+ /* source/preview mode switch (ported from pi-web's markdown/HTML DisplayMode
2819
+ tabs) — the host supplies already-rendered, already-sanitized HTML via
2820
+ `previewHtml`; this component only toggles visibility. */
2821
+ .ds-247420 .ds-preview-mode-switch { display: inline-flex; gap: var(--space-1); margin-right: var(--space-1); }
2822
+ .ds-247420 .ds-preview-mode-btn {
2823
+ font-family: var(--ff-mono); font-size: var(--fs-micro);
2824
+ padding: var(--space-1) var(--space-2); border-radius: var(--r-1);
2825
+ color: var(--paper-3); background: none; border: none; cursor: pointer;
2826
+ }
2827
+ .ds-247420 .ds-preview-mode-btn.active { color: var(--paper); background: color-mix(in oklab, var(--paper) 18%, transparent); }
2828
+ .ds-247420 .ds-preview-html {
2829
+ flex: 1; min-height: 0; overflow: auto;
2830
+ padding: var(--space-3) var(--space-4);
2831
+ background: var(--bg-0); border-radius: var(--r-2);
2832
+ }
2815
2833
  .ds-247420 .ds-preview-truncated {
2816
2834
  margin-top: var(--space-2); padding-top: var(--space-2);
2817
2835
  border-top: var(--bw-hair) solid color-mix(in oklab, var(--paper) 20%, transparent);
@@ -3154,6 +3172,31 @@
3154
3172
  .ds-247420 .chat-bubble.chat-md th { background: color-mix(in oklab, var(--fg) 5%, transparent); font-weight: 600; }
3155
3173
  .ds-247420 .chat-bubble.chat-md hr { border: 0; border-top: var(--bw-hair) solid var(--rule); margin: 12px 0; }
3156
3174
 
3175
+ /* Mermaid diagram blocks — rendered SVG swapped in over the fenced source by
3176
+ src/mermaid.js's renderMermaidBlocksUnder(); the source .pre stays in the
3177
+ DOM (display:none) behind a source/diagram toggle button. */
3178
+ .ds-247420 .ds-mermaid-block {
3179
+ position: relative; margin: var(--space-2) 0;
3180
+ border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
3181
+ border-radius: var(--r-1); background: var(--bg); padding: 12px 16px;
3182
+ }
3183
+ .ds-247420 .ds-mermaid-diagram { overflow-x: auto; display: flex; justify-content: center; }
3184
+ .ds-247420 .ds-mermaid-diagram svg { max-width: 100%; height: auto; }
3185
+ .ds-247420 .ds-mermaid-toggle {
3186
+ position: absolute; top: 6px; right: 6px;
3187
+ font: inherit; font-size: var(--fs-xs); line-height: 1;
3188
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
3189
+ color: var(--fg); border: none; border-radius: var(--r-1);
3190
+ padding: 4px 8px; cursor: pointer;
3191
+ }
3192
+ .ds-247420 .ds-mermaid-toggle:hover { background: color-mix(in oklab, var(--fg) 14%, transparent); }
3193
+
3194
+ /* Inline/display math — KaTeX HTML swapped into text nodes by
3195
+ src/math.js's renderMathBlocksUnder(). Display math centers on its own line;
3196
+ inline math sits within running text. */
3197
+ .ds-247420 .ds-math-display { display: block; margin: var(--space-2) 0; text-align: center; overflow-x: auto; }
3198
+ .ds-247420 .ds-math-inline { display: inline-block; }
3199
+
3157
3200
  .ds-247420 .chat-msg .chat-bubble.chat-code,
3158
3201
  .ds-247420 .chat-msg.you .chat-bubble.chat-code,
3159
3202
  .ds-247420 .chat-bubble.chat-code {
@@ -5607,6 +5650,265 @@
5607
5650
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
5608
5651
  }
5609
5652
  .ds-247420 .ds-dropdown-item[aria-disabled="true"] .ds-wts-item-branch { color: var(--fg); font-weight: 600; }
5653
+ /* ============================================================
5654
+ PluginsConfig — plugin/extension list + detail modal.
5655
+ ============================================================ */
5656
+
5657
+ .ds-247420 .ds-plugins-overlay {
5658
+ position: fixed; inset: 0; z-index: var(--z-modal, 1000);
5659
+ background: color-mix(in oklab, var(--ink) 35%, transparent);
5660
+ display: flex; align-items: center; justify-content: center;
5661
+ padding: var(--space-3);
5662
+ }
5663
+ .ds-247420 .ds-plugins-modal {
5664
+ width: min(860px, 100%); height: min(76vh, 720px);
5665
+ background: var(--bg); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-3);
5666
+ display: flex; flex-direction: column; overflow: hidden;
5667
+ box-shadow: var(--shadow-3, 0 8px 32px rgba(0,0,0,0.18));
5668
+ }
5669
+ .ds-247420 .ds-plugins-header {
5670
+ display: flex; align-items: center; justify-content: space-between;
5671
+ padding: var(--space-3) var(--space-4);
5672
+ border-bottom: var(--bw-hair) solid var(--rule); flex: 0 0 auto;
5673
+ }
5674
+ .ds-247420 .ds-plugins-title { font-size: var(--fs-md); font-weight: 700; color: var(--fg); }
5675
+ .ds-247420 .ds-plugins-close {
5676
+ background: none; border: none; color: var(--fg-3); cursor: pointer;
5677
+ font-size: 20px; line-height: 1; padding: 2px 6px; border-radius: var(--r-1);
5678
+ }
5679
+ .ds-247420 .ds-plugins-close:hover { background: var(--bg-2); color: var(--fg); }
5680
+ .ds-247420 .ds-plugins-close:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
5681
+
5682
+ .ds-247420 .ds-plugins-body { flex: 1 1 auto; display: flex; overflow: hidden; }
5683
+
5684
+ .ds-247420 .ds-plugins-sidebar {
5685
+ width: 245px; flex: 0 0 auto; overflow-y: auto;
5686
+ border-right: var(--bw-hair) solid var(--rule); background: var(--bg-2);
5687
+ padding: var(--space-2);
5688
+ }
5689
+ .ds-247420 .ds-plugins-sidebar-status {
5690
+ padding: var(--space-3) var(--space-2); font-size: var(--fs-sm); color: var(--fg-3);
5691
+ }
5692
+ .ds-247420 .ds-plugins-sidebar-status.ds-plugins-status-error { color: var(--flame); }
5693
+ .ds-247420 .ds-plugins-list { display: flex; flex-direction: column; gap: 2px; }
5694
+
5695
+ .ds-247420 .ds-plugins-row {
5696
+ display: flex; align-items: center; gap: 8px; width: 100%;
5697
+ padding: var(--space-2); border-radius: var(--r-2);
5698
+ background: none; border: var(--bw-hair) solid transparent; text-align: left; cursor: pointer;
5699
+ color: var(--fg); font: inherit;
5700
+ transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
5701
+ }
5702
+ .ds-247420 .ds-plugins-row:hover { background: var(--bg-3, var(--bg)); }
5703
+ .ds-247420 .ds-plugins-row.active { background: var(--accent-tint); border-color: var(--accent); }
5704
+ .ds-247420 .ds-plugins-row:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
5705
+
5706
+ .ds-247420 .ds-plugins-row-body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
5707
+ .ds-247420 .ds-plugins-row-name {
5708
+ font-family: var(--ff-mono); font-size: var(--fs-sm); color: var(--fg);
5709
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
5710
+ }
5711
+ .ds-247420 .ds-plugins-row-meta {
5712
+ font-size: var(--fs-micro); color: var(--fg-3);
5713
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
5714
+ }
5715
+ .ds-247420 .ds-plugins-row-busy { flex: 0 0 auto; font-size: var(--fs-micro); color: var(--fg-3); }
5716
+
5717
+ .ds-247420 .ds-plugins-dot {
5718
+ flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%;
5719
+ }
5720
+ .ds-247420 .ds-plugins-dot.tone-add { background: var(--green-2); }
5721
+ .ds-247420 .ds-plugins-dot.tone-delete { background: var(--flame); }
5722
+ .ds-247420 .ds-plugins-dot.tone-neutral { background: var(--fg-3); }
5723
+
5724
+ .ds-247420 .ds-plugins-main { flex: 1 1 auto; overflow-y: auto; padding: var(--space-4); }
5725
+
5726
+ .ds-247420 .ds-plugins-empty {
5727
+ height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;
5728
+ gap: var(--space-2); color: var(--fg-3);
5729
+ }
5730
+
5731
+ .ds-247420 .ds-plugins-detail { display: flex; flex-direction: column; gap: var(--space-4); max-width: 640px; }
5732
+ .ds-247420 .ds-plugins-detail-head {
5733
+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap;
5734
+ }
5735
+ .ds-247420 .ds-plugins-detail-title { display: flex; align-items: center; gap: 8px; min-width: 0; }
5736
+ .ds-247420 .ds-plugins-detail-title .name {
5737
+ font-family: var(--ff-mono); font-size: var(--fs-md); font-weight: 600; color: var(--fg);
5738
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
5739
+ }
5740
+ .ds-247420 .ds-plugins-version { font-size: var(--fs-micro); color: var(--fg-3); }
5741
+
5742
+ .ds-247420 .ds-plugins-toggle {
5743
+ flex: 0 0 auto; width: 40px; height: 22px; border-radius: 11px; border: none; padding: 0;
5744
+ background: var(--rule); position: relative; cursor: pointer;
5745
+ transition: background var(--dur-snap) var(--ease);
5746
+ }
5747
+ .ds-247420 .ds-plugins-toggle.on { background: var(--accent); }
5748
+ .ds-247420 .ds-plugins-toggle[disabled] { cursor: wait; opacity: 0.65; }
5749
+ .ds-247420 .ds-plugins-toggle-knob {
5750
+ position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%;
5751
+ background: var(--bg); box-shadow: var(--shadow-1, 0 1px 4px rgba(0,0,0,0.22));
5752
+ transition: left var(--dur-snap) var(--ease);
5753
+ }
5754
+ .ds-247420 .ds-plugins-toggle.on .ds-plugins-toggle-knob { left: 21px; }
5755
+
5756
+ .ds-247420 .ds-plugins-fact-grid {
5757
+ display: grid; grid-template-columns: minmax(96px, 130px) minmax(0, 1fr);
5758
+ gap: 9px var(--space-3); font-size: var(--fs-sm);
5759
+ }
5760
+ .ds-247420 .ds-plugins-fact-label { color: var(--fg-3); }
5761
+ .ds-247420 .ds-plugins-fact-value { color: var(--fg-2); }
5762
+ .ds-247420 .ds-plugins-fact-value.ds-plugins-mono { font-family: var(--ff-mono); overflow-wrap: anywhere; }
5763
+ .ds-247420 .ds-plugins-fact-value.tone-text-add { color: var(--green-2); }
5764
+ .ds-247420 .ds-plugins-fact-value.tone-text-delete { color: var(--flame); }
5765
+ .ds-247420 .ds-plugins-fact-value.tone-text-neutral { color: var(--fg-3); }
5766
+
5767
+ .ds-247420 .ds-plugins-group-label {
5768
+ font-size: var(--fs-micro); font-weight: 600; color: var(--fg-3);
5769
+ text-transform: uppercase; letter-spacing: 0.02em; margin-bottom: 6px;
5770
+ }
5771
+ .ds-247420 .ds-plugins-requires-list { display: flex; flex-wrap: wrap; gap: 6px; }
5772
+ .ds-247420 .ds-plugins-chip {
5773
+ font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-2);
5774
+ border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1); padding: 2px 7px;
5775
+ }
5776
+ .ds-247420 .ds-plugins-requires-empty { font-size: var(--fs-sm); color: var(--fg-3); }
5777
+
5778
+ .ds-247420 .ds-plugins-detail-actions { display: flex; gap: var(--space-2); }
5779
+ .ds-247420 .ds-plugins-btn {
5780
+ padding: 6px 12px; background: none; border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
5781
+ color: var(--fg-2); cursor: pointer; font-size: var(--fs-sm);
5782
+ }
5783
+ .ds-247420 .ds-plugins-btn:hover { background: var(--bg-2); }
5784
+ .ds-247420 .ds-plugins-btn[disabled] { cursor: not-allowed; opacity: 0.5; }
5785
+
5786
+ .ds-247420 .ds-plugins-footer {
5787
+ display: flex; align-items: center; justify-content: flex-end;
5788
+ padding: var(--space-2) var(--space-4);
5789
+ border-top: var(--bw-hair) solid var(--rule); flex: 0 0 auto;
5790
+ }
5791
+ .ds-247420 .ds-plugins-footer-count { font-size: var(--fs-micro); color: var(--fg-3); }
5792
+ /* ============================================================
5793
+ ModelsConfig — provider/model availability panel.
5794
+ ============================================================ */
5795
+ .ds-247420 .ds-mc { display: flex; flex-direction: column; gap: var(--space-3); }
5796
+
5797
+ .ds-247420 .ds-mc-loading, .ds-247420 .ds-mc-empty {
5798
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
5799
+ gap: var(--space-2); padding: var(--space-6) var(--space-3);
5800
+ color: var(--fg-3); text-align: center;
5801
+ }
5802
+ .ds-247420 .ds-mc-empty-hint { font-size: var(--fs-xs); color: var(--fg-3); }
5803
+
5804
+ /* Summary bar: totals + last-checked + refresh/rebuild actions. */
5805
+ .ds-247420 .ds-mc-summary {
5806
+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
5807
+ flex-wrap: wrap;
5808
+ }
5809
+ .ds-247420 .ds-mc-summary-facts { display: flex; gap: var(--space-3); font-size: var(--fs-sm); color: var(--fg-2); }
5810
+ .ds-247420 .ds-mc-summary-ts { color: var(--fg-3); }
5811
+ .ds-247420 .ds-mc-summary-actions { display: flex; align-items: center; gap: var(--space-2); }
5812
+ .ds-247420 .ds-mc-rebuild-error { font-size: var(--fs-xs); color: var(--flame); }
5813
+
5814
+ /* Two-pane body: provider tree (left) + model detail (right). */
5815
+ .ds-247420 .ds-mc-body {
5816
+ display: grid; grid-template-columns: minmax(220px, 300px) 1fr; gap: var(--space-3);
5817
+ align-items: start;
5818
+ }
5819
+ @media (max-width: 720px) {
5820
+ .ds-247420 .ds-mc-body { grid-template-columns: 1fr; }
5821
+ }
5822
+
5823
+ .ds-247420 .ds-mc-tree { display: flex; flex-direction: column; gap: 2px; }
5824
+ .ds-247420 .ds-mc-tree-group + .ds-mc-tree-group { margin-top: 2px; }
5825
+
5826
+ .ds-247420 .ds-mc-key-chip {
5827
+ font-family: var(--ff-mono); font-size: var(--fs-micro); font-weight: 700;
5828
+ padding: 1px 6px; border-radius: var(--r-1);
5829
+ }
5830
+ .ds-247420 .ds-mc-key-chip.tone-ok { color: var(--green-2); background: var(--green-tint); }
5831
+ .ds-247420 .ds-mc-key-chip.tone-fail { color: var(--fg-3); background: var(--bg-3); }
5832
+
5833
+ .ds-247420 .ds-mc-sampler {
5834
+ display: inline-block; margin: 2px 0 4px 12px;
5835
+ font-size: var(--fs-micro); padding: 1px 6px; border-radius: var(--r-1);
5836
+ }
5837
+ .ds-247420 .ds-mc-sampler.tone-ok { color: var(--green-2); background: var(--green-tint); }
5838
+ .ds-247420 .ds-mc-sampler.tone-fail { color: var(--ink); background: var(--sun); }
5839
+
5840
+ /* Detail pane */
5841
+ .ds-247420 .ds-mc-detail-empty { padding: var(--space-3); color: var(--fg-3); font-size: var(--fs-sm); }
5842
+ .ds-247420 .ds-mc-detail-head {
5843
+ display: flex; align-items: center; gap: var(--space-2);
5844
+ margin-bottom: var(--space-2);
5845
+ }
5846
+ .ds-247420 .ds-mc-detail-title { font-family: var(--ff-mono); font-size: var(--fs-base); font-weight: 700; }
5847
+
5848
+ .ds-247420 .ds-mc-discovery-error {
5849
+ display: flex; align-items: center; gap: var(--space-1-75);
5850
+ padding: var(--space-1-75) var(--space-2);
5851
+ margin-bottom: var(--space-2);
5852
+ color: var(--flame); background: color-mix(in oklab, var(--flame) 12%, transparent);
5853
+ border-radius: var(--r-1); font-size: var(--fs-xs);
5854
+ }
5855
+
5856
+ .ds-247420 .ds-mc-model-list { display: flex; flex-direction: column; gap: var(--space-2); }
5857
+ .ds-247420 .ds-mc-model-row {
5858
+ padding: var(--space-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
5859
+ }
5860
+ .ds-247420 .ds-mc-model-row.active { border-color: var(--accent); background: var(--accent-tint); }
5861
+ .ds-247420 .ds-mc-model-head {
5862
+ display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
5863
+ margin-bottom: var(--space-1-75);
5864
+ }
5865
+ .ds-247420 .ds-mc-model-id { font-family: var(--ff-mono); font-size: var(--fs-sm); font-weight: 600; }
5866
+ .ds-247420 .ds-mc-model-via { font-size: var(--fs-micro); color: var(--fg-3); }
5867
+ .ds-247420 .ds-mc-usable-chip {
5868
+ font-size: var(--fs-micro); font-weight: 700; padding: 1px 6px; border-radius: var(--r-1);
5869
+ margin-left: auto;
5870
+ }
5871
+ .ds-247420 .ds-mc-usable-chip.tone-ok { color: var(--green-2); background: var(--green-tint); }
5872
+ .ds-247420 .ds-mc-usable-chip.tone-fail { color: var(--fg-3); background: var(--bg-3); }
5873
+
5874
+ /* 7-mode availability grid — one chip per mode, wraps on narrow panes. */
5875
+ .ds-247420 .ds-mc-mode-grid { display: flex; flex-wrap: wrap; gap: 4px; }
5876
+ .ds-247420 .ds-mc-chip {
5877
+ font-family: var(--ff-mono); font-size: var(--fs-micro); font-weight: 600;
5878
+ padding: 2px 7px; border-radius: var(--r-1);
5879
+ border: var(--bw-hair) solid transparent;
5880
+ }
5881
+ .ds-247420 .ds-mc-chip.tone-ok { color: var(--green-2); background: var(--green-tint); }
5882
+ .ds-247420 .ds-mc-chip.tone-fail { color: var(--on-color); background: var(--flame); }
5883
+ .ds-247420 .ds-mc-chip.tone-skip { color: var(--fg-3); background: var(--bg-3); }
5884
+ .ds-247420 .ds-mc-chip.tone-unknown { color: var(--fg-3); background: none; border-color: var(--rule); opacity: 0.6; }
5885
+ /* ============================================================
5886
+ SkillsConfig — skill list + detail panel. Shares chrome with
5887
+ PluginsConfig (.ds-plugins-overlay/-modal/-header/-body/-sidebar/-list/
5888
+ -row/-dot/-main/-detail/-toggle/-fact-grid/-chip/-footer); the classes
5889
+ below are the skills-specific additions only.
5890
+ ============================================================ */
5891
+
5892
+ .ds-247420 .ds-skills-search-row {
5893
+ padding: var(--space-2) var(--space-4);
5894
+ border-bottom: var(--bw-hair) solid var(--rule); flex: 0 0 auto;
5895
+ }
5896
+
5897
+ .ds-247420 .ds-skills-group { margin-bottom: var(--space-2); }
5898
+ .ds-247420 .ds-skills-group-label {
5899
+ padding: var(--space-2) var(--space-2) 3px;
5900
+ font-size: var(--fs-micro); font-weight: 600; color: var(--fg-3);
5901
+ text-transform: uppercase; letter-spacing: 0.06em;
5902
+ }
5903
+
5904
+ .ds-247420 .ds-skills-description { font-size: var(--fs-sm); color: var(--fg-2); line-height: 1.5; }
5905
+
5906
+ .ds-247420 .ds-skills-body-group { display: flex; flex-direction: column; }
5907
+ .ds-247420 .ds-skills-body-preview {
5908
+ font-family: var(--ff-mono); font-size: var(--fs-micro); color: var(--fg-2);
5909
+ background: var(--bg-2); border: var(--bw-hair) solid var(--rule); border-radius: var(--r-2);
5910
+ padding: var(--space-3); overflow: auto; max-height: 260px; white-space: pre-wrap; word-break: break-word;
5911
+ }
5610
5912
 
5611
5913
  /* community.css */
5612
5914
  /* ============================================================
@@ -7761,6 +8063,55 @@
7761
8063
  .ds-247420 .ds-session-state { padding: var(--space-5) var(--space-3); text-align: center; color: var(--fg-3); font-size: var(--fs-sm); }
7762
8064
  .ds-247420 .ds-session-state-error { color: var(--flame); }
7763
8065
 
8066
+ /* Fork/branch tree nesting — child sessions indent under their parent with a
8067
+ collapse toggle and a small branch glyph, mirroring pi-web's SessionSidebar
8068
+ tree without reimplementing its inline-style React component. */
8069
+ .ds-247420 .ds-session-row-nested { position: relative; }
8070
+ .ds-247420 .ds-session-tree-toggle {
8071
+ flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
8072
+ width: 16px; height: 16px; padding: 0; background: none; border: none;
8073
+ color: var(--fg-3); cursor: pointer; transform: rotate(0deg); transition: transform var(--dur-snap) var(--ease);
8074
+ }
8075
+ .ds-247420 .ds-session-tree-toggle.open { transform: rotate(90deg); }
8076
+ .ds-247420 .ds-session-tree-toggle:hover { color: var(--fg); }
8077
+ .ds-247420 .ds-session-fork-icon { flex: 0 0 auto; display: inline-flex; color: var(--fg-3); }
8078
+
8079
+ /* Hover-revealed rename/delete row actions. */
8080
+ .ds-247420 .ds-session-row-actions { flex: 0 0 auto; display: none; align-items: center; gap: var(--space-1); }
8081
+ .ds-247420 .ds-session-row:hover .ds-session-row-actions,
8082
+ .ds-247420 .ds-session-row:focus-within .ds-session-row-actions { display: flex; }
8083
+ .ds-247420 .ds-session-row-action {
8084
+ display: inline-flex; align-items: center; justify-content: center;
8085
+ width: 24px; height: 24px; padding: 0; background: var(--bg-2); border: var(--border-w) solid var(--border);
8086
+ border-radius: var(--r-1); color: var(--fg-3); cursor: pointer;
8087
+ }
8088
+ .ds-247420 .ds-session-row-action:hover { background: var(--bg-3); color: var(--fg); border-color: var(--fg-3); }
8089
+ .ds-247420 .ds-session-row-action-danger:hover { background: color-mix(in srgb, var(--flame) 12%, var(--bg-2)); color: var(--flame); border-color: var(--flame); }
8090
+ @media (pointer: coarse) { .ds-247420 .ds-session-row-action { min-width: 44px; min-height: 44px; } }
8091
+
8092
+ /* Inline rename — the row's title area swaps for a text input at the same
8093
+ height; no modal, matches the row-in-place edit pattern used elsewhere. */
8094
+ .ds-247420 .ds-session-rename-input {
8095
+ flex: 1; min-width: 0; font-size: var(--fs-sm); font-family: inherit; color: var(--fg);
8096
+ background: var(--bg); border: var(--border-w) solid var(--accent); border-radius: var(--r-1);
8097
+ padding: var(--space-1) var(--space-2);
8098
+ }
8099
+ .ds-247420 .ds-session-rename-input:focus { outline: none; }
8100
+
8101
+ /* Inline delete confirm — same row height, two flat buttons, no modal;
8102
+ mirrors SessionDashboard's arm-then-confirm bulk-stop control. */
8103
+ .ds-247420 .ds-session-confirm-msg { flex: 1; min-width: 0; font-size: var(--fs-sm); color: var(--fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
8104
+ .ds-247420 .ds-session-confirm-actions { flex: 0 0 auto; display: flex; gap: var(--space-1); }
8105
+ .ds-247420 .ds-session-confirm-delete, .ds-247420 .ds-session-confirm-cancel {
8106
+ font-size: var(--fs-tiny); font-weight: 600; padding: var(--space-1) var(--space-2);
8107
+ border-radius: var(--r-1); cursor: pointer;
8108
+ }
8109
+ .ds-247420 .ds-session-confirm-delete { background: var(--flame); border: none; color: var(--bg); }
8110
+ .ds-247420 .ds-session-confirm-delete:hover { filter: brightness(1.1); }
8111
+ .ds-247420 .ds-session-confirm-cancel { background: var(--bg-2); border: var(--border-w) solid var(--border); color: var(--fg-2); }
8112
+ .ds-247420 .ds-session-confirm-cancel:hover { background: var(--bg-3); color: var(--fg); }
8113
+ @media (pointer: coarse) { .ds-247420 .ds-session-confirm-delete, .ds-247420 .ds-session-confirm-cancel { min-height: 44px; } }
8114
+
7764
8115
  /* ----------------------------------------------------------------------------
7765
8116
  SessionDashboard — grid of live-session cards.
7766
8117
  ---------------------------------------------------------------------------- */
@@ -8470,6 +8821,85 @@
8470
8821
  }
8471
8822
  .ds-247420 .chat-composer .send.cancel:active { filter: brightness(0.96); }
8472
8823
 
8824
+ /* ChatMinimap — scroll-position density overview beside a chat thread.
8825
+ Purely token-driven (no raw color literals — see lintTokensOrThrow). Dot
8826
+ position/tooltip offsets are set imperatively in JS (chat-minimap.js) since
8827
+ they are per-render numeric layout, not a static rule. */
8828
+ .ds-247420 .chat-minimap {
8829
+ position: relative;
8830
+ flex-shrink: 0;
8831
+ align-self: stretch;
8832
+ cursor: default;
8833
+ user-select: none;
8834
+ border-left: var(--bw-hair) solid var(--rule);
8835
+ background: var(--bg-2);
8836
+ overflow: visible;
8837
+ }
8838
+ .ds-247420 .chat-minimap-viewport {
8839
+ position: absolute;
8840
+ left: 0;
8841
+ right: 0;
8842
+ background: color-mix(in oklab, var(--fg-3) 12%, transparent);
8843
+ border-top: var(--bw-hair) solid var(--rule);
8844
+ border-bottom: var(--bw-hair) solid var(--rule);
8845
+ pointer-events: none;
8846
+ z-index: 1;
8847
+ }
8848
+ .ds-247420 .chat-minimap-centerline {
8849
+ position: absolute;
8850
+ left: 50%;
8851
+ top: 0;
8852
+ bottom: 0;
8853
+ width: 1px;
8854
+ background: var(--rule);
8855
+ transform: translateX(-50%);
8856
+ z-index: 0;
8857
+ }
8858
+ .ds-247420 .chat-minimap-dot {
8859
+ position: absolute;
8860
+ left: 50%;
8861
+ width: 6px;
8862
+ height: 6px;
8863
+ border-radius: var(--r-pill, 999px);
8864
+ transform: translate(-50%, -50%) scale(1);
8865
+ transition: transform 0.1s;
8866
+ z-index: 2;
8867
+ }
8868
+ .ds-247420 .chat-minimap-dot.is-user {
8869
+ background: color-mix(in oklab, var(--accent) 18%, transparent);
8870
+ border: 1.5px solid color-mix(in oklab, var(--accent) 70%, transparent);
8871
+ }
8872
+ .ds-247420 .chat-minimap-dot.is-assistant {
8873
+ background: color-mix(in oklab, var(--fg-3) 12%, transparent);
8874
+ border: 1.5px solid color-mix(in oklab, var(--fg-3) 50%, transparent);
8875
+ }
8876
+ .ds-247420 .chat-minimap-dot.is-nearest { transform: translate(-50%, -50%) scale(1.6); }
8877
+ .ds-247420 .chat-minimap-tooltip {
8878
+ position: absolute;
8879
+ right: 100%;
8880
+ margin-right: var(--space-1);
8881
+ background: var(--bg);
8882
+ border-top: var(--bw-hair) solid var(--rule);
8883
+ border-right: var(--bw-hair) solid var(--rule);
8884
+ border-bottom: var(--bw-hair) solid var(--rule);
8885
+ border-left: 2px solid var(--fg-3);
8886
+ border-radius: var(--r-1);
8887
+ padding: calc(var(--space-1) / 2) var(--space-2);
8888
+ z-index: 100;
8889
+ pointer-events: none;
8890
+ opacity: 0.45;
8891
+ font-size: var(--fs-tiny);
8892
+ color: var(--fg-3);
8893
+ line-height: 1.4;
8894
+ white-space: nowrap;
8895
+ overflow: hidden;
8896
+ text-overflow: ellipsis;
8897
+ transition: top 0.1s, opacity 0.1s;
8898
+ }
8899
+ .ds-247420 .chat-minimap-tooltip.is-user { border-left-color: color-mix(in oklab, var(--accent) 70%, transparent); }
8900
+ .ds-247420 .chat-minimap-tooltip.is-assistant { border-left-color: color-mix(in oklab, var(--fg-3) 50%, transparent); }
8901
+ .ds-247420 .chat-minimap-tooltip.is-nearest { opacity: 1; color: var(--fg); }
8902
+
8473
8903
  /* editor-primitives.css */
8474
8904
  /* editor-primitives.css — chrome for in-engine editors, inspectors, IDEs,
8475
8905
  debug HUDs. All rules under .ds-247420 scope (build prefixes). Tokens
@@ -8612,15 +9042,38 @@
8612
9042
  @media (prefers-reduced-motion: reduce) {
8613
9043
  .ds-247420 .ds-ep-tab-indicator { transition: none; }
8614
9044
  }
9045
+ /* scroll: content-sized tabs (min/max-width, no stretch) so overflow-x on the
9046
+ head has real per-tab width to scroll against — the pi-web TabBar shape for
9047
+ an unbounded open-file/open-session strip, vs. the default fixed small set
9048
+ that stretches evenly across the available width. */
9049
+ .ds-247420 .ds-ep-tabs-head.scroll .ds-ep-tab-wrap { flex: 0 0 auto; min-width: 80px; max-width: 180px; }
9050
+ .ds-247420 .ds-ep-tabs-head.scroll .ds-ep-tab { flex: 1; min-width: 0; }
9051
+ .ds-247420 .ds-ep-tab-wrap { display: flex; align-items: stretch; flex: 1; min-width: 0; }
8615
9052
  .ds-247420 .ds-ep-tab {
8616
- flex: 1; appearance: none; background: transparent; border: 0;
9053
+ flex: 1; min-width: 0; appearance: none; background: transparent; border: 0;
8617
9054
  border-bottom: 2px solid transparent;
8618
9055
  color: var(--panel-text-3);
8619
9056
  padding: 8px 10px;
8620
9057
  font: inherit; cursor: pointer;
9058
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
8621
9059
  transition: color var(--dur-snap, 80ms) var(--ease, ease), border-color var(--dur-snap, 80ms) var(--ease, ease);
8622
9060
  }
8623
9061
  .ds-247420 .ds-ep-tab:hover { color: var(--panel-text-2); }
9062
+ /* Close button — hidden until hover/focus within the tab, matching pi-web's
9063
+ hover-reveal close affordance; always visible on the active tab so touch/
9064
+ keyboard users without hover can still find it. */
9065
+ .ds-247420 .ds-ep-tab-close {
9066
+ appearance: none; background: transparent; border: 0; border-radius: var(--r-0);
9067
+ display: flex; align-items: center; justify-content: center;
9068
+ width: 22px; height: 22px; margin: var(--space-1-75) var(--space-1) var(--space-1-75) 0; padding: 0;
9069
+ flex-shrink: 0; color: var(--panel-text-3); cursor: pointer;
9070
+ opacity: 0; transition: opacity var(--dur-snap, 80ms) var(--ease, ease), background var(--dur-snap, 80ms) var(--ease, ease), color var(--dur-snap, 80ms) var(--ease, ease);
9071
+ }
9072
+ .ds-247420 .ds-ep-tab-wrap:hover .ds-ep-tab-close,
9073
+ .ds-247420 .ds-ep-tab-wrap:focus-within .ds-ep-tab-close,
9074
+ .ds-247420 .ds-ep-tab-wrap.active .ds-ep-tab-close { opacity: 1; }
9075
+ .ds-247420 .ds-ep-tab-close:hover { background: var(--panel-2); color: var(--panel-text-1); }
9076
+ .ds-247420 .ds-ep-tab-close:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; opacity: 1; }
8624
9077
  .ds-247420 .ds-ep-tab.active {
8625
9078
  color: var(--accent);
8626
9079
  border-bottom-color: var(--accent);