@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/CHANGELOG.md +56 -2
- package/bin/leftoff-statusline.js +9 -0
- package/bin/leftoff.js +794 -540
- package/bin/pty-host-main.js +66 -0
- package/docs/macos-permissions.md +52 -0
- package/docs/test-plan.md +43 -0
- package/mod/.claude-plugin/plugin.json +1 -1
- package/mod/hooks/core.js +172 -12
- package/mod/hooks/register.js +186 -5
- package/mod/skills/walkthrough/SKILL.md +5 -3
- package/package.json +1 -1
- package/ui/app.css +240 -2
- package/ui/app.js +553 -62
- package/ui/ask.js +6 -3
- package/ui/cp-fold.js +22 -0
- package/ui/decisions.js +235 -0
- package/ui/hook-fix.js +109 -0
- package/ui/live-status.js +68 -2
- package/ui/live-view.js +23 -6
- package/ui/prs.js +15 -5
- package/ui/semdiff.js +165 -22
- package/ui/session-catchup.js +18 -2
- package/ui/session-title.js +88 -0
- package/ui/start.js +87 -12
- package/ui/summary-examples.js +2 -2
- package/ui/term.js +11 -3
- package/ui/testplan.js +162 -0
- package/ui/viewport-fit.js +59 -0
- package/ui/walk-pop.js +3 -0
- package/ui/what-it-did.js +12 -5
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; }
|