/* Open work: connected Lean dependency groups, with correspondence marks inside each node. */
:root { --ow-hole: #dc2626; --ow-proved: #15803d; --ow-grid: #ececec; --ow-pin: #dbeafe; }
.open-work-panel { padding: 10px 14px 14px; overflow: auto; scrollbar-gutter: stable; }
.open-work-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 8px; }
.open-work-head-left { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; min-width: 0; }
.open-work-head-left .overview-label { margin: 0 5px 0 0; }
.open-work-head > button { flex: 0 0 auto; }
.open-work-filter { display: inline-flex; align-items: center; gap: 5px; max-width: 100%; overflow-wrap: anywhere; }
.open-work-filter button { border: none; background: none; color: var(--lean); cursor: pointer; font-size: 0.8rem; padding: 0; }
.open-work-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 15px; padding: 4px 0 10px; color: var(--muted); font-size: 0.72rem; }
.ow-legend-badge { display: inline-block; min-width: 17px; text-align: center; border-radius: 4px; background: #e8edf4; color: #4d607a; font-size: 9px; line-height: 16px; }
.ow-legend-badge.paper { background: #fff; border: 1px solid #b7c1cf; line-height: 14px; }
.open-work-canvas { width: 100%; }
.open-work-svg { display: block; margin: 0 auto; overflow: visible; }
.ow-caption { font: 500 10px var(--sans, ui-sans-serif, system-ui, sans-serif); fill: var(--muted); letter-spacing: 0.01em; }
.ow-component-divider { stroke: #e8ebef; stroke-width: 1; }
.ow-node { cursor: pointer; outline: none; }
.ow-node-shape { fill: #fff; stroke: #ddc3c3; stroke-width: 1; transition: fill 100ms, stroke 100ms; }
.ow-root > .ow-node-shape { fill: #fffdfd; stroke: #c47474; stroke-width: 1.1; }
.ow-node.ghost > .ow-node-shape { stroke: #9ca3af; stroke-dasharray: 3 2; }
.ow-node.extraction > .ow-node-shape { stroke-dasharray: 3 2; }
.ow-node:hover > .ow-node-shape, .ow-node.is-hot > .ow-node-shape { fill: #faf7f7; stroke: #b36a6a; }
.ow-node.in-file > .ow-node-shape { fill: #eff5ff; stroke: #83a6df; stroke-width: 1.3; }
.ow-node.is-primary > .ow-node-shape, .ow-node.is-pinned > .ow-node-shape, .ow-node:focus-visible > .ow-node-shape { fill: #eaf2ff; stroke: #507ed1; stroke-width: 1.7; stroke-dasharray: none; }
.ow-rname, .ow-bname { font: 11px var(--mono); fill: var(--text); }
.ow-node.in-file .ow-rname, .ow-node.in-file .ow-bname { fill: #27466f; }
.ow-count { font: 10.5px var(--sans, ui-sans-serif, system-ui, sans-serif); fill: #a55858; text-anchor: end; }
.ow-rg { fill: #fff; stroke: #bd6767; stroke-width: 1.25; }
.ow-wire { fill: none; stroke: #cf9191; stroke-width: 1.2; opacity: 0.62; }
.ow-wire.extraction { stroke-dasharray: 4 3; }
.open-work-svg .ow-wire.is-hot { stroke: #b74444; opacity: 1; stroke-width: 1.8; }
.open-work-svg.is-hover .ow-wire:not(.is-hot) { opacity: 0.12; }
.open-work-svg.is-hover .ow-node:not(.is-hot):not(.is-primary) { opacity: 0.16; }
.ow-badge > rect { fill: #e8edf4; stroke: none; }
.ow-badge.paper > rect { fill: #fff; stroke: #b7c1cf; stroke-width: 0.9; }
.ow-badge > text { font: 600 9px var(--sans, ui-sans-serif, system-ui, sans-serif); fill: #4d607a; text-anchor: middle; }
.ow-badge:hover > rect { fill: #dce6f4; }
.ow-badge.paper:hover > rect { stroke: #637fa7; }
.ow-group { cursor: pointer; outline: none; }
.ow-group > rect { fill: #f9fafb; stroke: #e6e9ee; }
.ow-group:hover > rect, .ow-group:focus-visible > rect { fill: #eef2f7; stroke: #b6c4d9; }
.ow-group-text, .ow-tag-text { font: 10.5px var(--sans, ui-sans-serif, system-ui, sans-serif); fill: var(--muted); }
.ow-chev { font-size: 11px; fill: var(--muted); }
.ow-tag { cursor: pointer; outline: none; }
.ow-tchip { fill: #fff; stroke: #e4e8ee; }
.ow-tag:hover > .ow-tchip, .ow-tag.is-hot > .ow-tchip, .ow-tag:focus-visible > .ow-tchip { fill: #eef3fa; stroke: #9bafcb; }
.open-work-panel .empty-state { padding: 10px 2px; }

/* Selection focus history */
.selection-history { display: grid; gap: 4px; }
/* One line of chrome, so the drawing keeps the panel. Numbers read as text, not as chips. */
.sh-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 5px; font-size: 0.7rem; color: var(--muted); line-height: 1.5; }
.sh-head b { font-size: 0.85rem; font-weight: 600; color: var(--text, #182739); }
.sh-head i { font-style: normal; opacity: 0.7; }
.sh-head span + span::before, .sh-head b + span::before, .sh-head i + span::before { content: '·'; margin-right: 5px; opacity: 0.45; }
.sh-head .color-status-own { color: var(--proof-own-text); }
.sh-head .color-status-inherited { color: var(--proof-inherited-text); }
.selection-history-draw { min-height: 0; margin-inline: -7px; }  /* the drawing bleeds into the panel padding */
.selection-history-svg { display: block; }
.selection-history .axis text { font-size: 9px; fill: var(--muted); }
.selection-history .axis line { stroke: var(--ow-grid); }
.sh-life.absent { stroke: var(--ow-grid); }
.sh-life.ok { stroke: var(--ow-proved); }
.sh-life.inherited { stroke: var(--proof-inherited-stroke); }
.sh-life.sorry { stroke: var(--ow-hole); }
.sh-regress { fill: #fff; stroke: var(--ow-hole); stroke-width: 1.5; }
.sh-name { font-size: 9px; fill: #374151; paint-order: stroke; stroke: #fff; stroke-width: 2px; stroke-linejoin: round; }
.sh-name.red { fill: #a52222; }
.sh-analyzed { stroke: var(--lean); stroke-dasharray: 2 2; }
.sh-kern-own { fill: var(--ow-hole); }
.sh-kern-inh { fill: var(--proof-inherited-stroke); stroke: none; }
.sh-ended { fill: #eef0f3; stroke: #c9ced6; }
.sh-cap { font-size: 9px; fill: var(--muted); }
.sh-row { cursor: pointer; }
.sh-row .sh-hit { fill: transparent; }
.sh-row:hover .sh-hit, .sh-row.is-hot .sh-hit { fill: #f1f5f9; }
.sh-row.is-pinned .sh-hit { fill: var(--ow-pin); }
.sh-band { cursor: pointer; }
.sh-band .sh-hit { fill: transparent; }
.sh-band:hover .sh-hit, .sh-band.is-hot .sh-hit { fill: #f1f5f9; }
.sh-band.is-selected .sh-hit { fill: var(--ow-pin); }
.sh-band-ok { fill: #cfe9d8; stroke: var(--ow-proved); stroke-width: 0.6; }
.sh-band-inherited { fill: #fbe3bd; stroke: var(--proof-inherited-stroke); stroke-width: 0.6; }
.sh-band-sorry { fill: #f3b8b8; stroke: var(--ow-hole); stroke-width: 0.6; }
.sh-band-quiet { fill: #e5e7eb; stroke: #c9ced6; stroke-width: 0.6; }
.sh-fname { font-size: 9px; fill: #374151; }
.sh-fname.red { fill: #a52222; }
.sh-reg-tick { stroke: var(--ow-hole); stroke-width: 1.4; }
.selection-history-note { color: var(--muted); font-size: 0.7rem; line-height: 1.4; }


.selection-overview { overflow-x: hidden; overflow-y: auto; }
.selection-history-svg { max-width: 100%; }

/* Controls keep keyboard focus when the linked panels redraw. */
.ow-badge[role="button"] { cursor: pointer; outline: none; }
.ow-badge:focus-visible > rect { stroke: #507ed1; stroke-width: 2; fill: #eaf2ff; }
.ow-node[aria-disabled="true"] { cursor: help; }
.ow-group.contains-selection > rect { fill: #eaf2ff; stroke: #507ed1; }
.ow-group.contains-selection .ow-group-text { fill: #27466f; }
.sh-row:focus-visible, .sh-band:focus-visible { outline: none; }
.sh-row:focus-visible .sh-hit, .sh-band:focus-visible .sh-hit { fill: #eaf2ff; stroke: #507ed1; stroke-width: 1; }
.open-work-reference-dialog { color: var(--text); background: #fff; width: min(440px, calc(100vw - 40px)); max-height: 75vh; overflow: auto; border: 1px solid #d7dfe9; border-radius: 10px; padding: 18px; box-shadow: 0 16px 60px #182e4d33; }
.open-work-reference-dialog::backdrop { background: #15223638; }
.ow-reference-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.ow-reference-head button { border: 0; border-radius: 4px; background: #f1f4f8; padding: 5px 9px; cursor: pointer; color: var(--muted); }
.open-work-reference-dialog article { margin-top: 14px; padding-top: 14px; border-top: 1px solid #e5e9ef; overflow-wrap: anywhere; font-size: 0.82rem; }
.open-work-reference-dialog article p { margin: 8px 0; line-height: 1.5; }

/* Compact impact simulation: identities stay visible; the lower band carries the scenario. */
.open-work-toolbar { position: sticky; top: -10px; z-index: 3; background: #fff; padding: 6px 0 8px; border-bottom: 1px solid #e7eaf0; margin-bottom: 8px; }
.open-work-head { margin-bottom: 4px; gap: 6px; }
.open-work-head-left { gap: 6px 10px; }
.ow-key { font: 10px var(--sans, system-ui); white-space: nowrap; }
.ow-key.own { color: #b52840; }.ow-key.inherited { color: #a15e16; }
.ow-scenario-summary { display: flex; align-items: center; gap: 5px 8px; flex-wrap: wrap; color: #697588; font: 10px var(--sans, system-ui); min-height: 24px; }
.ow-scenario-label { font-weight: 650; color: #5d528b; }.ow-summary-arrow { color: #8992a4; }
.ow-summary-clear { color: #167345; }.ow-summary-partial { color: #99661e; }.ow-scenario-scope { font-size: 8px; color: #798799; }
.ow-scenario-summary button, .ow-focus-summary button { border: 1px solid #dbe0e9; background: #fff; color: #5d6b83; padding: 3px 6px; border-radius: 4px; font: 9px var(--sans, system-ui); cursor: pointer; }
.ow-scenario-summary button { margin-left: auto; }.ow-scenario-summary button:disabled { opacity: .4; cursor: default; }
.ow-focus-summary { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 5px; font-size: 10px; }
.ow-focus-name { min-width: 0; max-width: 45%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 10px var(--mono); }
.ow-focus-summary button:last-child { color: #5c4b99; }
.open-work-legend { padding: 8px 2px 2px; font-size: 10px; line-height: 1.5; }
.ow-node { --ow-role: #d39539; --ow-role-fill: #fff6e7; --ow-role-text: #96551b; }
.ow-root { --ow-role: #d24e61; --ow-role-fill: #fff2f3; --ow-role-text: #ad2e43; }
.ow-node > .ow-node-shape, .ow-node.ow-root > .ow-node-shape, .ow-node.in-file > .ow-node-shape,
.ow-node.is-pinned > .ow-node-shape, .ow-node.is-hot > .ow-node-shape, .ow-node.is-primary > .ow-node-shape,
.ow-node:hover > .ow-node-shape, .ow-node:focus-visible > .ow-node-shape { fill: var(--ow-role-fill); stroke: var(--ow-role); stroke-width: 1.1; stroke-dasharray: none; }
.ow-node.ghost { --ow-role: #96a1b1; --ow-role-fill: #f5f6f8; --ow-role-text: #6b7482; }
.ow-selection-ring { fill: none; stroke: #7560b5; stroke-width: 1.5; opacity: 0; }
.ow-node.in-file > .ow-selection-ring { opacity: .4; stroke: #7793c1; }
.ow-node.is-pinned > .ow-selection-ring, .ow-node.is-primary > .ow-selection-ring, .ow-node:focus-visible > .ow-selection-ring { opacity: 1; stroke: #7560b5; }
.ow-role { font: 650 7px var(--sans, system-ui); letter-spacing: .6px; fill: var(--ow-role-text); }
.ow-rname, .ow-bname, .ow-node.in-file .ow-rname, .ow-node.in-file .ow-bname { font: 11px var(--mono); fill: #25364b; }
.ow-outcome-band { fill: #fae6c8; }.ow-root .ow-outcome-band { fill: #f9dfe4; }
.ow-node-outcome { font: 8.5px var(--sans, system-ui); fill: #875821; }
.ow-root .ow-node-outcome { fill: #9b4656; }
.ow-clear .ow-outcome-band { fill: #d8efdf; }.ow-clear .ow-node-outcome { fill: #19633d; }

.ow-uncertain .ow-outcome-band { fill: #e5e8ed; }.ow-uncertain .ow-node-outcome { fill: #737c8d; }
.ow-wire, .ow-wire.extraction { stroke: #a6b4c7; stroke-width: 1; stroke-dasharray: none; opacity: .66; }
.open-work-svg .ow-wire.is-hot { stroke: #74629e; stroke-width: 1.6; }
.ow-scenario-check { cursor: pointer; outline: none; }.ow-check-hit { fill: transparent; }
.ow-check-box { fill: #fff; stroke: #b85969; stroke-width: 1.1; }
.ow-scenario-check[aria-checked="true"] .ow-check-box { fill: #65549d; stroke: #65549d; }
.ow-scenario-check text { fill: white; font: 11px var(--sans, system-ui); pointer-events: none; }
.ow-scenario-check:hover .ow-check-box, .ow-scenario-check:focus-visible .ow-check-box { stroke: #473479; stroke-width: 2; }
.ow-sources-dialog .ow-sources-status { font-size: 12px; color: #6d7687; margin: 12px 0; }
.ow-sources-list { display: grid; gap: 5px; }.ow-sources-list label { display: flex; align-items: center; gap: 8px; font: 11px var(--mono); padding: 8px 6px; background: #f7f8fb; border-radius: 4px; cursor: pointer; }
.ow-sources-list input { accent-color: #65549d; }.ow-sources-list span { overflow-wrap: anywhere; }
.ow-sources-note { font-size: 10px; color: #7c8798; line-height: 1.5; margin: 12px 0 0; }

/* Width-fitting, vertically scrollable groups in the original center column. */
.open-work-panel { position: relative; display: flex; flex-direction: column; padding: 0; overflow: hidden; scrollbar-gutter: auto; min-height: 0; container-type: inline-size; }
.open-work-canvas { position: relative; flex: 1 1 auto; min-height: 0; width: 100%; overflow-x: hidden; overflow-y: scroll; scrollbar-gutter: stable; background: #fff; padding: 6px 10px 12px; box-sizing: border-box; }
.open-work-canvas::-webkit-scrollbar { width: 10px; }
.open-work-canvas::-webkit-scrollbar-track { background: #edf0f5; }
.open-work-canvas::-webkit-scrollbar-thumb { background: #b5c0cf; border: 2px solid #edf0f5; border-radius: 6px; }
/* SVG focus delegation also focuses the backdrop on pointer-down. Interactive nodes have
   their own keyboard indicators; the whole drawing should never get the browser's outline. */
.open-work-svg { display: block; width: 100%; height: auto; max-width: 100%; margin: 0; overflow: hidden; touch-action: pan-y; outline: none; }
.open-work-toolbar { position: relative; top: auto; order: -1; flex: 0 0 auto; display: flex; flex-wrap: wrap; align-items: center; gap: 1px 12px; padding: 4px 10px; margin: 0; border-bottom: 1px solid #e1e6ed; background: #fff; z-index: 3; }
.open-work-toolbar > *, .open-work-head { min-width: 0; }
.open-work-head { margin: 0; gap: 7px; }
.open-work-head-left { gap: 6px; }
.open-work-head .overview-label { font-size: 10px; margin-right: 3px; }
.open-work-head > .graph-icon-button { width: 20px; height: 20px; min-height: 20px; padding: 0; font-size: 12px; box-shadow: none; border-color: transparent; }
.ow-key { font-size: 9px; }
.ow-key.own::before { content: '□ '; }.ow-key.inherited::before { content: '○ '; }
.ow-scenario-summary { flex: 1 1 auto; gap: 5px; min-height: 20px; font-size: 9px; }
.ow-scenario-summary button, .ow-focus-summary button, .ow-clear-filter { padding: 2px 5px; font: 9px var(--sans, system-ui); }
.ow-clear-filter { border: 1px solid #dbe0e9; background: #fff; color: #566d94; border-radius: 4px; cursor: pointer; }
.ow-focus-summary { position: static; flex: 0 0 auto; margin: 0; flex-wrap: nowrap; padding: 5px 10px; background: #fff; border-top: 1px solid #e1e6ed; box-sizing: border-box; max-width: 100%; }
.ow-focus-name { max-width: 200px; font-size: 9px; }
.open-work-legend { position: absolute; top: 100%; left: 8px; right: 8px; background: white; padding: 12px; border: 1px solid #e2e6ee; border-radius: 6px; box-shadow: 0 6px 24px #1c32461a; max-height: 220px; overflow: auto; z-index: 5; }
.ow-rname, .ow-node.in-file .ow-rname { fill: #a72f43; font-weight: 550; }
.ow-node-outcome { font-size: 8px; }
.ow-badge > text { font-size: 8px; }
.ow-section-title { font: 500 10px var(--sans, system-ui); fill: #6a7585; }
.ow-section-count { font: 10px var(--sans, system-ui); fill: #788393; }
.open-work-svg.is-hover [data-ow-owner]:not(.is-hot):not(.is-primary) { opacity: .16; }
.open-work-svg.is-hover .ow-wire:not(.is-hot) { opacity: .08; }
.ow-node.in-file > .ow-selection-ring { opacity: 1; stroke: #243c70; stroke-width: 2.3; }
.ow-node.in-file .ow-rname, .ow-node.in-file .ow-bname { font-weight: 650; }
.ow-node.is-pinned > .ow-selection-ring, .ow-node.is-primary > .ow-selection-ring { opacity: 1; stroke: #7551b6; stroke-width: 2.3; }
.ow-node.ow-simulated, .ow-node.ow-clear { --ow-role: #299358; --ow-role-fill: #dcf3e5; --ow-role-text: #17693d; }
.ow-simulated .ow-rname, .ow-clear .ow-rname, .ow-clear .ow-bname, .ow-node.ow-simulated.in-file .ow-rname, .ow-node.ow-clear.in-file .ow-rname, .ow-node.ow-clear.in-file .ow-bname { fill: #17693d; }
.ow-simulated .ow-outcome-band, .ow-clear .ow-outcome-band { fill: #c5e8d2; }
.ow-simulated .ow-node-outcome, .ow-clear .ow-node-outcome { fill: #17693d; }
.ow-node.ow-partial .ow-outcome-band { fill: #fff0b3; }
.ow-node.ow-partial .ow-node-outcome { fill: #855d0c; }
.ow-focus-summary .ow-partial-count { background: #fff0b3; border-color: #efd086; color: #855d0c; }
.ow-scenario-check[aria-checked="true"] .ow-check-box { fill: #278a50; stroke: #278a50; }
.open-work-splitter { display: block; min-height: 7px; outline: none; touch-action: none; }
.open-work-splitter:focus-visible { outline: 1px solid #8798b0; outline-offset: -1px; }
@container (max-width: 440px) {
  .ow-add-label { display: none; }
  .ow-focus-name { flex: 1 1 60px; }
  .ow-focus-summary button { flex: 0 0 auto; }
  .ow-scenario-summary { flex-wrap: wrap; }
}


/* Linked views use one primary target; context never competes with its locator. */
.graph-svg.file-focus-managed .graph-node-group { opacity: 1 !important; }
.graph-svg.file-focus-managed .graph-node-group.map-related { opacity: .82 !important; }
.graph-svg.file-focus-managed .graph-node-group.map-muted { opacity: .18 !important; }
.graph-svg.file-focus-managed .graph-node-group .file-node-shape { filter: none !important; }
.graph-svg.file-focus-managed .file-selected-halo { display: none; }
.graph-svg.file-focus-managed[data-map-focus="hover"] .file-decl-projection { visibility: hidden; }
.graph-svg.file-focus-managed .graph-edge.file-import-edge.map-related-edge {
  stroke-width: 1.25 !important; stroke-opacity: 1 !important; opacity: .85 !important;
  vector-effect: non-scaling-stroke;
}
.graph-svg.file-focus-managed .graph-edge.file-import-edge.map-related-edge.private-import-edge { stroke: #475569 !important; }
.graph-svg.file-focus-managed .graph-edge.file-import-edge.map-related-edge.public-import-edge { stroke: #c2410c !important; }
.graph-svg.file-focus-managed:not([data-map-focus="overview"]) .graph-edge:not(.map-related-edge) { opacity: .12 !important; }
.graph-svg.file-focus-managed .graph-node-group.map-primary[data-node-id] > .graph-node-shape:is(.file-node-shape, .folder-node-shape) {
  stroke: #182739 !important; stroke-width: 2.5px !important; stroke-dasharray: none !important; vector-effect: non-scaling-stroke;
  transition: none;
}
.open-work-svg .ow-node > .ow-selection-ring { opacity: 0; stroke: #182739; stroke-width: 2.2; vector-effect: non-scaling-stroke; }
.open-work-svg .ow-node:is(.is-primary, .is-file-primary, :focus-visible) > .ow-selection-ring { opacity: 1; stroke: #182739; }
.open-work-svg .ow-node.in-file .ow-rname { font-weight: 550; }
.open-work-svg .ow-node.in-file .ow-bname { font-weight: 400; }
.open-work-svg .ow-node:is(.is-primary, .is-file-primary) :is(.ow-rname, .ow-bname) { font-weight: 650; }

/* Changes over Open work: observed transitions between two saved checks. The hypothetical
   What if scenario is hidden while they are shown, so green never means two things at once. */
.ow-changes-label { font-weight: 650; color: #3f5da8; }
.ow-changes-edited { color: #3f5da8; }
.ow-changes-edited::before, .ow-legend-edited { content: ''; display: inline-block; width: 11px; height: 7px; margin-right: 4px; border: 1.5px solid #4f6fc4; border-radius: 1px; vertical-align: -1px; }
.ow-changes-worse { color: #b52840; }
.ow-changes-message { color: #6b7688; }
.ow-changes-summary button { margin-left: auto; }
.ow-focus-change { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 9px; color: #5a6679; }
.open-work-svg .ow-node.ow-edited > .ow-node-shape { stroke: #4f6fc4; stroke-width: 1.9; rx: 1.5; }
/* Proved now is green, as everywhere else in the dashboard; the before | after square tells
   whether it just became proved or already was. Only a removed declaration is neutral. */
.ow-node.ow-steady, .ow-node.ow-added { --ow-role: #299358; --ow-role-fill: #dcf3e5; --ow-role-text: #17693d; }
.ow-node:is(.ow-steady, .ow-added) .ow-outcome-band { fill: #c5e8d2; }
.ow-node:is(.ow-steady, .ow-added) .ow-node-outcome, .ow-node:is(.ow-steady, .ow-added) :is(.ow-rname, .ow-bname) { fill: #17693d; }
.ow-node.ow-removed { --ow-role: #aab4c3; --ow-role-fill: #f7f8fa; --ow-role-text: #556072; }
.ow-node.ow-removed .ow-outcome-band { fill: #eceff4; }
.ow-node.ow-removed .ow-node-outcome, .ow-node.ow-removed :is(.ow-rname, .ow-bname) { fill: #3a475a; }
.open-work-svg .ow-node.ow-removed > .ow-node-shape { stroke-dasharray: 3 2; }
.ow-node.ow-worse .ow-outcome-band { fill: #f8d3da; }
.ow-node.ow-worse .ow-node-outcome { fill: #9b1c33; }
.open-work-svg .ow-wire.ow-wire-removed { stroke-dasharray: 4 3; }
.open-work-svg .ow-wire.ow-wire-via { stroke-dasharray: 1.5 2.5; stroke-linecap: round; stroke-width: 1.3; }

/* File map: Git status letter of the changed Lean files while Changes is shown. */
.graph-svg .graph-node-group .ow-file-change rect { fill: currentColor; stroke: #fff; stroke-width: 1.5px; vector-effect: non-scaling-stroke; }
.graph-svg .graph-node-group .ow-file-change text { font: 700 18px var(--mono, monospace); fill: #fff; stroke: none; text-anchor: middle; }
.graph-svg .ow-file-change-mark { transform-box: fill-box; transform-origin: center; transition: opacity .35s ease, transform .45s cubic-bezier(.3,1.6,.5,1); }
.graph-svg .ow-file-change.is-entering > .ow-file-change-mark { opacity: 0; transform: scale(.2); }
.graph-svg .ow-file-change.status-modified { color: #b7791f; }
.graph-svg .ow-file-change.status-added { color: #2f855a; }
.graph-svg .ow-file-change.status-deleted { color: #c53030; }
.graph-svg .ow-file-change.status-other { color: #718096; }

/* Replay: start from the last commit's open work, show what entered, then each transition in
   dependency order. Only classes change; geometry is the final layout throughout. */
.open-work-svg.ow-animating :is(.ow-node-shape, .ow-outcome-band) { transition: fill .45s ease, stroke .45s ease, stroke-width .3s ease; }
.open-work-svg.ow-animating :is(.ow-rname, .ow-bname, .ow-node-outcome) { transition: fill .45s ease; }
.open-work-svg.ow-animating :is(.ow-node, .ow-badge, .ow-group) { transform-box: fill-box; transform-origin: center; transition: opacity .45s ease, transform .5s cubic-bezier(.2,.8,.3,1.2); }
.open-work-svg.ow-animating .ow-wire { transition: opacity .6s ease; }
.open-work-svg .ow-entering { opacity: 0 !important; pointer-events: none; }
.open-work-svg :is(.ow-node, .ow-badge, .ow-group).ow-entering { transform: scale(.55); transform-box: fill-box; transform-origin: center; }
.open-work-svg .ow-node.ow-was-own { --ow-role: #d24e61; --ow-role-fill: #fff2f3; }
.open-work-svg .ow-node.ow-was-inherited { --ow-role: #d39539; --ow-role-fill: #fff6e7; }
.open-work-svg .ow-node.ow-was-own .ow-outcome-band { fill: #f9dfe4; }
.open-work-svg .ow-node.ow-was-inherited .ow-outcome-band { fill: #fae6c8; }
.open-work-svg .ow-node.ow-was-own .ow-node-outcome { fill: #9b4656; }
.open-work-svg .ow-node.ow-was-inherited .ow-node-outcome { fill: #875821; }
.open-work-svg .ow-node.ow-was-own :is(.ow-rname, .ow-bname) { fill: #a72f43; }
.open-work-svg .ow-node.ow-was-inherited :is(.ow-rname, .ow-bname) { fill: #25364b; }
.open-work-svg .ow-node.ow-edit-pending > .ow-node-shape { stroke: var(--ow-role); stroke-width: 1.1; rx: 5; }
.ow-changes-phase { padding: 0 3px; border-radius: 3px; transition: background .3s, color .3s; }
.ow-changes-phase.is-current { background: #e6ecfb; color: #243f8f; font-weight: 650; }
.open-work-svg .ow-spark { fill: none; stroke-width: 3.4px; stroke-linecap: round; opacity: .95; pointer-events: none; }
/* A verdict that changed color splits the node's own band: last commit left, now right. The
   same two-color keys appear in the summary. Captions are 10px, readable at the fitted scale. */
.open-work-svg.ow-observed .ow-node-outcome { font-size: 10px; }
.ow-split-half.look-own { fill: #f6ccd4; }.ow-split-half.look-inherited { fill: #f8dcb2; }.ow-split-half.look-proved { fill: #bfe5cc; }
.ow-split-text { font: 600 10px var(--sans, system-ui); }
.ow-split-text.look-own { fill: #9b2c3f; }.ow-split-text.look-inherited { fill: #8a5412; }.ow-split-text.look-proved { fill: #17693d; }
.open-work-svg .ow-split, .open-work-svg .ow-node-outcome { transition: opacity .35s ease; }
.open-work-svg .ow-split.ow-split-pending, .open-work-svg .ow-node-outcome.ow-caption-done { opacity: 0; }
.ow-look-key .look-own { background: #d24e61; }.ow-look-key .look-inherited { background: #e3a03f; }.ow-look-key .look-proved { background: #2f9e5b; }
.ow-look-key { display: inline-flex; vertical-align: -1px; border: .8px solid #5b6678; border-radius: 1px; margin: 0 1px 0 3px; }
.ow-look-key i { display: inline-block; width: 5px; height: 8px; }
.ow-letter rect { stroke: #fff; stroke-width: 1.2; }
.ow-letter text { font: 700 8.5px var(--mono, monospace); fill: #fff; text-anchor: middle; pointer-events: none; }
.ow-letter.letter-M rect { fill: #b7791f; }.ow-letter.letter-A rect { fill: #2f855a; }.ow-letter.letter-D rect { fill: #c53030; }
.open-work-svg .ow-node.ow-edit-pending .ow-letter { opacity: 0; }
.open-work-svg.ow-animating .ow-letter { transition: opacity .45s ease; }
.ow-letter-key { display: inline-block; min-width: 11px; padding: 0 2px; border-radius: 3px; color: #fff; font: 700 8.5px/12px var(--mono, monospace); text-align: center; }
.ow-letter-key.letter-M { background: #b7791f; }.ow-letter-key.letter-A { background: #2f855a; }.ow-letter-key.letter-D { background: #c53030; }
.ow-changes-edited::before { display: none; }
.ow-changes-phase small { font-size: 8.5px; font-weight: 400; color: #7a8598; }
.ow-changes-rewind { display: none; padding: 1px 6px; border-radius: 3px; background: #243f8f; color: #fff; font-weight: 650; }
.ow-changes-rewind.is-visible { display: inline-block; }
.open-work-svg .ow-ghosts { pointer-events: none; }
/* Changes: pending work that no edit changed is faded context; hovering or selecting reads it. */
.open-work-svg .ow-node.ow-context, .open-work-svg .ow-badge.ow-context { opacity: .3; }
.open-work-svg .ow-wire.ow-context { opacity: .18; }
.open-work-svg .ow-node.ow-context:is(:hover, .is-hot, .is-primary, .is-pinned, :focus-visible) { opacity: 1; }
.open-work-svg .ow-badge.ow-context:is(.is-hot, .is-primary), .open-work-svg .ow-wire.ow-context.is-hot { opacity: 1; }
