@peasant-labs/fairtrade 0.0.37 → 0.0.38

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.
@@ -1 +1 @@
1
- @layer graph{.gmp-root{background:var(--canvas);min-width:0;height:100%;min-height:0;font-family:var(--font-body);--gmp-map-pad-x:max(var(--sp-4), calc((100% - 1360px) / 2));flex-direction:column;display:flex}.gmp-map-canvas-region{border:var(--bd);background:var(--canvas);height:100%;min-height:0;position:relative}.gmp-map-legend{align-items:center;gap:var(--sp-4);row-gap:var(--sp-1);margin-top:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-map-swatch{width:10px;height:10px;margin-right:var(--sp-1);vertical-align:middle;border:1px solid var(--rule-strong);background:var(--surface-2);display:inline-block}.gmp-map-swatch--empty{border-color:var(--ink-5);background:var(--surface)}.gmp-map-swatch--edge{border:0;border-top:1px solid var(--rule-strong);background:0 0;width:16px;height:0;margin-top:-1px}.gmp-map-legend-danger{color:var(--danger)}.gmp-navigator{background:var(--canvas);min-height:100%;color:var(--ink);flex-direction:column;display:flex}.gmp-sr{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.gmp-navigator-head{justify-content:space-between;align-items:flex-start;gap:var(--sp-4);padding:var(--sp-4);border-bottom:var(--bd);background:var(--surface-2);display:flex}.gmp-navigator-search{min-width:min(100%, var(--rail-w));height:var(--control-h);border:var(--bd-strong);background:var(--surface);align-items:center;display:flex}.gmp-navigator-search:focus-within{border-color:var(--amber-dim);box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-navigator-search>.lucide{width:var(--ic-sm);height:var(--ic-sm);margin-inline:var(--sp-2);color:var(--ink-3)}.gmp-navigator-search input{min-width:0;height:100%;padding:0 var(--sp-2) 0 0;color:var(--ink);font-family:var(--font-mono);font-size:var(--fs-label);background:0 0;border:0;outline:0;flex:1}.gmp-navigator-search input::placeholder{color:var(--ink-4);text-transform:lowercase}.gmp-navigator-body{grid-template-columns:minmax(0, 1fr) var(--rail-w);min-height:0;display:grid}.gmp-navigator-tree{min-height:calc(var(--control-h) * 8);padding:var(--sp-3) 0;border-right:var(--bd)}.gmp-navigator-row-wrap{grid-template-columns:var(--control-h-sm) minmax(0, 1fr);align-items:center;gap:var(--sp-2);min-height:var(--control-h);padding:var(--sp-2) var(--sp-4) var(--sp-2) calc(var(--sp-4) + var(--gmp-tree-depth) * var(--sp-5));border-left:var(--stroke-emphasis) solid transparent;display:grid}.gmp-navigator-row-wrap:hover{background:var(--surface-hover)}.gmp-navigator-row-wrap:has(.gmp-navigator-row:focus-visible){box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-navigator-row-wrap[data-selected=true]{border-left-color:var(--amber);background:var(--surface-2)}.gmp-navigator-row{grid-template-columns:var(--ic-sm) minmax(0, 1fr) auto;align-items:center;gap:var(--sp-2);cursor:pointer;outline:0;min-width:0;display:grid}.gmp-navigator-row>.lucide{width:var(--ic-sm);height:var(--ic-sm);color:var(--ink-3)}.gmp-navigator-disclosure,.gmp-navigator-disclosure-placeholder{width:var(--control-h-sm);height:var(--control-h-sm)}.gmp-navigator-disclosure{color:var(--ink-3);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin:0;padding:0;display:inline-flex}.gmp-navigator-disclosure:hover{background:var(--surface-hover);color:var(--ink)}.gmp-navigator-disclosure:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-navigator-disclosure[aria-disabled=true]{cursor:default;opacity:.6}.gmp-navigator-chevron{visibility:hidden}@media (prefers-reduced-motion:no-preference){.gmp-navigator-chevron{transition:transform var(--dur-1) var(--ease-standard)}}.gmp-navigator-disclosure[aria-expanded] .gmp-navigator-chevron{visibility:visible}.gmp-navigator-disclosure[aria-expanded=true] .gmp-navigator-chevron{transform:rotate(90deg)}.gmp-navigator-path{white-space:normal;overflow-wrap:anywhere;min-width:0;font-size:var(--fs-sm);line-height:var(--lh-mono);color:var(--ink)}.gmp-navigator-meta{gap:var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);font-variant-numeric:tabular-nums;color:var(--ink-4);display:flex}.gmp-navigator-actions{padding:var(--sp-4);background:var(--surface)}.gmp-navigator-selected{color:var(--ink-strong);overflow-wrap:anywhere;margin:0;font-weight:600}.gmp-navigator-selected-path{margin:var(--sp-1) 0 var(--sp-4);color:var(--ink-4);font-family:var(--font-mono);font-size:var(--fs-label);overflow-wrap:anywhere}.gmp-navigator-action{align-items:center;gap:var(--sp-2);width:100%;min-height:var(--control-h);padding:var(--sp-2) var(--sp-3);border:var(--bd-strong);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0;display:flex}.gmp-navigator-action+.gmp-navigator-action{margin-top:var(--sp-2)}.gmp-navigator-action:hover{background:var(--surface-hover);color:var(--ink)}.gmp-navigator-action:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-navigator-action>.lucide{width:var(--ic-sm);height:var(--ic-sm)}.gmp-navigator-action--primary{border-color:var(--amber-dim);color:var(--amber)}.gmp-navigator-empty{padding:var(--sp-4);color:var(--ink-4);font-size:var(--fs-sm);line-height:var(--lh-body);margin:0}.gmp-navigator-missing{padding:var(--sp-3) var(--sp-4);border-bottom:var(--bd);color:var(--clay);font-size:var(--fs-sm);margin:0}.gmp-navigator-missing button{color:var(--ink);cursor:pointer;background:0 0;border:0;text-decoration:underline}@media (width<768px){.gmp-navigator-head{flex-direction:column}.gmp-navigator-search{width:100%}.gmp-navigator-body{grid-template-columns:1fr}.gmp-navigator-tree{border-right:0;border-bottom:var(--bd)}.gmp-navigator-row{grid-template-columns:var(--ic-sm) minmax(0, 1fr)}.gmp-navigator-meta{gap:var(--sp-2);flex-wrap:wrap;grid-column:2}}@media (prefers-reduced-motion:reduce){.gmp-navigator-chevron{transition:none}}.gmp-toolbar-spacer{flex:1}.gmp-rank-toolbar{align-items:center;gap:var(--sp-3);padding:var(--sp-3);border-bottom:var(--bd);flex-wrap:wrap;display:flex}.gmp-scent-filter{gap:var(--sp-1);flex-wrap:wrap;display:inline-flex}.gmp-rank-overflow{min-height:var(--target-min);padding:var(--sp-2) var(--sp-3);border:0;border-top:var(--bd);background:var(--surface);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-align:left;cursor:pointer;margin:0}.gmp-rank-overflow:hover{background:var(--surface-hover);color:var(--ink-2)}.gmp-presentation-switch{min-height:var(--control-h-sm);border:var(--bd-strong);display:inline-flex}.gmp-presentation-switch button{min-height:var(--target-min);padding:0 var(--sp-3);border:0;border-left:var(--bd);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0}.gmp-presentation-switch button:first-child{border-left:0}.gmp-presentation-switch button:hover{background:var(--surface-hover);color:var(--ink)}.gmp-presentation-switch button[aria-pressed=true]{box-shadow:inset var(--stroke-emphasis) 0 0 var(--amber-dim);background:var(--surface-2);color:var(--ink-strong)}.gmp-presentation-switch button:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}@media (width<768px){.gmp-toolbar-spacer{display:none}}.gmp-rail-inner{border:0}.gmp-rail-pad{padding:var(--sp-3) var(--sp-4)}.gmp-root .rs-sec:has(.gmp-rail-inner){padding:0!important}.gmp-root .rs-sec-body:has(>.gmp-rail-inner){padding:0!important}.gmp-root .rs-sec-body>.gmp-rail-inner>.sb-sec:last-child{border-bottom:0}.gmp-coverage{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-coverage-top{justify-content:space-between;align-items:baseline;gap:var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-2);display:flex}.gmp-coverage-top>.label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.gmp-coverage-pct{white-space:nowrap;color:var(--ink-strong);flex:none;font-weight:600}.gmp-coverage-bar{background:var(--surface-2);border:1px solid var(--rule);height:6px}.gmp-coverage-bar>span{background:var(--amber-dim);height:100%;display:block}.gmp-coverage-sub{font-size:var(--fs-label);color:var(--ink-4)}.gmp-tasklist,.gmp-convos,.gmp-coupling{padding:var(--sp-1) 0;margin:0;list-style:none}.gmp-task-row{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);border:0;border-left:var(--stroke-emphasis) solid transparent;text-align:left;cursor:pointer;min-height:var(--target-min);background:0 0;grid-template-columns:auto minmax(0,1fr) auto;display:grid}.gmp-task-row:hover,.gmp-task-row:focus-visible{background:var(--surface-hover);border-left-color:var(--amber);outline:none}.gmp-task-row:focus-visible{box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-task-title{font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);color:var(--ink);overflow-wrap:anywhere}.gmp-task-when{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4);white-space:nowrap}.gmp-outcome{white-space:nowrap;flex:none}.gmp-rail-filter{margin:0}.gmp-rail-filter .input{height:var(--control-h-sm)}.gmp-showall{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);border:0;border-top:var(--bd);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;text-align:left;cursor:pointer;background:0 0;display:flex}.gmp-showall:hover{background:var(--surface-hover);color:var(--amber-bright)}.gmp-rail-node-head{padding:var(--sp-3) var(--sp-4)}.gmp-rail-close{width:var(--control-h-sm);height:var(--control-h-sm);border:var(--bd-strong);color:var(--ink-3);cursor:pointer;background:0 0;justify-content:center;align-items:center;display:inline-flex}.gmp-rail-close:hover{color:var(--ink);border-color:var(--amber-dim)}.gmp-rail-name{margin-top:var(--sp-2);font-size:var(--fs-sm);color:var(--ink-strong);word-break:break-all}.gmp-rail-meta{gap:var(--sp-3);margin-top:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-connects{gap:var(--sp-3);flex-direction:column;display:flex}.gmp-connect-grp{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-connect-chips{gap:var(--sp-2)}.gmp-connect-chip{cursor:pointer;max-width:100%}.gmp-connect-chip:hover{border-color:var(--amber-dim);color:var(--ink)}.gmp-connect-chip .mono{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.gmp-convo-task{border-bottom:var(--bd)}.gmp-convo-task:last-child{border-bottom:0}.gmp-convo-task-btn{width:100%;padding:var(--sp-3) var(--sp-4);text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;gap:3px;display:flex}.gmp-convo-task-btn:hover{background:var(--surface-hover)}.gmp-convo-task-btn:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-convo-task-top{align-items:center;gap:var(--sp-2);display:flex}.gmp-convo-task-title{font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);color:var(--ink);overflow-wrap:anywhere}.gmp-retry{color:var(--amber);flex:none;align-items:center;margin-left:auto;display:inline-flex}.gmp-retry .lucide{width:var(--ic-sm);height:var(--ic-sm)}.gmp-convo-task-sub{font-size:var(--fs-label);color:var(--ink-4);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-convo-commit{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-4);background:var(--surface-2);border-bottom:var(--bd);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-3);display:flex}.gmp-convo-commit .lucide{color:var(--ink-4);width:var(--ic-sm);height:var(--ic-sm);flex:none}.gmp-commit-hash{color:var(--ink-2);flex:none}.gmp-commit-msg{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-label-chips{gap:var(--sp-1);flex-wrap:wrap;display:flex}.gmp-coupling-row{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);text-align:left;cursor:pointer;background:0 0;border:0;display:flex}.gmp-coupling-row:hover{background:var(--surface-hover)}.gmp-coupling-row:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-coupling-row .lucide{color:var(--ink-5);flex:none}.gmp-coupling-id{font-size:var(--fs-label);color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-coupling-shared{font-size:var(--fs-label);color:var(--ink-4);white-space:nowrap;flex:none;margin-left:auto}.gmp-effort{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-effort-row{justify-content:space-between;align-items:center;gap:var(--sp-3);display:flex}.gmp-effort-row b{color:var(--ink);font-weight:600}.gmp-effort-spend b{color:var(--amber)}.gmp-contribute{align-items:center;gap:var(--sp-2);width:100%;margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border:0;border-top:var(--bd);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;text-align:left;cursor:pointer;background:0 0;display:flex}.gmp-contribute:hover{background:var(--surface-hover);color:var(--amber-bright)}.gmp-contribute .lucide:last-child{margin-left:auto}.gmp-session-destination-title{font-family:var(--font-display);font-size:var(--fs-lg);font-weight:700;line-height:var(--lh-body);color:var(--ink-strong);overflow-wrap:anywhere;margin:0}.gmp-session-destination-context{margin:var(--sp-2) 0 var(--sp-4);color:var(--ink-3);font-size:var(--fs-sm)}.gmp-session-destination-summary{border:var(--bd);background:var(--surface-2);grid-template-columns:repeat(2,minmax(0,1fr));margin:0;display:grid}.gmp-session-destination-summary>div{gap:var(--sp-3);min-height:var(--control-h);padding:var(--sp-3) var(--sp-4);border-bottom:var(--bd);grid-template-columns:minmax(0,1fr) minmax(0,2fr);align-items:baseline;display:grid}.gmp-session-destination-summary>div:nth-last-child(-n+2){border-bottom:0}.gmp-session-destination-summary>div:nth-child(odd){border-right:var(--bd)}.gmp-session-destination-summary dt{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4)}.gmp-session-destination-summary dd{overflow-wrap:anywhere;min-width:0;font-family:var(--font-mono);font-size:var(--fs-sm);color:var(--ink-2);margin:0}@media (width<768px){.gmp-session-destination-summary{grid-template-columns:minmax(0,1fr)}.gmp-session-destination-summary>div{border-right:0}.gmp-session-destination-summary>div:nth-last-child(-n+2){border-bottom:var(--bd)}.gmp-session-destination-summary>div:last-child{border-bottom:0}}.gmp-changes-root{--gmp-pad-x:max(var(--sp-4), calc((100% - 1360px) / 2));max-width:none;margin-inline:0;overflow:auto}.gmp-changes-head{justify-content:space-between;align-items:flex-start;gap:var(--sp-4);padding:var(--sp-4) var(--gmp-pad-x);border-bottom:var(--bd);background:var(--surface);flex:none;display:flex}.gmp-changes-sub{font-size:var(--fs-label);color:var(--ink-4);margin-top:var(--sp-1)}.gmp-changes-body{padding:var(--sp-4) var(--gmp-pad-x);min-width:0}.gmp-unlinked-sessions{margin-top:var(--sp-5);border-top:var(--bd);padding-top:var(--sp-4)}.gmp-unlinked-sessions-head{padding:0 0 var(--sp-2);border:0}.gmp-unlinked-sessions-list{gap:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-unlinked-session{min-height:var(--sp-6);align-items:center;gap:var(--sp-2);max-width:100%;padding:var(--sp-1) var(--sp-2);border:var(--bd);background:var(--surface-2);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-label);text-align:left;cursor:pointer;display:inline-flex}.gmp-unlinked-session:hover{background:var(--surface-hover)}.gmp-unlinked-session:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-merged-chip{align-items:center;gap:var(--sp-2);padding:3px var(--sp-3);background:var(--surface-2);border:1px dashed var(--ink-5);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);cursor:pointer;z-index:3;display:inline-flex;position:absolute}.gmp-merged-chip:hover{color:var(--ink-2);border-color:var(--rule-strong)}.gmp-merged-chip:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-merged-chip .lucide{width:var(--ic-sm);height:var(--ic-sm);flex:none}.gmp-merged-sec{margin-top:var(--sp-5);border-top:var(--bd);padding-top:var(--sp-4)}.gmp-merged-head{padding:0 0 var(--sp-2);border:0}.gmp-merged-list{align-items:center;gap:var(--sp-3);flex-wrap:wrap;display:flex}.gmp-merged-revert{position:static}.gmp-legend-item{align-items:center;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-3);display:inline-flex}.gmp-legend-dim{color:var(--ink-4)}.gmp-changes-legend{align-items:center;gap:var(--sp-4);margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:var(--bd);flex-wrap:wrap;display:flex}.gmp-changes-legend .cg-dot{flex:none;position:static!important;transform:none!important}.gmp-changes-legend .cg-dot-filled{place-items:center;display:inline-grid}.gmp-changes-legend .cg-spark{position:static!important;transform:none!important}@media (width<1440px){.gmp-merged-chip{margin-top:var(--sp-2);position:static!important}}@media (width<768px){.gmp-changes-body{padding:var(--sp-3);overflow:hidden}.gmp-merged-chip{margin-top:var(--sp-2);position:static!important}}.gmp-detail-root{padding:var(--sp-5);gap:0;overflow:auto}.gmp-detail-head{margin-bottom:var(--sp-5)}.gmp-detail-title{font-family:var(--font-display);color:var(--ink-strong);font-weight:700;font-size:var(--fs-lg);margin-top:var(--sp-2)}.gmp-caption{margin-top:var(--sp-4);color:var(--ink-2);font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);max-width:var(--measure-prose)}.gmp-frag{padding:0 var(--sp-1);border:0;border-bottom:var(--stroke-hairline) dotted var(--amber-dim);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-body);cursor:pointer;background:0 0;display:inline}.gmp-frag:hover{color:var(--amber-bright);border-bottom-style:solid}.gmp-frag-on{color:var(--amber-bright);background:color-mix(in srgb, var(--amber) 12%, transparent);border-bottom-style:solid}.gmp-caption-hint{margin-top:var(--sp-2);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);display:block}.gmp-signals{gap:var(--sp-3);margin-bottom:var(--sp-4);flex-wrap:wrap;display:flex}.gmp-signal{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--surface);border:var(--bd);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-3);display:inline-flex}.gmp-signal .lucide{color:var(--ink-4);width:var(--ic-sm);height:var(--ic-sm)}.gmp-signal b{color:var(--ink);font-weight:600}.gmp-signal .mono{text-transform:none;color:var(--ink-2)}.gmp-signal-warn{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 45%, var(--rule))}.gmp-signal-warn .lucide,.gmp-signal-warn b{color:var(--danger)}.gmp-totals{gap:var(--sp-4);padding:var(--sp-3) 0;border-top:var(--bd);border-bottom:var(--bd);margin-bottom:var(--sp-5);flex-wrap:wrap;display:flex}.gmp-add{color:var(--add-rail)}.gmp-del{color:var(--del-rail)}.gmp-detail-sec{margin-bottom:var(--sp-5)}.gmp-detail-sechead{padding:0 0 var(--sp-3);border:0}.gmp-label-chip{align-items:center;gap:var(--sp-1);padding:0 var(--sp-2);border:var(--bd-strong);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-2);display:inline-flex}.gmp-label-chip .lucide{color:var(--amber);width:var(--ic-sm);height:var(--ic-sm)}.gmp-files{flex-direction:column;display:flex}.gmp-file{border:var(--bd)}.gmp-file+.gmp-file{border-top:0}.gmp-file-head{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-3);background:var(--surface);text-align:left;cursor:pointer;border:0;display:flex}.gmp-file-head:hover{background:var(--surface-hover)}.gmp-file-head:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-file-head .lucide:first-child{color:var(--ink-4);flex:none}.gmp-file-path{font-size:var(--fs-sm);color:var(--ink);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.gmp-file-status{height:22px;padding:0 var(--sp-2);flex:none}.gmp-file-convos{color:var(--ink-4);flex:none}.gmp-file-convos .lucide{color:var(--ink-4)}.gmp-file-body{border-top:var(--bd);background:var(--canvas)}.gmp-diff-state{padding:var(--sp-2) var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4)}.gmp-diff-error{color:var(--danger)}.gmp-hunk{border-bottom:var(--bd)}.gmp-hunk:last-child{border-bottom:0}.gmp-hunk-attrib{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--surface-2);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-3);display:flex}.gmp-hunk-attrib .lucide{color:var(--ink-5);flex:none}.gmp-hunk-from{color:var(--ink-4);text-transform:lowercase;flex:none}.gmp-hunk-link{color:var(--amber);font:inherit;cursor:pointer;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;min-width:0;padding:0;overflow:hidden}.gmp-hunk-link:hover{color:var(--amber-bright);text-underline-offset:2px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.gmp-hunk-hash{color:var(--ink-4);flex:none;margin-left:auto}.gmp-hunk-diff{border:0}.gmp-annot{align-items:center;gap:var(--sp-3);flex-wrap:wrap;display:flex;position:relative}.gmp-annot-chip{min-height:var(--target-min);padding:0 var(--sp-1) 0 var(--sp-2);font-size:var(--fs-label)}.gmp-annot-x{width:16px;height:16px;color:var(--ink-4);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin-left:2px;display:inline-flex}.gmp-annot-x:hover{color:var(--ink)}.gmp-annot-add{align-items:center;gap:var(--sp-2);height:var(--control-h-sm);padding:0 var(--sp-3);border:var(--bd-strong);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0;display:inline-flex}.gmp-annot-add:hover{color:var(--ink);border-color:var(--amber-dim)}.gmp-annot-add .lucide{color:var(--amber);width:var(--ic-sm);height:var(--ic-sm)}.gmp-annot-pop{z-index:var(--z-dropdown);gap:var(--sp-2);width:min(280px,90vw);padding:var(--sp-3);background:var(--surface-elev);border:var(--bd-strong);box-shadow:var(--overlay-shadow);flex-direction:column;display:flex;position:absolute;top:calc(100% + 4px);left:0}.gmp-annot-pop .input{height:var(--control-h-sm)}.gmp-annot-pop-foot{justify-content:flex-end;gap:var(--sp-2);display:flex}.gmp-exits{align-items:center;gap:var(--sp-3);padding-top:var(--sp-4);border-top:var(--bd);flex-wrap:wrap;display:flex}.gmp-gitdiff{padding:0 var(--sp-3);height:var(--control-h);background:var(--canvas);border:var(--bd);font-size:var(--fs-label);color:var(--ink-2);align-items:center;display:inline-flex}.gmp-boundary{margin-top:var(--sp-4);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);border-left:var(--stroke-emphasis) solid var(--rule-strong);padding-left:var(--sp-3);line-height:var(--lh-mono)}.tb-graph{background:var(--canvas);--edge:var(--rule-strong);--edge-error:var(--danger);flex-direction:column;height:100%;display:flex;position:relative}.tb-graph-flow{flex:1;min-height:0;position:relative}.tb-graph .react-flow__attribution{display:none}.tb-graph-minimap{border:var(--bd)!important;background:var(--surface)!important;width:160px!important;height:100px!important;bottom:.75rem!important;left:3rem!important}.tb-graph-controls{z-index:var(--z-sticky);border:var(--bd);background:var(--surface);flex-direction:column;display:flex;position:absolute;bottom:.75rem;left:.75rem}.tb-graph-controls-btn{width:var(--control-h-sm);height:var(--control-h-sm);border:0;border-bottom:var(--bd);color:var(--ink-2);cursor:pointer;background:0 0;justify-content:center;align-items:center;display:inline-flex}.tb-graph-controls-btn:last-child{border-bottom:0}.tb-graph-controls-btn:hover{background:var(--surface-hover);color:var(--ink)}.tb-graph-controls-btn:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.tb-graph-legend{z-index:var(--z-sticky);padding:var(--sp-2) var(--sp-3);border:var(--bd);background:var(--surface);position:absolute;top:.75rem;right:.75rem}.tb-gnode-handle{background:var(--rule-strong)!important;border:0!important;width:6px!important;height:6px!important}.tb-gnode-handle-top{top:-3px!important}.tb-gnode-handle-bottom{bottom:-3px!important}.tb-gnode-handle-right{top:50%!important;right:-3px!important;transform:translateY(-50%)!important}.tb-gnode-handle-left{top:50%!important;left:-3px!important;transform:translateY(-50%)!important}@media (prefers-reduced-motion:no-preference){.tb-graph-controls-btn{transition:background var(--dur-1) var(--ease-standard), color var(--dur-1) var(--ease-standard)}}}
1
+ @layer graph{.gmp-root{background:var(--canvas);min-width:0;height:100%;min-height:0;font-family:var(--font-body);--gmp-map-pad-x:max(var(--sp-4), calc((100% - 1360px) / 2));flex-direction:column;display:flex}.gmp-map-canvas-region{border:var(--bd);background:var(--canvas);height:100%;min-height:0;position:relative}.gmp-map-legend{align-items:center;gap:var(--sp-4);row-gap:var(--sp-1);margin-top:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-map-swatch{width:10px;height:10px;margin-right:var(--sp-1);vertical-align:middle;border:1px solid var(--rule-strong);background:var(--surface-2);display:inline-block}.gmp-map-swatch--empty{border-color:var(--ink-5);background:var(--surface)}.gmp-map-swatch--edge{border:0;border-top:1px solid var(--rule-strong);background:0 0;width:16px;height:0;margin-top:-1px}.gmp-map-legend-danger{color:var(--danger)}.gmp-navigator{background:var(--canvas);min-height:100%;color:var(--ink);flex-direction:column;display:flex}.gmp-sr{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.gmp-head-actions{justify-content:flex-end;align-items:center;gap:var(--sp-2);flex-wrap:wrap;display:inline-flex}.gmp-head-row{justify-content:space-between;align-items:center;gap:var(--sp-2) var(--sp-3);flex-wrap:wrap;display:flex}.gmp-navigator-head{justify-content:space-between;align-items:flex-start;gap:var(--sp-4);padding:var(--sp-4);border-bottom:var(--bd);background:var(--surface-2);display:flex}.gmp-navigator-search{min-width:min(100%, var(--rail-w));height:var(--control-h);border:var(--bd-strong);background:var(--surface);align-items:center;display:flex}.gmp-navigator-search:focus-within{border-color:var(--amber-dim);box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-navigator-search>.lucide{width:var(--ic-sm);height:var(--ic-sm);margin-inline:var(--sp-2);color:var(--ink-3)}.gmp-navigator-search input{min-width:0;height:100%;padding:0 var(--sp-2) 0 0;color:var(--ink);font-family:var(--font-mono);font-size:var(--fs-label);background:0 0;border:0;outline:0;flex:1}.gmp-navigator-search input::placeholder{color:var(--ink-4);text-transform:lowercase}.gmp-navigator-body{grid-template-columns:minmax(0, 1fr) var(--rail-w);min-height:0;display:grid}.gmp-navigator-tree{min-height:calc(var(--control-h) * 8);padding:var(--sp-3) 0;border-right:var(--bd)}.gmp-navigator-row-wrap{grid-template-columns:var(--control-h-sm) minmax(0, 1fr);align-items:center;gap:var(--sp-2);min-height:var(--control-h);padding:var(--sp-2) var(--sp-4) var(--sp-2) calc(var(--sp-4) + var(--gmp-tree-depth) * var(--sp-5));border-left:var(--stroke-emphasis) solid transparent;display:grid}.gmp-navigator-row-wrap:hover{background:var(--surface-hover)}.gmp-navigator-row-wrap:has(.gmp-navigator-row:focus-visible){box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-navigator-row-wrap[data-selected=true]{border-left-color:var(--amber);background:var(--surface-2)}.gmp-navigator-row{grid-template-columns:var(--ic-sm) minmax(0, 1fr) auto;align-items:center;gap:var(--sp-2);cursor:pointer;outline:0;min-width:0;display:grid}.gmp-navigator-row>.lucide{width:var(--ic-sm);height:var(--ic-sm);color:var(--ink-3)}.gmp-navigator-disclosure,.gmp-navigator-disclosure-placeholder{width:var(--control-h-sm);height:var(--control-h-sm)}.gmp-navigator-disclosure{color:var(--ink-3);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin:0;padding:0;display:inline-flex}.gmp-navigator-disclosure:hover{background:var(--surface-hover);color:var(--ink)}.gmp-navigator-disclosure:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-navigator-disclosure[aria-disabled=true]{cursor:default;opacity:.6}.gmp-navigator-chevron{visibility:hidden}@media (prefers-reduced-motion:no-preference){.gmp-navigator-chevron{transition:transform var(--dur-1) var(--ease-standard)}}.gmp-navigator-disclosure[aria-expanded] .gmp-navigator-chevron{visibility:visible}.gmp-navigator-disclosure[aria-expanded=true] .gmp-navigator-chevron{transform:rotate(90deg)}.gmp-navigator-path{white-space:normal;overflow-wrap:anywhere;min-width:0;font-size:var(--fs-sm);line-height:var(--lh-mono);color:var(--ink)}.gmp-navigator-meta{gap:var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);font-variant-numeric:tabular-nums;color:var(--ink-4);display:flex}.gmp-navigator-actions{padding:var(--sp-4);background:var(--surface)}.gmp-navigator-selected{color:var(--ink-strong);overflow-wrap:anywhere;margin:0;font-weight:600}.gmp-navigator-selected-path{margin:var(--sp-1) 0 var(--sp-4);color:var(--ink-4);font-family:var(--font-mono);font-size:var(--fs-label);overflow-wrap:anywhere}.gmp-navigator-action{align-items:center;gap:var(--sp-2);width:100%;min-height:var(--control-h);padding:var(--sp-2) var(--sp-3);border:var(--bd-strong);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0;display:flex}.gmp-navigator-action+.gmp-navigator-action{margin-top:var(--sp-2)}.gmp-navigator-action:hover{background:var(--surface-hover);color:var(--ink)}.gmp-navigator-action:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-navigator-action>.lucide{width:var(--ic-sm);height:var(--ic-sm)}.gmp-navigator-action--primary{border-color:var(--amber-dim);color:var(--amber)}.gmp-navigator-empty{padding:var(--sp-4);color:var(--ink-4);font-size:var(--fs-sm);line-height:var(--lh-body);margin:0}.gmp-navigator-missing{padding:var(--sp-3) var(--sp-4);border-bottom:var(--bd);color:var(--clay);font-size:var(--fs-sm);margin:0}.gmp-navigator-missing button{color:var(--ink);cursor:pointer;background:0 0;border:0;text-decoration:underline}@media (width<768px){.gmp-navigator-head{flex-direction:column}.gmp-navigator-search{width:100%}.gmp-navigator-body{grid-template-columns:1fr}.gmp-navigator-tree{border-right:0;border-bottom:var(--bd)}.gmp-navigator-row{grid-template-columns:var(--ic-sm) minmax(0, 1fr)}.gmp-navigator-meta{gap:var(--sp-2);flex-wrap:wrap;grid-column:2}}@media (prefers-reduced-motion:reduce){.gmp-navigator-chevron{transition:none}}.gmp-toolbar-spacer{flex:1}.gmp-rank-toolbar{align-items:center;gap:var(--sp-3);padding:var(--sp-3);border-bottom:var(--bd);flex-wrap:wrap;display:flex}.gmp-scent-filter{gap:var(--sp-1);flex-wrap:wrap;display:inline-flex}.gmp-rank-overflow{min-height:var(--target-min);padding:var(--sp-2) var(--sp-3);border:0;border-top:var(--bd);background:var(--surface);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-align:left;cursor:pointer;margin:0}.gmp-rank-overflow:hover{background:var(--surface-hover);color:var(--ink-2)}.gmp-presentation-switch{min-height:var(--control-h-sm);border:var(--bd-strong);display:inline-flex}.gmp-presentation-switch button{min-height:var(--target-min);padding:0 var(--sp-3);border:0;border-left:var(--bd);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0}.gmp-presentation-switch button:first-child{border-left:0}.gmp-presentation-switch button:hover{background:var(--surface-hover);color:var(--ink)}.gmp-presentation-switch button[aria-pressed=true]{box-shadow:inset var(--stroke-emphasis) 0 0 var(--amber-dim);background:var(--surface-2);color:var(--ink-strong)}.gmp-presentation-switch button:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}@media (width<768px){.gmp-toolbar-spacer{display:none}}.gmp-rail-inner{border:0}.gmp-rail-pad{padding:var(--sp-3) var(--sp-4)}.gmp-root .rs-sec:has(.gmp-rail-inner){padding:0!important}.gmp-root .rs-sec-body:has(>.gmp-rail-inner){padding:0!important}.gmp-root .rs-sec-body>.gmp-rail-inner>.sb-sec:last-child{border-bottom:0}.gmp-coverage{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-coverage-top{justify-content:space-between;align-items:baseline;gap:var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-2);display:flex}.gmp-coverage-top>.label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.gmp-coverage-pct{white-space:nowrap;color:var(--ink-strong);flex:none;font-weight:600}.gmp-coverage-bar{background:var(--surface-2);border:1px solid var(--rule);height:6px}.gmp-coverage-bar>span{background:var(--amber-dim);height:100%;display:block}.gmp-coverage-sub{font-size:var(--fs-label);color:var(--ink-4)}.gmp-tasklist,.gmp-convos,.gmp-coupling{padding:var(--sp-1) 0;margin:0;list-style:none}.gmp-task-row{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);border:0;border-left:var(--stroke-emphasis) solid transparent;text-align:left;cursor:pointer;min-height:var(--target-min);background:0 0;grid-template-columns:auto minmax(0,1fr) auto;display:grid}.gmp-task-row:hover,.gmp-task-row:focus-visible{background:var(--surface-hover);border-left-color:var(--amber);outline:none}.gmp-task-row:focus-visible{box-shadow:inset 0 0 0 var(--focus-ring-width) var(--focus-ring)}.gmp-task-title{font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);color:var(--ink);overflow-wrap:anywhere}.gmp-task-when{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4);white-space:nowrap}.gmp-outcome{white-space:nowrap;flex:none}.gmp-rail-filter{margin:0}.gmp-rail-filter .input{height:var(--control-h-sm)}.gmp-showall{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);border:0;border-top:var(--bd);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;text-align:left;cursor:pointer;background:0 0;display:flex}.gmp-showall:hover{background:var(--surface-hover);color:var(--amber-bright)}.gmp-rail-node-head{padding:var(--sp-3) var(--sp-4)}.gmp-rail-close{width:var(--control-h-sm);height:var(--control-h-sm);border:var(--bd-strong);color:var(--ink-3);cursor:pointer;background:0 0;justify-content:center;align-items:center;display:inline-flex}.gmp-rail-close:hover{color:var(--ink);border-color:var(--amber-dim)}.gmp-rail-name{margin-top:var(--sp-2);font-size:var(--fs-sm);color:var(--ink-strong);word-break:break-all}.gmp-rail-meta{gap:var(--sp-3);margin-top:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-connects{gap:var(--sp-3);flex-direction:column;display:flex}.gmp-connect-grp{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-connect-chips{gap:var(--sp-2)}.gmp-connect-chip{cursor:pointer;max-width:100%}.gmp-connect-chip:hover{border-color:var(--amber-dim);color:var(--ink)}.gmp-connect-chip .mono{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.gmp-convo-task{border-bottom:var(--bd)}.gmp-convo-task:last-child{border-bottom:0}.gmp-convo-task-btn{width:100%;padding:var(--sp-3) var(--sp-4);text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;gap:3px;display:flex}.gmp-convo-task-btn:hover{background:var(--surface-hover)}.gmp-convo-task-btn:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-convo-task-top{align-items:center;gap:var(--sp-2);display:flex}.gmp-convo-task-title{font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);color:var(--ink);overflow-wrap:anywhere}.gmp-retry{color:var(--amber);flex:none;align-items:center;margin-left:auto;display:inline-flex}.gmp-retry .lucide{width:var(--ic-sm);height:var(--ic-sm)}.gmp-convo-task-sub{font-size:var(--fs-label);color:var(--ink-4);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-convo-commit{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-4);background:var(--surface-2);border-bottom:var(--bd);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-3);display:flex}.gmp-convo-commit .lucide{color:var(--ink-4);width:var(--ic-sm);height:var(--ic-sm);flex:none}.gmp-commit-hash{color:var(--ink-2);flex:none}.gmp-commit-msg{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-label-chips{gap:var(--sp-1);flex-wrap:wrap;display:flex}.gmp-coupling-row{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-4);text-align:left;cursor:pointer;background:0 0;border:0;display:flex}.gmp-coupling-row:hover{background:var(--surface-hover)}.gmp-coupling-row:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-coupling-row .lucide{color:var(--ink-5);flex:none}.gmp-coupling-id{font-size:var(--fs-label);color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gmp-coupling-shared{font-size:var(--fs-label);color:var(--ink-4);white-space:nowrap;flex:none;margin-left:auto}.gmp-effort{gap:var(--sp-2);flex-direction:column;display:flex}.gmp-effort-row{justify-content:space-between;align-items:center;gap:var(--sp-3);display:flex}.gmp-effort-row b{color:var(--ink);font-weight:600}.gmp-effort-spend b{color:var(--amber)}.gmp-contribute{align-items:center;gap:var(--sp-2);width:100%;margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border:0;border-top:var(--bd);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;text-align:left;cursor:pointer;background:0 0;display:flex}.gmp-contribute:hover{background:var(--surface-hover);color:var(--amber-bright)}.gmp-contribute .lucide:last-child{margin-left:auto}.gmp-session-destination-title{font-family:var(--font-display);font-size:var(--fs-lg);font-weight:700;line-height:var(--lh-body);color:var(--ink-strong);overflow-wrap:anywhere;margin:0}.gmp-session-destination-context{margin:var(--sp-2) 0 var(--sp-4);color:var(--ink-3);font-size:var(--fs-sm)}.gmp-session-destination-summary{border:var(--bd);background:var(--surface-2);grid-template-columns:repeat(2,minmax(0,1fr));margin:0;display:grid}.gmp-session-destination-summary>div{gap:var(--sp-3);min-height:var(--control-h);padding:var(--sp-3) var(--sp-4);border-bottom:var(--bd);grid-template-columns:minmax(0,1fr) minmax(0,2fr);align-items:baseline;display:grid}.gmp-session-destination-summary>div:nth-last-child(-n+2){border-bottom:0}.gmp-session-destination-summary>div:nth-child(odd){border-right:var(--bd)}.gmp-session-destination-summary dt{font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4)}.gmp-session-destination-summary dd{overflow-wrap:anywhere;min-width:0;font-family:var(--font-mono);font-size:var(--fs-sm);color:var(--ink-2);margin:0}@media (width<768px){.gmp-session-destination-summary{grid-template-columns:minmax(0,1fr)}.gmp-session-destination-summary>div{border-right:0}.gmp-session-destination-summary>div:nth-last-child(-n+2){border-bottom:var(--bd)}.gmp-session-destination-summary>div:last-child{border-bottom:0}}.gmp-changes-root{--gmp-pad-x:max(var(--sp-4), calc((100% - 1360px) / 2));max-width:none;margin-inline:0;overflow:auto}.gmp-changes-head{justify-content:space-between;align-items:flex-start;gap:var(--sp-4);padding:var(--sp-4) var(--gmp-pad-x);border-bottom:var(--bd);background:var(--surface);flex:none;display:flex}.gmp-changes-sub{font-size:var(--fs-label);color:var(--ink-4);margin-top:var(--sp-1)}.gmp-changes-body{padding:var(--sp-4) var(--gmp-pad-x);min-width:0}.gmp-unlinked-sessions{margin-top:var(--sp-5);border-top:var(--bd);padding-top:var(--sp-4)}.gmp-unlinked-sessions-head{padding:0 0 var(--sp-2);border:0}.gmp-unlinked-sessions-list{gap:var(--sp-2);flex-wrap:wrap;display:flex}.gmp-unlinked-session{min-height:var(--sp-6);align-items:center;gap:var(--sp-2);max-width:100%;padding:var(--sp-1) var(--sp-2);border:var(--bd);background:var(--surface-2);color:var(--ink-2);font-family:var(--font-mono);font-size:var(--fs-label);text-align:left;cursor:pointer;display:inline-flex}.gmp-unlinked-session:hover{background:var(--surface-hover)}.gmp-unlinked-session:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-merged-chip{align-items:center;gap:var(--sp-2);padding:3px var(--sp-3);background:var(--surface-2);border:1px dashed var(--ink-5);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);cursor:pointer;z-index:3;display:inline-flex;position:absolute}.gmp-merged-chip:hover{color:var(--ink-2);border-color:var(--rule-strong)}.gmp-merged-chip:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset)}.gmp-merged-chip .lucide{width:var(--ic-sm);height:var(--ic-sm);flex:none}.gmp-merged-sec{margin-top:var(--sp-5);border-top:var(--bd);padding-top:var(--sp-4)}.gmp-merged-head{padding:0 0 var(--sp-2);border:0}.gmp-merged-list{align-items:center;gap:var(--sp-3);flex-wrap:wrap;display:flex}.gmp-merged-revert{position:static}.gmp-legend-item{align-items:center;gap:var(--sp-2);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-3);display:inline-flex}.gmp-legend-dim{color:var(--ink-4)}.gmp-changes-legend{align-items:center;gap:var(--sp-4);margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:var(--bd);flex-wrap:wrap;display:flex}.gmp-changes-legend .cg-dot{flex:none;position:static!important;transform:none!important}.gmp-changes-legend .cg-dot-filled{place-items:center;display:inline-grid}.gmp-changes-legend .cg-spark{position:static!important;transform:none!important}@media (width<1440px){.gmp-merged-chip{margin-top:var(--sp-2);position:static!important}}@media (width<768px){.gmp-changes-body{padding:var(--sp-3);overflow:hidden}.gmp-merged-chip{margin-top:var(--sp-2);position:static!important}}.gmp-detail-root{padding:var(--sp-5);gap:0;overflow:auto}.gmp-detail-head{margin-bottom:var(--sp-5)}.gmp-detail-title{font-family:var(--font-display);color:var(--ink-strong);font-weight:700;font-size:var(--fs-lg);margin-top:var(--sp-2)}.gmp-caption{margin-top:var(--sp-4);color:var(--ink-2);font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);max-width:var(--measure-prose)}.gmp-frag{padding:0 var(--sp-1);border:0;border-bottom:var(--stroke-hairline) dotted var(--amber-dim);color:var(--amber);font-family:var(--font-mono);font-size:var(--fs-body);cursor:pointer;background:0 0;display:inline}.gmp-frag:hover{color:var(--amber-bright);border-bottom-style:solid}.gmp-frag-on{color:var(--amber-bright);background:color-mix(in srgb, var(--amber) 12%, transparent);border-bottom-style:solid}.gmp-caption-hint{margin-top:var(--sp-2);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);display:block}.gmp-signals{gap:var(--sp-3);margin-bottom:var(--sp-4);flex-wrap:wrap;display:flex}.gmp-signal{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--surface);border:var(--bd);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-3);display:inline-flex}.gmp-signal .lucide{color:var(--ink-4);width:var(--ic-sm);height:var(--ic-sm)}.gmp-signal b{color:var(--ink);font-weight:600}.gmp-signal .mono{text-transform:none;color:var(--ink-2)}.gmp-signal-warn{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 45%, var(--rule))}.gmp-signal-warn .lucide,.gmp-signal-warn b{color:var(--danger)}.gmp-totals{gap:var(--sp-4);padding:var(--sp-3) 0;border-top:var(--bd);border-bottom:var(--bd);margin-bottom:var(--sp-5);flex-wrap:wrap;display:flex}.gmp-add{color:var(--add-rail)}.gmp-del{color:var(--del-rail)}.gmp-detail-sec{margin-bottom:var(--sp-5)}.gmp-detail-sechead{padding:0 0 var(--sp-3);border:0}.gmp-label-chip{align-items:center;gap:var(--sp-1);padding:0 var(--sp-2);border:var(--bd-strong);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-2);display:inline-flex}.gmp-label-chip .lucide{color:var(--amber);width:var(--ic-sm);height:var(--ic-sm)}.gmp-files{flex-direction:column;display:flex}.gmp-file{border:var(--bd)}.gmp-file+.gmp-file{border-top:0}.gmp-file-head{align-items:center;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-3);background:var(--surface);text-align:left;cursor:pointer;border:0;display:flex}.gmp-file-head:hover{background:var(--surface-hover)}.gmp-file-head:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.gmp-file-head .lucide:first-child{color:var(--ink-4);flex:none}.gmp-file-path{font-size:var(--fs-sm);color:var(--ink);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.gmp-file-status{height:22px;padding:0 var(--sp-2);flex:none}.gmp-file-convos{color:var(--ink-4);flex:none}.gmp-file-convos .lucide{color:var(--ink-4)}.gmp-file-body{border-top:var(--bd);background:var(--canvas)}.gmp-diff-state{padding:var(--sp-2) var(--sp-3);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-4)}.gmp-diff-error{color:var(--danger)}.gmp-hunk{border-bottom:var(--bd)}.gmp-hunk:last-child{border-bottom:0}.gmp-hunk-attrib{align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--surface-2);font-family:var(--font-mono);font-size:var(--fs-label);color:var(--ink-3);display:flex}.gmp-hunk-attrib .lucide{color:var(--ink-5);flex:none}.gmp-hunk-from{color:var(--ink-4);text-transform:lowercase;flex:none}.gmp-hunk-link{color:var(--amber);font:inherit;cursor:pointer;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;min-width:0;padding:0;overflow:hidden}.gmp-hunk-link:hover{color:var(--amber-bright);text-underline-offset:2px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.gmp-hunk-hash{color:var(--ink-4);flex:none;margin-left:auto}.gmp-hunk-diff{border:0}.gmp-annot{align-items:center;gap:var(--sp-3);flex-wrap:wrap;display:flex;position:relative}.gmp-annot-chip{min-height:var(--target-min);padding:0 var(--sp-1) 0 var(--sp-2);font-size:var(--fs-label)}.gmp-annot-x{width:16px;height:16px;color:var(--ink-4);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin-left:2px;display:inline-flex}.gmp-annot-x:hover{color:var(--ink)}.gmp-annot-add{align-items:center;gap:var(--sp-2);height:var(--control-h-sm);padding:0 var(--sp-3);border:var(--bd-strong);color:var(--ink-3);font-family:var(--font-mono);font-size:var(--fs-label);text-transform:lowercase;cursor:pointer;background:0 0;display:inline-flex}.gmp-annot-add:hover{color:var(--ink);border-color:var(--amber-dim)}.gmp-annot-add .lucide{color:var(--amber);width:var(--ic-sm);height:var(--ic-sm)}.gmp-annot-pop{z-index:var(--z-dropdown);gap:var(--sp-2);width:min(280px,90vw);padding:var(--sp-3);background:var(--surface-elev);border:var(--bd-strong);box-shadow:var(--overlay-shadow);flex-direction:column;display:flex;position:absolute;top:calc(100% + 4px);left:0}.gmp-annot-pop .input{height:var(--control-h-sm)}.gmp-annot-pop-foot{justify-content:flex-end;gap:var(--sp-2);display:flex}.gmp-exits{align-items:center;gap:var(--sp-3);padding-top:var(--sp-4);border-top:var(--bd);flex-wrap:wrap;display:flex}.gmp-gitdiff{padding:0 var(--sp-3);height:var(--control-h);background:var(--canvas);border:var(--bd);font-size:var(--fs-label);color:var(--ink-2);align-items:center;display:inline-flex}.gmp-boundary{margin-top:var(--sp-4);font-size:var(--fs-label);text-transform:lowercase;color:var(--ink-4);border-left:var(--stroke-emphasis) solid var(--rule-strong);padding-left:var(--sp-3);line-height:var(--lh-mono)}.tb-graph{background:var(--canvas);--edge:var(--rule-strong);--edge-error:var(--danger);flex-direction:column;height:100%;display:flex;position:relative}.tb-graph-flow{flex:1;min-height:0;position:relative}.tb-graph .react-flow__attribution{display:none}.tb-graph-minimap{border:var(--bd)!important;background:var(--surface)!important;width:160px!important;height:100px!important;bottom:.75rem!important;left:3rem!important}.tb-graph-controls{z-index:var(--z-sticky);border:var(--bd);background:var(--surface);flex-direction:column;display:flex;position:absolute;bottom:.75rem;left:.75rem}.tb-graph-controls-btn{width:var(--control-h-sm);height:var(--control-h-sm);border:0;border-bottom:var(--bd);color:var(--ink-2);cursor:pointer;background:0 0;justify-content:center;align-items:center;display:inline-flex}.tb-graph-controls-btn:last-child{border-bottom:0}.tb-graph-controls-btn:hover{background:var(--surface-hover);color:var(--ink)}.tb-graph-controls-btn:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset-inset)}.tb-graph-legend{z-index:var(--z-sticky);padding:var(--sp-2) var(--sp-3);border:var(--bd);background:var(--surface);position:absolute;top:.75rem;right:.75rem}.tb-gnode-handle{background:var(--rule-strong)!important;border:0!important;width:6px!important;height:6px!important}.tb-gnode-handle-top{top:-3px!important}.tb-gnode-handle-bottom{bottom:-3px!important}.tb-gnode-handle-right{top:50%!important;right:-3px!important;transform:translateY(-50%)!important}.tb-gnode-handle-left{top:50%!important;left:-3px!important;transform:translateY(-50%)!important}@media (prefers-reduced-motion:no-preference){.tb-graph-controls-btn{transition:background var(--dur-1) var(--ease-standard), color var(--dur-1) var(--ease-standard)}}}
package/dist/lib/graph.js CHANGED
@@ -73,20 +73,20 @@ function Rt(e) {
73
73
  }
74
74
  //#endregion
75
75
  //#region src/ui/graph/Changes.jsx
76
- function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelectChange: i, onOpenMap: a, hasMore: o = !1, onShowOlder: s, onOpenSession: c, nowMs: l }) {
77
- let u = l ?? Date.now(), { commits: d, reverted: f, unlinkedSessions: p, outsideWindowSessions: m, openCount: h, mergedCount: g } = B(() => Lt(e, { nowMs: u }), [e, u]), _ = e.defaultBranch, v = B(() => new Set(d.filter((e) => (e.sessionRefs?.length ?? 0) > 2).map((e) => e.id)), [d]), [y, b] = H([]);
76
+ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelectChange: i, onOpenMap: a, hasMore: o = !1, onShowOlder: s, onOpenSession: c, nowMs: l, headerActions: u }) {
77
+ let d = l ?? Date.now(), { commits: f, reverted: p, unlinkedSessions: m, outsideWindowSessions: h, openCount: g, mergedCount: _ } = B(() => Lt(e, { nowMs: d }), [e, d]), v = e.defaultBranch, y = B(() => new Set(f.filter((e) => (e.sessionRefs?.length ?? 0) > 2).map((e) => e.id)), [f]), [b, x] = H([]);
78
78
  z(() => {
79
- b((e) => {
80
- let t = e.filter((e) => v.has(e));
79
+ x((e) => {
80
+ let t = e.filter((e) => y.has(e));
81
81
  return t.length === e.length ? e : t;
82
82
  });
83
- }, [v]);
84
- let x = R((e) => {
85
- v.has(e) && b((t) => {
83
+ }, [y]);
84
+ let S = R((e) => {
85
+ y.has(e) && x((t) => {
86
86
  let n = new Set(t);
87
87
  return n.has(e) ? n.delete(e) : n.add(e), [...n];
88
88
  });
89
- }, [v]);
89
+ }, [y]);
90
90
  return /* @__PURE__ */ W("div", {
91
91
  className: "gmp-root gmp-changes-root",
92
92
  children: [/* @__PURE__ */ W("div", {
@@ -97,29 +97,32 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
97
97
  }), /* @__PURE__ */ W("div", {
98
98
  className: "gmp-changes-sub mono",
99
99
  children: [
100
- _ ? `default branch ${_}, ` : "",
101
- h,
102
- " open, ",
100
+ v ? `default branch ${v}, ` : "",
103
101
  g,
102
+ " open, ",
103
+ _,
104
104
  " merged"
105
105
  ]
106
- })] }), /* @__PURE__ */ W("button", {
107
- type: "button",
108
- className: "btn btn-secondary btn-sm",
109
- onClick: () => {
110
- r ? r({ type: "open-map" }) : a?.();
111
- },
112
- children: [/* @__PURE__ */ U(Oe, {
113
- size: 14,
114
- "aria-hidden": "true"
115
- }), " open the map"]
106
+ })] }), /* @__PURE__ */ W("div", {
107
+ className: "gmp-head-actions",
108
+ children: [u, /* @__PURE__ */ W("button", {
109
+ type: "button",
110
+ className: "btn btn-secondary btn-sm",
111
+ onClick: () => {
112
+ r ? r({ type: "open-map" }) : a?.();
113
+ },
114
+ children: [/* @__PURE__ */ U(Oe, {
115
+ size: 14,
116
+ "aria-hidden": "true"
117
+ }), " open the map"]
118
+ })]
116
119
  })]
117
120
  }), /* @__PURE__ */ W("div", {
118
121
  className: "gmp-changes-body",
119
122
  children: [
120
123
  /* @__PURE__ */ U(ue, {
121
124
  className: "gmp-cg",
122
- commits: d,
125
+ commits: f,
123
126
  selectedId: n,
124
127
  label: "default-branch commit history",
125
128
  onNavigate: r,
@@ -127,10 +130,10 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
127
130
  onOpenSession: c,
128
131
  hasMore: o,
129
132
  onShowOlder: s,
130
- expandedCommitSessions: y,
131
- onToggleCommitSessions: x
133
+ expandedCommitSessions: b,
134
+ onToggleCommitSessions: S
132
135
  }),
133
- p.length > 0 && /* @__PURE__ */ W("section", {
136
+ m.length > 0 && /* @__PURE__ */ W("section", {
134
137
  className: "gmp-unlinked-sessions",
135
138
  "aria-labelledby": "gmp-unlinked-sessions-heading",
136
139
  children: [/* @__PURE__ */ U("h2", {
@@ -139,7 +142,7 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
139
142
  children: "sessions not linked to a commit"
140
143
  }), /* @__PURE__ */ U("div", {
141
144
  className: "gmp-unlinked-sessions-list",
142
- children: p.map((e) => /* @__PURE__ */ W("button", {
145
+ children: m.map((e) => /* @__PURE__ */ W("button", {
143
146
  type: "button",
144
147
  className: "gmp-unlinked-session",
145
148
  onClick: () => {
@@ -153,7 +156,7 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
153
156
  }, e.sessionId))
154
157
  })]
155
158
  }),
156
- m.length > 0 && /* @__PURE__ */ W("section", {
159
+ h.length > 0 && /* @__PURE__ */ W("section", {
157
160
  className: "gmp-unlinked-sessions",
158
161
  "aria-labelledby": "gmp-outside-window-sessions-heading",
159
162
  children: [/* @__PURE__ */ U("h2", {
@@ -162,7 +165,7 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
162
165
  children: "sessions linked outside this visible commit window"
163
166
  }), /* @__PURE__ */ U("div", {
164
167
  className: "gmp-unlinked-sessions-list",
165
- children: m.map((e) => /* @__PURE__ */ W("button", {
168
+ children: h.map((e) => /* @__PURE__ */ W("button", {
166
169
  type: "button",
167
170
  className: "gmp-unlinked-session",
168
171
  onClick: () => {
@@ -176,14 +179,14 @@ function zt({ payload: e, projectLabel: t, selectedId: n, onNavigate: r, onSelec
176
179
  }, e.sessionId))
177
180
  })]
178
181
  }),
179
- f.length > 0 && /* @__PURE__ */ W("div", {
182
+ p.length > 0 && /* @__PURE__ */ W("div", {
180
183
  className: "gmp-merged-sec",
181
184
  children: [/* @__PURE__ */ U("div", {
182
185
  className: "sb-head gmp-merged-head",
183
186
  children: "already merged in"
184
187
  }), /* @__PURE__ */ U("div", {
185
188
  className: "gmp-merged-list",
186
- children: f.map((e) => /* @__PURE__ */ W("button", {
189
+ children: p.map((e) => /* @__PURE__ */ W("button", {
187
190
  type: "button",
188
191
  className: "gmp-merged-chip gmp-merged-revert",
189
192
  onClick: () => {
@@ -382,19 +385,19 @@ function Kt({ file: t, diff: n, open: r, onToggle: i }) {
382
385
  })]
383
386
  });
384
387
  }
385
- function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnotation: i, onRemoveAnnotation: a, onOpenMap: o, onShare: s, onCopyRecap: c, initialOpenFiles: l = {} }) {
388
+ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnotation: i, onRemoveAnnotation: a, onOpenMap: o, onShare: s, onCopyRecap: c, initialOpenFiles: l = {}, headerActions: u }) {
386
389
  v(e);
387
- let [u, d] = H(l), [f, p] = H(null), [m, h] = H(!1), [g, _] = H(""), y = V({}), b = V(null), x = n ?? Ut(e.branch), S = e.work.length, C = e.newEdges.length, w = e.removedEdges.length, T = (e) => d((t) => ({
390
+ let [d, f] = H(l), [p, m] = H(null), [h, g] = H(!1), [_, y] = H(""), b = V({}), x = V(null), S = n ?? Ut(e.branch), C = e.work.length, w = e.newEdges.length, T = e.removedEdges.length, E = (e) => f((t) => ({
388
391
  ...t,
389
392
  [e]: !t[e]
390
393
  }));
391
- function E(e, t) {
392
- if (p(e), t) {
393
- d((e) => ({
394
+ function D(e, t) {
395
+ if (m(e), t) {
396
+ f((e) => ({
394
397
  ...e,
395
398
  [t]: !0
396
399
  }));
397
- let e = y.current[t], n = b.current;
400
+ let e = b.current[t], n = x.current;
398
401
  if (e && n) {
399
402
  let t = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
400
403
  n.scrollTo({
@@ -404,44 +407,50 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
404
407
  }
405
408
  }
406
409
  }
407
- function D(e) {
410
+ function O(e) {
408
411
  e.preventDefault();
409
- let t = g.trim();
410
- t && i?.(t), h(!1), _("");
412
+ let t = _.trim();
413
+ t && i?.(t), g(!1), y("");
411
414
  }
412
- let O = e.files[0]?.path;
415
+ let k = e.files[0]?.path;
413
416
  return /* @__PURE__ */ W("div", {
414
417
  className: "gmp-root gmp-detail-root",
415
- ref: b,
418
+ ref: x,
416
419
  children: [
417
420
  /* @__PURE__ */ W("div", {
418
421
  className: "gmp-detail-head",
419
422
  children: [
420
423
  /* @__PURE__ */ W("div", {
421
- className: "crumb",
422
- children: [
423
- "review ",
424
- /* @__PURE__ */ U(G, {
425
- size: 14,
426
- "aria-hidden": "true"
427
- }),
428
- " ",
429
- e.defaultBranch,
430
- " ",
431
- /* @__PURE__ */ U(G, {
432
- size: 14,
433
- "aria-hidden": "true"
434
- }),
435
- " ",
436
- /* @__PURE__ */ U("span", {
437
- className: "cur",
438
- children: e.branch
439
- })
440
- ]
424
+ className: "gmp-head-row",
425
+ children: [/* @__PURE__ */ W("div", {
426
+ className: "crumb",
427
+ children: [
428
+ "review ",
429
+ /* @__PURE__ */ U(G, {
430
+ size: 14,
431
+ "aria-hidden": "true"
432
+ }),
433
+ " ",
434
+ e.defaultBranch,
435
+ " ",
436
+ /* @__PURE__ */ U(G, {
437
+ size: 14,
438
+ "aria-hidden": "true"
439
+ }),
440
+ " ",
441
+ /* @__PURE__ */ U("span", {
442
+ className: "cur",
443
+ children: e.branch
444
+ })
445
+ ]
446
+ }), u ? /* @__PURE__ */ U("div", {
447
+ className: "gmp-head-actions",
448
+ children: u
449
+ }) : null]
441
450
  }),
442
451
  /* @__PURE__ */ U("div", {
443
452
  className: "gmp-detail-title",
444
- children: x
453
+ children: S
445
454
  }),
446
455
  /* @__PURE__ */ W("p", {
447
456
  className: "gmp-caption",
@@ -450,8 +459,8 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
450
459
  " ",
451
460
  /* @__PURE__ */ W("button", {
452
461
  type: "button",
453
- className: "gmp-frag" + (f === "files" ? " gmp-frag-on" : ""),
454
- onClick: () => E("files", O),
462
+ className: "gmp-frag" + (p === "files" ? " gmp-frag-on" : ""),
463
+ onClick: () => D("files", k),
455
464
  children: [e.filesChanged, " files"]
456
465
  }),
457
466
  " ",
@@ -459,21 +468,21 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
459
468
  " ",
460
469
  /* @__PURE__ */ W("button", {
461
470
  type: "button",
462
- className: "gmp-frag" + (f === "conversations" ? " gmp-frag-on" : ""),
463
- onClick: () => E("conversations"),
464
- children: [S, " conversations"]
471
+ className: "gmp-frag" + (p === "conversations" ? " gmp-frag-on" : ""),
472
+ onClick: () => D("conversations"),
473
+ children: [C, " conversations"]
465
474
  }),
466
475
  ", reshaping",
467
476
  " ",
468
477
  /* @__PURE__ */ W("button", {
469
478
  type: "button",
470
- className: "gmp-frag" + (f === "conn" ? " gmp-frag-on" : ""),
471
- onClick: () => E("conn"),
479
+ className: "gmp-frag" + (p === "conn" ? " gmp-frag-on" : ""),
480
+ onClick: () => D("conn"),
472
481
  children: [
473
482
  "+",
474
- C,
475
- "/−",
476
483
  w,
484
+ "/−",
485
+ T,
477
486
  " connections"
478
487
  ]
479
488
  }),
@@ -547,12 +556,12 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
547
556
  children: [
548
557
  /* @__PURE__ */ W("span", {
549
558
  className: "gmp-add",
550
- children: ["+", C]
559
+ children: ["+", w]
551
560
  }),
552
561
  "/",
553
562
  /* @__PURE__ */ W("span", {
554
563
  className: "gmp-del",
555
- children: ["−", w]
564
+ children: ["−", T]
556
565
  }),
557
566
  " connections"
558
567
  ]
@@ -591,13 +600,13 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
591
600
  className: "gmp-files",
592
601
  children: e.files.map((e) => /* @__PURE__ */ U("div", {
593
602
  ref: (t) => {
594
- y.current[e.path] = t;
603
+ b.current[e.path] = t;
595
604
  },
596
605
  children: /* @__PURE__ */ U(Kt, {
597
606
  file: e,
598
- diff: u[e.path] ? t?.(e) : void 0,
599
- open: !!u[e.path],
600
- onToggle: () => T(e.path)
607
+ diff: d[e.path] ? t?.(e) : void 0,
608
+ open: !!d[e.path],
609
+ onToggle: () => E(e.path)
601
610
  })
602
611
  }, e.path))
603
612
  })]
@@ -634,8 +643,8 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
634
643
  /* @__PURE__ */ W("button", {
635
644
  type: "button",
636
645
  className: "gmp-annot-add",
637
- "aria-expanded": m,
638
- onClick: () => h((e) => !e),
646
+ "aria-expanded": h,
647
+ onClick: () => g((e) => !e),
639
648
  children: [
640
649
  /* @__PURE__ */ U(Ye, {
641
650
  size: 14,
@@ -645,9 +654,9 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
645
654
  r ? "change label" : "add a label"
646
655
  ]
647
656
  }),
648
- m && /* @__PURE__ */ W("form", {
657
+ h && /* @__PURE__ */ W("form", {
649
658
  className: "gmp-annot-pop",
650
- onSubmit: D,
659
+ onSubmit: O,
651
660
  children: [
652
661
  /* @__PURE__ */ U("span", {
653
662
  className: "label",
@@ -657,8 +666,8 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
657
666
  className: "input",
658
667
  type: "text",
659
668
  autoFocus: !0,
660
- value: g,
661
- onChange: (e) => _(e.target.value),
669
+ value: _,
670
+ onChange: (e) => y(e.target.value),
662
671
  placeholder: "e.g. good handoff",
663
672
  "aria-label": "annotation value"
664
673
  }),
@@ -667,7 +676,7 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
667
676
  children: [/* @__PURE__ */ U("button", {
668
677
  type: "button",
669
678
  className: "btn btn-ghost btn-sm",
670
- onClick: () => h(!1),
679
+ onClick: () => g(!1),
671
680
  children: "cancel"
672
681
  }), /* @__PURE__ */ W("button", {
673
682
  type: "submit",
@@ -705,7 +714,7 @@ function qt({ payload: e, getDiff: t, title: n, annotation: r = "", onSaveAnnota
705
714
  "aria-hidden": "true"
706
715
  }),
707
716
  " share ",
708
- S,
717
+ C,
709
718
  " conversations…"
710
719
  ]
711
720
  }),
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * The shared app sidebar, in one order for every app: the brand mark with a collapse handle on the
3
- * column's edge, the caller's nav groups, search, the switcher to the other apps, then the footer
4
- * row (the account on the left, the theme toggle on the right). A sticky resizable column on desktop
3
+ * column's edge, the shortcuts (search, the docs and community, the app's links that leave it), the
4
+ * app's own pages, then the footer row (the account on the left, the settings gear and the theme
5
+ * toggle on the right). A sticky resizable column on desktop
5
6
  * that collapses to an icon rail; a top bar plus an opaque drawer below 768px.
6
7
  * @param {AppSidebarProps} props
7
8
  */
8
- export default function AppSidebar({ app, apps, groups, currentId, homeHref, brand, search, theme, onThemeChange, account, accountSlot, LinkComponent, storageKey, defaultCollapsed, defaultWidth, minWidth, maxWidth, onCollapsedChange, label, className, }: AppSidebarProps): import("react").JSX.Element;
9
+ export default function AppSidebar({ app, apps, groups, currentId, homeHref, brand, search, elsewhere, settingsHref, theme, onThemeChange, account, accountSlot, LinkComponent, storageKey, defaultCollapsed, defaultWidth, minWidth, maxWidth, onCollapsedChange, label, className, }: AppSidebarProps): import("react").JSX.Element;
9
10
  /**
10
11
  * The page frame for an app screen: the sidebar column beside a main column that takes the rest
11
12
  * (min-width 0, so wide content stays contained). One column below 768px, the top bar above the page.
@@ -39,8 +40,9 @@ export function AppPage({ children, as: Tag, className, ...rest }: AppPageProps)
39
40
  * @property {(id: string) => void} [onSelect] with no href, renders a button that calls this.
40
41
  * @property {import('react').ComponentType<any>} [icon] a lucide icon component.
41
42
  * @property {string} [swatch] a CSS colour for a 12px square in place of an icon, e.g. 'var(--olive)'.
42
- * @property {boolean} [external] the item leaves this app: a trailing marker and a spoken suffix.
43
- * @property {string} [title] tooltip; defaults to the label.
43
+ * @property {boolean} [external] the item leaves this app: a trailing marker and a spoken suffix. It is
44
+ * listed with the shortcuts, never among the pages.
45
+ * @property {string} [title] ignored: a visible label takes no tooltip, and the rail shows the label.
44
46
  * @property {0|1} [depth] 1 indents the item under the one above it.
45
47
  * @property {string} [target]
46
48
  * @property {string} [rel]
@@ -72,7 +74,12 @@ export function AppPage({ children, as: Tag, className, ...rest }: AppPageProps)
72
74
  * @property {string} [currentId] the id of the current item (aria-current="page").
73
75
  * @property {string} [homeHref] the brand links here.
74
76
  * @property {string} [brand] the brand's accessible name and tooltip, default 'peasant'.
75
- * @property {AppSidebarSearch} [search] the app's search, placed after its nav groups.
77
+ * @property {AppSidebarSearch} [search] the app's search, the first shortcut under the brand.
78
+ * @property {AppSidebarItem[]} [elsewhere] the app's links that leave it (collectives online, from the local app),
79
+ * listed in the shortcuts after the docs and community. An `external`
80
+ * item in `groups` moves there too.
81
+ * @property {string} [settingsHref] the app's settings: a gear in the footer, current when currentId is
82
+ * 'settings'. A `settings` item in `groups` becomes the gear instead.
76
83
  * @property {'light'|'dark'} [theme] the current theme; with onThemeChange, the footer leads with the theme toggle.
77
84
  * @property {(next: 'light'|'dark') => void} [onThemeChange] called with the theme to switch to.
78
85
  * @property {AppSidebarAccount} [account]
@@ -159,11 +166,12 @@ export type AppSidebarItem = {
159
166
  */
160
167
  swatch?: string;
161
168
  /**
162
- * the item leaves this app: a trailing marker and a spoken suffix.
169
+ * the item leaves this app: a trailing marker and a spoken suffix. It is
170
+ * listed with the shortcuts, never among the pages.
163
171
  */
164
172
  external?: boolean;
165
173
  /**
166
- * tooltip; defaults to the label.
174
+ * ignored: a visible label takes no tooltip, and the rail shows the label.
167
175
  */
168
176
  title?: string;
169
177
  /**
@@ -232,9 +240,20 @@ export type AppSidebarProps = {
232
240
  */
233
241
  brand?: string;
234
242
  /**
235
- * the app's search, placed after its nav groups.
243
+ * the app's search, the first shortcut under the brand.
236
244
  */
237
245
  search?: AppSidebarSearch;
246
+ /**
247
+ * the app's links that leave it (collectives online, from the local app),
248
+ * listed in the shortcuts after the docs and community. An `external`
249
+ * item in `groups` moves there too.
250
+ */
251
+ elsewhere?: AppSidebarItem[];
252
+ /**
253
+ * the app's settings: a gear in the footer, current when currentId is
254
+ * 'settings'. A `settings` item in `groups` becomes the gear instead.
255
+ */
256
+ settingsHref?: string;
238
257
  /**
239
258
  * the current theme; with onThemeChange, the footer leads with the theme toggle.
240
259
  */
@@ -1,4 +1,4 @@
1
- /** Human-readable ms duration: "4.2s", "42s", "2m 14s", "1.5h". Tabular-friendly, no leading zeros. */
1
+ /** Human-readable ms duration in the one transcript format: "820ms", "4.2s", "2m 14s", "1h 12m"; zero or unknown reads as nothing. */
2
2
  export function formatDuration(ms: any): string;
3
3
  /**
4
4
  * @typedef {object} Task
@@ -13,8 +13,9 @@
13
13
  * @param {() => void} [props.onShare] the "share … conversations" exit (host owns share UX)
14
14
  * @param {() => void} [props.onCopyRecap] the "copy recap" exit (host owns the clipboard recap)
15
15
  * @param {Record<string, boolean>} [props.initialOpenFiles] files open on first render (path → open?)
16
+ * @param {import('react').ReactNode} [props.headerActions] the host's own controls for the head row, at the crumb's end (a docs link, say)
16
17
  */
17
- export default function ChangeDetail({ payload, getDiff, title, annotation, onSaveAnnotation, onRemoveAnnotation, onOpenMap, onShare, onCopyRecap, initialOpenFiles, }: {
18
+ export default function ChangeDetail({ payload, getDiff, title, annotation, onSaveAnnotation, onRemoveAnnotation, onOpenMap, onShare, onCopyRecap, initialOpenFiles, headerActions, }: {
18
19
  payload: import("./types.js").ChangeDetailPayload;
19
20
  getDiff?: (file: import("./types.js").FileChangePayload) => import("./types.js").ChangeDiffPayload | null | undefined;
20
21
  title?: string;
@@ -25,4 +26,5 @@ export default function ChangeDetail({ payload, getDiff, title, annotation, onSa
25
26
  onShare?: () => void;
26
27
  onCopyRecap?: () => void;
27
28
  initialOpenFiles?: Record<string, boolean>;
29
+ headerActions?: import("react").ReactNode;
28
30
  }): import("react").JSX.Element;
@@ -10,8 +10,9 @@
10
10
  * @param {() => void} [props.onShowOlder] deprecated legacy pagination callback; use onNavigate.
11
11
  * @param {(sessionId: string) => void} [props.onOpenSession] deprecated legacy session callback; use onNavigate.
12
12
  * @param {number} [props.nowMs] pins relative-time humanisation (default Date.now()); the harness fixes it for byte-stable captures
13
+ * @param {import('react').ReactNode} [props.headerActions] the host's own controls for the head row, beside "open the map" (a docs link, say)
13
14
  */
14
- export default function Changes({ payload, projectLabel, selectedId, onNavigate, onSelectChange, onOpenMap, hasMore, onShowOlder, onOpenSession, nowMs, }: {
15
+ export default function Changes({ payload, projectLabel, selectedId, onNavigate, onSelectChange, onOpenMap, hasMore, onShowOlder, onOpenSession, nowMs, headerActions, }: {
15
16
  payload: import("./types.js").ChangesPayload;
16
17
  projectLabel?: string;
17
18
  selectedId?: string;
@@ -22,4 +23,5 @@ export default function Changes({ payload, projectLabel, selectedId, onNavigate,
22
23
  onShowOlder?: () => void;
23
24
  onOpenSession?: (sessionId: string) => void;
24
25
  nowMs?: number;
26
+ headerActions?: import("react").ReactNode;
25
27
  }): import("react").JSX.Element;
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Is this wire turn one of Claude Code's session metadata records rather than conversation?
3
+ * @param {TurnDetail} turn
4
+ * @param {string | undefined} harness the session's harness
5
+ * @returns {boolean}
6
+ */
7
+ export function isSessionMetadataTurn(turn: TurnDetail, harness: string | undefined): boolean;
1
8
  /**
2
9
  * Default turn prefilter the adapter applies independently per partition:
3
10
  * preserve normalized evidence, including unknown provenance and folded refs.
@@ -72,9 +72,9 @@ export type PhaseVM = import("./view-model.js").PhaseVM;
72
72
  export type ScorecardBandVM = import("./view-model.js").ScorecardBandVM;
73
73
  export type TranscriptAnalyticsVM = import("./view-model.js").TranscriptAnalyticsVM;
74
74
  export { ROLES, ENTRY_TYPES, TOOL_CALL_KINDS, STOP_REASONS, SESSION_OUTCOMES, HARNESSES } from "./wire-types.js";
75
- export { adaptTranscript, prefilterTurns, diffLines } from "./adapter.js";
75
+ export { adaptTranscript, prefilterTurns, isSessionMetadataTurn, diffLines } from "./adapter.js";
76
76
  export { computeTasks, computeTurnLabels, buildTaskWaterfall, annotateTranscript, computePersonalMedians, detectPhases, assessScorecard, computeAnalytics, computeTaskGroups, phaseLabel } from "./analytics.js";
77
- export { formatRelative, formatDurationMins, formatDateLong } from "./time.js";
77
+ export { formatRelative, formatDurationMins, formatDurationMs, formatDurationSeconds, formatDateLong, isKnownTime } from "./time.js";
78
78
  export { summarizePrompt, composeSessionTitle, projectLabel } from "./title.js";
79
79
  export { default as TranscriptDiffEntryCard, DiffHunks as TranscriptDiffHunks } from "./DiffEntryCard.jsx";
80
80
  export { advanceTranscriptInitialPositionConsumption, normalizeTranscriptInitialPosition, resolveTranscriptInitialPosition, shouldApplyTranscriptInitialPosition, transcriptInitialPositionReadiness, transcriptInitialPositionToken } from "./initial-position.js";