*{box-sizing:border-box}
body{margin:0;height:100vh;display:flex;flex-direction:column;background:var(--bg-2);color:var(--text-1);
     font-family:var(--ff);font-size:13px;-webkit-font-smoothing:antialiased}
header{display:flex;align-items:center;gap:14px;padding:0 16px;height:var(--gnb);flex:0 0 var(--gnb);
       background:var(--bg-1);border-bottom:1px solid var(--border-1)}
.logo{font-family:var(--ff-display);font-weight:700;letter-spacing:.14em;font-size:15px;color:var(--act2)}
.subtle{color:var(--text-3-sm)} .sp{flex:1}
button{background:var(--bg-1);color:var(--text-1);border:1px solid var(--border-1);border-radius:var(--r-sm);
       padding:7px 12px;cursor:pointer;font-size:12px;font-family:var(--ff);font-weight:500;transition:none}
button:hover{border-color:var(--act);color:var(--act-hov)}
/* A keyboard-driven tool that advertises shortcuts in its header must show where focus is.
   Reuses the ring `input:focus` already had. */
:focus-visible{outline:none;border-color:var(--act);box-shadow:0 0 0 3px var(--t200)}
button:focus-visible,.chip:focus-visible,.shtab:focus-visible,.lrow:focus-visible,
#linetbl td:focus-visible,#linetbl th.rh:focus-visible{outline:2px solid var(--act2);
  outline-offset:-2px;box-shadow:0 0 0 3px var(--t200)}
button.primary{background:var(--act);border-color:var(--act);color:var(--act2);font-weight:600}
button.primary:hover{background:var(--act-hov);border-color:var(--act-hov);color:var(--m100)}
main{flex:1;display:flex;min-height:0}
#left{width:60%;display:flex;flex-direction:column;border-right:1px solid var(--border-1);background:var(--bg-1)}
#viewer{flex:1;overflow:hidden;position:relative;background:var(--bg-3);cursor:grab}
#viewer.drag{cursor:grabbing}
#img{position:absolute;transform-origin:0 0;user-select:none;-webkit-user-drag:none;box-shadow:var(--sh-md);background:var(--m100)}
#vbar{display:flex;gap:6px;align-items:center;padding:8px 12px;background:var(--bg-1);border-top:1px solid var(--border-1)}
#right{width:40%;display:flex;flex-direction:column;min-width:0;background:var(--bg-1);overflow:hidden}
/* Every fixed block must not grow; the queue takes the slack and scrolls; the action bar is
   pinned last so Confirm/Correct is ALWAYS on screen no matter how tall the line table is. */
#acc,#totals,#chips,#prog,#linebar{flex:0 0 auto}
#shtabs{display:flex;gap:5px;overflow-x:auto;padding:6px 12px;flex:0 0 auto;
  border-bottom:1px solid var(--border-1);background:var(--bg-1);scrollbar-width:thin}
#shtabs .shtab{flex:0 0 auto;white-space:nowrap}
#act{flex:0 0 auto}
/* accuracy panel */
#acc{padding:12px 14px;border-bottom:1px solid var(--border-1);background:var(--bg-1)}
#acc .top{display:flex;align-items:baseline;gap:10px}
#accval{font-family:var(--ff-display);font-size:30px;font-weight:700;line-height:1;color:var(--ok);font-variant-numeric:tabular-nums}
/* the word under the number, so a confidence figure never reads as a match figure */
#accunit{font-size:13px;font-weight:700;color:var(--text-2);text-transform:lowercase}
#accalt{font-size:12px;font-weight:600;color:var(--text-3-sm);font-variant-numeric:tabular-nums;margin-left:4px}
#accdelta{font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}
#accdelta.up{color:var(--ok)} #accdelta.down{color:var(--bad)}
/* the adjudicated COUNT — deliberately not a percentage, see paintAcc() */
#accdelta.win{color:var(--ok-ink)}
#acclabel{font-size:11px;color:var(--text-3-sm)}
#accbar{height:8px;background:var(--bg-3);margin-top:9px;position:relative;overflow:hidden}
#accfill{height:100%;background:var(--ok);width:0;transition:width .5s cubic-bezier(.4,0,.2,1)}
#accbase{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--act2);opacity:.55}
#accnote{margin-top:6px;font-size:11px;color:var(--text-3-sm);font-variant-numeric:tabular-nums}
#acc.tight{padding:8px 14px;cursor:pointer}
#acc.tight #accval{font-size:22px}
#acc.tight #accnote,#acc.tight #accbasis{display:none}
#acc .hintx{font-size:11px;color:var(--text-3-sm);float:right;margin-top:4px}
#accbasis{margin-top:5px;font-size:10.5px;color:var(--text-3-sm);line-height:1.45}
/* total-difference-by-column strip */
#totals{border-bottom:1px solid var(--border-1);background:var(--bg-1);font-size:11px}
#totals .thead{display:flex;justify-content:space-between;align-items:center;
  padding:9px 14px;cursor:pointer;user-select:none;color:var(--text-2)}
#totals .thead b{font-size:11px;font-weight:600}
#totbody{padding:0 14px 11px;display:none}
#totbody.open{display:block}
#totbody table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
#totbody td{padding:3px 0;border-bottom:1px solid var(--border-1)}
#totbody td.c{text-align:right;width:52px}
#totbody tr:last-child td{border-bottom:none}
#totbody .gh td{padding-top:9px;color:var(--text-3-sm);font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;border-bottom:none}
#totbody .gh.first td{padding-top:2px}
#totbody .ok{color:var(--ok-ink);font-weight:600} #totbody .bad{color:var(--bad-ink);font-weight:600}
#totbody .gnote{margin-top:8px;font-size:10.5px;color:var(--text-3-sm);line-height:1.5}
#chips{display:flex;gap:6px;padding:10px 12px;flex-wrap:wrap;align-items:center;border-bottom:1px solid var(--border-1)}
.chip{padding:5px 11px;border-radius:var(--r-pill);border:1px solid var(--border-1);cursor:pointer;font-size:11px;
      background:var(--bg-1);color:var(--text-2);font-weight:500}
.chip:hover{border-color:var(--act)}
.chip.on{background:var(--act2);color:var(--m100);border-color:var(--act2);font-weight:600}
#prog{height:3px;background:var(--bg-3)}#prog>div{height:100%;background:var(--t600);width:0;transition:width .3s}
#queue{flex:1 1 0;min-height:132px;overflow:auto;padding:10px;background:var(--bg-2)}
/* Short viewports: the accuracy panel and the totals strip are reference, the queue is the work.
   Collapse the reference so the review card is never clipped mid-sentence. */
@media (max-height:760px){
  #acc{padding:8px 14px}
  #acc #accnote,#acc #accbasis{display:none}
  #accval{font-size:22px}
  #totals .thead{padding:6px 14px}
  #linetbl{max-height:22vh}
  #linehint{display:none !important}
}
@media (max-height:620px){#totals{display:none}}
.card{border:1px solid var(--border-1);border-left:3px solid var(--border-1);border-radius:var(--r-sm);
      padding:11px 12px;margin-bottom:8px;background:var(--bg-1);cursor:pointer}
.card:hover{box-shadow:var(--sh-xs)}
.card.cur{border-color:var(--act);border-left-color:var(--act);box-shadow:var(--sh-sm)}
.card.diff{border-left-color:var(--bad)} .card.flag{border-left-color:var(--yel)}
/* no manual takeoff: a row whose DERIVED confidence sits below the job's threshold */
.card.lowconf{border-left-color:var(--warn);border-left-width:4px}
/* coverage gaps: a whole row on one side only. Distinct from a value disagreement. */
.card.turner_miss{border-left-color:var(--act2);border-left-width:4px}
.card.our_miss{border-left-color:var(--warn);border-left-width:4px}
.card.done{opacity:.45}
.card h4{margin:0 0 4px;font-size:12.5px;font-weight:600;color:var(--text-1)}
.meta{color:var(--text-3-sm);font-size:11px}
.vals{display:flex;gap:8px;margin:7px 0;flex-wrap:wrap}
.val{padding:3px 9px;border-radius:var(--r-xs);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}
.val.m{background:var(--bad-bg);color:var(--bad-ink);border:1px solid var(--bad)}
.val.a{background:var(--ok-bg);color:var(--t700);border:1px solid var(--ok)}
.flagtxt{color:var(--text-3-sm);font-size:11px;line-height:1.5;max-height:5.5em;overflow:auto;white-space:pre-wrap}
.badge{font-size:10px;padding:2px 7px;border-radius:var(--r-pill);margin-left:6px;
       background:var(--bg-3);color:var(--text-2);font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.badge.confirm{background:var(--ok-bg);color:var(--t700)}
.badge.correct{background:var(--bad-bg);color:var(--bad-ink)}
.badge.turner_error{background:var(--yel-lt);color:var(--warn)}
#act{border-top:1px solid var(--border-1);background:var(--bg-1);padding:11px 12px}
#act .row{display:flex;gap:6px;margin-bottom:7px;flex-wrap:wrap}
input,textarea,select{background:var(--bg-1);border:1px solid var(--border-1);color:var(--text-1);
      border-radius:var(--r-sm);padding:7px 9px;font-family:var(--ff);font-size:12px;width:100%}
input:focus,select:focus{outline:none;border-color:var(--act);box-shadow:0 0 0 3px var(--t200)}
#vbar select{width:auto}
#toast{position:fixed;bottom:16px;left:16px;background:var(--act2);color:var(--m100);padding:10px 14px;
       border-radius:var(--r-sm);display:none;max-width:62ch;box-shadow:var(--sh-lg);font-size:12px;z-index:20}
/* ---------- busy overlay (rebuild) ---------- */
#busy{position:fixed;inset:0;background:color-mix(in srgb, var(--bg-1) 72%, transparent);
      backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:40}
#busy[hidden]{display:none}
#busy .busybox{display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center;
      padding:28px 34px;border-radius:var(--r-sm);background:var(--bg-2);
      border:1px solid var(--border-1);box-shadow:var(--sh-xl);max-width:46ch}
#busy .spinner{width:56px;height:56px;border-radius:50%;border:5px solid var(--border-1);
      border-top-color:var(--act2);animation:busyspin .9s linear infinite}
@keyframes busyspin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){#busy .spinner{animation-duration:2.4s}}
#busy .busytitle{font-family:var(--ff-display);font-weight:700;font-size:16px}
#busy .busymsg{font-size:12px;color:var(--text-3-sm)}

#rules{position:fixed;inset:6% 12%;background:var(--bg-1);border:1px solid var(--border-1);
       border-radius:var(--r-sm);padding:18px;overflow:auto;display:none;z-index:19;box-shadow:var(--sh-xl)}
pre{white-space:pre-wrap;font-size:11px;color:var(--text-2);line-height:1.55}
.kbd{font-size:10.5px;color:var(--text-3-sm)}
h3{font-family:var(--ff-display);font-weight:700;margin:0 0 6px}

/* ---------- LINE MODE: walk one line at a time against its own drawings ---------- */
#linebar{display:flex;align-items:center;gap:6px;padding:8px 12px;border-bottom:1px solid var(--border-1);
         background:var(--bg-2);flex-wrap:wrap}
#linebar .lid{font-family:var(--ff-display);font-weight:700;font-size:15px;letter-spacing:-.01em}
#linebar .st{font-size:10px;padding:2px 8px;border-radius:var(--r-pill);font-weight:700;
             text-transform:uppercase;letter-spacing:.05em}
.st.look{background:var(--bad-bg);color:var(--bad-ink)}
.st.rule{background:var(--yel-lt);color:var(--warn)}
.st.scope{background:var(--bg-3);color:var(--text-2)}
.st.clean{background:var(--ok-bg);color:var(--t700)}
#linebar .cnt{font-size:11px;color:var(--text-3-sm);font-variant-numeric:tabular-nums}
.chip.away{opacity:.62;border-style:dashed}
.chip .of{color:var(--text-3-sm);font-weight:400}
.chip.on .of{color:var(--b400)}   /* on the dark active chip, muted must go light */
.lrow.nohit{opacity:.4}
#fscope{font-size:10.5px;color:var(--text-3-sm);padding:0 12px 6px;background:var(--bg-1);flex:0 0 auto}
.shtab{padding:4px 10px;border:1px solid var(--border-1);border-radius:var(--r-sm);cursor:pointer;
       font-size:11px;font-variant-numeric:tabular-nums;background:var(--bg-1);color:var(--text-2)}
.shtab:hover{border-color:var(--act);color:var(--act-hov)}
.shtab.on{background:var(--act);border-color:var(--act);color:var(--act2);font-weight:700}
#linetbl{border-bottom:1px solid var(--border-1);overflow:auto;max-height:30vh;
  flex:0 1 auto;min-height:0;background:var(--bg-1)}
.xlr{display:inline-block;margin-left:6px;font-size:11px;font-weight:600;letter-spacing:.02em;
  color:var(--text-3-sm);background:var(--bg-3);border-radius:0;padding:1px 4px;vertical-align:middle}
.xlr2{color:var(--text-3-sm);font-variant-numeric:tabular-nums}
#linetbl td.d,#linetbl td.only,#linetbl td.eq[onclick]{cursor:pointer}
#linetbl td.d:hover,#linetbl td.only:hover{outline:2px solid var(--act2);outline-offset:-2px}
#linetbl td.eq[onclick]:hover{outline:2px dashed var(--act);outline-offset:-2px}
#linetbl td.sel{outline:2px solid var(--act2);outline-offset:-2px}
#linehint{font-size:10.5px;color:var(--text-3-sm);padding:5px 12px;background:var(--bg-2);
  border-bottom:1px solid var(--border-1);flex:0 0 auto}
#linetbl table{border-collapse:collapse;width:100%;font-size:11.5px;font-variant-numeric:tabular-nums}
#linetbl th,#linetbl td{padding:4px 6px;border-bottom:1px solid var(--border-1);text-align:center;
       white-space:nowrap}
#linetbl thead th{position:sticky;top:0;background:var(--bg-2);color:var(--text-3-sm);font-size:11px;
       text-transform:uppercase;letter-spacing:.06em;font-weight:700;z-index:1}
#linetbl th.rh{text-align:left;font-weight:600;color:var(--text-2);cursor:pointer;position:sticky;left:0;
       background:var(--bg-1)}
#linetbl th.rh:hover{color:var(--act-hov)}
#linetbl tr.on th.rh{color:var(--act2)}
#linetbl tr.on td{background:var(--t100)}  /* t200 dropped red/ink text below AA */
#linetbl td .m{color:var(--text-3-sm)} #linetbl td .a{font-weight:700}
#linetbl td.d{background:var(--bad-bg)} #linetbl td.d .a{color:var(--bad-ink)}
#linetbl td.eq .a{color:var(--text-2);font-weight:500}
#linetbl td.only{background:var(--yel-lt)}
#linetbl .oneside{color:var(--warn);font-size:10px;font-weight:700;text-transform:uppercase}
.lgrp{padding:7px 12px;background:var(--bg-2);border-top:1px solid var(--border-1);font-size:10px;
      text-transform:uppercase;letter-spacing:.07em;color:var(--text-3-sm);font-weight:700;
      display:flex;gap:8px;align-items:center;position:sticky;top:0;z-index:2}
.lgrp .n{margin-left:auto;color:var(--text-3-sm);letter-spacing:0}
.lrow{display:flex;gap:9px;align-items:baseline;padding:8px 12px;border-top:1px solid var(--border-1);
      cursor:pointer;font-size:12px}
.lrow:hover{background:var(--bg-2)}
.lrow.onpg{box-shadow:inset 3px 0 0 var(--t500,#2a7)}
.lrow.on{background:var(--t200)}
.lrow .id{font-family:var(--ff-display);font-weight:700;min-width:74px}
.lrow .sz{color:var(--text-3-sm);font-size:11px;font-variant-numeric:tabular-nums;min-width:66px}
.lrow .wh{color:var(--text-2);flex:1;font-size:11.5px}
.lrow .dn{font-size:10px;color:var(--ok-ink)}

/* Drawing identity, pinned over the drawing so it stays readable when zoomed in — the estimator
   should never have to zoom out just to re-check which sheet they are looking at. */
#dwgtag{position:absolute;top:8px;left:8px;z-index:5;pointer-events:none;
  background:rgba(255,255,255,.93);border:1px solid var(--border-1);border-radius:var(--r-sm);
  padding:5px 9px;font-size:11.5px;line-height:1.35;box-shadow:var(--sh-sm);max-width:60%}
#dwgtag b{font-size:12.5px} #dwgtag .m{color:var(--text-3-sm)}
#dwgtag:empty{display:none}
/* When the fitted drawing fills the pane there is no free margin, and the full tag covered 2.8%
   of the linework (measured at 1280x640). Then it collapses to a chip that expands on hover or
   keyboard focus, so the identity is always reachable but never permanently on top of the sheet. */
#dwgtag.mini{pointer-events:auto;padding:3px 9px;background:var(--act2);color:var(--m100);
  border-color:var(--act2);border-radius:var(--r-pill);max-width:none;cursor:default}
#dwgtag.mini .m{display:none;color:var(--b400)}
#dwgtag.mini b{font-size:11.5px}
#dwgtag.mini:hover,#dwgtag.mini:focus-within{padding:5px 9px;border-radius:var(--r-sm);
  background:rgba(255,255,255,.96);color:var(--text-1);border-color:var(--border-1)}
#dwgtag.mini:hover .m,#dwgtag.mini:focus-within .m{display:block;color:var(--text-3-sm)}

/* ---------- EVIDENCE MARKUPS: boxes over the drawing, shown only on cell click ---------- */
/* #marks shares #img's transform (apply() sets both), so boxes are laid out in IMAGE PIXELS and
   pan/zoom keeps them glued to the linework.
   ⚠ EVERY on-screen length in here MUST be divided by --mkz, the live zoom that apply() publishes.
   Authored lengths are multiplied by the transform's scale, so a plain `border:2px` renders 0.45px
   at fit zoom (measured) — invisible exactly when you need to find the box. Do not "simplify"
   these calc()s away. */
#marks{position:absolute;top:0;left:0;transform-origin:0 0;z-index:4;pointer-events:none}
.mk{position:absolute;pointer-events:auto;border-radius:0;   /* --r-sm is 0; the system is square */
    border:calc(2px / var(--mkz,1)) solid var(--bad);
    box-shadow:0 0 0 calc(2px / var(--mkz,1)) rgba(255,255,255,.92),
               0 0 0 calc(5px / var(--mkz,1)) rgba(236,16,16,.24)}
/* stepped-to item full weight, its siblings dimmed but still placed */
.mk.cur{border-width:calc(4px / var(--mkz,1))}
/* a BOM line an independent read summed — the other side of a contradiction */
.mk.bom{border-color:var(--act);box-shadow:0 0 0 calc(2px / var(--mkz,1)) rgba(255,255,255,.92),
        0 0 0 calc(5px / var(--mkz,1)) rgba(0,90,200,.22)}
.card.check{border-left-color:var(--bad);border-left-width:4px}
.mk.dim{border-width:calc(1.5px / var(--mkz,1));
    box-shadow:0 0 0 calc(2px / var(--mkz,1)) rgba(255,255,255,.85)}
/* one-shot pulse on draw. NEVER looped: this screen is read for hours, and a blinking ring over
   linework both destroys legibility and trips WCAG 2.2.2. */
.mk::after{content:'';position:absolute;inset:calc(-7px / var(--mkz,1));
    border:calc(2px / var(--mkz,1)) solid var(--bad);
    animation:mkpop .42s cubic-bezier(.2,.7,.3,1) 1 both;pointer-events:none}
@media (prefers-reduced-motion:no-preference){#marks.nopop .mk::after{animation:none;opacity:0}}
@keyframes mkpop{from{transform:scale(1.8);opacity:.9}to{transform:scale(1);opacity:0}}
@media (prefers-reduced-motion:reduce){.mk::after{animation:none;opacity:.28}}
/* the tag counter-scales about its own bottom-left, so it pins to the box corner with no offset
   arithmetic and stays 11px on screen at any zoom */
.mk .tag{position:absolute;bottom:100%;left:0;transform-origin:0 100%;
    transform:scale(calc(1 / var(--mkz,1)));
    background:var(--bad);color:var(--m100);font-size:11px;font-weight:700;padding:1px 6px;
    border-radius:var(--r-pill);white-space:nowrap;line-height:1.35;margin-bottom:3px}

/* page overview: every located item, coloured by type (--c). Same --mkz rule as above. */
.mk.ov{border:calc(2px / var(--mkz,1)) solid var(--c);
    background:color-mix(in srgb, var(--c) 10%, transparent);
    box-shadow:0 0 0 calc(1.5px / var(--mkz,1)) rgba(255,255,255,.9);cursor:pointer}
.mk.ov::after{display:none}
.mk.ov.run{border-style:dashed;background:none;box-shadow:none;border-width:calc(1.5px / var(--mkz,1))}
.mk.ov:hover{background:color-mix(in srgb, var(--c) 22%, transparent)}
/* linework style: the item's own strokes recoloured (svg.ovink), the box only a hit area that
   shows on hover. Strokes are in page points, so they scale with the drawing they overlay. */
.ovink{position:absolute;top:0;left:0;pointer-events:none;overflow:visible}
.ovink path{fill:none;stroke:var(--c);stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}
.ovink path.f{fill:var(--c);stroke-width:1}
.ovink g.dim{opacity:.35}
/* focused view: an evidence box takes its item's type colour, like the overview */
.mk.typed{border-color:var(--c);box-shadow:0 0 0 calc(2px / var(--mkz,1)) rgba(255,255,255,.92),
          0 0 0 calc(5px / var(--mkz,1)) color-mix(in srgb, var(--c) 24%, transparent)}
.mk.typed::after{border-color:var(--c)}
.mk.typed .tag{background:var(--c)}
/* with linework drawn, the box is a thin frame a step outside the item, not a red block */
.mk.typed.ink{border-width:calc(1.5px / var(--mkz,1));border-style:dashed;box-shadow:none}
.mk.typed.ink.cur{border-style:solid}
.mk.ov.ink{border-color:transparent;background:none;box-shadow:none}
.mk.ov.ink:hover{border-color:var(--c);background:color-mix(in srgb, var(--c) 8%, transparent)}
.mk.ov .tag{background:var(--c);font-size:10px;padding:0 4px;margin-bottom:1px;font-weight:600}
.mk.ov.run .tag{top:0;bottom:auto;margin:0;transform-origin:0 0}
#ovbar{display:none;align-items:center;gap:6px;padding:6px 12px;font-size:11.5px;color:var(--text-2);
    background:var(--bg-1);border-top:1px solid var(--border-1);flex:0 0 auto;flex-wrap:wrap}
#ovbar.on{display:flex}
#ovbar .ttl{font-weight:700;color:var(--text-1)}
#ovbar .sp{flex:1}
#ovbar .lg{font:inherit;display:inline-flex;align-items:center;gap:5px;padding:2px 8px;min-width:0;
    background:var(--bg-2);border:1px solid var(--border-1);color:var(--text-1);cursor:pointer}
#ovbar .lg b{font-variant-numeric:tabular-nums}
#ovbar .lg .sw{width:11px;height:11px;border:2px solid var(--c);
    background:color-mix(in srgb, var(--c) 18%, transparent);display:inline-block}
#ovbar .lg .sw.run{border-style:dashed;background:none}
#ovbar .lg.off{opacity:.45;text-decoration:line-through}
#ovbar .lg.short b{color:var(--warn)}
#ovbar .step{font:inherit;font-weight:700;padding:3px 10px;min-width:0}
/* evidence HUD, docked in the viewer bar so it can never cover linework */
#mkbar{display:none;align-items:center;gap:8px;padding:7px 12px;font-size:11.5px;
    color:var(--text-2);background:var(--bg-2);border-top:1px solid var(--border-1);
    flex:0 0 auto;flex-wrap:wrap}
#mkbar.on{display:flex}
#mkbar .step{font:inherit;font-weight:700;padding:2px 9px;min-width:0}
#mkbar .idx{font-variant-numeric:tabular-nums;font-weight:700;min-width:58px;text-align:center}
#mkbar .fld{font-weight:700;color:var(--text-1)}
#mkbar .sp{flex:1}
#mkbar .short{color:var(--warn);font-weight:600}
#mkbar .conf{color:var(--text-3-sm)}
/* derived-confidence chip on a line-table row below the job's threshold */
.confchip{display:inline-block;margin-left:6px;font-size:11px;font-weight:700;padding:1px 5px;
    border-radius:var(--r-pill);background:var(--yel-lt);color:var(--warn);vertical-align:middle}
/* the caveat, stated on screen rather than in a title= nobody can reach */
#conf{display:none;flex:0 0 auto;padding:9px 12px;background:var(--bg-1);
    border-top:1px solid var(--border-1);border-left:3px solid var(--warn);font-size:11px;
    line-height:1.55;color:var(--text-2)}
#conf.on{display:block}
#conf b{color:var(--text-1);font-variant-numeric:tabular-nums}
#conf .hd{display:flex;align-items:baseline;gap:8px;margin-bottom:4px}
#conf .v{font-size:15px;font-weight:700;color:var(--warn);font-variant-numeric:tabular-nums}
#conf .lb{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
    color:var(--text-3-sm)}

/* line-list reference popup */
#lldlg{position:fixed;inset:4% 8%;background:var(--bg-1);border:1px solid var(--border-1);
    border-radius:var(--r-sm);padding:12px;overflow:auto;display:none;z-index:21;box-shadow:var(--sh-xl)}
#lldlg .bar{display:flex;gap:6px;align-items:center;position:sticky;top:0;z-index:1;
    background:var(--bg-1);padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid var(--border-1)}
#llimg{width:100%;background:var(--m100)}

/* ---------- JOB SETTINGS + KEYBOARD dialogs ----------
   Every job-specific value a reviewer legitimately changes is set here, not in the source. The
   line-list page is the worked example: it used to be a descriptor edit, now it is a field. */
#jobdlg,#keysdlg{position:fixed;background:var(--bg-1);border:1px solid var(--border-1);
  border-radius:var(--r-sm);padding:18px;overflow:auto;display:none;z-index:22;
  box-shadow:var(--sh-xl)}
#jobdlg{inset:8% 28%;min-width:380px}
#keysdlg{inset:14% 34%;min-width:320px}
@media (max-width:1100px){#jobdlg{inset:6% 8%}#keysdlg{inset:8% 12%}}
#jobdlg .bar,#keysdlg .bar,#lldlg .bar{display:flex;gap:6px;align-items:center;position:sticky;
  top:0;z-index:1;background:var(--bg-1);padding-bottom:9px;margin-bottom:6px;
  border-bottom:1px solid var(--border-1)}
#jobdlg .hint{font-size:11px;color:var(--text-3-sm);line-height:1.55;margin:0 0 14px;max-width:62ch}
.fld{display:block;margin-bottom:13px}
.fld>span{display:block;font-size:11px;font-weight:600;color:var(--text-2);margin-bottom:4px}
.fld>em{display:block;font-size:11px;color:var(--text-3-sm);font-style:normal;margin-top:4px;
  line-height:1.5}
.fld.chk{display:flex;align-items:center;gap:8px}
.fld.chk input{width:auto}
.fld.chk>span{margin:0;font-weight:500}
.warnbox{font-size:11px;color:var(--warn);background:var(--yel-lt);padding:8px 10px;
  line-height:1.5;margin:0 0 14px}
.dpath{font-size:11px;color:var(--text-3-sm);margin:4px 0 0;font-variant-numeric:tabular-nums}
table.keys{border-collapse:collapse;font-size:12px;width:100%}
table.keys th{text-align:left;font-weight:700;padding:5px 12px 5px 0;color:var(--text-1);
  white-space:nowrap;width:1%;font-variant-numeric:tabular-nums}
table.keys td{padding:5px 0;color:var(--text-2);border-bottom:1px solid var(--border-1)}
table.keys tr:last-child td{border-bottom:none}

/* =================================================================================================
   KEWAZO slide design language (design/design_1.md) applied to the app, 11-Sep-2026.
   Section bands F5F7FB with UPPERCASE bold labels · hairlines D7DEE6 · square corners everywhere ·
   teal at most twice per view (the headline figure and the one primary button).            */
header{gap:10px}
header .hname{color:var(--text-3-sm);font-size:13px;font-weight:500}
#jobsel{width:auto;max-width:320px;font-weight:600;color:var(--text-1);padding:6px 8px}
details.more{position:relative}
details.more summary{list-style:none;cursor:pointer;border:1px solid var(--border-1);padding:7px 12px;
  font-size:12px;font-weight:500;color:var(--text-1);background:var(--bg-1);user-select:none}
details.more summary::-webkit-details-marker{display:none}
details.more summary:hover{border-color:var(--act);color:var(--act-hov)}
details.more .menu{position:absolute;right:0;top:calc(100% + 4px);z-index:30;background:var(--bg-1);
  border:1px solid var(--border-1);box-shadow:var(--sh-md);display:flex;flex-direction:column;min-width:220px}
details.more .menu button{border:none;border-bottom:1px solid var(--border-1);text-align:left;padding:10px 14px}
details.more .menu button:last-child{border-bottom:none}
/* section bands */
.band{display:flex;align-items:center;gap:10px;padding:0 14px;height:34px;flex:0 0 auto;
  background:var(--bg-2);border-top:1px solid var(--border-1);border-bottom:1px solid var(--border-1);
  font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-1);
  cursor:pointer;user-select:none}
.band .bandr{margin-left:auto;font-weight:500;letter-spacing:0;text-transform:none;color:var(--text-3-sm);
  font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:60%}
#acc{border-bottom:none}
#acc.tight{cursor:default}
#acc .hintx{display:none}
/* the column totals are part of the expanded RESULT, never a separate strip */
#acc.tight ~ #totals{display:none}
#totals{border-top:1px solid var(--border-1)}
/* LINES panel — the navigation */
#lines{flex:0 1 auto;max-height:26vh;overflow:auto;background:var(--bg-1);border-bottom:1px solid var(--border-1)}
#lines.closed{display:none}
#lines .lgrp{position:static}
.lrow{padding:7px 14px;gap:10px}
.lrow .st{width:8px;height:8px;flex:0 0 8px;padding:0;border-radius:0;display:inline-block;align-self:center}
.lrow .st.look{background:var(--bad)} .lrow .st.rule{background:var(--yel)} .lrow .st.scope{background:var(--d400)}
.lrow .st.clean{background:var(--t400)}
.lrow .id{min-width:120px;font-size:12px}
.lrow.fin .id,.lrow.fin .wh{color:var(--text-3-sm)}
.lrow.on{background:var(--t100);box-shadow:inset 3px 0 0 var(--act2)}
/* THIS LINE */
#linebar{background:var(--bg-1);padding:9px 14px}
#linebar .lid{font-size:14px}
#linetbl{max-height:26vh}
#chips{padding:8px 14px}
.chip{border-radius:0}
.badge,.val,.xlr,#dwgtag.mini,.mk .tag,.confchip{border-radius:0}
/* jobs dialog */
#jobsdlg{position:fixed;inset:10% 14%;background:var(--bg-1);border:1px solid var(--border-1);padding:18px;
  overflow:auto;display:none;z-index:22;box-shadow:var(--sh-xl)}
#jobsdlg .bar,#rules .bar{display:flex;gap:6px;align-items:center;position:sticky;top:0;z-index:1;
  background:var(--bg-1);padding-bottom:9px;margin-bottom:6px;border-bottom:1px solid var(--border-1)}
#jobsdlg .hint,#rules .hint{font-size:11px;color:var(--text-3-sm);line-height:1.55;margin:0 0 14px;max-width:70ch}
#jobsdlg code{font-size:11px;background:var(--bg-2);padding:1px 4px}
table.jobs{border-collapse:collapse;width:100%;font-size:12px;font-variant-numeric:tabular-nums}
table.jobs th{text-align:left;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3-sm);
  font-weight:600;padding:6px 10px 6px 0;border-bottom:1px solid var(--text-1)}
table.jobs td{padding:10px 10px 10px 0;border-bottom:1px solid var(--border-1);vertical-align:top}
table.jobs th.c,table.jobs td.c{text-align:right}
table.jobs tr[role=button]{cursor:pointer}
table.jobs tr[role=button]:hover td{background:var(--bg-2)}
table.jobs tr.cur td{background:var(--t100)}
table.jobs td .sub{font-size:11px;color:var(--text-3-sm);margin-top:2px}
table.jobs td.ok{color:var(--ok-ink);font-weight:600}
table.jobs .tag{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ok-ink)}
table.jobs .go{color:var(--text-2);font-weight:600}
table.jobs tr.err td{color:var(--bad-ink);font-size:11px}
#rules{inset:8% 16%}

/* ---------- SELECTED CELL panel (under the drawing) + table-as-queue ---------- */
#cellpanel{flex:0 0 auto;border-top:1px solid var(--border-1);background:var(--bg-1);padding:10px 14px 8px}
#cellpanel[hidden]{display:none}
.cp-head{display:flex;align-items:baseline;gap:10px;margin-bottom:6px}
#cp-id{font-weight:700;font-size:13px}
#cp-xl{font-size:11px;font-variant-numeric:tabular-nums}
.cp-body{display:flex;gap:16px;align-items:flex-start;margin-bottom:8px}
.cp-vals{display:flex;gap:8px;flex:0 0 auto}
.cp-why{flex:1;font-size:11.5px;color:var(--text-2);line-height:1.5;min-width:0}
.cp-why .flagtxt{margin-top:6px;max-height:9em}
button.lnk{border:none;background:none;padding:0 0 0 6px;color:var(--act-hov);font-size:11px;cursor:pointer;text-decoration:underline}
#cellpanel #act{border-top:none;padding:0}
#cellpanel #act .row{margin-bottom:6px}
#cellpanel.ro #act{display:none}
body.line-mode #chips,body.line-mode #prog,body.line-mode #queue{display:none}
body.line-mode #linetbl{max-height:none;flex:1 1 auto}
#linetbl td.done{opacity:.55}
#linetbl td.done .a::after{content:' ✓';color:var(--ok-ink);font-weight:700}
#linetbl td.done.correct .a::after{content:' ✎';color:var(--bad-ink)}
#linetbl td.done.turner_error .a::after{content:' ✓';color:var(--warn)}
#linetbl td.done.rule_question .a::after{content:' ?';color:var(--warn)}

/* =================================================================================================
   CLASSIC-MODERN MINIMAL (11-Sep-2026, later). For a reviewer who lives in Excel: gridlines, one
   accent, dark primary buttons (design_1.md §6.2), text labels instead of glyphs, neutral selection. */
header{height:56px;flex:0 0 56px;gap:12px;padding:0 18px}
header img.logo{height:16px;width:auto;display:block;margin-right:4px}
header .hname{border-left:1px solid var(--border-1);padding-left:12px;color:var(--text-2);font-weight:500}
.hlbl{font-size:10.5px;color:var(--text-3-sm);text-transform:uppercase;letter-spacing:.07em;font-weight:600}
button{border:1px solid var(--d400);color:var(--d900);background:#fff;padding:6px 12px;font-weight:500}
button:hover{border-color:var(--d900);color:var(--d900);background:var(--d100)}
button:disabled{opacity:.4;cursor:default}
button.primary{background:var(--d900);border-color:var(--d900);color:#fff;font-weight:600}
button.primary:hover{background:var(--d800);border-color:var(--d800);color:#fff}
details.more summary{border-color:var(--d400)}
.shtab{border-color:var(--d400);color:var(--d900)} .shtab:hover{border-color:var(--d900);color:var(--d900);background:var(--d100)}
.shtab.on{background:var(--d900);border-color:var(--d900);color:#fff}
.chip{border-color:var(--d400);color:var(--d900)} .chip:hover{border-color:var(--d900)}
#linetbl table{border-collapse:collapse}
#linetbl th,#linetbl td{border:1px solid var(--border-1);padding:5px 8px;font-size:12px}
#linetbl thead th{background:var(--d100);color:var(--text-2);font-weight:600;letter-spacing:.04em}
#linetbl th.rh{background:#fff}
#linetbl tr.on td{background:var(--d100)} #linetbl tr.on th.rh{color:var(--d900);background:var(--d100)}
#linetbl td.d{background:var(--red-bg)} #linetbl td.only{background:var(--yel-lt)}
#linetbl td.sel,#linetbl td.d:hover,#linetbl td.only:hover{outline:2px solid var(--d900);outline-offset:-2px}
#linetbl td.eq[onclick]:hover{outline:1px solid var(--d900);outline-offset:-1px}
#tbllegend{font-size:11px;color:var(--text-3-sm);padding:6px 14px;border-bottom:1px solid var(--border-1);background:#fff;line-height:1.5;flex:0 0 auto}
#tbllegend .lg{padding:0 4px;font-weight:600} #tbllegend .lg.m{color:var(--text-3-sm)} #tbllegend .lg.d{background:var(--red-bg);color:var(--bad-ink)} #tbllegend .lg.y{background:var(--yel-lt);color:var(--warn)}
body.line-mode #linetbl{flex:1 1 auto}
.lrow.lhead{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-3-sm);font-weight:600;cursor:default;background:var(--d100);border-top:none;padding:6px 14px}
.lrow.lhead:hover{background:var(--d100)}
.lrow .id{font-weight:600}
.lrow.on{background:var(--d100);box-shadow:inset 3px 0 0 var(--d900)}
.lrow .dn{color:var(--text-2)} .lrow.fin .dn{color:var(--ok-ink);font-weight:600}
.val.a{background:var(--d100);color:var(--d900);border:1px solid var(--d400)}
.val.m{background:#fff;color:var(--text-2);border:1px solid var(--d400)}
.confchip{background:var(--d100);color:var(--text-2);font-weight:600;font-size:10.5px}
.confchip.lo{background:var(--warn-bg);color:var(--warn)}
#accval{color:var(--t600)}
#accfill{background:var(--t600)}
.band{background:#fff;border-top:none}
.band .bandr{color:var(--text-2)}
#dwgtag.mini{background:var(--d900);border-color:var(--d900)}
#mkbar .step{padding:3px 10px}

/* rejected rows — the validator refused these, so they are absent from the ledger entirely */
/* Same shape as #jobdlg / #keysdlg: openDlg() sets display:block inline, so this must be a
   plain block dialog rather than a flex one that a class toggles. */
#faildlg,#excldlg{position:fixed;inset:6% 12%;min-width:380px;background:var(--bg-1);
  border:1px solid var(--border-1);border-radius:var(--r-sm);padding:18px;overflow:auto;
  display:none;z-index:22;box-shadow:var(--sh-xl)}
@media (max-width:1100px){#faildlg,#excldlg{inset:5% 6%}}
#faildlg .bar,#excldlg .bar{display:flex;gap:6px;align-items:center;position:sticky;top:0;z-index:1;
  background:var(--bg-1);padding-bottom:9px;margin-bottom:6px;border-bottom:1px solid var(--border-1)}
#faildlg .hint,#excldlg .hint{font-size:11px;color:var(--text-3-sm);line-height:1.55;margin:0 0 14px;max-width:74ch}
#failbody{padding:0}
.failgrp{border:1px solid var(--border-1);border-left:3px solid var(--red);margin-bottom:14px}
.failwhy{padding:10px 12px 4px;font-size:12.5px;line-height:1.5}
.failpages{padding:0 12px 10px;color:var(--text-3);font-size:11.5px;
           border-bottom:1px solid var(--border-2)}
.failrow{padding:10px 12px;border-bottom:1px solid var(--border-2)}
.failrow:last-child{border-bottom:none}
.failhdr{display:flex;align-items:center;gap:10px;font-weight:600;font-size:12.5px;margin-bottom:6px}
.failhdr button{padding:3px 8px;font-size:11px}
.exclgrp{border-left-color:var(--border-1)}
.exclrow.back{background:var(--bg-2)}
.exclrow .tag{font-weight:500;font-size:11px;color:var(--text-3)}
.kvs{display:flex;flex-wrap:wrap;gap:5px}
.kv{background:var(--bg-2);border:1px solid var(--border-2);padding:2px 7px;font-size:11px}
.kv i{font-style:normal;color:var(--text-3);margin-right:5px}
.failflags{margin-top:8px;font-size:11.5px;color:var(--text-2);line-height:1.55}
.failflags summary{cursor:pointer;color:var(--act-hov);font-size:11px}
button.warnbtn{border-color:var(--red);color:var(--red)}
button.warnbtn:hover{background:var(--bg-err);border-color:var(--red);color:var(--red)}

/* export dialog — same block shape as #jobdlg, since openDlg sets display:block inline */
#expdlg{position:fixed;inset:10% 24%;min-width:420px;background:var(--bg-1);
  border:1px solid var(--border-1);border-radius:var(--r-sm);padding:18px;overflow:auto;
  display:none;z-index:22;box-shadow:var(--sh-xl)}
@media (max-width:1100px){#expdlg{inset:6% 8%}}
#expdlg .bar{display:flex;gap:6px;align-items:center;position:sticky;top:0;z-index:1;
  background:var(--bg-1);padding-bottom:9px;margin-bottom:6px;border-bottom:1px solid var(--border-1)}
#expdlg .hint{font-size:11px;color:var(--text-3-sm);line-height:1.55;margin:0 0 14px;max-width:66ch}
/* Where the export has got to. A named step that lights up beats a spinner: the wait is a
   minute and the reader wants to know it is the workbook, not the network. */
.expsteps{margin:0 0 10px}
.expstep{display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--text-3-sm);
         padding:4px 0}
.expstep .dot{width:8px;height:8px;flex:0 0 8px;border:1px solid var(--border-1);
              background:var(--bg-1);border-radius:var(--r-pill)}
.expstep.done{color:var(--text-2)}
.expstep.done .dot{background:var(--ok);border-color:var(--ok)}
.expstep.now{color:var(--text-1);font-weight:600}
.expstep.now .dot{background:var(--act);border-color:var(--act);
                  animation:exppulse 1.1s ease-in-out infinite}
@keyframes exppulse{0%,100%{box-shadow:0 0 0 0 var(--t300)}50%{box-shadow:0 0 0 4px var(--t200)}}
@media (prefers-reduced-motion:reduce){.expstep.now .dot{animation:none}}
.expline{font-size:12.5px;color:var(--text-2);margin:0 0 10px}
.expwarn{font-size:12px;background:var(--bg-err);border-left:3px solid var(--red);
         padding:9px 11px;margin:0 0 0;line-height:1.55}
/* The builder's refusal, verbatim: one line per offending row, so it must not be reflowed into
   a paragraph or clipped. Scrolls rather than stretching the dialog when many rows offend. */
.expwhy{font-size:11.5px;background:var(--bg-err);border-left:3px solid var(--red);
        padding:0 11px 9px;margin:0 0 12px;line-height:1.5;white-space:pre-wrap;
        overflow-x:auto;font-family:ui-monospace,Menlo,monospace;color:var(--text-2)}
.exprow{display:flex;align-items:center;gap:12px;justify-content:space-between;
        border:1px solid var(--border-1);padding:10px 12px;margin-bottom:8px}
.expname{font-weight:600;font-size:13px}
.expmeta{color:var(--text-3);font-size:11px;margin-top:2px;font-family:ui-monospace,Menlo,monospace}
.btnlike{background:var(--d900);border:1px solid var(--d900);color:#fff;font-weight:600;
         padding:6px 13px;font-size:12px;text-decoration:none;white-space:nowrap;
         border-radius:var(--r-sm)}
.btnlike:hover{background:var(--d800);border-color:var(--d800);color:#fff}
/* A superseded artefact stays downloadable — it is the user's own data — but it must not read as
   the current deliverable. Muted row, named tag, and a button that no longer looks like the
   primary action next to a fresh one. */
.exprow.stale{border-style:dashed;opacity:.72}
.staletag{font-weight:600;font-size:10px;letter-spacing:.04em;text-transform:uppercase;
          color:var(--red);border:1px solid var(--red);border-radius:var(--r-sm);
          padding:1px 5px;margin-left:6px;vertical-align:1px}
.btnlike.ghost{background:transparent;color:var(--text-2);border-color:var(--border-1);
               font-weight:500}
.btnlike.ghost:hover{background:var(--bg-2);color:var(--text-1)}

/* Jobs | Review — the same two tabs in both pages' headers (28 Sep 2026). */
header .tabs{display:flex;align-self:stretch;margin-left:8px}
header .tabs a{display:flex;align-items:center;padding:0 12px;color:var(--text-2);text-decoration:none;
  font-weight:600;font-size:13px;border-bottom:2px solid transparent}
header .tabs a.on{color:var(--text-1);border-bottom-color:var(--d900)}
header .tabs a:hover{color:var(--text-1)}
/* a job that is still running, shown above the review so partial results are not mistaken for final */
#runbar{display:flex;align-items:center;gap:12px;padding:7px 18px;background:var(--t100);
  border-bottom:1px solid var(--border-1);font-size:12px;flex:0 0 auto}
#runbar[hidden]{display:none}
#runbar .bar{flex:0 1 240px;height:4px;background:var(--bg-3)}
#runbar .bar>i{display:block;height:100%;background:var(--t600)}

/* ---- AI-only review (no manual takeoff): one number per cell, flagged rows shaded ---- */
#linetbl table.ai td[onclick]{cursor:pointer}
#linetbl table.ai td[onclick]:hover,#linetbl table.ai td.sel{outline:2px solid var(--d900);outline-offset:-2px}
#linetbl table.ai td.lc{background:var(--yel-lt)}
#linetbl table.ai td.bomx{background:var(--red-bg);color:var(--bad-ink);font-weight:700}
#linetbl table.ai tr.look th.rh{cursor:pointer;box-shadow:inset 3px 0 0 var(--warn)}
#linetbl table.ai tr.look.bom th.rh{box-shadow:inset 3px 0 0 var(--red)}
.confchip.bom{background:var(--red-bg);color:var(--bad-ink)}
#linetbl table.ai tr.ok th.rh{box-shadow:inset 3px 0 0 var(--ok)}
.confchip.ok{background:var(--ok-bg);color:var(--ok-ink)}
/* the row's numbers, editable in place for Save correction */
#editors .ed{display:inline-flex;flex-direction:column;gap:2px;margin:0 8px 6px 0;font-size:11px;color:var(--text-2)}
#editors .ed input{width:72px;font-variant-numeric:tabular-nums}
#editors .ed.hot span{color:var(--bad-ink);font-weight:700}
#linetbl table.ai td.fixed{font-weight:700;text-decoration:underline dotted;color:var(--ok-ink)}

/* Rule proposals dialog: what was sent, and what Kewazo did with it */
#rules .notebox{display:flex;gap:8px;align-items:flex-end;margin:0 0 14px}
#rules .notebox textarea{flex:1;font:inherit;font-size:13px;padding:6px 8px;border:1px solid var(--border-1);background:var(--bg-1);color:var(--text-1);resize:vertical}
#rules .propi{border-left:3px solid var(--border-2);padding:6px 10px;margin-bottom:8px;font-size:12.5px}
#rules .propi.added{border-left-color:var(--t500)}
#rules .propi .pwhy{margin:3px 0;white-space:pre-wrap}
#rules .pstat{font-size:10.5px;padding:1px 7px;border-radius:var(--r-pill);font-weight:600;background:var(--bg-2);color:var(--text-2);margin-right:4px}
#rules .pstat.added{background:var(--ok-bg);color:var(--t700)}
@media (max-width:640px){#rules .notebox{flex-direction:column;align-items:stretch}}
html:not(.operator) .oponly{display:none !important}

/* The proposal being reviewed, when the review was opened from the proposals inbox */
#propbar{display:flex;gap:16px;align-items:flex-start;padding:10px 18px;background:var(--yel-lt);
  border-bottom:1px solid var(--warn);font-size:12.5px;flex:0 0 auto}
#propbar[hidden]{display:none}
#propbar .pb-main{flex:1;min-width:0}
#propbar .pb-kind{font-weight:700;color:var(--warn);margin-right:8px;text-transform:uppercase;font-size:11px;letter-spacing:.05em}
#propbar .pb-why{font-size:14px;color:var(--text-1);margin:4px 0 2px;white-space:pre-wrap}
#propbar .pb-acts{display:flex;gap:6px;align-items:center;flex:0 0 auto}
@media (max-width:640px){#propbar{flex-direction:column}}
/* review feedback: the row being reviewed, and a pulse on the one just confirmed / corrected */
#linetbl tr.cur th.rh{box-shadow:inset 4px 0 0 var(--act2);color:var(--act2)}
#linetbl tr.cur td{background:var(--t100);box-shadow:inset 0 2px 0 var(--act2),inset 0 -2px 0 var(--act2)}
@keyframes rowok{0%{background:var(--ok-bg,#d7f2df)}100%{background:transparent}}
@keyframes rowfix{0%{background:var(--bad-bg)}100%{background:transparent}}
#linetbl tr.just td,#linetbl tr.just th.rh{animation:rowok 1.6s ease-out}
#linetbl tr.just-fix td,#linetbl tr.just-fix th.rh{animation:rowfix 1.6s ease-out}
/* lit in the item type's colour, the same one it is boxed in on the drawing */
#linetbl td.sel{outline:3px solid var(--c,var(--act2));outline-offset:-3px;font-weight:700;
  background:color-mix(in srgb,var(--c,var(--act2)) 18%,transparent)}
