@import url('https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=DM+Sans:wght@400;500;700&display=swap');
:root{
  --brown:#a5753d; --brown-deep:#6f4a24; --brown-tint:#f4ece0;   /* oak / barrel accent */
  --ink:#241c12; --mut:#6b6152; --line:#e2dccf; --bg:#f4f1ea; --card:#fff;
  --amber:#b7791f; --amber-bg:#fdf3df; --red:#b03a2e; --red-bg:#fdecea;
  --side:#2a2016; --acc:var(--brown); --ok:var(--brown-deep); --warn:var(--amber);
}
*{box-sizing:border-box}
body{margin:0;font-family:'DM Sans',-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.45;background:var(--bg);color:var(--ink);display:flex;min-height:100vh}
body.plain{display:block}
body.plain main{max-width:460px;margin:0 auto;padding:26px 18px}

/* ---------- sidebar ---------- */
.side{width:230px;flex:none;background:var(--side);color:#ded2c0;display:flex;flex-direction:column;padding:14px 10px;position:sticky;top:0;height:100vh;overflow-y:auto}
.brand{display:flex;align-items:center;gap:10px;padding:6px 10px 16px;text-decoration:none}
.brand .mark{width:34px;height:34px;border-radius:9px;background:var(--brown);color:#fff;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;flex:none}
.brand .logo{width:44px;height:44px;flex:none}
.brand .word{font-family:'DM Serif Display',serif;font-size:17px;color:#fff;line-height:1.05}
.brand .word span{color:#d9b47f}
.snav{display:flex;flex-direction:column;gap:2px;margin-top:6px}
.snav a{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;color:#ded2c0;text-decoration:none;font-weight:500;font-size:13.5px}
.snav a .ic{width:18px;text-align:center;opacity:.85;font-size:15px}
.snav a .cnt{margin-left:auto;background:rgba(217,180,127,.2);color:#ecdcc0;border-radius:999px;font-size:11px;font-weight:700;padding:0 7px;min-width:19px;text-align:center}
.snav a.active{background:rgba(217,180,127,.16);color:#fff;box-shadow:inset 3px 0 0 var(--brown)}
.snav a.flag{color:#ffd7d1}
.snav a.flag .cnt{background:var(--red);color:#fff}
.snav a:hover{background:rgba(255,255,255,.06)}
.side .foot{margin-top:auto;padding:12px 10px 4px;display:flex;align-items:center;gap:10px;border-top:1px solid rgba(255,255,255,.08)}
.side .foot .dot{width:28px;height:28px;border-radius:50%;background:var(--brown);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:12px;flex:none}
.side .foot .who{font-size:12.5px;color:#eee5d6;line-height:1.25}
.side .foot small{color:#b0a48f;display:block;font-size:11px}
.side .foot a{color:#b0a48f;text-decoration:none;font-size:11px}
.side .foot a:hover{color:#fff}

/* ---------- main + topbar ---------- */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.top{display:flex;align-items:center;gap:14px;background:#fff;border-bottom:1px solid var(--line);padding:10px 20px;position:sticky;top:0;z-index:6}
.top .search{flex:1;max-width:480px;margin:0}
.top .search input{margin:0;padding:8px 12px 8px 32px;border-radius:9px;background:var(--bg);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%235a6b7b' stroke-width='2'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:10px center}
.top .grow{flex:1}
.top .who{font-size:13px;color:var(--mut)}
.top .logout{color:var(--mut);text-decoration:none;font-size:13px}
.top .logout:hover{color:var(--ink)}
.top .av{width:30px;height:30px;border-radius:50%;background:var(--brown-deep);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:12px;flex:none}
.stationsw{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:var(--mut)}
.stationsw>span{font-weight:600}
.stationsw select{width:auto;margin:0;padding:6px 10px;border-radius:9px;border:1px solid var(--line);background:var(--bg);font:inherit;font-size:13px;font-weight:600;color:var(--ink);cursor:pointer}
@media(max-width:720px){.stationsw>span{display:none}}

/* ---------- page ---------- */
main{display:block;padding:22px 26px;min-width:0;flex:1}
.bar{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.bar h2{margin-right:auto}
h1,h2{font-family:'DM Serif Display',serif;font-weight:400;margin:.1em 0}
h2{font-size:26px} h1{font-size:24px}
h3{font-size:16px;font-weight:700;margin:16px 0 6px}
.muted{color:var(--mut)} .small{font-size:12px} .grow{flex:1} .row{display:flex;gap:10px}
.err{color:var(--red)}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:7px;background:#fff;border:1px solid var(--line);color:var(--ink);padding:8px 14px;border-radius:9px;cursor:pointer;font:inherit;font-weight:500;font-size:13px;text-decoration:none;line-height:1.2}
.btn:hover{border-color:#b9c2cb;background:#fbfcfd}
.btn.acc{background:var(--brown);border-color:var(--brown);color:#fff;font-weight:700}
.btn.acc:hover{background:var(--brown-deep);border-color:var(--brown-deep)}

/* ---------- cards / forms ---------- */
.card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px}
.card.narrow{max-width:400px;margin:56px auto}
label{display:block;margin:9px 0;font-size:12px;color:var(--mut)}
/* Field styling is for things you TYPE IN. It used to say `input,textarea,select`, which also
   caught radios, check boxes and file pickers and stretched each to 100% width - that broke the
   camera buttons, the verdict pills and the hidden verdict inputs on three separate occasions.
   List the types deliberately; a bare <input> defaults to text, hence :not([type]). */
input:not([type]),
input[type=text],input[type=email],input[type=password],input[type=number],input[type=search],
input[type=tel],input[type=url],input[type=date],input[type=month],input[type=week],
input[type=time],input[type=datetime-local],input[type=file],
textarea,select{display:block;width:100%;margin-top:3px;padding:8px 11px;border:1px solid var(--line);border-radius:9px;font:inherit;color:var(--ink);background:#fff}
textarea{resize:vertical}
/* The rule above is an AUTHOR style, so it beats the browser's built-in [hidden]{display:none} and
   a hidden input renders anyway - stretched to width:100%. Bite us once: the camera buttons wrap a
   hidden file input, which appeared as a white box squashing the icon. Put hidden back. */
input[hidden],textarea[hidden],select[hidden]{display:none}
/* Tick boxes are inline widgets and now fall outside the field rule entirely; this only keeps
   them predictable inside the flex labels they sit in. */
input[type=checkbox],input[type=radio]{margin:0;flex:none}
input:not([type=checkbox]):not([type=radio]):focus,textarea:focus,select:focus{outline:none;border-color:var(--brown);box-shadow:0 0 0 3px var(--brown-tint)}
.qty{width:90px}

/* ---------- tables (spaced row bars) ---------- */
table{width:100%;border-collapse:separate;border-spacing:0 5px;background:transparent}
th{text-align:left;padding:2px 14px 6px;font-size:11.5px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:700}
td{text-align:left;padding:11px 14px;font-size:13px;vertical-align:middle;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
tbody tr{background:#fff}
tbody tr td:first-child{border-left:1px solid var(--line);border-radius:9px 0 0 9px}
tbody tr td:last-child{border-right:1px solid var(--line);border-radius:0 9px 9px 0}
tbody tr:hover td{background:rgba(0,0,0,.04)}
tr.paper td:first-child{box-shadow:inset 4px 0 0 var(--paper,transparent)}
.station-sep{border:0;border-top:1px solid #e9e6de;margin:14px 0 2px}
table.floor td:last-child .btn{min-width:150px;justify-content:center}
td a{color:var(--brown-deep);text-decoration:none;font-weight:500}
td a:hover{text-decoration:underline}

/* ---------- pills / badges ---------- */
.pill{display:inline-block;padding:3px 9px;border-radius:999px;font-size:11.5px;font-weight:700}
.pill.ok{background:var(--brown-tint);color:var(--brown-deep)}
.pill.warn{background:var(--amber-bg);color:var(--amber)}
.pill.bad{background:var(--red-bg);color:var(--red)}
.flash{background:var(--brown-tint);border:1px solid #e3d3b8;color:var(--brown-deep);padding:10px 13px;border-radius:9px;margin-bottom:14px}

/* ---------- KPI cards + saved-view tabs ---------- */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:12px;padding:13px 16px;text-decoration:none;color:var(--ink);display:block}
a.kpi:hover{border-color:var(--brown)}
.kpi .n{font-size:22px;font-weight:400;font-family:'DM Serif Display',serif}
.kpi .n.warn{color:var(--amber)} .kpi .n.g{color:var(--brown-deep)}
.kpi label{font-size:12px;color:var(--mut);margin:2px 0 0;display:block}
.tabs{display:flex;gap:2px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin-bottom:14px}
.tabs a{padding:9px 14px;font-weight:500;color:var(--mut);text-decoration:none;font-size:13px;border-radius:9px 9px 0 0}
.tabs a:hover{color:var(--ink)}
.tabs a.on{color:var(--ink);font-weight:700;box-shadow:inset 0 -2px 0 var(--brown)}
.tabs a .cnt{color:var(--mut);font-weight:700;font-size:11px;margin-left:3px}
@media(max-width:820px){.kpis{grid-template-columns:repeat(2,1fr)}}

/* ---------- production stage badges (Floor + Ship axis) ---------- */
.stage{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:700;margin-right:6px;white-space:nowrap}
.stage.s-pre{background:#eceff2;color:#5a6b7b}
.stage.s-production{background:#fdebd0;color:#a04000}
.stage.s-assembly{background:#efe6f5;color:#6b4a8a}
.stage.s-finishing{background:var(--amber-bg);color:var(--amber)}
.stage.s-ready{background:var(--brown-tint);color:var(--brown-deep)}
.stage.s-staging{background:#e6eef4;color:#1a5276}
.stage.s-packing{background:#e6eef4;color:#1a5276}
.stage.s-shipping{background:#dff0f4;color:#1c6a80}
.stage.s-shipped{background:#e8ece9;color:#4a5a50}
.stage.s-scrap{background:var(--red-bg);color:var(--red)}

/* ---------- app-specific (preserved) ---------- */
.spacer{flex:1}
.split{display:flex;gap:16px;align-items:stretch;height:calc(100vh - 150px)}
.pane{flex:1;min-width:0;background:#fff;border:1px solid var(--line);border-radius:12px;padding:0}
.pane.scroll{padding:16px;overflow:auto}
.pane iframe{width:100%;height:100%;border:0;border-radius:12px}
.split-narrow{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-start}
.split-narrow .narrow{flex:1;min-width:240px;max-width:340px}
.li{border:1px solid var(--line);border-radius:10px;padding:10px;margin:8px 0;background:#fafbfc}
.route{margin:4px 0 2px} .route-roll{margin:6px 0 10px;font-size:13px}
.resolve{padding:5px 9px;border-radius:7px;font-size:13px;margin:6px 0;font-weight:600}
.resolve.ok{background:var(--brown-tint);color:var(--brown-deep)}
.resolve.warn{background:var(--amber-bg);color:var(--amber)}
.resolve.err{background:var(--red-bg);color:var(--red)}
.deco{display:inline-block;padding:2px 8px;border-radius:6px;font-size:12px;font-weight:600;letter-spacing:.03em;margin-right:4px}
.deco.burn{background:#fdebd0;color:#a04000}
.deco.print{background:#e3f0fb;color:#1a5276}
.deco.either{background:#f0eef5;color:#5b4a8a}
.deco.none{background:#f2f3f4;color:#888}
.deco.pack{background:#dff0f4;color:#1c6a80}
.deco.dtg{background:#efe7fb;color:#5b2d8e}
.dtg-names{font-size:15px;font-weight:700;margin:2px 0}
.dtg-thumb{max-width:160px;max-height:160px;border:1px solid #ccc;border-radius:4px;display:block;margin:4px 0;background:#fff}
.gold{font-family:'DM Sans',sans-serif;font-size:18px;font-weight:600;white-space:pre-wrap;background:#fffdf5;border:1px solid #efe6c0;border-radius:9px;padding:11px;margin-top:4px}
.navflag{color:var(--red);font-weight:700}
.linkbtn{background:none;border:0;color:var(--red);cursor:pointer;font:inherit;padding:0;text-decoration:underline}
.prio{display:inline-block;font-size:10px;font-weight:700;padding:1px 6px;border-radius:999px;color:#fff;vertical-align:middle}
.prio.rush{background:var(--red)}
.prio.amazon{background:#e67e22}
.prio.back{background:#8e24aa}
.dtg-next .opencue.back{color:#8e24aa}
.due-over{color:var(--red);font-weight:700}
.due-soon{color:var(--amber);font-weight:600}
span.paper{display:inline-block;padding:1px 8px;border-radius:8px;font-size:11px;font-weight:600;border:1px solid rgba(0,0,0,.28);vertical-align:middle}
.ref{margin:0;width:120px}
.ref img{width:100%;border-radius:7px;display:block}
.zoom{cursor:zoom-in}

/* ---------- lightbox ---------- */
#lb{display:none;position:fixed;inset:0;background:rgba(0,0,0,.85);align-items:center;justify-content:center;z-index:1000;cursor:zoom-out}
#lb img{max-width:92vw;max-height:92vh;border-radius:8px}

/* ---------- responsive ---------- */
@media(max-width:820px){
  body{flex-direction:column}
  .side{width:100%;height:auto;position:static;flex-direction:row;flex-wrap:wrap;align-items:center;padding:8px}
  .brand{padding:6px 10px}
  .snav{flex-direction:row;flex-wrap:wrap;margin-top:0}
  .snav a .cnt{margin-left:5px}
  .side .foot{margin:0 0 0 auto;border-top:0;padding:4px 10px}
  .split{height:auto;flex-direction:column}
}

/* ---------- nav section headings + responsive sidebar (ux-naming-nav, 2026-09-08) ---------- */
.snav .grp{font-size:10.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#9a8b73;padding:14px 12px 5px}
.snav .grp:first-child{padding-top:4px}
.btn.sm{padding:6px 11px;font-size:12.5px}
.navtoggle{display:none;background:none;border:0;color:var(--ink);font-size:22px;line-height:1;cursor:pointer;padding:4px 8px;margin:0}
@media (max-width:820px){
  .side{position:fixed;left:0;top:0;z-index:30;transform:translateX(-100%);transition:transform .18s ease;box-shadow:2px 0 18px rgba(0,0,0,.25)}
  body.nav-open .side{transform:translateX(0)}
  body.nav-open .navscrim{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:20}
  .navtoggle{display:inline-block}
}
.btn.ship{background:var(--red-bg);border-color:var(--red);color:var(--red);font-weight:700}
.btn.ship:hover{background:var(--red);color:#fff}

/* ---------- DTG station: grouped-by-order cards (2026-09-08) ---------- */
.dtg-grid{display:flex;flex-direction:column;gap:14px}
.dtg-order{padding:14px 16px;margin:0}
.dtg-head{font-size:15px;margin-bottom:10px}
.dtg-pieces{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:6px}
@media (max-width:820px){.dtg-pieces{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.dtg-pieces{grid-template-columns:1fr}}
.dtg-piece{display:flex;align-items:center;gap:10px;padding:8px;border:1px solid var(--line);border-radius:8px;background:#fff}
.dtg-piece.done{opacity:.62}
.dtg-check{width:30px;height:30px;flex:none;border:2px solid var(--brown);border-radius:7px;background:#fff;color:var(--brown);font-size:17px;font-weight:800;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}
.dtg-piece.done .dtg-check{background:var(--brown);color:#fff}
.dtg-mini{width:96px;height:96px;flex:none;object-fit:cover;border:1px solid var(--line);border-radius:6px;background:#fff}
.dtg-mini.zoomable{cursor:zoom-in}
.dtg-file{font-size:12px;margin-top:3px}
.dtg-mini.nomaster{display:flex;align-items:center;justify-content:center;color:var(--amber);font-weight:800}
.dtg-piece-txt{min-width:0}

/* Orders-page progress thermometer */
.progress-cell{min-width:150px}
.thermo{display:flex;flex-direction:column;gap:4px}
.thermo-bar{display:flex;gap:2px;height:7px}
.thermo-seg{flex:1;background:var(--line);border-radius:3px}
.thermo-seg.done{background:var(--brown)}
.thermo-seg.cur{background:var(--brown-deep);box-shadow:0 0 0 2px var(--brown-tint)}
.thermo-bar.cancelled .thermo-seg{background:var(--line);opacity:.5}
.thermo-meta{font-size:11.5px;line-height:1.3;color:var(--ink)}
.thermo-meta .age{color:var(--mut);font-weight:600}
.thermo-meta .age.warn{color:var(--amber)}
.thermo-meta .age.bad{color:var(--red);font-weight:700}

/* DTG QC gate (second set of eyes) */
.dtg-qcwait{font-weight:700;color:var(--amber,#b7791f);background:var(--amber-bg,#fdf3df);border:1px solid var(--amber,#b7791f);border-radius:7px;padding:3px 9px;font-size:13px}
.dtg-qr{display:inline-block;width:96px;height:96px;background:#fff;border:1px solid var(--line);border-radius:6px;padding:3px;line-height:0}
.dtg-qr img,.dtg-qr canvas{display:block;width:90px;height:90px}
.qc-list{display:flex;flex-direction:column;gap:8px;max-width:560px;margin-top:12px}
.qc-item{display:flex;align-items:center;gap:12px;padding:9px 11px;border:1px solid var(--line);border-radius:9px;background:var(--card,#fff)}
.qc-mini{width:72px;height:72px;object-fit:cover;border-radius:7px;border:1px solid var(--line);flex:none;background:var(--brown-tint,#f4ece0)}
.qc-mini.nomaster{display:flex;align-items:center;justify-content:center;color:var(--mut);font-size:22px}
.qc-txt{flex:1;min-width:0}

/* QC page: checkbox-select reprint / pass all */
.qc-reprint{width:22px;height:22px;cursor:pointer}
.qc-flag{margin-left:auto;font-size:12px;font-weight:600;color:var(--mut);cursor:pointer;white-space:nowrap}
.qc-item.notdone{opacity:.6}
.qc-submit{font-size:16px;padding:12px 22px;margin-top:14px}
.btn.danger{background:var(--red-bg,#fdecea);border-color:var(--red,#b03a2e);color:var(--red,#b03a2e)}

/* ---- DTG piece photos: the photo IS the check-off ---- */
/* floor card */
.dtg-check.need{border-style:dashed;cursor:default;font-size:14px;color:var(--amber);border-color:var(--amber)}
.dtg-shot{width:72px;height:72px;flex:none;object-fit:cover;border:2px solid var(--brown);border-radius:6px;background:#fff;cursor:zoom-in}
.dtg-mini.reshoot{display:flex;align-items:center;justify-content:center;color:var(--red);font-weight:800;border-color:var(--red);background:var(--red-bg)}

/* phone capture page */
.shoot-list{display:flex;flex-direction:column;gap:10px;margin-top:14px}
.shoot-item{display:flex;align-items:center;gap:10px;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--card);flex-wrap:wrap}
.shoot-item.done{background:var(--brown-tint)}
.shoot-art{width:64px;height:64px;flex:none;object-fit:cover;border:1px solid var(--line);border-radius:6px;background:#fff}
.shoot-art.nomaster{display:flex;align-items:center;justify-content:center;color:var(--amber);font-weight:800}
.shoot-txt{flex:1;min-width:120px}
.shoot-shot{width:72px;height:72px;flex:none;object-fit:cover;border:2px solid var(--brown);border-radius:6px;cursor:zoom-in}
.shoot-form{margin:0;flex:none}
/* the label IS the button - tapping it opens the camera, and the shot submits itself */
.shoot-btn{margin:0;cursor:pointer;display:inline-block;padding:12px 16px;white-space:nowrap}

/* approve page: the operator's photo is the thing being judged, so it leads */
.qc-shot{width:110px;height:110px;flex:none;object-fit:cover;border:2px solid var(--brown);border-radius:8px;background:#fff;cursor:zoom-in}
.qc-shot.nomaster{display:flex;align-items:center;justify-content:center;color:var(--mut);font-size:12px;text-align:center;border-style:dashed}
.qc-acts{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.qc-act{display:inline-flex;align-items:center;gap:5px;font-size:13px;font-weight:600;padding:7px 11px;border:1px solid var(--line);border-radius:999px;cursor:pointer;background:#fff;color:var(--mut)}

.qc-act:has(input:checked){border-color:var(--brown);background:var(--brown-tint);color:var(--ink)}
.qc-act.reshoot:has(input:checked){border-color:var(--amber);background:var(--amber-bg);color:var(--amber)}
.qc-act.reprint:has(input:checked){border-color:var(--red);background:var(--red-bg);color:var(--red)}

/* Orders page: what is made and waiting on a person, with the photos right there */
.qcband{border:2px solid var(--amber);background:var(--amber-bg);border-radius:11px;padding:12px 14px;margin:14px 0}
.qcband-head{font-weight:800;color:var(--amber);margin-bottom:8px}
.qcrow{background:#fff;border:1px solid var(--line);border-radius:9px;padding:10px 12px;margin-bottom:8px}
.qcrow:last-child{margin-bottom:0}
.qcrow-top{font-size:14px;cursor:pointer;display:flex;align-items:center;flex-wrap:wrap;gap:2px}
.qcrow-top .twist{display:inline-block;transition:transform .15s;color:var(--mut);margin-right:4px}
.qcrow.open .qcrow-top{margin-bottom:8px}
.qcrow.open .twist{transform:rotate(90deg)}
.qcrow-body{margin-top:2px}
.qcrow-shots{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.qcrow-shots img{width:60px;height:60px;object-fit:cover;border:1px solid var(--line);border-radius:6px;cursor:zoom-in}
.qcrow-go{margin-left:auto;white-space:nowrap}

/* full-size overlay for thumbnails that carry their own data-full (piece photos, print masters) */
#zoomlb{display:none;position:fixed;inset:0;background:rgba(20,16,12,.92);z-index:9999;align-items:center;justify-content:center;flex-direction:column;cursor:zoom-out}
#zoomlb img{max-width:94vw;max-height:86vh;background:#fff;box-shadow:0 8px 40px rgba(0,0,0,.6)}
#zoomcap{color:#fff;margin-top:10px;font-size:15px}
#zoomlb .x{position:absolute;top:14px;right:20px;color:#fff;font-size:30px;line-height:1}
/* the camera icon is a <label> wrapping a hidden file input: tap = camera on a phone, picker on the bench */
label.dtg-check{cursor:pointer;display:flex;align-items:center;justify-content:center}
label.dtg-check.need:hover{background:var(--amber-bg);border-style:solid}
/* Camera inputs sit inside their label. display:none can drop a label click on older iOS Safari,
   so clip the input instead: invisible, still clickable, still reachable by keyboard. */
input.filein{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.shoot-art.zoomable{cursor:zoom-in}

/* ---- approving is a comparison: the artwork above what actually came off the press ---- */
.pair,.qc-pair{display:inline-flex;flex-direction:column;gap:2px;cursor:zoom-in;flex:none}
.pair img,.qc-pair img{display:block;object-fit:cover;border:1px solid var(--line);border-radius:6px;background:#fff}
.pair img:first-child,.qc-pair img:first-child{border-color:var(--mut)}
.pair img:last-child,.qc-pair img:last-child{border:2px solid var(--brown)}
.pair-none,.qc-pair .nomaster{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border:1px dashed var(--line);border-radius:6px;color:var(--amber);font-weight:800}
.qc-vs{font-size:10px;color:var(--mut);text-align:center;letter-spacing:.06em;text-transform:uppercase}

/* side-by-side overlay - stacks on a phone, sits shoulder to shoulder on the bench screen */
#cmplb{display:none;position:fixed;inset:0;background:rgba(20,16,12,.94);z-index:10000;align-items:center;justify-content:center;flex-direction:column;cursor:zoom-out;padding:20px}
#cmplb .cmp-wrap{display:flex;gap:18px;align-items:center;justify-content:center;flex-wrap:wrap;max-width:100%}
#cmplb figure{margin:0;text-align:center}
#cmplb img{max-width:44vw;max-height:70vh;background:#fff;box-shadow:0 8px 40px rgba(0,0,0,.6);border-radius:4px}
#cmplb figcaption{color:#e8e2d8;font-size:13px;margin-top:8px}
#cmpcap{color:#fff;margin-top:14px;font-size:15px;font-weight:600}
#cmplb .x{position:absolute;top:14px;right:20px;color:#fff;font-size:30px;line-height:1}
@media (max-width:760px){
  #cmplb .cmp-wrap{flex-direction:column;gap:10px}
  #cmplb img{max-width:92vw;max-height:36vh}
  #cmplb figcaption{margin-top:4px;font-size:12px}
}

/* compare overlay = the review itself: step through the pieces and judge each one */
#cmplb .cmp-bar{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;gap:12px;padding:12px 16px;color:#fff;background:linear-gradient(rgba(0,0,0,.55),transparent)}
#cmpcount{font-size:13px;color:#e8e2d8;min-width:64px}
#cmpcap{font-weight:700;font-size:15px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#cmplb .cmp-x{background:rgba(255,255,255,.12);border:0;color:#fff;font-size:22px;line-height:1;width:38px;height:38px;border-radius:9px;cursor:pointer;flex:none}
#cmplb .cmp-x:hover{background:rgba(255,255,255,.24)}
/* arrows flank the images, where your eyes already are - not tucked in a toolbar */
#cmplb .cmp-nav{position:absolute;top:50%;transform:translateY(-50%);width:56px;height:86px;border:0;border-radius:12px;
  background:rgba(255,255,255,.12);color:#fff;font-size:40px;line-height:1;cursor:pointer;z-index:2}
#cmplb .cmp-nav:hover{background:rgba(255,255,255,.26)}
#cmplb .cmp-nav.prev{left:14px}
#cmplb .cmp-nav.next{right:14px}
#cmplb .cmp-note{display:none;margin-top:12px;width:min(560px,92vw)}
#cmplb .cmp-note input{width:100%;margin:0;padding:12px 14px;border-radius:10px;border:2px solid var(--amber);background:#fff;font-size:15px}
.qc-note{display:none;margin-top:8px}
.qc-note input{margin-top:2px}
@media (max-width:760px){
  #cmplb .cmp-nav{width:40px;height:64px;font-size:30px}
  #cmplb .cmp-nav.prev{left:4px}
  #cmplb .cmp-nav.next{right:4px}
}
#cmplb .cmp-acts{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap;justify-content:center}
#cmplb .cmp-act{font-size:15px;font-weight:700;padding:12px 20px;border-radius:999px;border:2px solid rgba(255,255,255,.3);background:rgba(255,255,255,.08);color:#fff;cursor:pointer}
#cmplb .cmp-act.on.ok{background:var(--brown);border-color:var(--brown)}
#cmplb .cmp-act.on.reshoot{background:var(--amber);border-color:var(--amber)}
#cmplb .cmp-act.on.reprint{background:var(--red);border-color:var(--red)}
#cmplb .cmp-foot{color:#e8e2d8;font-size:13px;margin-top:12px;text-align:center}
#cmplb .cmp-foot .ok{color:#8fd9b0}
#cmplb .cmp-foot .neg{color:#ff9b94}
#cmplb .cmp-wrap{margin-top:46px}
@media (max-width:760px){
  #cmplb .cmp-act{font-size:14px;padding:11px 15px}
  #cmpcap{font-size:13px}
}
.qcrow-who{display:flex;gap:12px;align-items:center;flex-wrap:wrap;font-size:12px;margin-bottom:7px}
.claimed{font-weight:700;color:var(--amber);background:var(--amber-bg);border:1px solid var(--amber);border-radius:6px;padding:1px 8px}
/* the band's verdict form is written into by the overlay, never shown in place */
.qc-hidden-form{display:none}
#cmplb .cmp-done{margin-top:14px;font-size:16px;font-weight:700;padding:13px 26px;border-radius:10px;border:0;cursor:pointer;background:var(--brown);color:#fff}
#cmplb .cmp-done.danger{background:var(--red)}
#cmplb .cmp-done:hover{filter:brightness(1.08)}

/* marking up the photo: the canvas sits exactly over the image */
.cmp-canvas-holder{position:relative;display:inline-block;line-height:0}
#cmpCanvas{position:absolute;left:0;top:0;pointer-events:none;touch-action:none;cursor:crosshair}
.cmp-tool{margin-left:8px;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.3);color:#fff;
  font-size:12px;font-weight:600;padding:5px 11px;border-radius:999px;cursor:pointer}
.cmp-tool:hover{background:rgba(255,255,255,.28)}
.cmp-tool.on{background:#ff2d2d;border-color:#ff2d2d}
#cmpClear{display:none}
#cmplb .cmp-act.on.issue{background:var(--amber);border-color:var(--amber)}
.qc-gate{margin-top:14px;padding:11px 14px;border:1px dashed var(--line);border-radius:9px;color:var(--mut);font-size:13px;max-width:560px}
.qc-act.issue:has(input:checked){border-color:var(--amber);background:var(--amber-bg);color:var(--amber)}
/* a piece a supervisor sent back must read as sent back from across the bench */
.dtg-piece.kicked{border:2px solid var(--red);background:var(--red-bg)}
.dtg-kickback{margin-top:5px;font-size:13px;line-height:1.35}
.dtg-kickback b{display:inline-block;background:var(--red);color:#fff;font-size:11px;letter-spacing:.06em;padding:1px 7px;border-radius:5px;margin-right:6px}
.dtg-kickback span{color:var(--red);font-weight:700}
.dtg-kickback em{display:block;color:var(--red);font-style:normal;font-size:12px;margin-top:2px}
.dtg-trail{font-size:11px;color:var(--mut);margin-top:3px}
.dtg-piece.kicked .dtg-trail{color:var(--red);opacity:.85}

/* at a glance: green tick = settled, red dot = wants attention */
.pair,.qc-pair{position:relative}
.pair-dot{position:absolute;right:-5px;top:-5px;width:18px;height:18px;border-radius:50%;border:2px solid #fff;
  display:flex;align-items:center;justify-content:center;font-size:11px;font-style:normal;font-weight:900;color:#fff;line-height:1}
.pair-dot.good{background:var(--brown-deep)}
.pair-dot.good::after{content:"✓"}
.pair-dot.bad{background:var(--red)}
.qc-pair .pair-dot{width:22px;height:22px;font-size:13px;right:-7px;top:-7px}
.qc-redo{margin-top:6px;font-size:13px;color:var(--red)}
.qc-redo b{display:inline-block;background:var(--red);color:#fff;font-size:11px;letter-spacing:.06em;padding:1px 7px;border-radius:5px;margin-right:6px}
.qc-redo span{font-weight:700}
.qc-already{margin-top:6px;font-size:12px;color:var(--brown-deep)}
/* while a photo is on its way up, the control says so and nothing else can be tapped */
form.sending{opacity:.65;pointer-events:none}
/* where the piece in front of you stands: not reviewed / reviewed / issue */
.cmp-state{font-size:12px;font-weight:700;padding:4px 11px;border-radius:999px;white-space:nowrap;flex:none}
.cmp-state.none{background:rgba(255,255,255,.14);color:#e8e2d8;border:1px solid rgba(255,255,255,.3)}
.cmp-state.good{background:var(--brown-deep);color:#fff}
.cmp-state.bad{background:var(--red);color:#fff}
/* a red dot with nothing in it reads as "not done"; a tick reads as "done" */
.pair-dot.bad::after{content:""}
.qc-pair.rejected{border:2px solid var(--red);border-radius:9px;padding:4px;background:var(--red-bg)}
.qc-pair.rejected img{border-color:var(--red)}
/* Users: a level, then anything extra ticked on the person */
.caps{margin:10px 0 4px;padding:10px 12px;border:1px dashed var(--line);border-radius:9px;background:var(--bg)}
.capbox{display:flex;align-items:flex-start;gap:9px;margin:7px 0;font-size:13px;cursor:pointer}
.capbox input{margin:2px 0 0}
.capbox.bylevel{opacity:.6;cursor:default}
.capbox em{font-style:normal;color:var(--mut);font-size:12px}
#cmplb .cmp-done.blocked{background:rgba(255,255,255,.18);color:#e8e2d8;cursor:not-allowed}

/* Phone: the approve list is the thing a supervisor actually uses on a handset, so it has to
   stack rather than squeeze - the pair above the text, and full-width tap targets. */
@media (max-width:620px){
  .qc-item{flex-wrap:wrap;gap:10px}
  .qc-pair{flex-direction:row;align-items:center;gap:8px}
  .qc-pair img{width:88px;height:88px}
  .qc-vs{writing-mode:horizontal-tb;font-size:10px}
  .qc-txt{flex:1 1 100%;min-width:0}
  .qc-acts{gap:8px}
  .qc-act{flex:1 1 calc(50% - 4px);justify-content:center;padding:12px 8px;font-size:14px}
  .qc-note input{font-size:15px}
  .qcrow-shots{gap:6px}
  .qcrow-go{margin-left:0;width:100%;text-align:center;margin-top:8px}
}
/* the verdict inputs live in the form but are driven from the comparison, never touched here */
input.qc-hidden-input,input.qc-hidden-input[type=radio],input.qc-hidden-input[type=text]{display:none}
.qc-status{margin-top:8px;font-size:13px;color:var(--mut)}
.qc-status.good{color:var(--brown-deep);font-weight:700}
.qc-status.bad{color:var(--red);font-weight:700}
.qc-pair{cursor:zoom-in}

/* The floor card is a bench screen. On a phone the QR is useless — you cannot scan the device in
   your hand — and the inline picker is the wrong shape, so a phone gets the capture page instead. */
.onphone{display:none}
@media (max-width:620px){
  .onphone{display:inline-flex;align-items:center;justify-content:center}
  span.onphone{display:inline}
  .onbench{display:none !important}
  a.dtg-check.onphone{text-decoration:none}
  .dtg-actions .btn.onphone{width:100%;margin:6px 0 0}
  .dtg-pieces{grid-template-columns:1fr}
  .dtg-actions{gap:8px}
}

/* Actions sit at the TOP of the order card now: what this order needs next should be the first
   thing you read, not something you scroll past ten pieces to find. */
.dtg-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 12px;padding-bottom:10px;border-bottom:2px solid var(--line)}
.dtg-actions .btn{margin:0}
/* Getting out of the capture page: a real control, and one at the end of the list where you finish */
.bar .backbtn{margin:0;flex:none}
.bar h2{margin-right:auto}
.backbtn.wide{display:block;width:100%;margin-top:18px;text-align:center}
@media (max-width:620px){
  .bar{gap:10px}
  .bar h2{font-size:22px;width:100%;order:2;margin:0}
  .bar .backbtn{order:1}
}

/* The comparison has to fit a phone. The pictures scroll; the controls never do - a verdict you
   cannot reach because it is below the fold is the same as no verdict at all. */
#cmplb .cmp-tray{display:flex;flex-direction:column;align-items:center;gap:0;width:100%}
@media (max-width:760px){
  #cmplb{justify-content:flex-start;padding:0;overflow:hidden}
  #cmplb .cmp-wrap{flex:1 1 auto;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;
    margin:52px 0 0;padding:0 12px 12px;align-items:flex-start;justify-content:flex-start}
  #cmplb img{max-width:100%;max-height:none}
  #cmplb figure{width:100%}
  #cmplb .cmp-tray{flex:none;background:rgba(12,10,8,.97);border-top:1px solid rgba(255,255,255,.18);
    padding:10px 12px calc(10px + env(safe-area-inset-bottom));gap:8px}
  #cmplb .cmp-acts{margin-top:0;width:100%}
  #cmplb .cmp-act{flex:1 1 0;justify-content:center}
  #cmplb .cmp-note{margin-top:0;width:100%}
  #cmplb .cmp-foot{margin-top:0}
  #cmplb .cmp-done{margin-top:2px;width:100%}
  #cmplb .cmp-nav{top:auto;bottom:calc(50% + 40px);transform:none}
}
/* Issue turns into the way forward once its reason is written */
#cmplb .cmp-act.issue.isnext{background:var(--brown);border-color:var(--brown);color:#fff}
/* the old mark-up opens in the lightbox, not a new tab - a review should not lose your place */
.seeold{color:var(--red);text-decoration:underline;cursor:zoom-in;font-weight:700}


/* DTG stages as tabs: a stage is a whole view, not something to scroll past */
.dtg-tabs{margin:10px 0 4px}
.dtg-tabs a{display:inline-flex;align-items:center;gap:7px}
.dtg-tabs a.empty{opacity:.45}
.dtg-tabs a.on.s-approval{background:var(--amber);border-color:var(--amber);color:#fff}
.dtg-tabs a.on.s-approved{background:var(--brown-deep);border-color:var(--brown-deep);color:#fff}
/* Ship board stage tabs */
.dtg-tabs a.on.s-intransit{background:var(--amber);border-color:var(--amber);color:#fff}
.dtg-tabs a.on.s-packing{background:var(--brown);border-color:var(--brown);color:#fff}
.dtg-tabs a.on.s-waiting_ship{background:var(--acc);border-color:var(--acc);color:#fff}
.dtg-tabs a.on.s-matching{background:#8e24aa;border-color:#8e24aa;color:#fff}
.dtg-tabs a.on.s-shipped{background:var(--brown-deep);border-color:var(--brown-deep);color:#fff}
.dtg-tabs a.on.s-label{background:var(--acc);border-color:var(--acc);color:#fff}
.dtg-tabs a.on.s-ready{background:var(--brown-deep);border-color:var(--brown-deep);color:#fff}
/* red marker: there is signed-off work sitting in the Approved tab waiting to be carried off */
.dtg-tabs a .redmark{width:9px;height:9px;border-radius:50%;background:var(--red);flex:none;animation:redpulse 1.8s ease-out infinite}
.dtg-tabs a.on .redmark{background:#fff}
@keyframes redpulse{0%{box-shadow:0 0 0 0 rgba(176,58,46,.55)}70%{box-shadow:0 0 0 6px rgba(176,58,46,0)}100%{box-shadow:0 0 0 0 rgba(176,58,46,0)}}
.dtg-blurb{margin:2px 0 12px}
/* the short internal floor handle (T1..T9999) — the big thing you say and write */
.ftag{display:inline-block;background:var(--side);color:#fff;font-weight:800;font-size:13px;
  letter-spacing:.3px;padding:1px 7px;border-radius:6px;font-variant-numeric:tabular-nums}
/* DTG bench board as a compact list — pictures hidden until you click a row open */
.dtg-list{width:100%}
.dtg-list tbody tr.dtg-row{cursor:pointer}
.dtg-list tbody tr.dtg-row:hover td{background:var(--brown-tint)}
.dtg-list .dtg-twist{width:20px;text-align:center;color:var(--mut)}
.dtg-list .twist{display:inline-block;transition:transform .15s}
.dtg-list tr.dtg-row.open .twist{transform:rotate(90deg)}
.dtg-list tr.dtg-detail>td{background:#faf7f2;padding:12px 16px}
.dtg-next .opencue{color:var(--brown-deep);font-weight:700;font-size:12px;white-space:nowrap}
/* the roll-down action bar: one QR (only the open row shows it), beside the tap button + artwork */
.dtg-detail-act{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap;margin:0 0 12px}
/* the scan card: QR with its instruction centred underneath — one tidy block */
.dtg-detail-act .scan{display:inline-flex;flex-direction:column;align-items:center;gap:8px;flex:none;
  padding:12px;background:#fff;border:1px solid var(--line);border-radius:10px}
.dtg-detail-act .dtg-qr{width:140px;height:140px;line-height:0}
.dtg-detail-act .dtg-qr img,.dtg-detail-act .dtg-qr canvas{display:block;width:140px;height:140px}
.dtg-detail-act .scan .qcap{font-size:12px;color:var(--mut);max-width:150px;text-align:center;margin:0}
.dtg-detail-act .qcol{display:flex;flex-direction:column;gap:2px}
.dtg-info{display:flex;flex-direction:column;gap:3px;font-size:13px;margin-left:auto}
.dtg-info .k{display:inline-block;min-width:78px;color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.3px}
.dtg-info .btn{align-self:flex-start;margin-top:4px}
@media (max-width:620px){ .dtg-info{margin-left:0} }
.dtg-file{margin-top:4px}
.dtg-file .linkbtn{font-weight:600}
.dtg-pc b{font-size:15px}
.tstation{font-variant-numeric:tabular-nums;font-weight:600;color:var(--mut)}
.tstation.tst-amber{color:var(--amber)}
.tstation.tst-red{color:var(--red);font-weight:800}
/* the order you just scanned, so you are not hunting a list for it */
.scanned{outline:3px solid var(--brown);outline-offset:2px;animation:scanflash 1.4s ease-out 2}
@keyframes scanflash{0%,100%{background:transparent}30%{background:var(--brown-tint)}}
tr.paper.scanned td{background:var(--brown-tint)}

/* Order page: where it stands, and what has happened to it */
.stages{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.stage-step{display:flex;align-items:center;gap:7px;padding:7px 12px;border:1px solid var(--line);border-radius:999px;
  background:#fff;font-size:13px;color:var(--mut)}
.stage-step .dot{width:9px;height:9px;border-radius:50%;background:var(--line);flex:none}
.stage-step.done{border-color:var(--brown);color:var(--ink);font-weight:700}
.stage-step.done .dot{background:var(--brown)}
.stage-step .when{font-size:11px;color:var(--mut);font-weight:400}
.histlog{margin-top:8px;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.hist{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);font-size:13px}
.hist:last-child{border-bottom:0}
.hist .t{color:var(--mut);font-size:12px;min-width:112px;flex:none}
.hist .w{font-weight:700}
.hist.good .w{color:var(--brown-deep)}
.hist.bad .w{color:var(--red)}
@media (max-width:620px){ .hist .t{min-width:0;width:100%} }

/* Order page: notes people leave each other, and the details form folded out of the way */
.orderedit{margin:26px 0 8px;border-top:2px solid var(--line);border-radius:0;padding-top:14px}
.orderedit summary{cursor:pointer;padding:4px 0}
.notebox{display:flex;gap:8px;align-items:flex-start;margin:6px 0 10px}
.notebox input{margin:0}
.notebox .btn{margin:0;width:auto;flex:none;white-space:nowrap}
.notelist{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.note{padding:9px 12px;border-bottom:1px solid var(--line)}
.note:last-child{border-bottom:0}
.note .b{font-size:14px;margin-bottom:2px}
@media (max-width:620px){ .notebox{flex-direction:column} .notebox .btn{width:100%} }

/* Order page: the artwork it should be, beside the photo of what came off the press */
.opieces{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:10px;margin-top:8px}
.opiece{display:flex;gap:12px;align-items:flex-start;padding:10px;border:1px solid var(--line);border-radius:10px;background:#fff}
.opiece.kicked{border-color:var(--red);background:var(--red-bg)}
.opair{display:flex;gap:8px;flex:none}
.opair.comparable{cursor:zoom-in}
.opair figure{margin:0;text-align:center}
.opair img{cursor:zoom-in;width:110px;height:110px;object-fit:cover;border:1px solid var(--line);border-radius:7px;background:#fff;display:block}
.opair figure:last-child img{border:2px solid var(--brown)}
.opiece.kicked .opair figure:last-child img{border-color:var(--red)}
.opair figcaption{font-size:10px;color:var(--mut);margin-top:3px;text-transform:uppercase;letter-spacing:.04em}
.opair .none{display:flex;align-items:center;justify-content:center;width:110px;height:110px;border:1px dashed var(--line);
  border-radius:7px;color:var(--mut);font-size:11px;text-align:center;padding:6px}
.otxt{min-width:0}
@media (max-width:620px){ .opieces{grid-template-columns:1fr} }

/* Order page: who it is going to, and what kind of order it is */
.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px;margin-top:18px}
.fcol{border:1px solid var(--line);border-radius:10px;background:#fff;padding:12px 14px}
.fcol h3{margin:0 0 8px;font-size:15px}
.frow{display:flex;gap:10px;padding:5px 0;border-bottom:1px solid var(--line);font-size:14px}
.frow:last-child{border-bottom:0}
.frow .k{flex:none;width:112px;color:var(--mut);font-size:13px}
.frow .v{min-width:0;word-break:break-word}
/* Ship-it box row: keep the preset select + custom L×W×H inline (global input rule is display:block) */
.shipbox{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.shipbox select{display:inline-block;width:auto;max-width:220px;margin-top:0}
.shipbox #boxCustom{display:inline-flex;align-items:center;gap:6px}
.shipbox #boxCustom input{display:inline-block;width:58px;margin-top:0}
.shipbox .x{color:var(--mut)}
@media (max-width:620px){ .frow{flex-direction:column;gap:2px} .frow .k{width:auto} }
.rawjson{background:#0e1114;color:#d7e3ee;padding:12px;border-radius:9px;overflow:auto;max-height:420px;font-size:12px;line-height:1.5}
.hist .said{flex-basis:100%;font-size:13px;color:var(--ink);background:var(--bg);border-left:3px solid var(--line);padding:4px 10px;margin-top:3px;border-radius:0 6px 6px 0}
.hist.bad .said{border-left-color:var(--red)}
.histmark{width:56px;height:56px;object-fit:cover;border:2px solid var(--red);border-radius:6px;cursor:zoom-in;margin-top:4px}
.notebox .notepic{width:auto;flex:none;margin:0;white-space:nowrap;cursor:pointer}
.notepicked{margin:-4px 0 10px}
.notepho{display:block;margin-top:6px;width:120px;height:120px;object-fit:cover;border:1px solid var(--line);border-radius:8px;cursor:zoom-in}
@media (max-width:620px){ .notebox .notepic{width:100%;text-align:center} }
.notebox label.notepic.onphone{display:none}
@media (max-width:620px){ .notebox label.notepic.onphone{display:inline-block} .notebox label.notepic.onbench{display:none} }
.notephone{display:flex;align-items:center;gap:12px;margin:0 0 12px}
@media (max-width:620px){ .notephone{display:none} }
.shipform{display:flex;gap:6px;align-items:center}
.shipform .trackin{margin:0;width:190px;padding:7px 9px;font-size:13px}
.shipform .btn{margin:0;width:auto;white-space:nowrap}
@media (max-width:620px){ .shipform{flex-direction:column;align-items:stretch} .shipform .trackin{width:100%} }
/* Nobody is told an order is waiting, so the board shows it going stale */
.dtg-tabs a .age{font-size:11px;font-weight:800;opacity:.85}
.dtg-tabs a.ageing{border-color:var(--amber);color:var(--amber)}
.dtg-tabs a.ageing.on{background:var(--amber);border-color:var(--amber);color:#fff}
.dtg-tabs a.stale{border-color:var(--red);color:var(--red)}
.dtg-tabs a.stale.on{background:var(--red);border-color:var(--red);color:#fff}
.dtg-qcwait.ageing{border-color:var(--amber);color:var(--amber);background:var(--amber-bg)}
.dtg-qcwait.stale{border-color:var(--red);color:#fff;background:var(--red)}
/* A scan lands here, so the next move lands here too */
.nextact{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:16px 0 4px;padding:12px 14px;
  border:2px solid var(--brown);border-radius:11px;background:var(--brown-tint)}
.nextact .k{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--brown-deep)}
.nextact .btn{margin:0;width:auto}
.stage.s-transit{background:var(--amber-bg);color:var(--amber);border:1px solid var(--amber)}

/* Work held off a bench until its run sheet is printed. */
.heldbar{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;
  border:1px dashed var(--line);border-radius:10px;padding:10px 12px;margin:0 0 12px;background:var(--paper,#fbfaf7)}

/* Which item of an order this card/page is - shown only when the order has more than one. */
.itemtag{display:inline-block;font-size:12px;font-weight:800;letter-spacing:.6px;
  padding:1px 7px;border-radius:4px;background:var(--ink,#2b2b2b);color:#fff;vertical-align:middle}

/* Permission ticks, one per line and readable rather than a wall of jargon. */
.caps .capbox{display:flex;gap:9px;align-items:flex-start;padding:6px 0;font-size:14px}
.caps .capbox input{margin:2px 0 0;width:auto;display:inline-block;flex:0 0 auto}
.caps .capbox span{line-height:1.35}

/* Users list: one line per person, everything else behind the arrow. */
.userrow{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:0 0 8px;background:var(--card,#fff)}
.userrow > summary{cursor:pointer;list-style:revert;font-size:15px}
.userrow[open] > summary{margin-bottom:8px;border-bottom:1px solid var(--line);padding-bottom:8px}
.userrow[data-off="1"]{opacity:.62}

/* Permission tree: category headers with items beneath, partial state shown by the browser's dash. */
.captree .capcat{border:1px solid var(--line);border-radius:8px;padding:8px 10px;margin:0 0 8px}
.captree .caphead{display:flex;gap:9px;align-items:flex-start;font-size:14px;padding:2px 0 6px;border-bottom:1px solid var(--line);margin-bottom:4px}
.captree .caphead input{margin:3px 0 0;width:auto;display:inline-block;flex:0 0 auto}
.captree .capbox{padding:4px 0 4px 26px}

/* Camera page: artwork the same size as the Floor card, and the order's basics up top. */
.shoot-art{width:96px;height:96px}
.shoot-facts{display:flex;flex-wrap:wrap;gap:6px 18px;margin:4px 0 10px;font-size:14px}
.shoot-facts .k{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut)}
.shoot-facts .warn{color:#b06000}

/* Where it is: each stage is a door. The current one says so. */
.stages a.stage-step{text-decoration:none;color:inherit}
.stages a.stage-step:hover .lbl{text-decoration:underline}
.stage-step.current{font-weight:700}
.stage-step.current .dot{background:var(--acc);box-shadow:0 0 0 3px color-mix(in srgb,var(--acc) 25%,transparent)}
.stage-step .go{margin-left:8px;font-size:12px;color:var(--acc);font-weight:700}
.stages.compact{margin:4px 0 8px}
.stages.compact .stage-step{font-size:12px}

/* Order numbers: a block face, slashed zero, a little air between the glyphs. TMT-B4C845E4BE has to
   be read off a screen across a bench, so no 0/O or 1/I guessing. */
.onum{font-family:ui-monospace,"SF Mono",Menlo,Consolas,"DejaVu Sans Mono","Liberation Mono",monospace;
      font-weight:700;letter-spacing:.06em;font-variant-numeric:slashed-zero;font-size:1.06em;white-space:nowrap}
h2 .onum{font-size:1em;letter-spacing:.08em}
.stage-step .who{font-size:11px;color:var(--brown);font-weight:600}
.stage-step .who::before{content:"· "}

/* Orders list: the whole row opens the order. */
table.orders tr.paper[data-order]{cursor:pointer}
table.orders tr.paper[data-order]:hover td{background:var(--brown-tint)}
table.orders .ordlink{text-decoration:none;color:inherit}
table.orders .ordlink:hover{text-decoration:underline}
.btn.warn{border-color:var(--red);color:var(--red);font-weight:700}
.shipto{font-size:17px;line-height:1.45;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:#fff;display:inline-block;min-width:260px}
.langsw a{color:inherit;opacity:.7}.langsw b{opacity:1}
.langfoot{text-align:center;margin:18px 0;font-size:13px;color:var(--mut)}.langfoot a{color:inherit;margin:0 6px}.langfoot b{margin:0 6px}

/* the phone's home screen: the code, big, and the rest a tap away */
.badgehome #badgeqr img,.badgehome #badgeqr canvas{max-width:min(78vw,300px);height:auto}
.badgelinks{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:12px}
.badgelinks .btn{flex:1 1 40%;text-align:center;padding:12px 8px;font-size:15px}

.badgelinks .findform{display:flex;gap:6px;flex:1 1 100%}.badgelinks .findform input{flex:1;font-size:16px}
.badgelinks #scanBtn{flex:1 1 100%;font-size:17px;padding:14px}

/* phone mode: the same pages with nothing around them */
body.phone main{max-width:100%;padding:10px 12px 28px}
.pbar{display:flex;align-items:center;gap:12px;margin:-4px -12px 12px;padding:10px 14px;background:var(--brown);color:#fff;position:sticky;top:0;z-index:5}
.pbar a{color:#fff;text-decoration:none;font-weight:700;font-size:16px;white-space:nowrap}
.pbar-t{font-weight:600;opacity:.9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.phone .bar{flex-wrap:wrap}body.phone .bar h2{font-size:20px}
body.phone details.li{display:none}                 /* "what the channel sent", "edit what was entered": not phone work */
body.phone .histlog{max-height:240px;overflow:auto}
body.phone .facts{grid-template-columns:1fr}
body.phone table{font-size:13px}

/* the scan page: the camera is the page */
body.plain .scanpage{position:fixed;inset:0;background:#000;display:flex;flex-direction:column}
.scanpage video{flex:1;width:100%;object-fit:cover;min-height:0}
.scanfoot{padding:14px 16px calc(14px + env(safe-area-inset-bottom));background:#111;color:#eee;display:flex;gap:12px;align-items:center;justify-content:space-between}
.scanfoot #scanSay{font-size:14px;line-height:1.35}
.scanfoot .btn{flex:none;background:#fff}
body.plain .scanpage ~ .langfoot{display:none}

.scanpage .reticle{position:absolute;left:50%;top:42%;width:min(62vw,300px);aspect-ratio:1;transform:translate(-50%,-50%);border:3px solid rgba(255,255,255,.9);border-radius:14px;box-shadow:0 0 0 100vmax rgba(0,0,0,.45);pointer-events:none}
.scanpage .reticle.hit{border-color:#5ad36a}
.scanpage{position:relative}

.nextqr{display:inline-flex;flex-direction:column;align-items:center;gap:2px;margin-left:14px;padding:6px;background:#fff;border:1px solid var(--line);border-radius:8px}
.nextqr .dtg-qr{display:block}

.benchcode{display:flex;gap:16px;align-items:center;margin:12px 0 14px;padding:12px 14px;border:2px solid var(--brown);border-radius:12px;background:#fff}
.benchcode .dtg-qr{flex:none}.benchcode b{font-size:17px}

/* the phone header: black, fixed, the name centred */
.phead{position:sticky;top:0;z-index:20;background:#000;color:#fff;height:50px;padding-top:env(safe-area-inset-top);display:flex;align-items:center;justify-content:center;font-family:"Arial Black","Helvetica Neue",Arial,sans-serif;font-weight:900;font-size:17px;letter-spacing:.14em;text-transform:uppercase}
.phead a{position:absolute;left:14px;color:#fff;text-decoration:none;font-size:26px;line-height:1}
body.plain.phone .pbar{position:static;margin-top:0;background:var(--brown-tint);color:var(--ink);padding:8px 14px}
body.plain.phone .pbar a{color:var(--ink);font-size:14px}
body.plain .scanpage{top:48px}

.pagelead{max-width:520px;margin:-6px 0 16px;color:var(--mut);line-height:1.5;font-size:14px}

/* ---------- login: dead simple — a mark and one button ---------- */
.login{max-width:380px;margin:9vh auto 0;text-align:center;padding:0 8px}
.login-brand{display:flex;flex-direction:column;align-items:center;gap:14px;margin-bottom:32px}
.login-brand .login-mark{width:82px;height:82px;border-radius:20px;object-fit:cover;display:block;box-shadow:0 8px 20px rgba(60,40,15,.2)}
.login-brand b{font-family:'DM Serif Display',serif;font-weight:400;font-size:23px;color:var(--ink)}
.login .login-go{width:100%;justify-content:center;font-size:18px;padding:16px;border-radius:15px}
.login-sub{color:var(--mut);font-size:13px;margin-top:12px}
.login-hint{color:var(--mut);font-size:12.5px;margin-top:24px}
.login-tile{display:flex;flex-direction:column;align-items:center;gap:12px;background:var(--card);border:1px solid var(--line);border-radius:18px;padding:28px 18px;font-weight:700;font-size:17px;line-height:1.3;box-shadow:0 6px 22px rgba(60,40,15,.07)}
.login-tile .login-ic{font-size:42px}
.login-qr{display:flex;justify-content:center;margin-bottom:8px}
.login-qr #pairqr{padding:14px;background:#fff;border:1px solid var(--line);border-radius:16px;line-height:0}
.login-qr #pairqr img,.login-qr #pairqr canvas{display:block;width:min(64vw,220px);height:auto}

/* ---------- phone home ("My code"): a clean app screen, big thumb targets ---------- */
.phome{max-width:460px;margin:0 auto;padding:6px 2px 4px}
.qrcard{background:var(--card);border:1px solid var(--line);border-radius:20px;padding:22px 18px 18px;text-align:center;box-shadow:0 8px 26px rgba(60,40,15,.08);margin-bottom:16px}
.qrname{font-family:'DM Serif Display',serif;font-size:27px;color:var(--ink);margin-bottom:16px;line-height:1.1}
.qrbox{display:inline-block;padding:14px;background:#fff;border:1px solid var(--line);border-radius:16px;line-height:0}
.qrbox img,.qrbox canvas{display:block;width:min(66vw,250px)!important;height:auto!important}
.qrhint{margin-top:15px;line-height:1.3}
.qrhint .qrlabel{display:block;font-weight:700;font-size:16px;color:var(--ink)}
.qrhint .qrttl{display:block;color:var(--mut);font-size:13px;margin-top:2px;font-variant-numeric:tabular-nums}
.ptile{display:flex;align-items:center;gap:14px;width:100%;background:var(--card);border:1px solid var(--line);border-radius:16px;padding:15px 16px;margin-bottom:12px;text-decoration:none;color:var(--ink);box-shadow:0 2px 10px rgba(60,40,15,.05)}
.ptile:active{transform:scale(.99)}
.ptile .pt-ic{font-size:24px;flex:none;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:var(--brown-tint);border-radius:13px}
.ptile .pt-tx{flex:1;font-weight:700;font-size:16px;display:flex;flex-direction:column;gap:1px;text-align:left}
.ptile .pt-tx small{font-weight:400;color:var(--mut);font-size:12.5px}
.ptile .pt-go{flex:none;font-size:24px;line-height:1;color:var(--mut);background:none;border:0;padding:0 6px;cursor:pointer}
.ptile.primary{background:var(--brown);border-color:var(--brown);color:#fff}
.ptile.primary .pt-ic{background:rgba(255,255,255,.18)}
.ptile.primary .pt-tx small{color:rgba(255,255,255,.82)}
.ptile.primary .pt-go{color:rgba(255,255,255,.75)}
.ptile.find input{flex:1;border:0;background:none;font:inherit;font-size:16px;padding:0;margin:0;min-width:0;color:var(--ink)}
.ptile.find input::placeholder{color:var(--mut)}
.ptile.find input:focus{outline:none}
.pfoot{max-width:460px;margin:14px auto 4px;display:flex;justify-content:center;gap:10px}
.pfoot .pfbtn{flex:1;text-align:center;background:var(--card);border:1px solid var(--line);color:var(--ink);text-decoration:none;font-weight:600;font-size:15px;padding:13px 14px;border-radius:14px}
.pfoot .pfbtn:active{transform:scale(.99)}
.pfoot .pfbtn:hover{border-color:var(--brown)}
/* the plain "← Back" variant (desktop / sub-pages) stays a quiet link, not a full-width button */
.pfoot > a:not(.pfbtn){flex:none;color:var(--mut);text-decoration:none;font-size:14px;padding:10px}

.stage.s-shipped{background:#e9f5ec;color:#1d5c2c}

/* the laser bench (burn.php) */
.tabs .tabx{margin-left:auto;font-size:12px}
.burnq,.burnbed{margin:12px 0;padding:12px 14px}
.burnq-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.burnq-hd h3{margin:0}
.burnq-hd .spacer{flex:1}
form.inl{display:inline;margin:0}
.bedmap{width:100%;max-width:820px;height:auto;display:block;margin:8px 0 12px;border-radius:6px}
.slotno{font-size:20px}
.spot{font-size:18px;letter-spacing:.5px}
tr.burnready td{background:#eef8ee}
.burnact{margin:10px 0 4px}
label.chk{white-space:nowrap;margin-right:10px;cursor:pointer}
tr.burnheld td{background:#fff8e6}
.prio.hold{background:#f6d58a;color:#4a3300}

/* editing a bed by hand */
.mvbtn{border:1px solid #c9b38f;background:#fff;border-radius:6px;padding:2px 7px;cursor:pointer;font-size:13px}
.mvbtn:hover{background:#f4ead8}
.movebar{margin:6px 0 8px;padding:8px 10px;background:#fff3cd;border:1px solid #e6c15a;border-radius:8px;font-size:13px}
.burnbed.moving .bedlist tr[data-slot],.burnbed.moving .bedmap .slot{cursor:pointer}
.burnbed.moving .bedlist tr[data-slot]:hover td{background:#fff3cd}
.burnbed.moving .bedmap .slot:hover circle{stroke:#d19a00;stroke-width:0.12}
tr.emptyslot td{color:var(--mut);font-style:italic}
tr.pickline td{text-align:center;font-size:11px;color:#8a6d45;background:#f4ead8;border-top:2px dashed #8a6d45;padding:3px}
.rowctl form.rm select{font-size:11px;max-width:150px}
.qctl .mvbtn{margin-right:2px}

/* drafts, finalising, the wait screen (10-14) */
.bedstate{font-size:11px;font-weight:800;letter-spacing:.5px;padding:2px 8px;border-radius:10px}
.bedstate.draft{background:#fff3cd;color:#5a4300;border:1px solid #e6c15a}
.bedstate.stale{background:#fde2e2;color:#6b1111;border:1px solid #e3a1a1}
.bedstate.final{background:#e4f3e4;color:#1d4d1d;border:1px solid #9fcf9f}
.burnbed.draft{border-left:4px solid #e6c15a}.burnbed.stale{border-left:4px solid #e3a1a1}
.pickc{width:26px;text-align:center}.pickc input{width:18px;height:18px;cursor:pointer}
.burnwait{position:fixed;inset:0;background:rgba(20,14,8,.78);z-index:9999;display:flex;align-items:center;justify-content:center;color:#fff;text-align:center}
.burnwait>div{display:flex;flex-direction:column;align-items:center;gap:14px;max-width:420px;padding:20px}
.burnwait b{font-size:20px;line-height:1.3}.burnwait span{font-size:13px;opacity:.8}
.burnwait .spin{width:48px;height:48px;border:5px solid rgba(255,255,255,.25);border-top-color:#fff;border-radius:50%;animation:burnspin .9s linear infinite}
@keyframes burnspin{to{transform:rotate(360deg)}}
