@leftoff/cli 0.9.17 → 0.9.18-beta.10

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/ui/app.css CHANGED
@@ -2495,6 +2495,7 @@ mark.tx, .co-snip mark, .tx-snip mark, .tx-msg-text mark { background: var(--tx-
2495
2495
  .composer .att-chips[hidden] { display: none; }
2496
2496
  .composer.att-drop { border-color: var(--accent); box-shadow: 0 0 0 3px var(--focus); background: color-mix(in srgb, var(--accent) 7%, var(--card2)); }
2497
2497
  .att-input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; overflow: hidden; clip: rect(0 0 0 0); }
2498
+ .att-picker { position: fixed; left: 0; bottom: 0; } /* 0.9.18: the paperclip's picker, outside the page so a redraw can't drop what you picked */
2498
2499
  .composer-attach { flex: none; width: 44px; height: 44px; margin: 0; padding: 0; border: 0; background: transparent; display: grid; place-items: center; cursor: pointer; color: var(--muted); -webkit-tap-highlight-color: transparent; }
2499
2500
  .composer-clip { width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; transition: background-color .15s, color .15s; }
2500
2501
  .composer-clip .ic { width: 19px; height: 19px; }
@@ -3283,6 +3284,10 @@ del.gd-x { background: var(--gd-del-word); }
3283
3284
  /* 0.9.9 Permissions: the New session choice, the session page's switch and its pill beside Live */
3284
3285
  .start-mode { grid-template-columns: repeat(3, minmax(0, 1fr)); }
3285
3286
  .start-mode .start-opt-sub { white-space: normal; }
3287
+ /* 1.0 Mode: headless, board terminal, my terminal app (shape + words) */
3288
+ .run-glyph { color: var(--muted); font-weight: 400; display: inline-block; width: 1.1em; }
3289
+ .start-opt[aria-checked="true"] .run-glyph { color: var(--accent); }
3290
+ .start-run .start-opt-sub { white-space: normal; }
3286
3291
  .headless-mode { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin: -4px 0 10px; }
3287
3292
  .headless-mode .hm-l { font-size: 12.5px; font-weight: 600; color: var(--muted); }
3288
3293
  .hm-seg { display: inline-flex; border: 1px solid var(--line); border-radius: 10px; overflow: visible; background: var(--card); }
@@ -3321,6 +3326,8 @@ del.gd-x { background: var(--gd-del-word); }
3321
3326
  .help-more[hidden] { display: none; }
3322
3327
  .start-h-help { display: flex; align-items: center; gap: 6px; }
3323
3328
  @media (hover: hover) and (pointer: fine) { .help-q { width: 28px; height: 28px; margin: 0 -4px; } }
3329
+ .term-pill { display: inline-flex; align-items: center; gap: 4px; margin-left: 6px; padding: 1px 8px; border-radius: 999px; border: 1px dashed var(--line-strong); color: var(--text2); font-size: 11.5px; font-weight: 600; line-height: 1.5; white-space: nowrap; } /* 1.0 */
3330
+ .term-pill.t-app { border-style: solid; }
3324
3331
  .mode-pill { position: relative; display: inline-block; padding: 1px 8px; border-radius: 999px; border: 1px solid var(--line-strong); background: var(--bg2); color: var(--text2); font-size: 11.5px; font-weight: 600; line-height: 1.5; white-space: nowrap; }
3325
3332
  .mode-pill.m-auto { border-color: var(--accent); background: var(--tint-accent); color: var(--text); }
3326
3333
  .mode-pill.m-acceptEdits { border-color: var(--yellow); background: var(--tint-yellow); color: var(--text); }
@@ -3571,6 +3578,11 @@ html.lf-kb .live-box.full { padding-bottom: 8px; }
3571
3578
  .live-fbar { display: flex; align-items: center; gap: 6px; min-height: 52px; padding-top: env(safe-area-inset-top); border-bottom: 1px solid var(--line); }
3572
3579
  .live-box.full > .live-fbar { max-width: none; margin: 0 calc(-1 * var(--lf-pr)) 0 calc(-1 * var(--lf-pl)); width: auto; padding-left: max(4px, env(safe-area-inset-left)); padding-right: max(8px, env(safe-area-inset-right)); background: var(--bg); }
3573
3580
  .live-fs-x { margin-left: 0; }
3581
+ /* 2026-11-05 session titles: the name on line one, folder@branch muted under it */
3582
+ .live-fbar .lf-tt { display: flex; flex-direction: column; justify-content: center; flex: 1 1 auto; min-width: 0; gap: 1px; }
3583
+ .live-fbar .lf-where { display: block; min-width: 0; font-size: 12px; line-height: 1.25; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
3584
+ .live-fbar .lf-where:empty { display: none; }
3585
+ .s-where { margin-top: 2px; font-size: 12px; line-height: 1.3; color: var(--muted); overflow-wrap: anywhere; }
3574
3586
  .live-fbar .lf-title { display: block; flex: 1 1 auto; min-width: 0; margin: 0; font-size: 15px; font-weight: 650; line-height: 1.3; color: var(--text); text-transform: none; letter-spacing: normal; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
3575
3587
  .lf-pills { flex: none; display: inline-flex; align-items: center; gap: 6px; }
3576
3588
  .lf-stop { flex: none; min-height: 36px; }
@@ -5268,6 +5280,18 @@ code .file-ref-off { font-size: inherit; }
5268
5280
  .wt-sf .wt-snip + .wt-snip { border-top: 1px dashed var(--line); }
5269
5281
  .wt-sf .wt-snip-h { margin: 0; padding: 4px 10px; }
5270
5282
  @media (pointer: fine) { .wt-sf > summary { min-height: 34px; } .wt-sfa-b { min-height: 32px; } }
5283
+ /* 2026-11-03 a file a step shares with an earlier one: folded, with a quiet way back to where it's open */
5284
+ .wt-also { display: inline-flex; align-items: center; gap: 4px; align-self: stretch; padding: 0 6px; font-size: 12px; color: var(--text2); text-decoration: none; white-space: nowrap; }
5285
+ .wt-also .ic { width: 13px; height: 13px; color: var(--muted); }
5286
+ .wt-also:hover { color: var(--text); text-decoration: underline; text-underline-offset: 2px; }
5287
+ .wt-also:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 6px; }
5288
+ .wt-sf-also > summary .wt-sf-p { color: var(--text2); }
5289
+ /* the lines the step's refs name, when it shows a hunk whole: the rest steps back */
5290
+ .wt-gd-focus .gd-row:not(.wt-focus), .wt-gd-focus .gd-half:not(.wt-focus):not(.gd-empty) { opacity: .55; }
5291
+ .wt-gd-focus .gd-row.wt-focus .gd-n, .wt-gd-focus .gd-half.wt-focus .gd-gut { box-shadow: inset 2px 0 0 var(--muted); }
5292
+ .wt-focus-w { display: inline-flex; align-items: center; gap: 6px; }
5293
+ .wt-focus-g { width: 2px; height: 12px; border-radius: 1px; background: var(--muted); }
5294
+ .wt-snip-none { margin: 0; padding: 10px; font-size: 12.5px; }
5271
5295
  /* "changed since": a half-filled circle and the words (the stale bar uses the same glyph) */
5272
5296
  .wt-chg { flex: none; display: inline-flex; align-items: center; gap: 5px; height: 20px; padding: 1px 7px 0; box-sizing: border-box; border: 1px dashed var(--line-strong); border-radius: 6px; font-size: 11.5px; font-weight: 600; line-height: 1; color: var(--text2); }
5273
5297
  .wt-chg-g { flex: none; width: 9px; height: 9px; border-radius: 50%; border: 1.5px solid currentColor; background: linear-gradient(90deg, currentColor 50%, transparent 50%); box-sizing: border-box; }
@@ -5281,8 +5305,8 @@ code .file-ref-off { font-size: inherit; }
5281
5305
  .wt-dmode { display: none; }
5282
5306
  @media (min-width: 1000px) { .wt-dmode { display: inline-flex; } }
5283
5307
  .wt-r2 { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; margin: 6px 0 0; }
5284
- .wt-r2:not(:has(.wt-spot)):not(:has(.wt-dmode:not([hidden]))) { display: none; }
5285
- @media (max-width: 999.98px) { .wt-r2:not(:has(.wt-spot)) { display: none; } }
5308
+ .wt-r2:not(:has(.wt-spot)):not(:has(.wt-dmode:not([hidden]))):not(:has(.fsc-seg)) { display: none; }
5309
+ @media (max-width: 999.98px) { .wt-r2:not(:has(.wt-spot)):not(:has(.fsc-seg)) { display: none; } }
5286
5310
  /* the side-by-side drawing */
5287
5311
  .gd-split .gd-srow { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); min-width: 0; }
5288
5312
  .gd-half { display: grid; grid-template-columns: var(--gd-gw) 2ch minmax(0, 1fr); min-width: 0; }
@@ -5351,3 +5375,217 @@ code .file-ref-off { font-size: inherit; }
5351
5375
  .fs-wt-rv { display: inline-flex; align-items: center; gap: 4px; height: 18px; margin-left: 6px; padding: 1px 6px 0; box-sizing: border-box; border: 1px solid var(--line); border-radius: 9px; font-size: 11px; font-weight: 600; line-height: 1; color: var(--text2); white-space: nowrap; vertical-align: middle; }
5352
5376
  .fs-wt-rv .ic { width: 11px; height: 11px; color: var(--green); margin-top: -1px; }
5353
5377
  .fs-wt-rv-part { border-style: dashed; }
5378
+
5379
+ /* 2026-11-03 This session · Whole folder (walkthrough, its Files view, What it did): a quiet segmented
5380
+ toggle with each side's count; 44px to a finger, 32px to a mouse. Files that aren't this session's carry
5381
+ a small hollow-dashed ring plus the words "not from this session" (shape and words, never color alone). */
5382
+ .fsc-seg { margin-right: auto; flex: none; }
5383
+ .wt-seg.fsc-seg button { height: 44px; gap: 7px; }
5384
+ .fsc-n { font: 500 11.5px/1 var(--mono); font-variant-numeric: tabular-nums; color: var(--muted); padding: 2px 5px 1px; border-radius: 6px; background: var(--bg2); }
5385
+ .wt-seg.fsc-seg button[aria-pressed="true"] .fsc-n { color: var(--text2); background: var(--bg); }
5386
+ @media (pointer: fine) { .wt-seg.fsc-seg button { height: 32px; } }
5387
+ @media (max-width: 600px) { .wt-r2 .fsc-seg { width: 100%; display: flex; } .wt-r2 .fsc-seg button { flex: 1 1 0; } }
5388
+ .nots-g { display: inline-block; flex: none; width: 7px; height: 7px; border: 1.5px dashed var(--muted); border-radius: 50%; box-sizing: border-box; margin: 0 5px 0 0; vertical-align: middle; }
5389
+ .wt-nots { display: inline-flex; align-items: center; flex: none; font-size: 11.5px; color: var(--muted); white-space: nowrap; margin-left: 6px; }
5390
+ .wt-pre { font-size: 11.5px; white-space: nowrap; margin-left: 6px; }
5391
+ .wt-fl-i .nots-g { margin: 0 2px 0 4px; }
5392
+ .wt-fl-i.nots .wt-fm-f, .wt-file.nots .wt-file-p, .wid-item.nots .wid-base { color: var(--text2); }
5393
+ .wid-scope { margin: 4px 0 8px; }
5394
+ .wid-scope .fsc-seg { display: flex; width: 100%; box-sizing: border-box; }
5395
+ .wid-scope .fsc-seg button { flex: 1 1 0; }
5396
+ .wid-path .wt-nots, .wid-path .wt-pre { font-family: var(--sans, inherit); }
5397
+ .wid-scope-n { display: flex; gap: 6px; align-items: flex-start; }
5398
+ .wid-scope-n .ic { width: 13px; height: 13px; flex: none; margin-top: 2px; }
5399
+
5400
+ /* 2026-11-03 "hooks not reporting": a quiet note beside the session's pills (a dashed ring plus words) */
5401
+ .sub .s-hooks { display: inline-flex; align-items: center; gap: 5px; margin-left: 4px; font-size: 12px; color: var(--muted); white-space: nowrap; }
5402
+ .sub .s-hooks-ring { width: 8px; height: 8px; border-radius: 50%; border: 1.5px dashed currentColor; box-sizing: border-box; flex: none; }
5403
+ .fs-head .sub > .s-hooks { height: 22px; vertical-align: middle; }
5404
+ .fs-side.is-scrolled .fs-head .sub > .s-hooks { display: none; }
5405
+ /* 2026-11-03 which hooks were skipped and why: the same note, its words cut short on a narrow header (the whole in its tip) */
5406
+ .sub .s-hooks-skip { max-width: min(420px, 100%); min-width: 0; }
5407
+ .sub .s-hooks-skip .s-hooks-t { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
5408
+
5409
+ /* 2026-11-03 "Let me answer prompts here" (ui/hook-fix.js): the hooks-skipped note's way out. Centered; a bottom sheet on a phone. */
5410
+ .sub .s-hooks-fix { margin-left: 6px; min-height: 44px; padding: 0 10px; border: 1px solid var(--btn-line); border-radius: 8px; background: transparent; color: var(--accent); font: inherit; font-size: 12px; cursor: pointer; white-space: nowrap; }
5411
+ @media (pointer: fine) { .sub .s-hooks-fix { min-height: 32px; padding: 0 9px; } }
5412
+ .sub .s-hooks-fix:hover { background: var(--btn-hover); }
5413
+ .sub .s-hooks-fix:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
5414
+ .fs-side.is-scrolled .fs-head .sub > .s-hooks-fix { display: none; }
5415
+ .sub .s-hooks-applied .s-hooks-ring { border-style: dotted; }
5416
+ .hf-back { position: fixed; inset: 0; z-index: 400; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; padding: 16px; }
5417
+ .hf-modal { width: min(560px, 100%); max-height: calc(100dvh - 32px); overflow: auto; background: var(--card); border: 1px solid var(--line-strong); border-radius: var(--radius); box-shadow: var(--toast-shadow); padding: 16px 18px 14px; color: var(--text2); }
5418
+ .hf-grab { display: none; }
5419
+ .hf-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 6px; }
5420
+ .hf-head h2 { margin: 0; font-size: 15px; font-weight: 600; color: var(--text); text-transform: none; letter-spacing: normal; }
5421
+ .hf-p { margin: 8px 0; font-size: 13px; line-height: 1.5; }
5422
+ .hf-quiet { color: var(--muted); font-size: 12.5px; }
5423
+ .hf-file code, .hf-p code { font-size: 12px; overflow-wrap: anywhere; }
5424
+ .hf-file { margin: 4px 0; }
5425
+ .hf-code { margin: 6px 0; padding: 10px 12px; background: var(--field); border: 1px solid var(--line); border-radius: 8px; font-size: 12px; line-height: 1.45; overflow: auto; white-space: pre; color: var(--text); user-select: all; }
5426
+ .hf-mark { display: inline-block; width: 9px; height: 9px; margin-right: 7px; vertical-align: 0; box-sizing: border-box; }
5427
+ .hf-mark-ok { border-radius: 50%; background: var(--green); }
5428
+ .hf-mark-admin { border-radius: 2px; border: 1.5px solid var(--yellow); transform: rotate(45deg); }
5429
+ .hf-mark-off { border-radius: 50%; border: 1.5px dashed var(--muted); }
5430
+ .hf-ign { margin-top: 10px; padding-top: 6px; border-top: 1px solid var(--line); }
5431
+ .hf-acts { display: flex; justify-content: flex-end; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
5432
+ .hf-acts .btn, .hf-x { min-height: 44px; min-width: 44px; justify-content: center; }
5433
+ @media (pointer: fine) { .hf-acts .btn, .hf-x { min-height: 32px; min-width: 32px; } }
5434
+ .hf-modal .btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
5435
+ @media (max-width: 640px) {
5436
+ .hf-back { align-items: flex-end; padding: 0; }
5437
+ .hf-modal { width: 100%; max-height: 88dvh; border-radius: var(--radius) var(--radius) 0 0; border-bottom: none; padding: 8px 16px calc(14px + env(safe-area-inset-bottom)); }
5438
+ .hf-grab { display: block; width: 36px; height: 4px; border-radius: 2px; background: var(--line-strong); margin: 2px auto 8px; }
5439
+ .hf-acts { justify-content: stretch; }
5440
+ .hf-acts .btn { flex: 1 1 auto; }
5441
+ }
5442
+
5443
+ /* 2026-11-03 decision memory */
5444
+ .dec-list { list-style: none; margin: 0; padding: 0 0 6px; display: grid; gap: 10px; }
5445
+ .dec-row { font-size: 13.5px; line-height: 1.45; color: var(--text); }
5446
+ .dec-id { font: 600 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text2); }
5447
+ .dec-why, .dec-alt, .dec-src { font-size: 12.5px; color: var(--text2); margin-top: 2px; }
5448
+ .dec-src { color: var(--muted, var(--text2)); }
5449
+ .dec-st { margin-left: 6px; font-size: 12px; color: var(--text2); white-space: nowrap; }
5450
+ .dec-rc { display: inline-flex; align-items: center; gap: 2px; font-size: 12px; color: var(--text2); font-variant-numeric: tabular-nums; white-space: nowrap; }
5451
+ a.dec-rc { min-height: 44px; text-decoration: none; }
5452
+ a.dec-rc:hover .dec-rc-w { text-decoration: underline; }
5453
+ .pchip-rc { margin-left: 6px; }
5454
+ .proj-review-slot:empty { display: none; }
5455
+ .scu-decs { margin-top: 10px; }
5456
+ .scu-dec-h { font-size: 12.5px; font-weight: 600; color: var(--text2); margin: 0 0 4px; }
5457
+ .scu-dec-l { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-size: 13.5px; }
5458
+ .scu-dec-l .dec-st { margin: 0 4px 0 0; }
5459
+ .dec-given { margin: 6px 0 2px; font-size: 12.5px; color: var(--text2); }
5460
+ .dec-given-i { display: inline-block; width: 1em; text-align: center; }
5461
+ .dec-missed { color: var(--text); }
5462
+ .dec-given-how { color: var(--text2); }
5463
+ .dec-given code { font-size: 12px; }
5464
+ .dec-open { display: inline-flex; align-items: center; min-height: 44px; font-size: 13px; }
5465
+ /* the panel's list: one quiet line (status · id · source), the decision, why; a hairline between rows */
5466
+ .dec-list { gap: 0; }
5467
+ .dec-list > .dec-row { padding: 10px 0; border-top: 1px solid var(--line); }
5468
+ .dec-list > .dec-row:first-child { border-top: 0; padding-top: 2px; }
5469
+ .dec-row-h { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 2px; font-size: 11.5px; line-height: 1.5; color: var(--text2); }
5470
+ .dec-row-h .dec-st { margin-left: 0; font-size: 11.5px; color: var(--text); }
5471
+ .dec-row-h .dec-id { font: 500 11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text2); opacity: .85; }
5472
+ .dec-row-h .dec-src { margin-top: 0; font-size: 11.5px; }
5473
+ .dec-dot { color: var(--text2); opacity: .6; }
5474
+ .dec-list .dec-text { font-size: 14px; font-weight: 500; line-height: 1.4; margin-top: 2px; overflow-wrap: anywhere; }
5475
+ .dec-row-rejected .dec-text { text-decoration: line-through; text-decoration-thickness: 1px; color: var(--text2); }
5476
+ .dec-row-superseded .dec-text { color: var(--text2); }
5477
+ .dec-list .dec-why, .dec-list .dec-alt { font-size: 12.5px; line-height: 1.4; }
5478
+ /* compact buttons: a small pill inside a 44px hit area */
5479
+ .dec-acts-panel { gap: 6px; margin-top: 8px; }
5480
+ .dec-acts.dec-acts-panel .btn { position: relative; min-height: 0; height: 28px; padding: 0 10px; font-size: 12.5px; border-radius: 7px; }
5481
+ .dec-acts.dec-acts-panel .btn::after { content: ''; position: absolute; inset: -8px -3px; }
5482
+
5483
+ .dec-page .dec-head h1 { margin: 4px 0 2px; }
5484
+ .dec-tl { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 0; }
5485
+ .dec-item { position: relative; padding: 12px 0 12px 18px; border-left: 2px solid var(--line); margin-left: 6px; }
5486
+ .dec-item::before { content: ''; position: absolute; left: -6px; top: 17px; width: 10px; height: 10px; border-radius: 50%; background: var(--bg); border: 2px solid var(--text2); box-sizing: border-box; }
5487
+ .dec-item.dec-accepted::before { background: var(--text2); }
5488
+ .dec-item.dec-superseded, .dec-item.dec-rejected { opacity: .78; }
5489
+ .dec-item.dec-superseded::before { border-color: var(--line-strong, var(--line)); }
5490
+ .dec-item.dec-rejected .dec-text { text-decoration: line-through; text-decoration-thickness: 1px; }
5491
+ .dec-h { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; font-size: 12.5px; color: var(--text2); }
5492
+ .dec-date { font-variant-numeric: tabular-nums; }
5493
+ .dec-repo { padding: 1px 6px; border: 1px solid var(--line); border-radius: 999px; font-size: 11.5px; }
5494
+ .dec-item .dec-st { margin-left: 0; }
5495
+ .dec-item .dec-text { font-size: 15px; line-height: 1.45; margin-top: 4px; color: var(--text); overflow-wrap: anywhere; }
5496
+ .dec-meta { font-size: 12.5px; color: var(--text2); margin-top: 4px; }
5497
+ .dec-chains { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 4px; font-size: 12.5px; color: var(--text2); }
5498
+ .dec-chip { font: 600 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text); background: transparent; border: 1px solid var(--line); border-radius: 6px; padding: 4px 6px; min-height: 24px; cursor: pointer; position: relative; }
5499
+ .wt-dec-rel { font: 600 11.5px/1 system-ui, sans-serif; margin-left: 6px; padding: 2px 5px; border: 1px solid var(--line); border-radius: 4px; color: var(--text2); white-space: nowrap; }
5500
+ .wt-dec-dep { border-style: solid; border-color: var(--text2); color: var(--text); }
5501
+ .wt-dec-prop { border-style: dashed; }
5502
+ .dec-chip::after { content: ''; position: absolute; inset: -10px -4px; }
5503
+ .dec-chip:hover { border-color: var(--text2); }
5504
+ .dec-sug { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 8px; padding: 8px 10px; border: 1px dashed var(--line); border-radius: 8px; font-size: 13px; }
5505
+ .dec-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
5506
+ .dec-acts .btn, .dec-acts .linkish { min-height: 44px; }
5507
+ .dec-acts-quiet { margin-top: 0; }
5508
+ .dec-ctl { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 4px 0 4px; }
5509
+ .dec-ctl .sask-opt, .dec-ctl .btn, .dec-store-opts .sask-opt { min-height: 44px; }
5510
+ .dec-store-h { font-weight: 600; margin-bottom: 6px; }
5511
+ .dec-store-opts { display: inline-flex; flex-wrap: wrap; gap: 6px; }
5512
+ .dec-store p { margin: 8px 0 0; max-width: 62ch; }
5513
+ .dec-edit { display: grid; gap: 8px; margin-top: 8px; max-width: 640px; }
5514
+ .dec-edit label { display: grid; gap: 4px; font-size: 12.5px; color: var(--text2); }
5515
+ .dec-in { font: inherit; font-size: 15px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--bg); color: var(--text); min-height: 44px; box-sizing: border-box; width: 100%; }
5516
+ @media (pointer: coarse) { .dec-in { font-size: 16px; } }
5517
+ .dec-in:focus-visible { outline: 2px solid var(--accent, var(--text2)); outline-offset: 1px; }
5518
+ .dec-flash { background: color-mix(in srgb, var(--text2) 10%, transparent); transition: background .6s; }
5519
+ @media (prefers-reduced-motion: reduce) { .dec-flash { transition: none; } }
5520
+ .dec-proj p { margin: 4px 0 10px; }
5521
+ .dec-empty { margin: 6px 0 10px; } .dec-empty p, .dec-proj .dec-empty p { margin: 0 0 4px; max-width: 64ch; } /* 2026-11-05 where decisions come from, on an empty log */
5522
+
5523
+ .wt-decs { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 2px; }
5524
+ .wt-dec { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; min-height: 32px; padding: 4px 8px; font-weight: 400; }
5525
+ @media (pointer: coarse) { .wt-dec { min-height: 44px; } }
5526
+ .wt-dec .wt-dec-id { font-weight: 600; }
5527
+ .wt-dec .wt-dec-t { font: 12.5px/1.3 var(--sans, system-ui, sans-serif); color: var(--text2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 42ch; }
5528
+ .wt-dec-gone { border-style: dashed; }
5529
+ .wt-dec-w { font: 12px/1 var(--sans, system-ui, sans-serif); color: var(--text2); }
5530
+ .dec-chainview { margin-top: 4px; }
5531
+
5532
+ .dv-isdec .dv-dl { display: none !important; }
5533
+ .dec-ctl .sask-opt { border: 1px solid var(--line); border-radius: 8px; padding: 0 12px; background: transparent; color: var(--text2); cursor: pointer; }
5534
+ .dec-ctl .sask-opt[aria-pressed="true"] { color: var(--text); border-color: var(--line-strong, var(--text2)); }
5535
+ @media (min-width: 700px) { .dv-isdec .dv-sheet { max-width: 760px; height: auto; max-height: 80vh; margin-left: auto; margin-right: auto; } }
5536
+
5537
+ /* testplan Part 3: the test plan page (ui/testplan.js) */
5538
+ .tp-page .tp-head h1 { margin: 4px 0 2px; }
5539
+ .tp-budget { display: inline-flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 12px; }
5540
+ .tp-budget .sask-opt, .tp-go .btn, .tp-exp .btn, .tp-acts .btn, .tp-open { min-height: 44px; }
5541
+ .tp-budget .sask-opt { border: 1px solid var(--line); border-radius: 8px; padding: 0 14px; background: transparent; color: var(--text2); cursor: pointer; font: inherit; }
5542
+ .tp-budget .sask-opt[aria-pressed="true"] { color: var(--text); border-color: var(--line-strong, var(--text2)); font-weight: 600; }
5543
+ .tp-prl, .tp-recent, .tp-ncl { list-style: none; margin: 8px 0; padding: 0; display: grid; gap: 6px; font-size: 14px; }
5544
+ .tp-prl a, .tp-recent a { overflow-wrap: anywhere; }
5545
+ .tp-wt, .tp-nowt { font-size: 12px; color: var(--text2); white-space: nowrap; }
5546
+ .tp-go { margin: 12px 0; }
5547
+ .tp-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin: 8px 0 4px; }
5548
+ .tp-prog { font-weight: 600; font-variant-numeric: tabular-nums; }
5549
+ .tp-cov { color: var(--text2); font-size: 13px; }
5550
+ .tp-exp { display: inline-flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
5551
+ .tp-by { font-size: 12.5px; margin: 0 0 8px; }
5552
+ .tp-list { list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 12px; }
5553
+ .tp-check { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; background: var(--bg); }
5554
+ .tp-check.tp-done { border-style: solid; opacity: .82; }
5555
+ .tp-check.tp-failed { border-width: 2px; border-color: var(--text2); }
5556
+ .tp-ch { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; }
5557
+ .tp-n { font: 600 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text2); }
5558
+ .tp-title { font-size: 16px; margin: 0; flex: 1 1 260px; overflow-wrap: anywhere; }
5559
+ .tp-risk { font-size: 12px; white-space: nowrap; color: var(--text2); border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; }
5560
+ .tp-risk-high { color: var(--text); border-color: var(--text2); font-weight: 600; }
5561
+ .tp-min { font-size: 12px; color: var(--text2); font-variant-numeric: tabular-nums; }
5562
+ .tp-where, .tp-expect, .tp-why { margin: 6px 0 0; font-size: 14px; line-height: 1.45; overflow-wrap: anywhere; }
5563
+ .tp-k { display: inline-block; min-width: 96px; font-size: 12px; color: var(--text2); }
5564
+ .tp-steps { margin: 6px 0 0; padding-left: 22px; font-size: 14px; line-height: 1.45; }
5565
+ .tp-cites { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
5566
+ .tp-cite { font: 600 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text); border: 1px solid var(--line); border-radius: 6px; padding: 5px 7px; text-decoration: none; position: relative; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
5567
+ a.tp-cite::after { content: ''; position: absolute; inset: -10px -4px; }
5568
+ .tp-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; align-items: center; }
5569
+ .tp-tick[aria-pressed="true"] { font-weight: 600; border-color: var(--text); }
5570
+ .tp-clear { min-height: 44px; }
5571
+ .tp-note { display: grid; gap: 8px; margin-top: 10px; max-width: 640px; }
5572
+ .tp-note-l { display: grid; gap: 4px; font-size: 12.5px; color: var(--text2); }
5573
+ .tp-propf { margin-top: 10px; }
5574
+ .tp-prop { display: inline-flex; align-items: center; min-height: 44px; }
5575
+ .tp-nc-w { overflow-wrap: anywhere; }
5576
+ .tp-notes { margin: 12px 0; font-size: 13px; color: var(--text2); }
5577
+ .tp-notes summary { min-height: 44px; display: flex; align-items: center; cursor: pointer; }
5578
+ .tp-del .linkish { min-height: 44px; }
5579
+ .tp-wait { display: flex; align-items: center; gap: 10px; padding: 16px 0; color: var(--text2); }
5580
+ .tp-spin { width: 14px; height: 14px; border: 2px solid var(--line); border-top-color: var(--text2); border-radius: 50%; animation: tp-spin 1s linear infinite; }
5581
+ @keyframes tp-spin { to { transform: rotate(360deg); } }
5582
+ @media (prefers-reduced-motion: reduce) { .tp-spin { animation: none; } }
5583
+ @media (max-width: 600px) { .tp-exp { margin-left: 0; } .tp-k { display: block; min-width: 0; } }
5584
+ /* testplan Part 3: picking merged PRs on the PRs page */
5585
+ .prrow.pickable { display: flex; gap: 8px; align-items: flex-start; }
5586
+ .pr-pick { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; border: 0; background: transparent; color: var(--text2); cursor: pointer; font: inherit; font-size: 18px; line-height: 1; padding: 0; }
5587
+ .pr-pick-w { font-size: 11px; margin-top: 2px; }
5588
+ .pr-pick[aria-pressed="true"] { color: var(--text); }
5589
+ .prs-picks { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 8px 12px; margin: 0 0 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--bg); }
5590
+ .prs-picks .btn, .prs-picks .linkish { min-height: 44px; }
5591
+ .wt-dec .wt-dec-id { white-space: nowrap; flex: none; }