/* Build the kit (#plan). Scoped under .v-plan so other screens can reuse class names. */
.v-plan{
  & .layout{display:grid;grid-template-columns:minmax(0,1fr) 520px;height:calc(100vh - var(--top-h));min-height:680px}
  & .stage-col{display:flex;flex-direction:column;gap:10px;padding:14px 18px 14px 24px;min-width:0;min-height:0}
  & .parts-col{border-left:1px solid var(--line);background:var(--paper);display:flex;flex-direction:column;min-height:0;position:relative}
  & .parts-scroll{flex:1;overflow:auto;padding:14px 22px 12px;display:flex;flex-direction:column;gap:12px;min-height:0;scroll-padding:12px}

  /* wall bar */
  & .wallbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;min-height:44px}
  & .wf{display:flex;align-items:center;gap:8px}
  & .wf label{font-size:13px;color:var(--ink-2);font-weight:500}
  & .wf .inp input{width:62px}
  & .wall-err{margin:-4px 0 0;padding-left:2px}
  /* the moment's trigger: a quiet button beside Apply (8 px), not a second primary */
  & .remeasure{margin-left:-6px;gap:7px;font-size:13.5px}
  & .remeasure svg{width:18px;height:12px;color:var(--muted)}
  & .facts{display:flex;align-items:center;gap:14px;margin:0 0 0 auto;font-size:12.5px;color:var(--muted);min-height:40px;padding:0 10px;border:1px solid transparent;border-radius:6px;background:transparent}
  & .facts:hover{border-color:var(--hair);background:var(--paper-2)}
  & .facts span{white-space:nowrap}
  & .facts b{color:var(--ink);font:500 13px var(--mono);margin-left:4px}
  & .facts .avail b{color:var(--teal-ink)}
  & .facts svg{width:14px;height:14px;color:var(--ink-2)}
  & .wallsum{display:none;align-items:center;gap:8px;min-height:44px;padding:0 10px;border:1px solid var(--hair);border-radius:6px;background:var(--paper-2);text-align:left;line-height:1.15}
  & .wallsum .ws1,.wallsum .ws2{display:block;font-size:12px;color:var(--muted)}
  & .wallsum .ws1 b{font:600 14px var(--mono);color:var(--ink)}
  & .wallsum .ws2 b{font:500 12px var(--mono);color:var(--teal-ink)}
  & .wallsum svg{width:14px;height:14px;color:var(--ink-2);margin-left:2px}

  /* fit strip: the first issue beside the wall controls */
  & .fit .lnk,& .fitline .lnk{background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;text-align:left;cursor:pointer;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}
  & .fit:focus-visible,& .fitline:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
  & .fitline{display:none}
  /* a stable height: the strip holds two lines in every state, so the stage never reframes */
  & .fit{display:flex;align-items:center;gap:12px;min-height:52px;padding:4px 0 4px 12px;border-left:3px solid var(--teal);font-size:13.5px}
  & .fit .ic{width:22px;height:22px;display:grid;place-items:center;border-radius:50%;border:1.5px solid var(--teal);color:var(--teal-ink);flex:none}
  & .fit .ic svg{width:12px;height:12px}
  & .fit.bad{border-left-color:var(--red);background:var(--red-tint)}
  & .fit.bad .ic{border-color:var(--red);color:var(--red-ink)}
  & .fit .txt{flex:1;min-width:0}
  & .fit .txt b{font-weight:600}
  & .fit.bad .txt b{color:var(--red-ink)}
  & .fit .try{display:flex;align-items:center;gap:10px;padding-right:8px}
  & .fit .try:empty{display:none}
  & .fit .try .hint{font-size:12.5px;color:var(--muted);white-space:nowrap}

  /* stage: the only rounded object (the studio) */
  & .stage{position:relative;flex:1;min-height:0;border-radius:16px;overflow:hidden;background:radial-gradient(120% 90% at 50% 0%,var(--paper-2),var(--studio) 70%);border:1px solid var(--line);isolation:isolate}
  & .viewport{position:absolute;inset:0;overflow:hidden}
  & .stage canvas{position:absolute;inset:0;width:100%;height:100%;display:block;opacity:0;transition:opacity var(--t-mid) var(--settle);touch-action:pan-y}
  & .stage.ready canvas{opacity:1}
  & .stage.cut canvas{opacity:.15;transition:opacity var(--t-fast) var(--settle)}
  & .poster{position:absolute;inset:0;display:grid;place-items:center;color:var(--muted);font-size:13px;pointer-events:none;transition:opacity var(--t-mid) var(--settle)}
  & .poster span{display:flex;flex-direction:column;align-items:center;gap:10px}
  & .poster i{width:28px;height:28px;border-radius:50%;border:1.5px dashed var(--teal);display:block}
  & .stage.ready .poster{opacity:0}
  & .stage-ui{position:absolute;inset:0;pointer-events:none;display:flex;flex-direction:column;justify-content:flex-end;padding:12px}
  & .stage-ui > *{pointer-events:auto}
  & .ui-bottom{display:flex;justify-content:center;pointer-events:none}
  & .ui-bottom > *{pointer-events:auto}
  & .frontnote{display:none;align-items:center;gap:10px;padding:7px 12px;border-radius:6px;background:var(--paper-2);border:1px solid var(--line);font-size:12.5px;color:var(--ink-2)}
  & .frontnote svg{width:16px;height:16px}
  & .stage[data-view="front"] .xsw{display:none}
  & .stage[data-view="front"] .frontnote{display:flex}
  & .fallback{position:absolute;inset:0;display:none;padding:64px 20px 70px;background:var(--paper)}
  & .fallback svg{width:100%;height:100%}
  & .stage.nogl .fallback{display:block}
  & .stage.nogl canvas,& .stage.nogl .poster,& .stage.nogl .xsw,& .stage.nogl .tabs,& .stage.nogl .overlay,& .stage.nogl .balloons{display:none}
  & .stage.nogl .frontnote{display:flex}
  & .stage-top{position:absolute;left:0;right:0;top:0;z-index:2;display:flex;align-items:flex-end;gap:16px;padding:8px 18px 0;pointer-events:none}
  & .stage-top > *{pointer-events:auto}
  & .tabs{display:flex;gap:18px}
  & .tabs button{position:relative;min-height:40px;padding:0 2px;border:0;background:transparent;font-size:13.5px;font-weight:500;color:var(--muted)}
  & .tabs button:hover{color:var(--ink)}
  & .tabs button[aria-pressed="true"]{color:var(--ink)}
  & .tabs button[aria-pressed="true"]::after{content:"";position:absolute;left:0;right:0;bottom:4px;height:2px;background:var(--ink)}

  /* What's in the box: two states, the thumb is a balloon on a leader */
  & .xsw{position:relative;display:inline-flex;align-items:stretch;padding:0 6px;border-radius:6px;background:color-mix(in srgb,var(--paper-2) 92%,transparent);border:1px solid var(--line)}
  & .xsw button{position:relative;z-index:1;min-height:42px;padding:0 14px 0 30px;border:0;background:transparent;font-size:13.5px;font-weight:500;color:var(--muted);white-space:nowrap}
  & .xsw button[aria-checked="true"]{color:var(--ink)}
  & .xthumb{position:absolute;left:0;top:0;bottom:0;width:10px;pointer-events:none;transition:transform var(--t-mid) var(--settle),width var(--t-mid) var(--settle)}
  & .xthumb::before{content:"";position:absolute;left:8px;top:50%;width:14px;height:14px;margin-top:-7px;border-radius:50%;background:var(--teal-solid);border:1.5px solid var(--teal-solid)}
  & .xthumb i{position:absolute;left:22px;right:10px;bottom:8px;height:1.5px;background:var(--teal)}
  & .xthumb i::before{content:"";position:absolute;left:-7px;bottom:0;width:10px;height:1.5px;background:var(--teal);transform-origin:right;transform:rotate(-40deg)}
  & .xsw[aria-disabled="true"]{opacity:.5;pointer-events:none}

  /* box count */
  & .boxcount{display:flex;align-items:center;gap:6px 18px;flex-wrap:wrap;min-height:44px;padding:4px 4px 0}
  & .boxcount .lab{font:600 12px var(--ui);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
  & .bc{display:flex;align-items:center;gap:7px;font-size:14px;color:var(--ink-2);background:transparent;border:0;border-bottom:1.5px solid transparent;padding:0 2px;min-height:44px}
  & .bc:hover,& .bc.hot{color:var(--ink);border-bottom-color:var(--teal)}
  & .bc b{font:500 15px var(--mono);color:var(--ink)}
  & .bc svg{width:26px;height:20px;color:var(--ink-2)}
  & .boxcount .excl{margin-left:auto;font-size:12.5px;color:var(--muted)}
  & .depth-line{display:flex;gap:8px;font-size:12.5px;color:var(--muted);align-items:flex-start;margin:-4px 0 0;padding:0 4px}
  & .depth-line svg{width:16px;height:16px;margin-top:1px}
  & .depth-line .dl-t{flex:1;min-width:0}
  /* the orbit hint lives in the line under the stage, not over the model */
  & .hint-orbit{margin-left:auto;padding-left:12px;white-space:nowrap}
  &:has(.stage[data-view="front"]) .hint-orbit{visibility:hidden}
  &:has(.stage.nogl) .hint-orbit{display:none}

  /* parts column: paper with hairlines, no cards */
  & .ph{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  & .ph h2{margin:0;font:700 24px/1 var(--display);letter-spacing:-.01em}
  & .ph .grow{flex:1}
  & .ph .btn{gap:6px}
  & .bom{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
  & .bom li{border-bottom:1px solid var(--line)}
  & .line{width:100%;display:grid;grid-template-columns:34px 1fr auto auto;grid-template-areas:"b n q t" "b d u u";align-items:center;column-gap:12px;padding:7px 6px 7px 2px;background:transparent;border:0;text-align:left;border-radius:0;position:relative;min-height:52px}
  & .line:hover,& .line.hot{background:var(--glow-2)}
  & .line.hot::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:2px;background:var(--teal)}
  & .line .bl{grid-area:b;width:28px;height:28px;border-radius:50%;border:1.5px solid var(--teal);display:grid;place-items:center;font:500 13px var(--mono);color:var(--teal-ink);background:var(--paper-2);justify-self:center}
  & .line.hot .bl{background:var(--glow)}
  & .line.has-sel .bl{background:var(--teal-solid);border-color:var(--teal-solid);color:var(--on-teal)}
  & .line .n{grid-area:n;font-weight:600;font-size:14.5px}
  & .line .d{grid-area:d;font-size:12px;color:var(--muted);font-family:var(--mono)}
  & .line .q{grid-area:q;font:500 13px var(--mono);color:var(--ink-2)}
  & .line .t{grid-area:t;font:500 14px var(--mono);text-align:right;min-width:86px}
  & .line .u{grid-area:u;font:400 11.5px var(--mono);color:var(--muted);text-align:right}
  /* the moment marks lines that would change */
  & .line .swap{grid-column:2 / -1;display:none;align-items:center;gap:8px;margin-top:5px;font-size:12.5px;color:var(--ink-2)}
  & .line .swap .to{display:inline-flex;align-items:center;gap:6px;padding:3px 7px;border-radius:6px;border:1px dashed var(--teal);color:var(--teal-ink);font-weight:600;background:var(--paper-2)}
  & .line .swap .dlt{margin-left:auto;font:500 13px var(--mono);color:var(--teal-ink)}
  & .line.changing .swap{display:flex}
  & .line.changing .n,& .line.changing .t{text-decoration:line-through;text-decoration-color:var(--muted);color:var(--muted)}
  & .colour-line{display:flex;align-items:center;gap:12px;padding:9px 6px 9px 2px;font-size:13px;color:var(--ink-2)}
  & .colour-line .bl{width:28px;height:28px;display:grid;place-items:center;margin:0 3px;border-radius:50%;border:1.5px dashed var(--teal);font:500 13px var(--mono);color:var(--muted);flex:none}
  & .colour-line.unknown{color:var(--red-ink)}
  & .colour-line.unknown .bl{border-color:var(--red);color:var(--red-ink)}
  & .moment-slot:empty{display:none}

  & .card{border-top:1px solid var(--line);padding:10px 0 2px}
  & .card h3{margin:0 0 6px;min-height:34px;font:600 13px var(--ui);color:var(--ink-2);display:flex;align-items:center;gap:8px;letter-spacing:0}
  & .card h3 .grow{flex:1}
  & .card h3 small{font:400 12px var(--mono);color:var(--muted)}
  & .run{display:flex;gap:3px;margin:0 0 8px;align-items:flex-end;height:54px}
  & .run button{flex:var(--w) 1 0;min-width:0;border:1px solid var(--hair);background:var(--paper);border-radius:6px 6px 3px 3px;height:var(--h);min-height:44px;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:2px;padding:4px 2px 5px;font:500 11.5px var(--mono);color:var(--ink-2)}
  & .run button:hover{border-color:var(--ink-2)}
  & .run button .mb{width:18px;height:18px;border-radius:50%;border:1.3px solid var(--teal);font-size:10px;line-height:15px;color:var(--teal-ink);background:var(--paper-2)}
  & .run button[aria-pressed="true"]{border-color:var(--teal-solid);background:var(--glow-2);color:var(--ink);box-shadow:inset 0 -3px 0 var(--teal)}
  & .run button[aria-pressed="true"] .mb{background:var(--teal-solid);color:var(--on-teal);border-color:var(--teal-solid)}
  & .run button.unknown{border:1.5px dashed var(--red);color:var(--red-ink)}
  & .run button.unknown .mb{border-color:var(--red);color:var(--red-ink)}
  & .run .empty{flex:1;height:44px;border:1.5px dashed var(--hair);border-radius:6px;display:flex;align-items:center;justify-content:center;gap:8px;font-size:12.5px;color:var(--muted)}
  & .run .empty i{width:16px;height:16px;border-radius:50%;border:1.3px dashed var(--teal)}
  & .selname{font-size:13.5px;margin:0 0 8px;display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}
  & .selname b{font-weight:600}
  & .selname span{font:400 12px var(--mono);color:var(--muted)}
  & .selname span.hint{font:400 12.5px var(--ui)}
  & .tools{display:flex;gap:5px;flex-wrap:wrap}
  & .tools .btn{min-height:40px;padding:0 10px;font-size:13.5px;gap:6px}
  & .finish{display:flex;flex-direction:column;gap:8px}
  & .finish .grp{display:grid;grid-template-columns:108px 1fr;align-items:center;gap:10px}
  & .finish .gl{font-size:12.5px;color:var(--ink-2);display:flex;flex-direction:column;line-height:1.25;font-weight:500}
  & .finish .gl span+span{font:400 11.5px var(--mono);color:var(--muted)}
  & .errsum .lnk{font-size:13px}
  & .errsum li{padding:1px 0}

  /* summary */
  & .summary{border-top:1px solid var(--line);padding:12px 22px 14px;background:var(--paper);display:flex;flex-direction:column;gap:8px}
  & .occ{display:flex;gap:18px;font-size:12.5px;color:var(--muted)}
  & .occ b{font:500 13.5px var(--mono);color:var(--ink);margin-left:6px}
  & .occ .rem b{color:var(--teal-ink)}
  & .occ .rem.bad b{color:var(--red-ink)}
  & .money{display:grid;grid-template-columns:1fr auto;gap:2px 12px;font-size:13px;color:var(--ink-2)}
  & .money .v{font:500 13px var(--mono);text-align:right;color:var(--ink)}
  & .totrow{display:flex;align-items:flex-end;gap:8px 12px;flex-wrap:wrap}
  & .tot{min-width:0}
  & .tot{display:flex;flex-direction:column;gap:2px}
  & .tot .k{font-size:12px;color:var(--muted)}
  & .tot .v{font:700 30px/1.05 var(--display);letter-spacing:-.01em;font-variant-numeric:tabular-nums}
  & .continue{margin-left:auto;min-height:48px;padding:0 18px;font-size:15px;border-radius:12px}
  /* .continue.lit stays as a hook: the moment CSS draws its own timed ring */
  & .legal{margin:0;font-size:11.5px;color:var(--muted);line-height:1.4}
  & .blockreason{font-size:12px;color:var(--red-ink);margin:0;text-align:right}
  & .blockreason:empty{display:none}

  /* while the moment previews a swap, the edit cards step aside */
  body.preview-on & .card.sel-card,body.preview-on & .finish-card{display:none}
}

/* measurements dialog (dialogs sit inside the view) */
#p-dlg-measure{
  & .fields{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}
  & .avail-read{margin:0;font-size:13px;color:var(--ink-2)}
  & .avail-read b{font:500 14px var(--mono);color:var(--teal-ink)}
  & .avail-read b.bad{color:var(--red-ink)}
  & .avail-read span{color:var(--muted);font-size:12px}
  & .spanlist{display:flex;flex-direction:column;gap:10px}
  & .spanrow{margin:0;padding:10px 12px 12px;border:1px dashed var(--hair);border-radius:6px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
  & .spanrow legend{font:600 12.5px var(--ui);color:var(--ink-2);padding:0 4px}
  & .spanrow .fields{width:100%;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) minmax(0,1fr)}
}

/* ---------- responsive ---------- */
@media (max-width:1180px){
  .v-plan .layout{grid-template-columns:minmax(0,1fr) 420px}
  .v-plan .facts .h,.v-plan .facts .r{display:none}
}
@media (max-width:899px){
  .v-plan{
    & .layout{display:block;height:auto;min-height:0}
    & .stage-col{display:flex;flex-direction:column;padding:12px 16px 4px;gap:10px}
    & .wallbar{order:1;flex-wrap:nowrap;gap:8px}
    & .wall-err{order:1}
    & .continue{margin-left:auto;max-width:100%}
    & .stage{order:2;flex:none;border-radius:14px}
    & .fit{display:none}
    & .fitline{order:1;display:flex;align-items:center;gap:8px;min-height:52px;padding:2px 0 2px 10px;border-left:3px solid var(--teal);font-size:13px;line-height:1.25}
    & .fitline.bad{border-left-color:var(--red);background:var(--red-tint)}
    & .fitline .ic{width:20px;height:20px;display:grid;place-items:center;border-radius:50%;border:1.5px solid var(--teal);color:var(--teal-ink);flex:none}
    & .fitline .ic svg{width:11px;height:11px}
    & .fitline.bad .ic{border-color:var(--red);color:var(--red-ink)}
    & .fitline .txt{flex:1;min-width:0}
    & .fitline.bad .txt b{color:var(--red-ink)}
    & .fitline .sub{color:var(--ink-2)}
    & .fitline .try{flex:none;padding-right:4px}
    & .fitline .try:empty{display:none}
    & .fitline .try .btn{min-height:44px;padding:0 10px}
    & .boxcount{order:4;padding:2px 0 0;gap:6px 14px}
    & .boxcount .excl{margin-left:0;width:100%}
    & .depth-line{order:5;margin:0}
    & .wf,& .facts{display:none!important}
    & .wallsum{display:grid;grid-template-columns:auto auto;column-gap:10px;align-items:center;flex:0 1 auto;min-width:0;padding:4px 10px}
    & .wallsum .ws1{grid-column:1;grid-row:1}
    & .wallsum .ws2{grid-column:1;grid-row:2}
    & .wallsum svg{grid-column:2;grid-row:1 / 3}
    & .wallsum .ws1 b,& .wallsum .ws2 b{white-space:nowrap}
    & .wallsum .ws1,& .wallsum .ws2{white-space:nowrap}
    & .remeasure{margin-left:auto;padding:0 10px;font-size:13px;white-space:nowrap;min-height:44px;flex:none}
    & .viewport{position:relative;inset:auto;height:min(54vh,430px);min-height:320px}
    & .stage-ui{position:static;padding:6px 8px 8px;display:block;border-top:1px solid var(--line)}
    & .ui-bottom{display:block}
    & .stage-top{position:static;padding:2px 10px 0;border-bottom:1px solid var(--line)}
    & .tabs{width:100%}
    & .tabs button{flex:1;min-height:44px}
    & .xsw{width:100%}
    & .xsw button{flex:1;min-height:44px}
    & .fallback{padding:16px}
    & .hint-orbit{display:none}
    & .parts-col{border-left:0;border-top:1px solid var(--line)}
    & .parts-scroll{overflow:visible;padding:16px}
    & .summary{padding:14px 16px 18px}
    & .finish .grp{grid-template-columns:1fr}
    & .finish .gl{flex-direction:row;gap:8px;align-items:baseline}
    & .line{padding:10px 4px 10px 0}
    & .line .d{white-space:normal}
    & .tools .btn{min-height:44px;flex:1 1 auto}
    & .card h3 .btn{min-height:44px}
    & .ph .btn{min-height:44px}
  }
  #p-dlg-measure .spanrow .fields{grid-template-columns:1fr 1fr}
  #p-dlg-measure .spanrow .fields .field:first-child{grid-column:1 / -1}
}
@media (min-width:900px){
  /* desktop: the fit line under the wall bar states occupied and remaining; the summary is money only */
  .v-plan .summary .occ{display:none}
}
@media (max-width:420px){
  .v-plan .remeasure{font-size:12.5px;padding:0 8px}
  .v-plan .wallsum{padding:0 8px;gap:6px}
  .v-plan .wallsum .ws1 b{font-size:13px}
  .v-plan .chips .chip .r{display:none}
  .v-plan .line .t{min-width:74px}
  .v-plan .tools .btn{padding:0 8px;font-size:13px}
}
@media (max-width:380px){
  /* 360: the wall chip and Re-measure stack instead of colliding */
  .v-plan .wallbar{flex-direction:column;align-items:stretch;gap:6px}
  .v-plan .wallsum{width:100%;grid-template-columns:1fr auto}
  .v-plan .remeasure{margin-left:0;width:100%;min-height:44px;justify-content:flex-start;padding:0 10px}
}
@media print{
  .v-plan .stage-ui{display:none!important}
}
