
/* BIOTECH, the white-label peptide supply platform. App shell + product UI layer. */
:root{
  --ink:#0a0a0a; --ink-2:#141416; --line:#e6e6e6; --paper:#fff; --paper-2:#F6F5F1;
  --surface:#fff; --surface-2:#FBFAF6; --surface-3:#EDEAE1;
  --muted:#8a8177; --muted-2:#8a8a92; --ink-soft:#5c5648; --line-soft:#d8d2c2;
  --acc:#BC9745; --acc-ink:#1a1305; --warn:#c47a2e; --bad:#b23b3b; --good:#3f7a52;
  --display:'Playfair Display',Georgia,serif; --body:'Inter',-apple-system,system-ui,sans-serif;
  --act:#F8DC7E; --act-dk:#EFCC5C; --act-ink:#241B05; --act-edge:#A8842E;
  --act-soft:rgba(248,220,126,.34); --act-line:rgba(168,132,46,.50); --act-deep:#7A5E06;
  --num:'Inter',-apple-system,system-ui,sans-serif;
  --fig:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
  --ease:cubic-bezier(.2,.7,.2,1); --sb:266px;
}

/* ---- The back office reads light, because staff live in it all day and
   contrast is what stops mistakes. It tells itself apart from the customer
   portal two ways: a cooler paper against the customer's warm cream, and a
   deep nav rail where the customer has a pale one. Brand gold, Playfair and
   Inter are shared, so it is the same company in a different room. ---- */
.app.ops{
  --ink:#1A1611; --ink-2:#332C22; --line:#DAD3C6; --paper:#FCFAF6; --paper-2:#E9E3D7;
  --surface:#FCFAF6; --surface-2:#2B2119; --surface-3:#F2EDE3;
  --muted:#75695A; --muted-2:#847766; --ink-soft:#544B3E; --line-soft:#C6BCAA;
  --acc:#BC9745; --acc-ink:#1a1305;
  --good:#3f7a52; --bad:#a4453f; --warn:#b1732a;
  background:var(--paper-2); color:var(--ink);
}
.app.ops .topbar{background:rgba(233,227,215,.94);border-bottom-color:var(--line)}
.app.ops .card,.app.ops .tile{background:var(--surface);border-color:var(--line)}
.app.ops .tbl thead th{background:var(--surface-3);color:var(--muted)}
.app.ops .tbl tbody tr:hover{background:#F7F3EA}
.app.ops .tbl tr.cat-row td{background:#EFE6D2;color:#6E5A24}
.app.ops .editrow > td{background:var(--surface-3)}
.app.ops .addpanel{background:var(--surface-3);border-color:var(--line-soft)}
.app.ops .inp,.app.ops .sel,.app.ops textarea.inp{background:#FFFDF9;border-color:var(--line-soft);color:var(--ink)}
.app.ops .mini-card,.app.ops .rolecard,.app.ops .bsthumb,.app.ops .opt{background:var(--surface-3);border-color:var(--line)}
.app.ops .catchip{background:var(--surface);border-color:var(--line-soft)}
.app.ops .seg{background:var(--surface-3)}

/* The nav rail is the one dark surface: a deep brown out of the same warm
   family, so the two apps read as the same brand rather than two products.
   It redefines the tokens its own children use rather than being patched
   rule by rule. */
.app.ops .sidebar{
  --ink:#F2EBDF; --ink-2:#E0D7C7; --muted:#A09483; --muted-2:#A09483;
  --ink-soft:#CFC4B2; --line:#3B2F24; --line-soft:#463829; --acc:#D4AC57;
  --surface-3:#372B21;
  background:var(--surface-2); color:var(--ink); border-right-color:#3B2F24;
}
.app.ops .sidebar .sb-sec{color:#968A79}
.app.ops .sidebar .sb-nav a{color:#D3C9B9}
.app.ops .sidebar .sb-nav a:hover{background:rgba(255,255,255,.07);color:#F7F1E7}
.app.ops .sidebar .sb-nav a.on{background:rgba(212,172,87,.18);color:#F2DFB2}
.app.ops .sidebar .sb-nav a.on svg{color:#D4AC57}
.app.ops .sidebar .sb-user{background:rgba(255,255,255,.07)}
.app.ops .sidebar .sb-exit{border-color:#463829;color:#CFC4B2}
.app.ops .sidebar .sb-exit:hover{background:rgba(255,255,255,.07);color:#F7F1E7}
.app.ops .sidebar .sb-brand{color:#F7F2E8}
.app.ops .sidebar .sb-tag{color:#968A79}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:var(--body);color:var(--ink);background:var(--paper-2);-webkit-font-smoothing:antialiased;font-size:14px;line-height:1.5}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{font-family:var(--display);font-weight:800;letter-spacing:-.01em;text-transform:uppercase;margin:0}
.mono{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
button{font-family:inherit;cursor:pointer}
::selection{background:var(--acc);color:#1a1305}

/* Only what the ops shell genuinely needs on top of the shared components. */
.app.ops .tile.accent{background:rgba(188,151,69,.10);border-color:rgba(188,151,69,.34)}
.app.ops .rowlink{color:var(--ink-soft)}
.app.ops .rowlink:hover{color:#8A6A1F}
.app.ops .rowlink.danger{color:var(--bad)}

/* Inline edit, opened in place of the row it belongs to. Editing a product
   where you are already looking at it beats a modal that hides the list. */
.thsub{font-family:var(--body);font-weight:400;font-size:9.5px;letter-spacing:.02em;text-transform:none;color:var(--muted);margin-top:2px}
.editrow > td{padding:16px !important}
.editgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px 16px;margin-bottom:14px}
.editgrid .field{margin:0}
.editfoot{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.labelrow{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-height:34px}

/* Volume breaks: quantity and the rate it earns, paired. Run together on one
   line they read as one long number, which is how the old version failed. */
.addr-tail{font-family:var(--fig);font-size:12px;font-weight:600;color:var(--ink-2);margin-left:6px}
.inp.bad{border-color:var(--bad);box-shadow:0 0 0 3px rgba(164,69,63,.16)}

.breaks{display:flex;gap:7px;flex-wrap:wrap}
.brk{display:inline-flex;align-items:baseline;gap:6px;padding:3px 9px;border-radius:7px;
  background:var(--surface-3);border:1px solid var(--line)}
.brk b{font-family:var(--num);font-weight:600;font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--ink-2)}
.brk i{font-style:normal;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.03em;color:var(--acc)}
@media(max-width:900px){.breaks{flex-direction:column;gap:4px}.brk{justify-content:space-between;min-width:120px}}

/* An add-form that opens inside the card it belongs to. The gold edge marks it
   as a thing you are composing, not a thing you are reading. */
.addpanel{background:var(--paper-2);border:1px solid var(--line);border-radius:14px;
  padding:20px 20px 20px 23px;margin-bottom:18px;position:relative;overflow:hidden}
.addpanel::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--acc)}
.addpanel .editgrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px 22px;margin-bottom:18px}
.addpanel .editfoot{padding-top:16px;border-top:1px solid var(--line)}
@media(max-width:1080px){.addpanel .editgrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.addpanel{padding:16px 16px 16px 19px}.addpanel .editgrid{grid-template-columns:1fr;gap:14px}}

/* Photo field: shows the shot you are about to save, at the shape it will take. */
/* The handover panel: everything needed to give a new account its way in. */
.invite{background:var(--surface-3);border:1px solid var(--line);border-left:3px solid var(--acc);
  border-radius:12px;padding:16px 18px;margin-top:14px}
.invite-h{font-size:14px;margin-bottom:14px}
.invite-h .tid{margin-left:4px}
.invite-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:9px}
.invite-lb{flex:0 0 96px;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.07em;
  text-transform:uppercase;color:var(--muted)}
.invite-val{flex:1;min-width:160px;font-family:var(--fig);font-size:12px;background:var(--surface);
  border:1px solid var(--line-soft);border-radius:8px;padding:7px 10px;overflow-x:auto;white-space:nowrap}
.invite-note{margin:12px 0 0;font-size:12.5px;line-height:1.6;color:var(--muted)}
.invite-foot{display:flex;gap:16px;margin-top:13px;padding-top:13px;border-top:1px solid var(--line)}
@media(max-width:640px){
  .invite-lb{flex:1 1 100%}
  .invite-row .btn,.invite-row .rowlink{width:100%;text-align:center;justify-content:center}
}

/* The vial label standard: a checklist, not a form. Each line says what it is,
   who supplies it, and why it is on a vial at all. */
.lstd-group{margin-bottom:22px}
.lstd-group:last-child{margin-bottom:0}
.lstd-head{display:flex;align-items:baseline;gap:10px;font-family:var(--display);font-weight:800;
  font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink);
  padding-bottom:8px;border-bottom:1px solid var(--line);margin-bottom:4px}
.lstd-head span{font-family:var(--body);font-weight:400;font-size:11px;letter-spacing:0;
  text-transform:none;color:var(--muted);margin-left:auto}
.lstd-row{display:flex;gap:16px;padding:11px 0;border-bottom:1px solid var(--line)}
.lstd-row:last-child{border-bottom:0}
.lstd-tick{flex:0 0 96px;display:flex;align-items:flex-start;gap:7px;cursor:pointer;padding-top:1px}
.lstd-tick input{width:15px;height:15px;margin:1px 0 0;accent-color:var(--acc);flex:none;cursor:pointer}
.lstd-tick span{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted)}
.lstd-row.req .lstd-tick span{color:var(--acc)}
.lstd-main{flex:1;min-width:0}
.lstd-nm{font-weight:600;font-size:13.5px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.lstd-ex{font-family:var(--fig);font-size:12px;color:var(--ink-soft);margin-top:4px}
.lstd-note{font-size:12px;line-height:1.55;color:var(--muted);margin-top:4px}
@media(max-width:640px){
  .lstd-row{flex-direction:column;gap:8px}
  .lstd-tick{flex:none}
}

/* Strength pricing: the model on the left, what it does on the right. */
.pm-h{font-family:var(--display);font-weight:800;font-size:10.5px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--ink);padding-bottom:8px;border-bottom:1px solid var(--line);margin-bottom:6px}
.pm-row{display:flex;align-items:center;gap:14px;padding:8px 0;border-bottom:1px solid var(--line)}
.pm-row:last-child{border-bottom:0}
.pm-nm{flex:1;min-width:0;font-size:13px}
.pm-nm .hint2{margin-top:2px}
.pm-row .inp{width:90px;text-align:right;flex:none;font-family:var(--num);font-variant-numeric:tabular-nums}
.pm-pct{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--muted)}
.pm-total{display:flex;justify-content:space-between;align-items:baseline;margin-top:11px;padding-top:11px;
  border-top:1px solid var(--line);font-family:var(--display);font-weight:700;font-size:10.5px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.pm-total b{font-family:var(--num);font-weight:600;font-size:15px;letter-spacing:0;
  text-transform:none;color:var(--ink);font-variant-numeric:tabular-nums}
/* Margins: cost against price, and the one bar that shows how much of a dollar
   is actually yours. */
.mg-bulk{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px 20px;margin-bottom:4px}
.mg-bulk .field{margin:0}
.mg-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-top:14px;
  background:var(--surface-3);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.mg-stats b{display:block;font-family:var(--num);font-weight:600;font-size:19px;line-height:1.1;
  font-variant-numeric:tabular-nums}
.mg-stats span{display:block;font-size:11.5px;color:var(--muted);margin-top:3px}

.mg-demo{background:var(--surface-3);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:12px}
.mg-demo-h{font-family:var(--display);font-weight:800;font-size:10.5px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--ink);margin-bottom:9px}
.mg-demo-row{display:grid;grid-template-columns:70px 110px 78px 92px 1fr;gap:12px;align-items:baseline;
  padding:6px 0;border-bottom:1px solid var(--line);font-size:12.5px}
.mg-demo-row:last-child{border-bottom:0}
.mg-demo-row b{font-family:var(--num);font-weight:600;font-variant-numeric:tabular-nums}
@media(max-width:760px){.mg-demo-row{grid-template-columns:1fr 1fr;gap:4px 12px}}
/* A pricing suggestion: what kind, what it says, and the one button. */
.sug{display:flex;align-items:flex-start;gap:18px;padding:15px 0;border-bottom:1px solid var(--line)}
.sug:last-child{border-bottom:0;padding-bottom:0}
.sug:first-child{padding-top:0}
.sug-tag{flex:0 0 128px;padding-top:1px}
.sug-body{flex:1;min-width:0}
.sug-link{display:block;margin-top:7px;font-family:var(--display);font-weight:700;font-size:11px;
  letter-spacing:.05em;text-transform:uppercase;color:var(--ink-soft);text-decoration:underline}
.sug-link:hover{color:#8A6A1F}
.sug-sku{margin-top:5px;font-size:11.5px;line-height:1.4;color:var(--muted)}
.sug-sku span{font-size:11px}
.sug-opts{margin-top:11px;display:flex;flex-direction:column;gap:8px}
.sug-opt{display:flex;align-items:flex-start;gap:11px}
.sug-opt .btn{flex:none;margin-top:1px}
.sug-opt span{font-size:12px;line-height:1.55;color:var(--muted)}
@media(max-width:820px){.sug-opt{flex-direction:column;gap:5px}.sug-opt .btn{width:100%;justify-content:center}}

.sug-body b{display:block;font-size:14px;margin-bottom:4px}
.sug-body p{margin:0;font-size:12.5px;line-height:1.6;color:var(--muted)}
.sug-act{flex:0 0 190px;display:flex;flex-direction:column;align-items:flex-end;gap:7px}
.sug-move{font-family:var(--num);font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap;
  color:var(--muted)}
.sug-move span{margin:0 3px;color:var(--muted-2)}
.sug-move b{color:var(--ink);font-weight:600}
.sug-act .btn{width:100%;justify-content:center}
@media(max-width:820px){
  .sug{flex-direction:column;gap:9px}
  .sug-tag,.sug-act{flex:none;width:100%;align-items:stretch}
  .sug-act{flex-direction:row;align-items:center;justify-content:space-between;gap:14px}
  .sug-act .btn{width:auto}
}

.mg-bandnote{margin:14px 0 12px;font-size:12.5px;line-height:1.6;color:var(--muted)}
.mg-bands{margin-bottom:14px}
.mg-bands .inp{width:64px;text-align:right;display:inline-block;font-family:var(--num);
  font-variant-numeric:tabular-nums}
.mg-caps{display:flex;align-items:flex-end;gap:20px;flex-wrap:wrap}
.mg-caps .field{margin:0}
@media(max-width:640px){.mg-caps{align-items:stretch}.mg-caps .field{flex:1 1 100%}}
.mg-bar{display:flex;height:46px;border-radius:11px;overflow:hidden;border:1px solid var(--line)}
.mg-bar-cogs,.mg-bar-profit{display:flex;align-items:center;padding:0 14px;min-width:0;overflow:hidden}
.mg-bar-cogs{background:var(--surface-3);color:var(--ink-soft)}
.mg-bar-profit{flex:1;background:rgba(63,122,82,.16);color:#2c5f3f}
.mg-bar span{font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.05em;
  text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mg-bar-exp{background:rgba(196,122,46,.18);color:#8a5b00;display:flex;align-items:center;
  padding:0 14px;min-width:0;overflow:hidden}
.mg-bar-profit.neg{background:rgba(178,59,59,.16);color:#8f3030}
.pl{margin-top:18px;border-top:1px solid var(--line);padding-top:6px}
.pl-row{display:flex;justify-content:space-between;align-items:baseline;gap:16px;padding:8px 0;
  border-bottom:1px solid var(--line);font-size:13.5px}
.pl-row b{font-family:var(--num);font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.pl-row b small{font-family:var(--body);font-weight:400;font-size:11.5px;color:var(--muted);margin-left:9px}
.pl-row.out b{color:var(--muted)}
.pl-row.sub{padding-left:18px;font-size:12.5px;color:var(--muted)}
.pl-row.sum{border-bottom:1.5px solid var(--line-soft);font-weight:600}
.pl-row.big{font-size:16px;border-bottom:0;padding-top:12px}
.pl-row.big b{font-size:21px}
.pl-row.big.neg b{color:var(--bad)}
.pl-note{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.55}
.mg-bar-foot{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:9px;
  font-size:12px;color:var(--muted)}
.mg-next{font-family:var(--num);font-size:11.5px;color:#8A6A1F;margin-top:3px;font-variant-numeric:tabular-nums}
@media(max-width:640px){
  .mg-bar{height:auto;flex-direction:column}
  .mg-bar-cogs,.mg-bar-profit{width:100% !important;padding:10px 14px}
}

.pm-compound{display:flex;align-items:baseline;gap:12px;margin-top:12px;padding:12px 14px;
  border-radius:11px;background:var(--surface-3);border:1px solid var(--line)}
.pm-compound b{font-family:var(--num);font-weight:600;font-size:24px;line-height:1;flex:none;
  font-variant-numeric:tabular-nums}
.pm-compound span{font-size:12px;line-height:1.55;color:var(--muted)}
.pm-compound.hot{background:rgba(196,122,46,.09);border-color:rgba(196,122,46,.42)}
.pm-compound.hot b{color:#B1732A}
.pm-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;
  background:var(--surface-3);border:1px solid var(--line);border-radius:12px;padding:15px 18px}
.pm-stats b{display:block;font-family:var(--num);font-weight:600;font-size:21px;line-height:1.1;
  font-variant-numeric:tabular-nums}
.pm-stats span{display:block;font-size:11.5px;color:var(--muted);margin-top:3px}
.pm-flags{margin-top:16px;border:1px solid rgba(196,122,46,.40);background:rgba(196,122,46,.07);
  border-radius:12px;padding:14px 16px}
.pm-flags .pm-h{border-bottom-color:rgba(196,122,46,.30)}
.pm-flag{display:flex;gap:12px;flex-wrap:wrap;padding:6px 0;font-size:13px}
.pm-flag span{color:var(--muted)}
.pm-flags p{margin:9px 0 0;font-size:12.5px;line-height:1.6;color:var(--muted)}
@media(max-width:640px){.pm-row{flex-wrap:wrap}.pm-row .inp{width:100%}}

.uprow{display:flex;align-items:center;gap:12px}
.upshot{width:58px;height:58px;flex:none;border-radius:10px;border:1px solid var(--line-soft);
  background:var(--surface) center/cover no-repeat;display:grid;place-items:center;overflow:hidden}
.upshot span{font-family:var(--display);font-weight:700;font-size:8.5px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted);text-align:center;line-height:1.2;padding:0 4px}

/* Advancing an order: which order, and where it is about to go. */
.advhead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;font-size:13px}
.advmove{display:inline-flex;align-items:center;gap:7px;margin-left:auto;font-family:var(--display);
  font-weight:700;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.advmove b{color:#8A6A1F}
@media(max-width:700px){
  .editgrid{grid-template-columns:1fr}
  .editfoot{gap:10px}
  .editfoot .btn{width:100%;justify-content:center}
  .advmove{margin-left:0;width:100%}
}

/* Analytics: an action is a claim, the number that backs it, and the way to act
   on it. Keeping those three in one row stops it becoming a wall of advice. */
.action{display:flex;align-items:flex-start;gap:20px;padding:17px 0;border-bottom:1px solid var(--line)}
.action:last-child{border-bottom:0;padding-bottom:0}
.action:first-child{padding-top:0}
.action-metric{flex:0 0 104px;padding-top:1px}
.action-num{font-family:var(--num);font-weight:600;font-size:26px;line-height:1;letter-spacing:-.02em;
  color:var(--ink);font-variant-numeric:tabular-nums}
.action-unit{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--muted);margin-top:5px;line-height:1.3}
.action-body{flex:1;min-width:0}
.action-body b{display:block;font-size:14px;margin-bottom:4px}
.action-body p{margin:0;font-size:13px;line-height:1.6;color:var(--muted)}
.action .btn{flex:none;margin-top:2px}

.catbar{display:flex;align-items:center;gap:14px;padding:9px 0}
.catbar-lb{flex:0 0 210px;font-size:13px;display:flex;align-items:center;gap:8px}
.catbar-lb .dot{width:8px;height:8px;border-radius:50%;flex:none}
.catbar-track{flex:1;height:8px;border-radius:5px;background:var(--surface-3);overflow:hidden;min-width:60px}
.catbar-fill{height:100%;border-radius:5px}
.catbar-val{flex:0 0 150px;text-align:right;font-family:var(--num);font-weight:600;font-size:13px;
  font-variant-numeric:tabular-nums}
@media(max-width:760px){
  .action{flex-direction:column;gap:9px}
  .action-metric{flex:none;padding-top:0;display:flex;align-items:baseline;gap:8px}
  .action-unit{margin-top:0}
  .action .btn{width:100%;justify-content:center}
  .catbar{flex-wrap:wrap;gap:8px}
  .catbar-lb{flex:1 1 100%}
  .catbar-val{flex:0 0 auto;text-align:left}
  .catbar-track{flex:1 1 100%;order:3}
}

/* ---- layout ---- */
.app{display:grid;grid-template-columns:var(--sb) 1fr;min-height:100vh}
.sidebar{position:sticky;top:0;height:100vh;background:var(--surface-2);color:var(--ink);border-right:1px solid var(--line);display:flex;flex-direction:column;padding:22px 16px;overflow:auto}
/* The nav rail is taller than a laptop window, so it scrolls — and it was doing
   that with the operating system's own scrollbar: sixteen solid grey pixels
   down the edge of the panel, next to the dark rail, permanently there on any
   Mac set to always show scroll bars. Six pixels, in the rail's own colours,
   and it only darkens enough to find while the pointer is in the rail. */
.sidebar{scrollbar-width:thin;scrollbar-color:var(--line-soft) transparent}
.sidebar::-webkit-scrollbar{width:6px}
.sidebar::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:var(--line-soft);border-radius:3px}
.sidebar:hover::-webkit-scrollbar-thumb{background:var(--muted)}
/* The back office rail is dark, so its thumb has to come from the light side. */
.app.ops .sidebar{scrollbar-color:rgba(255,255,255,.20) transparent}
.app.ops .sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,.17)}
.app.ops .sidebar:hover::-webkit-scrollbar-thumb{background:rgba(255,255,255,.32)}
.sb-brand{display:flex;align-items:center;gap:9px;font-family:var(--display);font-weight:800;font-size:21px;letter-spacing:.02em;padding:6px 8px 4px}
.sb-brand .mk-img{height:26px;width:auto;flex:none}
.sb-brand .mk{width:14px;height:14px;border-radius:4px;background:var(--acc);box-shadow:0 0 0 4px rgba(188,151,69,.18)}
.sb-brand .tm{font-size:10px;opacity:.6;margin-left:1px}
.sb-tag{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.24em;color:var(--muted);margin:2px 8px 20px 32px;text-transform:uppercase}
.sb-tag b{color:var(--acc)}
.sb-sec{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.2em;color:#9a9188;text-transform:uppercase;margin:16px 10px 7px}
.sb-nav a{display:flex;align-items:center;gap:11px;padding:9px 11px;border-radius:9px;color:var(--ink-soft);font-weight:500;font-size:13.5px;transition:.16s var(--ease);position:relative}
.sb-nav a svg{width:17px;height:17px;flex:0 0 17px;opacity:.85}
.sb-nav a:hover{background:rgba(10,10,10,.045);color:var(--ink)}
.sb-nav a.on{background:rgba(188,151,69,.16);color:var(--ink)}
.sb-nav a.on::before{content:"";position:absolute;left:-16px;top:9px;bottom:9px;width:3px;border-radius:0 3px 3px 0;background:var(--acc)}
.sb-nav a .pill{margin-left:auto;font-size:10.5px;font-weight:700;background:var(--act);color:var(--act-ink);border-radius:20px;padding:1px 7px;font-family:var(--display)}
.sb-nav a .pill.warn{background:var(--warn);color:#3a2600}
.sb-nav a .pill.bad{background:var(--bad);color:#3a0009}
.sb-foot{margin-top:auto;padding-top:18px}
.sb-pin{display:flex;align-items:center;gap:9px;width:100%;margin-bottom:10px;padding:8px 11px;border:0;border-radius:9px;
  background:none;color:var(--muted);font:inherit;font-size:12px;cursor:pointer;transition:.15s var(--ease)}
.sb-pin svg{flex:0 0 15px;opacity:.8}
.sb-pin:hover{background:rgba(10,10,10,.045);color:var(--ink-soft)}
.sb-pin[aria-pressed="true"]{color:var(--acc)}
.sb-pin[aria-pressed="true"] svg{opacity:1}

/* ---------- A sidebar that only borrows its width ---------- */
/* Collapsed it shows icons; hovering slides it open over the page rather than
   pushing the table sideways, so nothing reflows under the pointer. Pinning it
   puts it back in the layout for good. */
.sidebar{white-space:nowrap;overflow-x:hidden;transition:width .18s var(--ease)}
.app.sb-slim{grid-template-columns:68px 1fr}
.app.sb-slim > .sidebar{position:fixed;left:0;top:0;width:68px;z-index:45;padding-left:14px;padding-right:14px}
/* Taking the sidebar out of the flow leaves the page as the grid's first item,
   which would then sit in the narrow column meant for the sidebar. */
.app.sb-slim > .main{grid-column:2}
.app.sb-slim > .sidebar:hover,
.app.sb-slim > .sidebar:focus-within{width:var(--sb);box-shadow:14px 0 34px -18px rgba(10,10,10,.4)}
.app.sb-slim > .sidebar .sb-tag,
.app.sb-slim > .sidebar .sb-sec,
.app.sb-slim > .sidebar .sb-brand,
.app.sb-slim > .sidebar .sb-user,
.app.sb-slim > .sidebar .sb-exit,
.app.sb-slim > .sidebar .sb-pin span,
.app.sb-slim > .sidebar .sb-nav a span,
.app.sb-slim > .sidebar .sb-nav a .pill{opacity:0;transition:opacity .14s var(--ease)}
.app.sb-slim > .sidebar:hover .sb-tag,
.app.sb-slim > .sidebar:hover .sb-sec,
.app.sb-slim > .sidebar:hover .sb-brand,
.app.sb-slim > .sidebar:hover .sb-user,
.app.sb-slim > .sidebar:hover .sb-exit,
.app.sb-slim > .sidebar:hover .sb-pin span,
.app.sb-slim > .sidebar:hover .sb-nav a span,
.app.sb-slim > .sidebar:hover .sb-nav a .pill,
.app.sb-slim > .sidebar:focus-within .sb-tag,
.app.sb-slim > .sidebar:focus-within .sb-sec,
.app.sb-slim > .sidebar:focus-within .sb-brand,
.app.sb-slim > .sidebar:focus-within .sb-user,
.app.sb-slim > .sidebar:focus-within .sb-exit,
.app.sb-slim > .sidebar:focus-within .sb-pin span,
.app.sb-slim > .sidebar:focus-within .sb-nav a span,
.app.sb-slim > .sidebar:focus-within .sb-nav a .pill{opacity:1}
/* The mark stays visible while the wordmark beside it is clipped away. */
.app.sb-slim > .sidebar .sb-brand{opacity:1}
.app.sb-slim > .sidebar:not(:hover):not(:focus-within) .sb-brand{font-size:0;letter-spacing:0}
/* A count still has to be readable when the labels are not: it becomes a dot
   on the icon rather than disappearing with the text. */
.app.sb-slim > .sidebar:not(:hover):not(:focus-within) .sb-nav a:has(.pill)::after{
  content:"";position:absolute;top:7px;left:26px;width:7px;height:7px;border-radius:50%;background:var(--act);border:2px solid var(--surface-2)}
@media(max-width:920px){
  .app.sb-slim{grid-template-columns:1fr}
  .app.sb-slim > .sidebar{width:270px;position:fixed}
  .app.sb-slim > .sidebar *{opacity:1 !important;font-size:inherit}
}
.sb-user{display:flex;align-items:center;gap:10px;padding:10px;border-radius:11px;background:rgba(10,10,10,.035);border:1px solid var(--line)}
.sb-user .av{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--acc),#8f7434);color:#fff;display:grid;place-items:center;font-family:var(--display);font-weight:800;font-size:14px}
.sb-user .nm{font-weight:600;font-size:12.5px;color:var(--ink);line-height:1.25}
.sb-user .rl{font-size:10.5px;color:var(--muted-2)}
.sb-exit{display:block;text-align:center;margin-top:9px;font-size:11px;color:var(--muted);padding:7px;border-radius:8px;border:1px solid var(--line)}
.sb-exit:hover{color:var(--ink);border-color:#c9c2b0}

/* ---- topbar + main ---- */
.main{min-width:0;display:flex;flex-direction:column}
.topbar{position:sticky;top:0;z-index:20;background:rgba(250,250,250,.86);backdrop-filter:saturate(180%) blur(12px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:16px;padding:14px 30px}
.tb-title h1{font-size:22px}
.tb-title p{margin:2px 0 0;color:var(--muted-2);font-size:12.5px}
.tb-spacer{flex:1}
.tb-search{display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:8px 13px;color:var(--muted-2);font-size:13px;min-width:210px}
.tb-search svg{width:15px;height:15px}
.tb-btn{width:38px;height:38px;border-radius:10px;border:1px solid var(--line);background:var(--surface);display:grid;place-items:center;color:#3a3a42;position:relative;cursor:pointer}
.tb-btn:hover{border-color:#c9c9cf}
.tb-btn .dot{position:absolute;top:8px;right:9px;width:7px;height:7px;border-radius:50%;background:var(--bad);border:2px solid #fff}
.dropdown-panel{position:absolute;top:calc(100% + 10px);right:0;width:320px;max-height:420px;overflow:auto;background:var(--surface);border:1px solid var(--line);border-radius:14px;box-shadow:0 16px 34px -12px rgba(10,10,10,.28);padding:8px;z-index:60;text-align:left;cursor:default}
.dropdown-panel .nrow{display:flex;gap:10px;align-items:flex-start;padding:10px 11px;border-radius:10px;cursor:pointer;font-size:12.5px;color:var(--ink)}
.dropdown-panel .nrow:hover{background:var(--paper-2)}
.dropdown-panel .nrow small{display:block;color:var(--muted-2);font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;font-family:var(--display);font-weight:700;margin-bottom:2px}
.dropdown-panel .empty{padding:18px 12px;text-align:center;color:var(--muted-2);font-size:12.5px}
.tb-search{position:relative}
.tb-search input{border:0;background:none;outline:none;font-family:inherit;font-size:13px;color:var(--ink);width:150px}
.tb-search input::placeholder{color:var(--muted-2)}
.tb-live{display:flex;align-items:center;gap:7px;font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:#0a7a55;background:rgba(188,151,69,.12);padding:7px 12px;border-radius:20px}
.tb-live .bl{width:7px;height:7px;border-radius:50%;background:var(--acc);box-shadow:0 0 0 0 rgba(188,151,69,.6);animation:blink 2s infinite}
@keyframes blink{0%{box-shadow:0 0 0 0 rgba(188,151,69,.55)}70%{box-shadow:0 0 0 7px rgba(188,151,69,0)}100%{box-shadow:0 0 0 0 rgba(188,151,69,0)}}

.content{padding:26px 30px 60px;max-width:1320px;width:100%}
.view{display:none;animation:fade .4s var(--ease)}
.view.on{display:block}
@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* A line of orientation at the top of a page, not an alert. This was amber
   with a warning triangle, so every page of the back office opened looking
   like something was wrong, and the real warnings below had nothing to
   stand out against. */
/* ---- A section that exists but is not open yet ----
   Packaging ships after the compound flow goes live. It stays on the page,
   greyed back and inert, so a client can see what is coming and cannot press
   anything in it. Not display:none: a section that vanishes reads as a feature
   we do not have. ---- */
.soonbar{display:flex;gap:16px;align-items:flex-start;background:var(--surface-2,#FBFAF6);
  border:1px solid var(--line);border-radius:14px;padding:16px 18px;margin-bottom:22px}
.soonbar b{display:block;font-size:14px;color:var(--ink);margin-bottom:5px}
.soonbar p{margin:0;font-size:12.5px;line-height:1.65;color:var(--muted);max-width:68ch}
.soon-badge{flex:0 0 auto;background:var(--acc);color:var(--acc-ink);border-radius:999px;
  padding:5px 12px;font-size:10.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
.soon-off{opacity:.38;filter:grayscale(.72);pointer-events:none;user-select:none}
.sb-nav a.soon{opacity:.5}
.soon-pill{margin-left:auto;background:var(--acc);color:var(--acc-ink);border-radius:999px;
  padding:2px 7px;font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}
@media(max-width:640px){ .soonbar{flex-direction:column;gap:10px} }

.hintbar{display:flex;align-items:center;gap:10px;background:#fff;color:#6f6a63;border:1px solid #e8e3d8;border-radius:12px;padding:10px 16px;font-size:12px;margin-bottom:22px}
.hintbar b{color:#3f3a34;font-family:var(--display);letter-spacing:.04em}
.hintbar svg{width:15px;height:15px;color:#a89a7d;flex:0 0 15px}

/* The transaction hash on an order. It is 64 characters of nothing anybody
   reads, so it wraps rather than widening the card, and the two things an
   operator actually does with it sit next to it. */
.od-tx{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:9px;padding:9px 11px;
  background:var(--paper-2);border:1px solid var(--line);border-radius:10px}
.od-tx code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:var(--ink);
  word-break:break-all;flex:1 1 200px;min-width:0}
.od-tx-lb{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted);flex:0 0 auto}

/* The step after a packaging component is answered. Quiet while something is
   still missing, and the order itself once nothing is. */
.pi-next{margin-top:18px}
.pi-next-h{font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:13px;
  letter-spacing:.02em;margin-bottom:6px}
.pi-next.ready{border-color:var(--acc)}
.pi-next.ready .pi-next-h{color:var(--acc-deep,#7A5E06)}
.pi-next-rows{margin:12px 0 4px}
.pi-next-row{display:flex;justify-content:space-between;gap:12px;padding:5px 0;font-size:13px}
.pi-next-row b{font-family:var(--num);font-variant-numeric:tabular-nums}
.pi-next-row.total{border-top:1px solid var(--line);margin-top:4px;padding-top:9px;font-weight:600}

/* A file on a message, and the clip that puts one there. */
.chatfile{display:flex;align-items:center;flex-wrap:wrap;margin:0 0 8px}
.chatfile:empty{display:none}
.clip{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  flex:0 0 34px;border:1px solid var(--line);border-radius:9px;color:var(--muted);
  background:var(--surface);transition:.15s var(--ease)}
.clip:hover{border-color:var(--acc);color:var(--ink)}
.clip::before{content:"";width:15px;height:15px;background:currentColor;
  -webkit-mask:var(--clip) center/contain no-repeat;mask:var(--clip) center/contain no-repeat}
:root{--clip:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M21 11.5 12.5 20a5 5 0 0 1-7-7l8-8a3.5 3.5 0 0 1 5 5l-8 8a2 2 0 0 1-3-3l7-7'/></svg>")}
.msg-file{display:flex;align-items:center;gap:7px;margin-top:7px;padding-top:7px;
  border-top:1px solid rgba(10,10,10,.10);font-size:12.5px}
.msg-file svg{flex:0 0 13px;opacity:.75}
.msg-file .sub2{margin-left:auto;white-space:nowrap}
.msg.me .msg-file{border-top-color:rgba(255,255,255,.28)}
.msg.me .msg-file a{color:inherit;text-decoration:underline}

.lblkind{margin:6px 0 10px}
.lblkind b{color:var(--ink)}

.od-files{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;margin-top:9px}
.od-files .btn.xs{margin-right:4px}

/* ---- tiles ---- */
.tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:20px}
.tiles.four{grid-template-columns:repeat(4,1fr)}
.tiles.three{grid-template-columns:repeat(3,1fr)}
.tiles.six{grid-template-columns:repeat(3,1fr)}
.tile{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:18px 18px 16px;position:relative;overflow:hidden;transition:.18s var(--ease)}
.tile:hover{border-color:#d3d3d9;box-shadow:0 12px 30px -20px rgba(0,0,0,.3);transform:translateY(-2px)}
.tile .lb{display:flex;align-items:center;gap:7px;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted-2)}
.tile .lb svg{width:14px;height:14px}
.tile .val{font-family:var(--display);font-weight:800;font-size:29px;letter-spacing:-.02em;margin:9px 0 3px;line-height:1}
.tile .val small{font-size:15px;color:var(--muted-2);font-weight:600}
.tile .sub{font-size:11.5px;color:var(--muted-2)}
.tile .sub b{color:#0a7a55}
.tile.accent{background:linear-gradient(150deg,#FBF2DE,#F3E6C6);border-color:rgba(188,151,69,.4);color:var(--ink)}
.tile.accent .lb{color:#8a733f}.tile.accent .lb svg{color:#8a6a1f}
.tile.accent .sub{color:#8a733f}.tile.accent .sub b{color:#8a6a1f}
.tile .trend{position:absolute;right:14px;top:16px;font-family:var(--display);font-weight:700;font-size:11px;padding:2px 8px;border-radius:20px}
.trend.up{background:rgba(188,151,69,.14);color:#0a7a55}
.trend.dn{background:rgba(255,92,108,.14);color:#c22f3d}
.tile .spark{position:absolute;left:0;right:0;bottom:0;height:34px;opacity:.5}

/* ---- cards / panels ---- */
.grid2{display:grid;grid-template-columns:1.6fr 1fr;gap:18px;margin-bottom:20px}
.grid2.rev{grid-template-columns:1fr 1.6fr}
.card{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:20px}
.card-h{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.card-h h3{font-size:15px;white-space:nowrap}
.card-h .hint{font-size:11.5px;color:var(--muted-2)}
.card-h .right{margin-left:auto;display:flex;gap:7px;align-items:center;flex-wrap:wrap}
.seg{display:inline-flex;background:var(--paper-2);border:1px solid var(--line);border-radius:9px;padding:2px;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.seg button{flex:none}
.seg button{border:0;background:none;font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);padding:5px 10px;border-radius:7px}
.seg button.on{background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08)}
.legend{display:flex;gap:14px;font-size:11.5px;color:var(--muted-2)}
.legend i{width:9px;height:9px;border-radius:3px;display:inline-block;margin-right:5px;vertical-align:middle}

.donut{display:inline-block}
.dn-num{fill:var(--ink);font-family:var(--display);font-weight:800;font-size:21px;text-anchor:middle}
.dn-sub{fill:#9a9aa2;font-family:var(--display);font-weight:700;font-size:9px;letter-spacing:.12em;text-transform:uppercase;text-anchor:middle}
.app.ops .dn-num{fill:#fff}
.areachart,.barchart{width:100%;height:170px;display:block}
.bar-in{fill:#26262c}.bar-out{fill:var(--acc)}
.ac-dot{fill:#fff;stroke:var(--acc);stroke-width:1.6}

/* ---- tables ---- */
.tbl-wrap{background:var(--surface);border:1px solid var(--line);border-radius:16px;overflow:hidden}
.tbl{width:100%;border-collapse:collapse;font-size:13px}
.tbl th{text-align:left;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted-2);padding:13px 16px;border-bottom:1px solid var(--line);white-space:nowrap;background:var(--paper-2)}
.tbl td{padding:13px 16px;border-bottom:1px solid var(--line-soft,#f0f0f0);vertical-align:middle}
.tbl tr:last-child td{border-bottom:0}
.tbl tbody tr{transition:background .12s}
.tbl tbody tr:hover{background:#fcfcfd}
.tbl .num{text-align:right;font-variant-numeric:tabular-nums}
.tbl .strong{font-weight:600}
.tid{font-family:var(--display);font-weight:700;color:var(--ink-2);letter-spacing:.02em}
.sub2{color:var(--muted-2);font-size:11.5px}
.hashlink{color:#0a7a55;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
.hashlink:hover{text-decoration:underline}
.hashlink svg{width:11px;height:11px;vertical-align:-1px;margin-left:2px}

/* ---- badges ---- */
.bdg{display:inline-flex;align-items:center;gap:5px;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;padding:3px 9px;border-radius:20px;white-space:nowrap}
.bdg::before{content:"";width:6px;height:6px;border-radius:50%}
.bdg.ok{background:rgba(188,151,69,.14);color:#0a7a55}.bdg.ok::before{background:var(--acc)}
.bdg.pend{background:rgba(255,176,32,.16);color:#8a5b00}.bdg.pend::before{background:var(--warn)}
.bdg.bad{background:rgba(255,92,108,.14);color:#c22f3d}.bdg.bad::before{background:var(--bad)}
.bdg.hold{background:rgba(120,120,130,.14);color:#54545c}.bdg.hold::before{background:#8a8a92}
.bdg.info{background:rgba(60,120,255,.12);color:#2b56c0}.bdg.info::before{background:#3c78ff}

/* ---- misc ---- */
.btn{display:inline-flex;align-items:center;gap:7px;font-family:var(--display);font-weight:700;font-size:12px;letter-spacing:.04em;text-transform:uppercase;padding:9px 16px;border-radius:10px;border:1.5px solid var(--act-edge);background:var(--act);color:var(--act-ink);transition:.16s var(--ease);cursor:pointer}
.btn:hover{background:var(--act-dk);border-color:var(--act-deep);box-shadow:0 2px 10px -4px rgba(10,10,10,.25)}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--line-soft)}
.btn.ghost:hover{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
.btn.sm{padding:6px 12px;font-size:11px}
.btn.acc{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
.btn.acc:hover{background:var(--act-dk);color:var(--act-ink);border-color:var(--act-deep);box-shadow:0 2px 10px -4px rgba(10,10,10,.25)}

/* small pill button, repeated row-level commerce actions (Add, Order, Restock) */
.btn.xs{display:inline-flex;align-items:center;gap:4px;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;padding:5px 12px;border-radius:20px;border:1px solid var(--act-line);background:var(--act-soft);color:var(--act-deep);transition:.14s var(--ease);white-space:nowrap;cursor:pointer}
.btn.xs:hover{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
.btn.xs.on{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
/* the primary action on a product card: solid, so the eye lands on it first */
.btn.xs.add{background:var(--act);border:1.5px solid var(--act-edge);color:var(--act-ink);box-shadow:0 1px 0 rgba(20,16,10,.08),0 0 0 2px rgba(168,132,46,.20)}
.btn.xs.add:hover{background:var(--act-dk);border-color:var(--act-deep);box-shadow:0 1px 0 rgba(20,16,10,.12),0 0 0 3px rgba(168,132,46,.26)}
/* already in the order: confirmed, not competing for the click */
.btn.xs.added{background:#F2EFE6;border:1.5px solid #DED9CC;color:#6f6857;box-shadow:none}
.btn.xs.added:hover{background:#EAE5D8;border-color:#CFC8B6;color:var(--ink)}

/* plain navigational text link, Edit, Open, View all, back links */
.rowlink{color:var(--ink-soft);font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.05em;text-transform:uppercase;transition:.14s var(--ease)}
.rowlink:hover{color:var(--act-deep)}

/* product thumbnail, table rows / cards */
.thumb{width:34px;height:34px;border-radius:9px;object-fit:cover;background:var(--paper-2);border:1px solid var(--line);flex:none;display:block}
.thumb.lg{width:52px;height:52px;border-radius:12px}
.thumb-row{display:flex;align-items:center;gap:11px}

/* form controls, standalone, work anywhere (not only inside .field) */
.inp,select.sel{width:100%;border:1px solid var(--line);border-radius:10px;padding:10px 13px;font-family:inherit;font-size:13px;background:var(--surface);color:var(--ink);transition:border-color .14s var(--ease),box-shadow .14s var(--ease)}
.inp:focus,select.sel:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.20)}
.inp::placeholder{color:#adaaa2}
select.sel{appearance:none;-webkit-appearance:none;cursor:pointer;padding-right:32px;background-repeat:no-repeat;background-position:right 11px center;background-size:15px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b6b73' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E")}
select.sel:hover{border-color:#c9c2b0}
select.sel.xs{padding:6px 26px 6px 10px;font-size:12.5px;border-radius:8px;background-size:13px;background-position:right 8px center}

.notice{display:flex;gap:11px;align-items:flex-start;background:rgba(255,176,32,.09);border:1px solid rgba(255,176,32,.3);border-radius:13px;padding:14px 16px;font-size:12.5px;color:#7a5300;margin-bottom:18px}
.notice.bad{background:rgba(255,92,108,.07);border-color:rgba(255,92,108,.3);color:#a02531}
.notice.acc{background:rgba(188,151,69,.08);border-color:rgba(188,151,69,.32);color:#0a6a49}
.notice svg{width:17px;height:17px;flex:0 0 17px;margin-top:1px}
.notice b{font-family:var(--display);letter-spacing:.02em}

.progress{height:8px;border-radius:20px;background:#eee;overflow:hidden}
.progress i{display:block;height:100%;border-radius:20px;background:var(--acc)}
.progress.warn i{background:var(--warn)}.progress.bad i{background:var(--bad)}

/* activation stepper */
.steps{display:flex;gap:0;margin:6px 0 2px}
.step{flex:1;text-align:center;position:relative;font-size:11px;color:var(--muted-2)}
.step .dot{width:26px;height:26px;border-radius:50%;background:#eee;color:var(--muted-2);display:grid;place-items:center;margin:0 auto 7px;font-family:var(--display);font-weight:800;font-size:12px;position:relative;z-index:2}
.step.done .dot{background:var(--acc);color:#1a1305}
.step.now .dot{background:var(--ink);color:#fff;box-shadow:0 0 0 5px rgba(10,10,10,.08)}
.step.done,.step.now{color:var(--ink);font-weight:600}
.step::before{content:"";position:absolute;top:13px;left:-50%;width:100%;height:2px;background:#eee;z-index:1}
.step:first-child::before{display:none}
.step.done::before,.step.now::before{background:var(--acc)}

/* reserve calendar */
.rescal{display:flex;flex-direction:column;gap:10px}
.rescal .rc{display:flex;align-items:center;gap:13px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--paper-2)}
.rescal .rc .dte{font-family:var(--display);font-weight:800;text-align:center;line-height:1;min-width:44px}
.rescal .rc .dte b{display:block;font-size:19px}.rescal .rc .dte span{font-size:10px;color:var(--muted-2);letter-spacing:.1em}
.rescal .rc .mid{flex:1}.rescal .rc .mid b{font-size:13px}.rescal .rc .mid p{margin:1px 0 0;font-size:11.5px;color:var(--muted-2)}
.rescal .rc .amt{font-family:var(--display);font-weight:800;font-size:15px}
.rescal .rc.next{border-color:var(--acc);background:rgba(188,151,69,.06)}

.kv{display:grid;grid-template-columns:auto 1fr;gap:10px 18px;font-size:13px}
.kv dt{color:var(--muted-2)}.kv dd{margin:0;text-align:right;font-weight:600}

.wallet{display:flex;align-items:center;gap:12px;padding:14px;border:1px solid var(--line);border-radius:13px;margin-bottom:11px;background:var(--surface)}
.wallet .net{font-family:var(--display);font-weight:800;font-size:12px;letter-spacing:.04em;padding:5px 9px;border-radius:8px;background:var(--ink);color:#fff}
.wallet .addr{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:#3a3a42;word-break:break-all}
.wallet .addr small{display:block;color:var(--muted-2);font-family:var(--display);letter-spacing:.1em;text-transform:uppercase;font-size:9.5px;margin-bottom:2px}

/* team / invite form */
.field{margin-bottom:13px}
.field label{display:block;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted-2);margin-bottom:6px}
.field .hint2{font-size:11px;color:var(--muted-2);margin-top:5px}

.avrow{display:flex;align-items:center;gap:11px}
.av-sm{width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,var(--acc),#8f7434);color:#1a1305;display:grid;place-items:center;font-family:var(--display);font-weight:800;font-size:11.5px;flex:0 0 30px}
.av-sm.mono{background:linear-gradient(135deg,#8a8a92,#54545c);color:#fff}
.avrow .nm2{font-weight:600;font-size:13px}
.avrow .em2{font-size:11.5px;color:var(--muted-2)}

/* role legend */
.rolegrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.rolecard{border:1px solid var(--line);border-radius:13px;padding:13px 14px;background:var(--surface)}
.rolecard h4{font-family:var(--display);font-weight:800;font-size:12px;letter-spacing:.04em;text-transform:uppercase;margin:0 0 6px}
.rolecard p{margin:0;font-size:11.5px;color:var(--muted-2);line-height:1.5}

/* brand studio queue */
.gaterow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.gatechip{display:inline-flex;align-items:center;gap:4px;font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:20px;background:var(--paper-2);border:1px solid var(--line);color:var(--muted-2)}
.gatechip.pass{background:rgba(188,151,69,.14);color:#0a7a55;border-color:transparent}
.gatechip.fail{background:rgba(255,92,108,.14);color:#c22f3d;border-color:transparent}
.gatechip.wait{background:rgba(255,176,32,.16);color:#8a5b00;border-color:transparent}
.bsthumb{width:42px;height:42px;border-radius:9px;overflow:hidden;background:var(--paper-2);flex:0 0 42px}
.bsthumb img{width:100%;height:100%;object-fit:cover}

.tbl tr.cat-row td{background:#FBF8F1;font-family:var(--display);font-weight:700;font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:#8a733f;padding:9px 16px;border-bottom:1px solid var(--line)}
.skucode{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--muted-2)}

/* chat */
.chat{display:flex;flex-direction:column;gap:12px;max-height:340px;overflow:auto;padding-right:4px}
.msg{max-width:78%;padding:11px 14px;border-radius:14px;font-size:13px;line-height:1.45}
.msg.them{background:var(--paper-2);border:1px solid var(--line);border-bottom-left-radius:4px}
.msg.me{align-self:flex-end;background:var(--ink);color:#fff;border-bottom-right-radius:4px}
.msg.ai{background:rgba(188,151,69,.09);border:1px solid rgba(188,151,69,.3);border-bottom-left-radius:4px}
.msg .who{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.1em;text-transform:uppercase;opacity:.6;margin-bottom:4px}
.chatbar{display:flex;gap:9px;margin-top:14px}
.chatbar input{flex:1;border:1px solid var(--line);border-radius:11px;padding:11px 14px;font-family:inherit;font-size:13px}
.chatbar input:focus{outline:none;border-color:var(--acc)}

/* internal skin, same cream/gold system as the client app, differentiated only by
   a slightly deeper cream on the sidebar and the "INTERNAL · OPS" tag, never by going dark */
.app.ops .sidebar{background:var(--surface-2)}
.app.ops .tbl tr.cat-row td{background:#474030;color:#EDDCA6}

/* login */
/* ---- Access gate ----
   The first thing anyone sees of either portal, so it carries the brand rather
   than being a password box on a blank page. Two panels: an illustration that
   says what the business is, and the form. Both apps share the structure and
   differ only in ground colour, so they read as one company with two doors. */
.gate{position:fixed;inset:0;z-index:99999;display:grid;grid-template-columns:1.15fr .85fr;
  font-family:var(--body);background:#F6F5F1;color:#0a0a0a}
.gate-art{position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:flex-end;
  padding:48px;background:#F1EEE6}
.gate-art svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.gate-art-copy{position:relative;z-index:2;max-width:430px}
.gate-eyebrow{font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.26em;
  text-transform:uppercase;color:#9A7C32}
.gate-art-copy h2{font-family:var(--display);font-weight:800;font-size:clamp(26px,3.1vw,40px);
  line-height:1.06;letter-spacing:-.01em;text-transform:none;margin:14px 0 12px;color:#1A1611}
.gate-art-copy p{margin:0;font-size:14px;line-height:1.65;color:#6B6255;max-width:390px}

.gate-panel{display:flex;align-items:center;justify-content:center;padding:40px 6vw;background:#FCFBF8}
.gate-form{width:100%;max-width:330px;text-align:center}
.gate-mark{height:52px;width:auto;margin-bottom:16px}
/* The mark is a dark bird with gold detail, so on the brown ground it would
   vanish. A warm plate behind it reads as a medallion rather than a patch. */
.gate--ops .gate-mark{height:44px;padding:11px 15px;border-radius:16px;background:#F6F2E9;
  box-shadow:0 0 0 1px rgba(212,172,87,.30),0 10px 30px -14px rgba(0,0,0,.65);box-sizing:content-box}
.gate-wordmark{font-family:var(--display);font-weight:800;font-size:27px;letter-spacing:.05em;line-height:1}
.gate-sub{font-family:var(--body);font-weight:600;font-size:9.5px;letter-spacing:.34em;
  text-transform:uppercase;color:#8a8177;margin-top:7px}
.gate-role{display:inline-block;margin:20px 0 26px;padding:5px 13px;border-radius:20px;
  font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;
  background:rgba(188,151,69,.13);border:1px solid rgba(188,151,69,.34);color:#8A6A1F}
.gate-label{display:block;text-align:left;font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.13em;text-transform:uppercase;color:#8a8177;margin-bottom:7px}
.gate-input{width:100%;padding:13px 15px;border-radius:11px;border:1.5px solid #ddd8cc;background:#fff;
  color:#0a0a0a;font-size:14.5px;font-family:var(--fig);letter-spacing:.02em;box-sizing:border-box;
  transition:.16s var(--ease)}
.gate-input::placeholder{font-family:var(--body);letter-spacing:0;color:#a8a094}
.gate-input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.18)}
.gate-input.bad{border-color:#b23b3b;box-shadow:0 0 0 3px rgba(178,59,59,.14)}
/* A door button, not a buy button. One hairline instead of a 2px border and a
   3px ring, which together were reading as three edges stacked. */
.gate-btn{width:100%;margin-top:11px;padding:12px;border-radius:10px;background:#F6D97A;color:#2A2008;
  border:1px solid rgba(150,116,36,.55);font-weight:700;font-family:var(--display);font-size:12px;
  text-transform:uppercase;letter-spacing:.09em;cursor:pointer;
  box-shadow:0 1px 2px rgba(20,16,10,.07);transition:.18s var(--ease)}
.gate-btn:hover{background:#FBE698;border-color:rgba(150,116,36,.8);
  box-shadow:0 3px 12px -4px rgba(150,116,36,.5)}
.gate-btn:active{transform:translateY(1px);box-shadow:0 1px 2px rgba(20,16,10,.10)}
.gate-btn:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.gate-note{font-size:12px;color:#8a8177;margin:16px 0 0;line-height:1.6;min-height:32px}
.gate-note.bad{color:#a4453f}
.gate--ops .gate-note.bad{color:#E8A0A0}
.gate-firstrun{background:rgba(188,151,69,.12);border:1px solid rgba(188,151,69,.32);border-radius:10px;
  padding:10px 12px;margin-bottom:16px;font-size:12.5px;line-height:1.55;color:#7a6122;text-align:left}
.gate--ops .gate-firstrun{background:rgba(212,172,87,.14);border-color:rgba(212,172,87,.34);color:#EFD9A4}
.gate-form form{text-align:left}
.gate-form .gate-btn{margin-top:16px}

/* Back office: the same door in the darker room. */
.gate--ops{background:#2B2119;color:#F2EBDF}
.gate--ops .gate-art{background:#241B14}
.gate--ops .gate-art-copy h2{color:#F7F2E8}
.gate--ops .gate-art-copy p{color:#A79B89}
.gate--ops .gate-eyebrow{color:#D4AC57}
.gate--ops .gate-panel{background:#332720}
.gate--ops .gate-wordmark{color:#F7F2E8}
.gate--ops .gate-sub,.gate--ops .gate-label,.gate--ops .gate-note{color:#A79B89}
.gate--ops .gate-role{background:rgba(212,172,87,.16);border-color:rgba(212,172,87,.38);color:#EFD9A4}
.gate--ops .gate-input{background:#241B14;border-color:#4A3A2C;color:#F7F2E8}
.gate--ops .gate-input::placeholder{color:#8C8071}
.gate--ops .gate-input:focus{border-color:#D4AC57;box-shadow:0 0 0 3px rgba(212,172,87,.22)}

/* The illustration: a peptide chain drifting behind the copy. Two chains at
   different speeds give depth without anything moving fast enough to distract. */
.gate-chain{animation:gateDrift 34s ease-in-out infinite alternate}
.gate-chain--back{animation-duration:52s;animation-direction:alternate-reverse}
.gate-node{animation:gatePulse 5.5s ease-in-out infinite}
.gate-halo{animation:gateHalo 13s ease-in-out infinite alternate}
@keyframes gateDrift{from{transform:translate3d(0,0,0)}to{transform:translate3d(-26px,16px,0)}}
@keyframes gatePulse{0%,100%{opacity:.55}50%{opacity:1}}
@keyframes gateHalo{from{opacity:.5;transform:scale(1)}to{opacity:.9;transform:scale(1.06)}}
.gate-ring{animation:gateSpin linear infinite}
.gate-vial{animation:gateFloat 17s ease-in-out infinite alternate}
@keyframes gateSpin{to{transform:rotate(360deg)}}
@keyframes gateFloat{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-16px,0)}}

/* Layers lean towards the pointer. The wrapper carries that transform; the
   drift keyframes stay on the group inside it. */
.gate-layer{transition:transform .5s cubic-bezier(.22,.8,.3,1)}

/* Armed: pointer on a button, or a field focused. The scene brightens and the
   chain quickens, so a control feels connected to the page behind it. Nothing
   moves position, so nothing distracts while you are typing. */
.gate-art svg{transition:opacity .5s var(--ease)}
.gate.is-armed .gate-chain{opacity:1 !important}
.gate.is-armed .gate-node{animation-duration:2.1s}
.gate.is-armed .gate-ring{animation-duration:22s !important}
.gate.is-armed .gate-vial{opacity:.42}
.gate.is-armed .gate-halo{opacity:1;transform:scale(1.1)}
.gate-vial,.gate-halo{transition:opacity .45s var(--ease),transform .6s var(--ease)}
.gate-chain{transition:opacity .45s var(--ease)}
.gate-node{transition:animation-duration .3s linear}

@media(max-width:900px){
  .gate{grid-template-columns:1fr;grid-template-rows:minmax(190px,26vh) 1fr}
  .gate-art{padding:24px;justify-content:flex-end}
  .gate-art-copy h2{font-size:23px;margin:9px 0 6px}
  .gate-art-copy p{display:none}
  .gate-panel{padding:32px 24px;align-items:flex-start}
  .gate-mark{height:42px}
}
@media(max-height:560px){
  .gate{grid-template-columns:1fr;grid-template-rows:1fr}
  .gate-art{display:none}
}
/* Anyone who has asked for less motion gets a still illustration, not a
   slightly slower one. */
@media(prefers-reduced-motion:reduce){
  .gate-chain,.gate-node,.gate-halo,.gate-ring,.gate-vial{animation:none}
  .gate-layer{transition:none}
}
.lf-field{margin-bottom:15px}
.lf-field label{display:block;font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted-2);margin-bottom:7px}
.lf-field input{width:100%;border:1px solid var(--line);border-radius:11px;padding:13px 15px;font-family:inherit;font-size:14px}
.lf-field input:focus{outline:none;border-color:var(--acc)}
.lf-row{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;color:var(--muted-2);margin-bottom:20px}
.lf-note{font-size:11.5px;color:var(--muted-2);margin-top:18px;text-align:center}
.lf-demo{margin-top:22px;padding:13px 15px;border:1px dashed var(--line);border-radius:12px;font-size:12px;color:var(--muted-2);background:var(--paper-2)}
.lf-demo b{font-family:var(--display);color:var(--ink)}

@media(max-width:1080px){.grid2,.grid2.rev{grid-template-columns:1fr}.tiles,.tiles.six,.tiles.four,.tiles.three{grid-template-columns:repeat(2,1fr)}}
@media(max-width:920px){
  .app{grid-template-columns:1fr}
  .sidebar{position:fixed;left:0;top:0;z-index:60;width:270px;max-width:84vw;transform:translateX(-100%);
    transition:transform .26s var(--ease);box-shadow:0 0 40px -10px rgba(10,10,10,.35)}
  .app.nav-open .sidebar{transform:none}
  .app.nav-open::before{content:"";position:fixed;inset:0;z-index:50;background:rgba(20,16,10,.42);
    animation:scrimin .2s var(--ease)}
  .menu-btn{display:grid !important}
}
@keyframes scrimin{from{opacity:0}to{opacity:1}}
body.nav-locked{overflow:hidden}
.menu-btn{display:none;width:38px;height:38px;border-radius:10px;border:1px solid var(--line);background:var(--surface);place-items:center}
@media(max-width:640px){.tiles,.tiles.six,.tiles.four,.tiles.three{grid-template-columns:1fr}.content{padding:18px}.topbar{padding:12px 16px}.tb-search{display:none}}

/* ---- domain switch (Supply / Payments) ---- */
.dsw{display:flex;gap:4px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:11px;padding:4px;margin:4px 0 16px}
.dsw-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:7px;border:0;background:none;color:rgba(255,255,255,.6);font-family:var(--display);font-weight:700;font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;padding:8px 6px;border-radius:8px;cursor:pointer;transition:.18s var(--ease)}
.dsw-btn svg{width:15px;height:15px}
.dsw-btn:hover{color:#fff}
.dsw-btn.on{background:var(--act);color:var(--act-ink)}
.sb-group{margin-bottom:2px}

/* ---- catalogue mini-cards ---- */
.mini-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px;margin-top:4px}
.mini{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--surface);transition:.2s var(--ease)}
.mini:hover{border-color:#d5d5d5;box-shadow:0 8px 22px rgba(10,10,10,.07)}
.mini-shot{aspect-ratio:1/1;background:linear-gradient(180deg,#fbfbfb,#f3f3f3);display:flex;align-items:center;justify-content:center}
.mini-shot img{width:100%;height:100%;object-fit:contain;padding:14px;mix-blend-mode:multiply}
.mini-cap{padding:12px 13px}
.mini-cap b{display:block;font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:15px;letter-spacing:-.01em;line-height:1}
.mini-cap small{color:var(--muted-2);font-size:12px}
.cat-dot{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:6px;vertical-align:middle}

/* ---- order builder ---- */
.modes{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mode{border:1px solid var(--line);border-radius:12px;padding:14px;cursor:pointer;display:block;transition:.18s var(--ease)}
.mode.on{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.mode input{margin-right:8px}
.mode b{font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:14px}
.mode small{display:block;color:var(--muted-2);font-size:12.5px;margin-top:4px;margin-left:22px}
.ord-list{display:flex;flex-direction:column}
.ord-row{display:flex;align-items:center;gap:10px;padding:11px 2px;border-bottom:1px solid var(--line)}
.ord-nm{flex:1}
.ord-nm b{font-weight:600}.ord-nm small{display:block;color:var(--muted-2);font-size:12px}
.qty{display:flex;align-items:center;border:1px solid var(--line);border-radius:9px;overflow:hidden}
.qty button{border:0;background:#f6f6f6;width:30px;height:30px;cursor:pointer;font-size:16px;color:var(--ink)}
.qty input{width:42px;border:0;text-align:center;font-family:var(--body);font-weight:600}
@media(max-width:640px){.modes{grid-template-columns:1fr}}

/* category chips, colour-coded pop filter, replaces a plain <select> */
.catchips{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0 4px}
.catchip{display:inline-flex;align-items:center;gap:6px;font-family:var(--body);font-weight:600;font-size:12px;padding:6px 13px;border-radius:20px;border:1.5px solid var(--line);background:var(--surface);color:var(--ink-soft);cursor:pointer;transition:.14s var(--ease)}
.catchip:hover{border-color:#c9c2b0}
.catchip.on{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
.catchip.pkg{font-weight:800;border-width:2px}
.catdot{width:8px;height:8px;border-radius:50%;flex:none}

/* quantity slider, volume pricing drags the unit price down as it moves right */
.qslide{display:flex;flex-direction:column;gap:4px;min-width:190px}
.qslide input[type=range]{-webkit-appearance:none;appearance:none;flex:1;min-width:40px;width:auto;height:5px;border-radius:4px;background:linear-gradient(90deg,var(--acc) 0%,var(--acc) var(--fill,50%),#e6e6e6 var(--fill,50%),#e6e6e6 100%);outline:none;cursor:pointer}
.qslide input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:17px;height:17px;border-radius:50%;background:var(--surface);border:2.5px solid var(--acc);cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.25)}
.qslide input[type=range]::-moz-range-thumb{width:17px;height:17px;border-radius:50%;background:var(--surface);border:2.5px solid var(--acc);cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.25);box-sizing:border-box}
.qslide input[type=range]::-moz-range-track{height:5px;border-radius:4px;background:#e6e6e6}

/* ---- order status timeline (client · light) ---- */
.timeline{display:flex;flex-direction:column}
.tl-step{display:flex;gap:12px;align-items:flex-start;position:relative}
.tl-step:not(:last-child)::before{content:"";position:absolute;left:10px;top:20px;bottom:-4px;width:2px;background:var(--line)}
.tl-step.done::before{background:var(--acc)}
.tl-dot{width:22px;height:22px;border-radius:50%;background:#e9e9ec;color:var(--muted-2);display:grid;place-items:center;font-size:11px;flex:none;z-index:1}
.tl-step.done .tl-dot{background:var(--acc);color:#1a1305}
.tl-step.now .tl-dot{background:var(--ink);color:#fff}
.tl-step b{font-weight:600;font-size:14px}
.tl-step small{display:block;color:var(--muted-2);font-size:12px;padding-bottom:14px}

/* ---- entitlements switchboard + client 360 (internal · dark) ---- */
.tgl{width:38px;height:22px;border-radius:12px;background:var(--acc);position:relative;flex:none;cursor:pointer;transition:.18s}
.tgl.off{background:#3a3a42}
.tgl::after{content:"";position:absolute;top:2px;left:18px;width:18px;height:18px;border-radius:50%;background:var(--surface);transition:.18s var(--ease)}
.tgl.off::after{left:2px}
.ent-card .ent-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 34px}
.ent-sec{font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted-2);margin:6px 0 2px}
.ent-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid #26262c}
.ent-row .el{flex:1}
.ent-row .el b{font-weight:600;font-size:14px}
.ent-row .el small{display:block;color:var(--muted-2);font-size:12px}
.ent-val{font-weight:600;font-size:13px;white-space:nowrap}
@media(max-width:820px){.ent-card .ent-grid{grid-template-columns:1fr;gap:0}}
.c360-head{margin-bottom:4px}
.c360-id{display:flex;align-items:center;gap:14px}
.c360-id .av.lg{width:46px;height:46px;font-size:18px;border-radius:12px;background:var(--acc);color:#1a1305;display:grid;place-items:center;font-family:var(--display);font-weight:800;flex:none}
.c360-id h2{font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:22px;letter-spacing:-.01em;color:var(--ink)}
.c360-id p{color:#5a5a62;font-size:13px;margin-top:2px}
.c360-badge{margin-left:auto;display:inline-flex;align-items:center;gap:5px}
.c360-split{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:16px 0 6px}
.ledger-sup{border-top:3px solid #6a6a72}
.ledger-pay{border-top:3px solid var(--acc)}
.tbl.sm td,.tbl.sm th{padding:7px 8px;font-size:12.5px}
@media(max-width:820px){.c360-split{grid-template-columns:1fr}}

/* ---- USDT pay panel (client · light) ---- */
.grid2>*{min-width:0}  /* let table cards scroll inside grid cells instead of blowing out the track */
.usdt-pay .net-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}
.net-tab{flex:1 1 88px;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:1px;border:1.5px solid var(--line);border-radius:11px;padding:9px 12px;background:var(--surface);cursor:pointer;font-family:var(--display);font-weight:800;font-size:13px;color:var(--ink);transition:.16s var(--ease)}
.net-tab small{font-family:var(--body);font-weight:500;font-size:11px;color:var(--muted-2);text-transform:none;letter-spacing:0}
.net-tab:hover{border-color:#c4c4c9}
.net-tab.on{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.pay-grid{display:grid;grid-template-columns:118px 1fr;gap:18px;align-items:start}
.qr{width:118px;height:118px;border:1px solid var(--line);border-radius:12px;padding:9px;background:var(--surface);flex:none}
.qr-p{width:100%;height:100%;border-radius:4px;background:repeating-conic-gradient(#0a0a0a 0 25%,#fff 0 50%) 0 0/16px 16px}
.pay-fields{min-width:0}
.pay-warn{display:flex;gap:8px;align-items:flex-start;background:#fff5f5;border:1px solid #f2c9cd;color:#a12633;border-radius:10px;padding:9px 11px;font-size:12.5px;margin-bottom:14px}
.pay-warn svg{flex:none;margin-top:1px}
.pay-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 0;border-bottom:1px solid var(--line)}
.pay-row.col{flex-direction:column;align-items:stretch;gap:6px}
.pl{font-size:12px;color:var(--muted-2);font-weight:600}
.pay-amt{font-family:var(--display);font-weight:800;font-size:20px}
.pay-amt small{font-size:12px;color:var(--muted-2);font-weight:600}
.addr-copy{display:flex;align-items:center;gap:8px;background:var(--paper-2);border:1px solid var(--line);border-radius:9px;padding:8px 10px}
.pay-addr{font-family:ui-monospace,Menlo,monospace;font-size:12px;word-break:break-all;flex:1;min-width:0;color:var(--ink)}
.copy-btn{flex:none;border:0;background:var(--ink);color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:5px 10px;border-radius:7px;cursor:pointer}
.copy-btn.done{background:#0a7a55}
.hash-in{display:flex;gap:8px;margin-top:5px}
.hash-in input{flex:1;min-width:0;border:1px solid var(--line);border-radius:9px;padding:9px 11px;font-family:var(--body);font-size:13px}
.pay-msg{font-size:12.5px;margin-top:9px;min-height:1em}
.pay-msg.ok{color:#0a7a55}.pay-msg.warn{color:#c22f3d}
#runBody input[type=checkbox],#v-treasury input[type=checkbox]{accent-color:#BC9745;width:15px;height:15px}
@media(max-width:520px){.pay-grid{grid-template-columns:1fr}.qr{margin:0 auto}}

/* ---- three-way reconciliation (internal · dark) ---- */
.recon3{display:grid;grid-template-columns:1fr auto 1fr auto 1fr;align-items:stretch;gap:12px}
.rec-node{border:1px solid #26262c;border-radius:14px;padding:16px 14px;text-align:center;background:#17171c;display:flex;flex-direction:column;justify-content:center}
.rec-node.hi{border-color:var(--acc);box-shadow:inset 0 0 0 1px rgba(188,151,69,.35)}
.rn-lb{display:flex;align-items:center;justify-content:center;gap:6px;font-family:var(--display);font-weight:700;font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted-2)}
.rn-amt{font-family:var(--display);font-weight:800;font-size:24px;color:#fff;margin:9px 0 3px}
.rn-amt small{font-size:12px;color:var(--muted-2);font-weight:700}
.rec-node small{color:var(--muted-2);font-size:11.5px}
.rec-link{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--acc);white-space:nowrap}
.rl-ico{width:26px;height:26px;border-radius:50%;background:rgba(188,151,69,.14);display:grid;place-items:center;color:var(--acc)}
@media(max-width:820px){.recon3{grid-template-columns:1fr}.rec-link{flex-direction:row;gap:7px;padding:3px 0}}
/* chain-watcher confirmation bar */
.confbar{display:inline-block;width:78px;height:6px;border-radius:3px;background:#2a2a30;overflow:hidden;vertical-align:middle;margin-right:8px}
.confbar span{display:block;height:100%;background:var(--acc);border-radius:3px}

/* ---------- Packaging locker (shared client + internal) ---------- */
.pkg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px}
.pkgcard{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--surface);cursor:pointer;transition:.2s var(--ease);text-align:left;padding:0;font:inherit;width:100%;display:block}
.pkgcard:hover{border-color:#d5d5d5;box-shadow:0 8px 22px rgba(10,10,10,.07)}
.pkgcard-shot{position:relative;aspect-ratio:4/3;background:linear-gradient(180deg,#fbfbfb,#f3f3f3);display:flex;align-items:center;justify-content:center}
.pkgcard-shot img{width:100%;height:100%;object-fit:contain;padding:14px;mix-blend-mode:multiply}
.pkgcard-n{position:absolute;right:9px;bottom:9px;background:rgba(255,255,255,.94);border:1px solid var(--line);border-radius:999px;font-size:10.5px;font-weight:600;padding:2px 8px;color:var(--ink-2)}
.pkgcard-cap{padding:11px 13px 13px}
.pkgcard-cap b{display:block;font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:14px;letter-spacing:-.01em;line-height:1.1;margin-bottom:3px}
.pkgcard-cap small{display:block;color:var(--ink-2);font-size:11px;margin-bottom:8px}

.opt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:14px}
.opt{border:1.5px solid var(--line);border-radius:13px;overflow:hidden;background:var(--surface);transition:.2s var(--ease);position:relative}
.opt.on{border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.18)}
.opt.declined{opacity:.5}
.opt.draft{border-style:dashed}
.opt-shot{aspect-ratio:1/1;background:linear-gradient(180deg,#fbfbfb,#f3f3f3);display:flex;align-items:center;justify-content:center}
.opt-shot img{width:100%;height:100%;object-fit:contain;padding:12px;mix-blend-mode:multiply}
.opt-cap{padding:10px 12px 12px}
.opt-cap b{display:flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;margin-bottom:3px;line-height:1.25}
.opt-sw{width:13px;height:13px;border-radius:4px;border:1px solid var(--line);flex:none}
.opt-cap small{display:block;color:var(--ink-2);font-size:11px;line-height:1.4}
.opt-act{display:flex;gap:7px;flex-wrap:wrap;margin-top:10px}

.pkgmsg{border-radius:12px;padding:10px 13px;background:var(--paper-2);border:1px solid var(--line)}
.pkgmsg.them{background:rgba(188,151,69,.09);border-color:rgba(188,151,69,.3)}
.pkgmsg-who{font-size:11px;font-weight:600;color:var(--ink-2);margin-bottom:4px}
.pkgmsg-who small{font-weight:400;color:var(--ink-2);margin-left:5px}
.pkgmsg p{margin:0;font-size:12.5px;line-height:1.55;color:var(--ink)}

/* ---------- Packaging order cards (client) ---------- */
.bigcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:18px}
.bigcard{border:1.5px solid var(--line);border-radius:16px;overflow:hidden;background:var(--surface);display:flex;flex-direction:column;transition:.2s var(--ease)}
.bigcard:hover{border-color:#d5d5d5;box-shadow:0 10px 26px rgba(10,10,10,.08)}
.bigcard.on{border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.18)}
.bigcard-shot{position:relative;aspect-ratio:4/3;background:linear-gradient(180deg,#fbfbfb,#f1f0ec);cursor:pointer}
.bigcard-shot img{width:100%;height:100%;object-fit:contain;padding:18px;mix-blend-mode:multiply}
.bigcard-shot .flag{position:absolute;left:10px;top:10px;background:rgba(255,255,255,.94);border:1px solid var(--line);border-radius:999px;font-size:10px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:3px 9px;color:var(--ink-2)}
.bigcard-shot .flag.rendered{background:var(--acc);border-color:var(--acc);color:var(--acc-ink)}
/* Grouped rather than evenly spaced: identity, then choice, then price, then
   terms, then the action. A uniform gap made all five read as one list. */
.bigcard-body{padding:15px 16px 16px;display:flex;flex-direction:column;gap:0;flex:1}
/* Two lines reserved whatever the name is, so every price in a row sits on one
   line. A grid you can scan down a column of prices is the whole point. */
.bigcard-body h4{margin:0 0 3px;min-height:2.6em;font-family:var(--body);font-weight:600;font-size:15px;letter-spacing:-.005em;line-height:1.3;text-transform:none;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* A stock badge is taller than the plain "in stock" text it replaces, which
   pushed the price of every out-of-stock card a few pixels down the row. One
   height for both, whatever sits in it. */
.bigcard-body .meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px;min-height:21px;
  color:var(--muted);font-size:11.5px;line-height:1.45}
/* Price: one figure to compare on, one line of detail beneath it. Giving the
   box its own row of equal weight made the card ask which number mattered. */
.bigcard-price{margin-top:12px;font-variant-numeric:tabular-nums lining-nums}
.bcp-main{display:flex;align-items:baseline;gap:7px}
/* Money on a product card is money, so it wears the same face as every other
   figure on the site: var(--fig), the one the cart totals, tiles and invoices
   use. It was the only price left in the body sans, which made it read as a
   heading rather than as a number. */
.bcp-main b{font-family:var(--fig);font-weight:600;font-size:18px;letter-spacing:-.02em;line-height:1}
.bcp-main span{font-family:var(--body);font-weight:500;font-size:11.5px;color:var(--muted);letter-spacing:0}
.bcp-sub{margin-top:4px;font-family:var(--fig);font-weight:500;font-size:11px;
  color:var(--muted);letter-spacing:-.01em}
.bigcard-foot{margin-top:auto;padding-top:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bigcard-qty{display:flex;align-items:center;gap:6px;margin-left:auto}
.bigcard-qty input{width:66px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;font:inherit;font-size:12.5px;text-align:right;background:var(--surface);color:var(--ink)}

/* ---------- Quantity + volume pricing (shared by both order flows) ---------- */
.qtybar{display:inline-flex;align-items:stretch;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--surface)}
.qtybtn{width:30px;border:0;background:var(--surface);color:var(--ink);font-size:15px;line-height:1;cursor:pointer;transition:.15s var(--ease)}
.qtybtn:hover:not(:disabled){background:var(--paper-2)}
.qtybtn:disabled{color:#c9c5bc;cursor:default}
.qtyin{width:64px;border:0;border-left:1px solid var(--line);border-right:1px solid var(--line);padding:7px 6px;font:inherit;font-size:13px;text-align:center;background:var(--surface);color:var(--ink);-moz-appearance:textfield}
.qtyin::-webkit-outer-spin-button,.qtyin::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.qtybar:focus-within{border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.18)}
.saves{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;min-height:1px}
.save{font-size:10.5px;font-weight:600;letter-spacing:.02em;padding:3px 8px;border-radius:999px;background:var(--paper-2);color:var(--ink-2);border:1px solid var(--line);font-variant-numeric:tabular-nums lining-nums}
.save.on{background:rgba(188,151,69,.15);border-color:rgba(188,151,69,.45);color:#7a6122}
/* Order terms: two facts, not one run-on sentence. Spaced apart so each is
   readable at a glance rather than parsed. */
.moq{display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  margin-top:11px;padding-top:9px;border-top:1px solid var(--line);
  font-size:10.5px;color:var(--muted);letter-spacing:.02em;
  /* so the digits line up down a column of cards */
  font-variant-numeric:tabular-nums lining-nums}

/* product card variant select */
.bigcard-onespec{display:flex;align-items:center;margin-top:11px;height:33px;padding:0 11px;
  border:1px solid transparent;border-radius:9px;font-size:12.5px;
  color:var(--muted);background:var(--paper-2);box-sizing:border-box}
.bigcard-body .sel{width:100%;height:33px;padding:0 30px 0 11px;border-radius:9px;font-family:var(--body);font-size:12.5px;margin-top:11px;background-color:#FCFBF8}
.bigcard-body .sel:hover{background-color:#fff}
.bigcard-line{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-top:9px}
.bigcard-total{font-family:var(--display);font-weight:700;font-size:15px}

/* ---------- Order page: catalogue left, cart alongside ---------- */
.ordergrid{display:grid;grid-template-columns:minmax(0,1fr) 348px;gap:18px;align-items:start}
/* The order column pins below the sticky topbar and scrolls on its own, so
   the total and the delivery form are reachable without scrolling past the
   whole catalogue. Two independent scrolls: the catalogue on the page, the
   order in its column. */
.cartcol{position:sticky;top:102px;max-height:calc(100vh - 118px);overflow-y:auto;overscroll-behavior:contain;
  display:flex;flex-direction:column;gap:18px;margin:-6px;padding:6px;scrollbar-width:thin;scrollbar-color:#ddd8cc transparent}
.cartcol::-webkit-scrollbar{width:6px}
.cartcol::-webkit-scrollbar-thumb{background:#ddd8cc;border-radius:3px}
.cartcol::-webkit-scrollbar-track{background:transparent}
@media(max-width:1180px){.ordergrid{grid-template-columns:minmax(0,1fr)}.cartcol{position:static;max-height:none;overflow:visible}}
.ordergrid .bigcards{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}

.cartline{display:flex;flex-direction:column;gap:8px;padding:13px 0;border-top:1px solid var(--line)}
.cartline:first-child{border-top:0;padding-top:2px}
.cl-top{display:flex;align-items:flex-start;gap:10px}
.cl-nm{flex:1;min-width:0;font-weight:600;font-size:13px;line-height:1.3}
.cl-nm small{display:block;font-weight:400;font-size:11px;color:var(--ink-2);margin-top:2px}
.cl-tot{font-family:var(--display);font-weight:700;font-size:14px;white-space:nowrap}
.cl-bot{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.cl-bot .qtybar{flex:none}
.cl-vials{font-size:11px;color:var(--ink-2)}
.cl-rm{font-size:11px;color:#c22f3d;margin-left:auto}
.cartempty{padding:14px 0;color:var(--ink-2);font-size:12.5px}

/* ---------- Surface roles: catalogue vs your order vs delivery ---------- */
/* Three stacked panels on one screen read as one wall unless the surfaces
   differ. Catalogue stays plain white; the order panel is warmed and edged in
   gold because it is the thing being built; delivery is cooled and quiet. */
.card.cart{background:linear-gradient(180deg,#FFFDF7,#FFFFFF 42%);border-color:rgba(188,151,69,.34);box-shadow:0 1px 0 rgba(188,151,69,.10)}
.card.cart .card-h{padding-bottom:12px;margin-bottom:4px;border-bottom:1px solid rgba(188,151,69,.22)}
.card.cart .card-h h3{color:#7a6122}
.card.delivery{background:#FAFAF7;border-color:#E3E1DA}
.card.delivery .card-h h3{color:var(--ink-soft)}

/* ---------- Cart line ---------- */
.cartline{display:block;padding:14px 0;border-top:1px solid rgba(188,151,69,.20)}
.cartline:first-child{border-top:0}
.cl-top{display:flex;align-items:baseline;gap:10px;margin-bottom:2px}
.cl-nm{flex:1;min-width:0;font-family:var(--body);font-weight:600;font-size:13.5px;line-height:1.3;letter-spacing:-.005em}
.cl-tot{font-family:var(--num);font-weight:700;font-size:14.5px;letter-spacing:-.01em;font-variant-numeric:tabular-nums lining-nums;white-space:nowrap}
.cl-meta{font-size:11px;color:var(--muted);letter-spacing:.01em;margin-bottom:10px}
.cl-bot{display:flex;align-items:center;gap:10px}
.cl-bot .qtybar{flex:none}
.cl-unit{font-size:11.5px;color:var(--ink-soft);font-variant-numeric:tabular-nums;line-height:1.35}
.cl-unit b{display:block;font-weight:600;color:var(--ink)}
.cl-rm{font-size:11px;color:#b23b3b;margin-left:auto;white-space:nowrap}
.cl-rm:hover{text-decoration:underline}
.cartline .saves{margin-top:9px}
.cartempty{padding:16px 0 4px;color:var(--muted);font-size:12.5px}

/* Every empty panel takes the same shape: one line saying what is missing,
   then the single button that fills it. Nothing dead-ends. */
.emptystate{display:flex;flex-direction:column;align-items:center;gap:12px;padding:34px 18px;text-align:center}
.emptystate p{margin:0;max-width:360px;color:var(--muted);font-size:13px;line-height:1.6}
.emptystate .btn{margin:0}
.cartempty .emptystate{padding:20px 0 6px}

/* summary rail under the lines */
.cart-sum{border-top:1px solid rgba(188,151,69,.22);margin-top:6px;padding-top:12px}
.cart-sum .kv dd{font-family:var(--num);font-variant-numeric:tabular-nums lining-nums}
.cart-sum .kv dd b{font-size:15px;letter-spacing:-.01em}

/* ---------- Card footer ---------- */
.bigcard-foot{margin-top:auto;padding-top:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bigcard-note{width:100%;font-size:10.5px;color:var(--muted);letter-spacing:.02em}
.bigcard-total{font-family:var(--num);font-weight:700;font-size:14.5px;font-variant-numeric:tabular-nums lining-nums}
.qtyin{font-family:var(--num);font-variant-numeric:tabular-nums lining-nums}
.tile .val{font-family:var(--num);font-weight:700;letter-spacing:-.02em;font-variant-numeric:tabular-nums lining-nums}

/* ---------- Category runs inside "All categories" ---------- */
/* Showing everything at once should not lose the grouping the chips give you,
   so the flat grid breaks into labelled runs instead. */
/* asking for a change, and the versions it produced */
.editrow{display:flex;gap:10px;align-items:center}
.editrow .inp{flex:1}
.versionstrip:empty{display:none}
.versionstrip{margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.vs-lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-bottom:9px}
.vs-row{display:flex;gap:9px;flex-wrap:wrap}
.vs{width:74px;height:60px;padding:0;border:1.5px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface);cursor:pointer;transition:.15s var(--ease)}
.vs img{width:100%;height:100%;object-fit:contain;display:block}
.vs:hover{border-color:var(--acc)}
.vs.on{border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.2)}
@media(max-width:640px){.editrow{flex-direction:column;align-items:stretch}}

/* mockup state on a packaging card */
.flag.rendering{background:#FBF2DE;color:#8a6a1f}
.flag.rendering::before{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;border:1.5px solid #8a6a1f;border-right-color:transparent;margin-right:6px;vertical-align:middle;animation:bxspin .8s linear infinite}
.flag.failed{background:#F5E1E1;color:#8E2F2F}
.flag.pending{background:#EDEAE3;color:#6A6259}

/* A price is the one field in the catalogue that changes weekly, so it sits in
   the row rather than behind a form. The confirmation is the border, briefly. */
/* Dividing a label order across compounds. The running total is the whole
   point of the panel, so it sits under the table and says where it stands. */
/* Labels reached from the order form. The note sits with the line it belongs
   to; the confirmation sits under the order, because what it changed is a
   second order the client is not looking at. */
.waitbox{margin:12px 0 4px;padding:12px 13px;border:1px solid var(--acc);border-radius:11px;
  background:var(--act-soft,rgba(248,220,126,.34))}
.waitbox-h{font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--acc-deep,#7A5E06);margin-bottom:6px}
.waitbox p{margin:6px 0 10px;line-height:1.5}
.waitbox .lblbox-row{border-top:0;padding:2px 0}

.lblbox{margin:10px 12px 0;padding:13px 14px;border:1px solid var(--line);border-radius:11px;background:var(--surface-2)}
.lblbox.ok{border-color:var(--good);background:#F3F8F5}
.lblbox-h{font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:#84848c;margin-bottom:6px}
.lblbox p{margin:0 0 10px;line-height:1.5}
.lblbox-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  padding:5px 0;font-size:12.5px;color:var(--ink-soft);border-top:1px solid var(--line)}
.lblbox-row:first-of-type{border-top:0}
.lblbox-row b{font-variant-numeric:tabular-nums;color:var(--ink);font-size:13px}
.lblbox-row.short b{color:var(--acc-deep,#7A5E06)}
.lblbox-act{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:11px}
.lblbox-said{margin-top:8px;font-size:12.5px;color:#2C5F42;font-weight:600}
.cartsaid{margin:8px 12px 0;padding:9px 11px;border:1px solid var(--good);border-radius:9px;
  background:#F2F8F4;font-size:12px;line-height:1.45;color:#2C5F42}
.lblask{margin:8px 12px 0;padding:12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}
.lblask b{font-size:13px}
.lblask p{margin:4px 0 10px}
.lblask-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

.cmptbl{margin-top:2px}
.cmptbl td,.cmptbl th{padding:8px 10px}
.cmptbl tr.on td{background:var(--surface-2)}
.cmptbl .qtyin{width:96px;text-align:right;font-variant-numeric:tabular-nums}
.cmpfoot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;padding:10px 12px;
  border:1px solid var(--line);border-radius:10px;background:var(--surface-2);
  font-size:12.5px;color:var(--ink-soft)}
.cmpfoot b{color:var(--bad);font-weight:600}
.cmpfoot.ok{border-color:var(--good);background:#F2F8F4}
.cmpfoot.ok b{color:var(--good)}

.priceedit{display:inline-flex;align-items:center;gap:3px;justify-content:flex-end}
.priceedit .cur{color:var(--muted);font-size:12px}
.inp.price{width:78px;text-align:right;padding:5px 8px;font-size:13px;font-variant-numeric:tabular-nums;
  transition:border-color .18s var(--ease),background .18s var(--ease)}
.inp.price:focus{border-color:var(--acc)}
.inp.price.saved{border-color:var(--good);background:#F1F8F3}
.inp.price.bad{border-color:var(--bad);background:#FCF3F3}
.tbl td .spec{font-size:13px;color:var(--ink)}
.tbl td .sku{font-family:var(--fig);font-size:10.5px;letter-spacing:.04em;color:var(--muted);margin-top:2px}
.tbl td.pname{vertical-align:top;padding-top:13px;width:210px;border-right:1px solid var(--line)}
@keyframes bxspin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.flag.rendering::before{animation:none}}

/* ---------- Catalogue as an order form ---------- */
/* One row per strength, the compound name spanning its rows, a quantity box
   on every line. A wholesale buyer fills a column, not a grid of cards. */
.cat-toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.cat-toolbar .searchbox{width:300px;max-width:100%}
.cat-rules{font-size:11.5px;color:var(--muted);white-space:nowrap}
.cat-rules b{color:var(--ink-soft);font-weight:600}
.reorder-line{font-size:12px;margin:-2px 0 12px}
.reorder-line:empty{display:none}
body.view-neworder .tb-search{display:none}
.catalog-wrap{border-radius:12px;overflow-x:auto}
.tbl.catalog th{padding:10px 10px}
.tbl.catalog td{padding:8px 10px}
.tbl.catalog td.pname{vertical-align:top;padding-top:11px;width:150px;border-right:1px solid var(--line-soft,#f0f0f0)}
.tbl.catalog td.pname b{font-weight:600;font-size:13px}
.tbl.catalog .besttag{display:block;font-family:var(--display);font-size:9.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#8a6a1f;margin-top:4px}
.tbl.catalog .spec{font-size:12.5px;white-space:nowrap}
.tbl.catalog .sku{font-family:var(--fig);font-size:10.5px;color:var(--muted);margin-top:1px}
.tbl.catalog .sku .bdg{font-size:9px;padding:1px 7px;margin-left:4px;vertical-align:middle}
.tbl.catalog tbody tr.on td{background:rgba(188,151,69,.08)}
.tbl.catalog tbody tr.off td:not(.pname){color:var(--muted)}
.tbl.catalog .qtycell{width:132px}
.tbl.catalog .qtybar.cat{border-radius:8px}
.tbl.catalog .qtybar.cat .qtybtn{width:28px;font-size:14px}
.tbl.catalog .qtyin.cat{width:52px;padding:6px 6px;text-align:center;border-top:0;border-bottom:0}
.tbl.catalog .qtyin.cat:focus{outline:0}
.tbl.catalog .qtyin.cat::placeholder{color:#c9c5bc}
.tbl.catalog .disc{display:block;font-family:var(--body);font-size:10.5px;color:#0a7a55;font-weight:600}

/* Setting one client's price on one product. The product name needs the room,
   the two numbers do not, and the button sits on the same baseline as the
   fields rather than under them. */
.cp-add{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.cp-f{display:flex;flex-direction:column;gap:5px;flex:0 1 360px;min-width:0}
.cp-f>span{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.cp-f.cp-n{flex:0 0 110px}
.cp-add .btn{flex:0 0 auto;height:39px}
@media(max-width:640px){
  .cp-f,.cp-f.cp-n{flex:1 1 100%}
  .cp-add .btn{width:100%;justify-content:center}
}
/* A negotiated price is not a discount off the scale, and must not read as one. */
.tbl.catalog .disc.agreed{color:var(--acc)}
.tbl.catalog tr.cat-row td .dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:8px;vertical-align:middle}
.tbl.catalog tr.cat-row td .ct{margin-left:8px;font-family:var(--body);font-weight:400;font-size:11px;letter-spacing:0;text-transform:none;color:var(--muted)}
@media(max-width:640px){.cat-rules{white-space:normal}.tbl.catalog td.pname{width:auto}}

/* Categories read down the left of the catalogue rather than wrapping across
   three lines above it: a list of eleven is scanned, not read. */
.catgrid{display:grid;grid-template-columns:158px minmax(0,1fr);gap:0 16px;margin-top:14px}
.catmain{min-width:0}
.cattabs{display:flex;flex-direction:column;gap:1px;border-right:1px solid var(--line);padding-right:14px;align-self:start;position:sticky;top:104px}
.cattab{display:flex;align-items:flex-start;gap:8px;width:100%;text-align:left;background:none;border:0;border-radius:8px;
  padding:6px 9px;font:inherit;font-size:12.5px;line-height:1.3;color:var(--muted);cursor:pointer;transition:.12s var(--ease)}
/* A long category name wraps; the dot and the count stay on its first line so
   the column still reads as a list rather than a ragged block. */
.cattab .dot{width:7px;height:7px;border-radius:50%;flex:none;opacity:.85;margin-top:5px}
.cattab .n{margin-left:auto;padding-top:1px;font-family:var(--fig);font-size:10.5px;color:var(--muted-2);font-variant-numeric:tabular-nums}
.cattab:hover{background:rgba(10,10,10,.035);color:var(--ink)}
.cattab.on{background:var(--act-soft,rgba(188,151,69,.13));color:var(--ink);font-weight:600}
.cattab.on .n{color:var(--ink-soft)}
.cattab:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
@media(max-width:1180px){
  .catgrid{grid-template-columns:1fr;gap:0}
  .cattabs{flex-direction:row;flex-wrap:wrap;border-right:0;border-bottom:1px solid var(--line);
    padding:0 0 10px;margin-bottom:12px;position:static;gap:2px 6px}
  .cattab{width:auto}
  .cattab .n{margin-left:4px}
}
.catalog-card .searchmeta{margin-top:10px}

/* Softer table: hairlines only between rows, category rows as plain labels. */
.tbl.catalog td.pname{border-right:0}
.tbl.catalog tr.cat-row td{background:transparent;border-bottom:0;padding:22px 10px 6px;color:var(--ink-soft);font-size:10.5px;letter-spacing:.14em}
.tbl.catalog tbody tr:first-child.cat-row td{padding-top:12px}
.tbl.catalog tbody tr:hover td{background:#FCFBF8}
.tbl.catalog tbody tr.on:hover td{background:rgba(188,151,69,.11)}

/* Order panel foot and the delivery step */
.cart-foot{margin-top:10px;text-align:center;font-size:11.5px}
.checkout-grid{margin-top:4px}
.fieldgrid{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.fieldgrid .span2{grid-column:1/-1}
@media(max-width:640px){.fieldgrid{grid-template-columns:1fr}}
.coline{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:10px 0;border-top:1px solid rgba(188,151,69,.2)}
.coline:first-child{border-top:0;padding-top:2px}
.coline b{display:block;font-size:13px;font-weight:600}
.coline small{display:block;font-size:11px;color:var(--muted);margin-top:2px}
.coline > span{font-family:var(--fig);font-weight:600;font-size:13px;white-space:nowrap;font-variant-numeric:tabular-nums}

.catsec + .catsec{margin-top:26px}
.catsec-h{display:flex;align-items:center;gap:9px;margin:0 0 13px}
.catsec-h .dot{width:9px;height:9px;border-radius:50%;flex:none}
.catsec-h .nm{font-family:var(--display);font-weight:700;font-size:11px;letter-spacing:.14em;text-transform:uppercase}
.catsec-h .ct{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}
.catsec-h .rule{flex:1;height:1px;background:var(--line)}
.bigcard-cat{position:absolute;left:0;top:0;width:100%;height:3px}

/* ---------- Order summary + primary action ---------- */
.sumrow{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:5px 0;font-size:12.5px;color:var(--ink-soft)}
.sumrow b{font-family:var(--num);font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums lining-nums}
.sumrow.saved{color:#3f7a52}.sumrow.saved b{color:#3f7a52}
.sumrow.total{margin-top:6px;padding-top:10px;border-top:1px solid rgba(188,151,69,.28);font-size:13px;color:var(--ink);font-weight:600}
.sumrow.total b{font-size:20px;font-weight:700;letter-spacing:-.02em}
.btn.cta{width:100%;justify-content:center;padding:14px 18px;font-size:12.5px;border-radius:12px;background:var(--act);border:2px solid var(--act-edge);color:var(--act-ink);margin-top:14px;box-shadow:0 1px 0 rgba(20,16,10,.10),0 0 0 3px rgba(168,132,46,.24)}
.btn.cta:hover{background:var(--act-dk);border-color:var(--act-deep);box-shadow:0 1px 0 rgba(20,16,10,.14),0 0 0 4px rgba(168,132,46,.30)}
.btn.cta.is-off{background:#EDE9DF;border:2px solid #E0DACA;color:#a49b86;cursor:default;box-shadow:none}
.cta-note{text-align:center;font-size:10.5px;color:var(--muted);margin-top:8px;letter-spacing:.02em}
.field-bad .inp{border-color:#c22f3d;box-shadow:0 0 0 3px rgba(194,47,61,.12)}
.stepnum{display:inline-grid;place-items:center;width:19px;height:19px;border-radius:50%;background:var(--act);color:var(--act-ink);font-family:var(--num);font-weight:700;font-size:11px;margin-right:2px}
.card.delivery .stepnum{background:#dcd8cc;color:var(--ink-soft)}

/* ---------- Optional add-on row (insurance) ---------- */
.optrow{display:flex;align-items:flex-start;gap:10px;padding:12px 13px;margin-top:12px;border:1px solid var(--line);border-radius:12px;background:var(--surface);cursor:pointer;transition:.16s var(--ease)}
.optrow:hover{border-color:var(--act-line)}
.optrow input[type=checkbox]{width:16px;height:16px;margin:1px 0 0;accent-color:var(--act);flex:none;cursor:pointer}
.optrow-txt{flex:1;min-width:0}
.optrow-txt b{display:block;font-size:12.5px;font-weight:600;line-height:1.3}
.optrow-txt small{display:block;font-size:11px;color:var(--muted);line-height:1.45;margin-top:3px}
.optrow-amt{font-family:var(--fig);font-weight:600;font-size:12.5px;font-variant-numeric:tabular-nums lining-nums;white-space:nowrap}
.optrow.on{background:var(--act-soft);border-color:var(--act-edge)}

/* ---------- Invoice ---------- */
.invoice{padding:0;overflow:hidden}
.inv-head{display:flex;align-items:flex-start;gap:20px;padding:24px 26px;background:var(--paper-2);border-bottom:1px solid var(--line);flex-wrap:wrap}
.inv-brand{font-family:var(--display);font-weight:800;font-size:19px;letter-spacing:.03em;line-height:1}
.inv-brand span{display:block;font-family:var(--body);font-weight:600;font-size:9.5px;letter-spacing:.26em;text-transform:uppercase;color:var(--muted);margin-top:5px}
.inv-id{margin-left:auto;text-align:right}
.inv-id .lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.inv-id .no{font-family:var(--num);font-weight:700;font-size:21px;letter-spacing:-.01em;margin:3px 0 7px;font-variant-numeric:tabular-nums lining-nums}
.inv-parties{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;padding:22px 26px;border-bottom:1px solid var(--line)}
@media(max-width:820px){.inv-parties{grid-template-columns:1fr}}
.inv-parties h5{margin:0 0 8px;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.inv-parties .body{font-size:12.5px;line-height:1.65;color:var(--ink)}
.inv-parties .body b{font-weight:600}
.inv-dl{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font-size:12.5px}
.inv-dl dt{color:var(--muted)}
.inv-dl dd{margin:0;text-align:right;font-weight:600;font-variant-numeric:tabular-nums}
.inv-tot{display:flex;justify-content:flex-end;padding:18px 26px 24px}
.inv-tot .box{width:100%;max-width:320px}
.inv-tot .sumrow.total{border-top-color:var(--ink)}
.inv-note{padding:0 26px 22px;font-size:11px;color:var(--muted);line-height:1.6}

.pay-net{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.pay-net button{flex:1;min-width:96px;border:1.5px solid var(--line);background:var(--surface);border-radius:11px;padding:9px 8px;cursor:pointer;font-family:var(--body);font-size:12px;font-weight:600;color:var(--ink-2);transition:.15s var(--ease)}
.pay-net button small{display:block;font-weight:400;font-size:10.5px;color:var(--muted);margin-top:2px}
.pay-net button.on{border-color:var(--acc);background:rgba(188,151,69,.10);color:var(--ink)}
.pay-addr-box{border:1px solid var(--line);border-radius:12px;padding:13px 15px;background:var(--paper-2);margin-bottom:14px}
.pay-addr-box .lb{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-family:var(--display);font-weight:700}
.pay-addr-box .val{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;word-break:break-all;margin-top:5px;color:var(--ink)}
.pay-addr-box .val.pending{font-family:var(--body);color:#8a5b00;font-style:italic}
.pay-amt-box{display:flex;align-items:baseline;justify-content:space-between;gap:12px;border:1.5px solid var(--acc);background:rgba(188,151,69,.10);border-radius:12px;padding:12px 15px;margin-bottom:14px}
.pay-amt-box span{font-size:12px;color:#7a6122;font-weight:600}
.pay-amt-box b{font-family:var(--num);font-weight:700;font-size:19px;letter-spacing:-.02em;font-variant-numeric:tabular-nums lining-nums}

.upsell{border:1.5px dashed rgba(188,151,69,.55);background:linear-gradient(180deg,#FFFDF7,#fff);border-radius:16px;padding:20px}
.upsell h4{margin:0 0 6px;font-family:var(--display);font-weight:800;text-transform:uppercase;font-size:15px;letter-spacing:-.01em}
.upsell p{margin:0 0 14px;font-size:12.5px;line-height:1.6;color:var(--ink-soft)}
.upsell-thumbs{display:flex;gap:8px;margin-bottom:14px}
.upsell-thumbs img{width:54px;height:54px;object-fit:contain;border:1px solid var(--line);border-radius:10px;background:var(--surface);padding:5px}

/* ---------- Catalogue search ---------- */
.searchbox{position:relative;display:flex;align-items:center;width:260px}
.searchbox svg{position:absolute;left:12px;pointer-events:none;color:#9a9188}
.searchbox input{width:100%;border:1px solid var(--line);border-radius:11px;padding:10px 34px 10px 36px;font-family:var(--body);font-size:13px;background:var(--surface);color:var(--ink);transition:border-color .14s var(--ease),box-shadow .14s var(--ease)}
.searchbox input::placeholder{color:#a8a49b}
.searchbox input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.20)}
.searchbox .clr{position:absolute;right:8px;width:20px;height:20px;border:0;border-radius:50%;background:var(--surface-3);color:var(--ink-soft);font-size:13px;line-height:1;cursor:pointer;display:none;place-items:center}
.searchbox .clr:hover{background:#ddd8cc}
.searchbox.has .clr{display:grid}
@media(max-width:560px){.searchbox{width:100%}}
.searchmeta{font-size:11.5px;color:var(--muted);margin:-4px 0 14px}
.searchmeta b{color:var(--ink);font-weight:600}

/* summary rows read as a statement: quantities, then money, then the total */
.cart-sum .sumrow + .sumrow{border-top:1px solid rgba(188,151,69,.16)}
.cart-sum .sumrow{padding:8px 0}
.cart-sum .sumrow.total{border-top:1.5px solid rgba(188,151,69,.45);margin-top:2px;padding-top:12px}
.inv-tot .sumrow + .sumrow{border-top:1px solid var(--line)}
.inv-tot .sumrow{padding:8px 0}

/* search sits on the filter row so it lines up with the chips and the grid */
.catbar{display:flex;align-items:flex-start;gap:14px;margin-bottom:14px;flex-wrap:wrap}
.catbar .searchbox{flex:0 0 260px}
.catbar > div:last-child{flex:1;min-width:220px}
@media(max-width:700px){.catbar{flex-direction:column}.catbar .searchbox{flex:0 0 auto;width:100%}}
/* the commit point, at the end of the details it depends on */
.checkout{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}

/* ---------- Best sellers ---------- */
.bestbadge{position:absolute;left:9px;top:9px;display:inline-flex;align-items:center;gap:5px;background:var(--ink);color:#fff;border-radius:999px;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.08em;text-transform:uppercase;padding:3px 9px;z-index:2}
.bestbadge b{font-family:var(--num);font-weight:700;color:var(--acc)}
.catchip.best{border-color:var(--act-line);color:var(--act-deep);font-weight:700}
.catchip.best.on{background:var(--act);border-color:var(--act-edge);color:var(--act-ink)}
.reorder{border:1px dashed rgba(188,151,69,.5);border-radius:12px;padding:13px 14px;margin-top:12px;background:var(--surface)}
.reorder .lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-bottom:5px}
.reorder .nm{font-size:12.5px;font-weight:600;margin-bottom:3px}
.reorder .mt{font-size:11px;color:var(--muted);margin-bottom:10px}

/* ---------- Order tracker: animate the progress, not the whole page ---------- */
.steps{margin:14px 0 4px}
.step .dot{transition:background .45s var(--ease),color .45s var(--ease),box-shadow .45s var(--ease),transform .45s var(--ease)}
.step::before{background:#eee;transform-origin:left center}
/* the connector fills toward the reached step */
.step.done::before,.step.now::before{background:var(--acc);animation:stepfill .55s var(--ease) both}
.step.done .dot{animation:stepin .4s var(--ease) both}
.step.now .dot{transform:scale(1.06)}
.step.now .dot::after{content:"";position:absolute;inset:-5px;border-radius:50%;border:2px solid var(--ink);opacity:.25;animation:steppulse 2.2s var(--ease) infinite}
.step .lbl{display:block;transition:color .3s var(--ease)}
@keyframes stepfill{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes stepin{from{transform:scale(.6);opacity:.4}to{transform:scale(1);opacity:1}}
@keyframes steppulse{0%{transform:scale(1);opacity:.28}70%{transform:scale(1.5);opacity:0}100%{transform:scale(1.5);opacity:0}}
@media(prefers-reduced-motion:reduce){
  .step.done::before,.step.now::before,.step.done .dot{animation:none}
  .step.now .dot::after{animation:none;opacity:.2}
}

/* ---------- Order page surfaces ---------- */
.card.ordhead{background:linear-gradient(180deg,#FBFAF6,#fff 60%);border-color:#E3E0D7}
.card.paynow{background:linear-gradient(180deg,#FFFDF7,#fff 55%);border-color:rgba(188,151,69,.45);box-shadow:0 2px 0 rgba(188,151,69,.10)}
.card.paid{background:#F7FAF7;border-color:rgba(63,122,82,.35)}
.paynow-grid{display:flex;align-items:center;gap:20px;flex-wrap:wrap}
.paynow-amt{flex:1;min-width:180px}
.paynow-amt .lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.paynow-amt .val{font-family:var(--num);font-weight:700;font-size:30px;letter-spacing:-.025em;line-height:1.1;margin-top:5px;font-variant-numeric:tabular-nums lining-nums}
.paynow-amt .sub{font-size:11.5px;color:var(--muted);margin-top:5px}
.paynow-act{display:flex;flex-direction:column;gap:7px;min-width:210px}
.paynow-act .btn{width:100%;justify-content:center}
.paynow-steps{display:flex;gap:16px;flex-wrap:wrap;margin-top:16px;padding-top:14px;border-top:1px solid rgba(188,151,69,.24)}
.paynow-steps div{flex:1;min-width:150px;font-size:11.5px;color:var(--ink-soft);line-height:1.5}
.paynow-steps b{display:block;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:4px}

/* numbers on the order page match the order builder */
/* These two views used to set money back to the body sans, so an order line
   read in a different face from the same figure on every other screen. */
#v-orderdetail .tbl .num,#v-invoice .tbl .num{font-family:var(--fig);font-variant-numeric:tabular-nums lining-nums}
#v-orderdetail .tbl td.strong,#v-invoice .tbl td.strong{font-family:var(--body);font-weight:600}
#v-orderdetail .kv dd,#v-invoice .kv dd{font-family:var(--fig);font-variant-numeric:tabular-nums lining-nums}

/* ---------- Category rail: one line instead of four ---------- */
/* Nine categories wrapped to four rows and pushed the grid below the fold.
   One scrollable line keeps them all reachable and gives the products the space. */
.chiprail{margin:0 0 14px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;-webkit-overflow-scrolling:touch}
.chiprail::-webkit-scrollbar{height:5px}
.chiprail::-webkit-scrollbar-thumb{background:#ddd8cc;border-radius:3px}
.chiprail::-webkit-scrollbar-track{background:transparent}
.chiprail .catchips{flex-wrap:nowrap;margin:0;padding-bottom:6px;width:max-content}
.chiprail .catchip{white-space:nowrap;font-size:11.5px;padding:6px 12px}
.card-h .searchbox{width:230px}
@media(max-width:700px){.card-h .right{width:100%}.card-h .searchbox{width:100%}}

/* ---------- Commit block ---------- */
.co-recap{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:12px}
.co-recap span{font-size:11px;font-weight:600;letter-spacing:.02em;padding:3px 9px;border-radius:999px;background:var(--paper-2);color:var(--ink-2);border:1px solid var(--line);font-variant-numeric:tabular-nums}
.co-recap span.ok{background:rgba(63,122,82,.10);border-color:rgba(63,122,82,.35);color:#2f6b42}
.co-recap span.add{background:var(--surface);border-style:dashed;border-color:rgba(188,151,69,.55);padding:2px 9px}
.co-recap span.add .rowlink{font-size:11px}
.co-trust{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:7px}
.co-trust li{position:relative;padding-left:20px;font-size:11.5px;line-height:1.5;color:var(--ink-soft)}
.co-trust li::before{content:"";position:absolute;left:0;top:4px;width:12px;height:12px;border-radius:50%;background:rgba(63,122,82,.14);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%233f7a52' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='5 13 10 18 19 6'/%3E%3C/svg%3E");
  background-size:9px;background-position:center;background-repeat:no-repeat}
.optrow.flash{animation:optflash 1.2s var(--ease)}
@keyframes optflash{0%,100%{box-shadow:0 0 0 0 rgba(188,151,69,0)}30%{box-shadow:0 0 0 5px rgba(188,151,69,.28)}}
@media(prefers-reduced-motion:reduce){.optrow.flash{animation:none;border-color:var(--acc)}}
.pay-amt-box{flex-wrap:wrap}
.pay-amt-box .btn.xs{margin-left:auto}
.co-recap span.warn{background:rgba(196,122,46,.12);border-color:rgba(196,122,46,.4);color:#8a5b00}
.co-trust li b{font-weight:600;color:var(--ink)}

/* ---------- Illustrated order tracker ---------- */
.steps{display:flex;margin:20px 0 6px}
.step .dot{width:44px;height:44px;border-radius:50%;background:#F1EFE9;color:#b3ab9c;display:grid;place-items:center;margin:0 auto 10px;
  transition:background .45s var(--ease),color .45s var(--ease),box-shadow .45s var(--ease),transform .45s var(--ease)}
.step .dot svg{width:22px;height:22px}
.step::before{top:22px;height:2px}
.step.done .dot{background:rgba(188,151,69,.18);color:#8a6a1f;box-shadow:none}
.step.now .dot{background:var(--ink);color:#fff;box-shadow:0 0 0 6px rgba(10,10,10,.06);transform:none}
.step .lbl{font-size:11.5px;letter-spacing:.01em}

/* a completed stage draws its tick; the live stage keeps working */
.step.done .tick{stroke-dasharray:14;stroke-dashoffset:14;animation:tickdraw .5s var(--ease) .15s forwards}
.step.now.st-confirm .tick{stroke-dasharray:14;stroke-dashoffset:14;animation:tickdraw 2.6s var(--ease) infinite}
.step.now.st-packing .lid{transform-origin:12px 8px;animation:lidseal 2.4s var(--ease) infinite}
.step.now.st-shipped .van{animation:vanroll 2.2s var(--ease) infinite}
.step.now.st-shipped .wheel{animation:wheelspin 2.2s linear infinite;transform-origin:center}
.step.now.st-shipped .road{opacity:.25;stroke-dasharray:3 4;animation:roadrun 1.1s linear infinite}
.step.now.st-delivered .tick{stroke-dasharray:14;stroke-dashoffset:14;animation:tickdraw .6s var(--ease) forwards}
@keyframes tickdraw{to{stroke-dashoffset:0}}
@keyframes lidseal{0%,100%{transform:translateY(0)}45%{transform:translateY(-2.5px)}}
@keyframes vanroll{0%,100%{transform:translateX(0)}50%{transform:translateX(1.4px)}}
@keyframes wheelspin{to{transform:rotate(360deg)}}
@keyframes roadrun{to{stroke-dashoffset:-7}}
@media(prefers-reduced-motion:reduce){
  .step .tick,.step .lid,.step .van,.step .wheel,.step .road{animation:none!important;stroke-dashoffset:0!important}
}

/* payment panel: amount, reference, action - three aligned columns */
.paynow-grid{align-items:stretch;gap:24px}
.paynow-amt{display:flex;flex-direction:column;justify-content:center}
.paynow-ref{display:flex;flex-direction:column;justify-content:center;gap:5px;padding:0 24px;border-left:1px solid rgba(188,151,69,.28);border-right:1px solid rgba(188,151,69,.28)}
.paynow-ref .lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.paynow-ref b{font-family:var(--num);font-weight:700;font-size:16px;letter-spacing:-.01em;font-variant-numeric:tabular-nums lining-nums}
.paynow-act{justify-content:center;min-width:230px}
.btn.cta.ghost-cta{background:transparent;border-color:var(--ink);color:var(--ink)}
.btn.cta.ghost-cta:hover{background:var(--ink);border-color:var(--ink);color:#fff}
@media(max-width:820px){.paynow-ref{border:0;padding:0}}
/* header actions sit on one baseline */
.card-h .right .btn.xs{align-self:center}

/* ---------- Category rail: show that it keeps going ---------- */
.railwrap{position:relative;margin:0 0 14px}
.railwrap .chiprail{margin:0}
/* fade on whichever side has more to reveal */
.railwrap::after,.railwrap::before{content:"";position:absolute;top:0;bottom:6px;width:52px;pointer-events:none;opacity:0;transition:opacity .2s var(--ease)}
.railwrap::after{right:0;background:linear-gradient(90deg,rgba(255,255,255,0),#fff 72%)}
.railwrap::before{left:0;background:linear-gradient(270deg,rgba(255,255,255,0),#fff 72%);z-index:1}
.railwrap.more::after{opacity:1}
.railwrap.scrolled::before{opacity:1}
.rail-next,.rail-prev{position:absolute;right:2px;top:2px;width:28px;height:28px;border-radius:50%;border:1px solid var(--line);background:var(--surface);
  color:var(--ink);display:none;place-items:center;cursor:pointer;z-index:2;box-shadow:0 2px 8px -3px rgba(10,10,10,.25);transition:.15s var(--ease)}
.rail-prev{right:auto;left:2px}
.rail-next:hover,.rail-prev:hover{border-color:var(--acc);background:var(--acc);color:var(--acc-ink)}
.railwrap.more .rail-next{display:grid}
.railwrap.scrolled .rail-prev{display:grid}

/* ---------- Hero figures ---------- */
/* Amounts you act on get the mono face: precise, aligned, a bit instrument-like,
   which suits an invoice settled on-chain. Inline numbers stay in Inter. */
.paynow-amt .val,.inv-id .no,.sumrow.total b,.pay-amt-box b,.tile .val,.paynow-ref b{
  font-family:var(--fig);font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.inv-id .no{letter-spacing:.02em;font-weight:600}
.paynow-ref b{letter-spacing:.02em;font-size:15px}
.pay-addr-box .val{font-family:var(--fig);font-size:12px;letter-spacing:.01em}
.cl-tot,.bigcard-total,.inv-tot .sumrow b,.cart-sum .sumrow b{font-family:var(--fig);font-weight:500;letter-spacing:-.01em}
.cart-sum .sumrow.total b,.inv-tot .sumrow.total b{font-weight:600}
.tbl .num{font-family:var(--fig);font-weight:400;font-size:12.5px;letter-spacing:-.01em}
.tbl .num.strong,.tbl td.num.strong{font-weight:600}

/* ---------- Settlement actions carry their own semantic colour ---------- */
/* Gold stays the brand accent. Money actions read green because that is what
   the app already uses for settled, so paying and paid belong to one family. */
.btn.pay{background:#2f6b42;border:2px solid #245434;color:#fff;box-shadow:0 1px 0 rgba(20,16,10,.10),0 0 0 3px rgba(47,107,66,.16)}
.btn.pay:hover{background:#255736;border-color:#1c422a;box-shadow:0 1px 0 rgba(20,16,10,.14),0 0 0 4px rgba(47,107,66,.22)}
.btn.pay.is-off{background:#E7E4DB;border:2px solid #DED9CC;color:#a49b86;cursor:default;box-shadow:none}
.card.paynow{border-color:rgba(47,107,66,.32);background:linear-gradient(180deg,#F8FBF8,#fff 55%);box-shadow:0 2px 0 rgba(47,107,66,.08)}
.card.paynow .paynow-amt .lb{color:#5f7a68}
.card.paynow .paynow-ref{border-color:rgba(47,107,66,.24)}
.card.paynow .paynow-steps{border-top-color:rgba(47,107,66,.20)}

/* the three-step strip is its own band, not a footnote */
.paynow-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:0;margin:18px -20px -20px;padding:0;
  border-top:1px solid rgba(47,107,66,.20);background:#F4F8F4;border-radius:0 0 15px 15px;overflow:hidden}
.paynow-steps div{padding:14px 18px;border-left:1px solid rgba(47,107,66,.14);min-width:0}
.paynow-steps div:first-child{border-left:0}
.paynow-steps b{display:flex;align-items:center;gap:6px;font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.14em;text-transform:uppercase;color:#2f6b42;margin-bottom:5px}
.paynow-steps b::before{content:"";width:16px;height:16px;border-radius:50%;background:rgba(47,107,66,.14);
  color:#2f6b42;font-family:var(--fig);font-size:9px;display:grid;place-items:center}
.paynow-steps div:nth-child(1) b::before{content:"1"}
.paynow-steps div:nth-child(2) b::before{content:"2"}
.paynow-steps div:nth-child(3) b::before{content:"3"}
@media(max-width:820px){.paynow-steps{grid-template-columns:1fr}.paynow-steps div{border-left:0;border-top:1px solid rgba(47,107,66,.14)}.paynow-steps div:first-child{border-top:0}}

/* ---------- Invoice masthead ---------- */
.inv-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}
.inv-toolbar .backlink{margin-bottom:0}

/* ---------- Invoice to PDF ---------- */
/* bxPrintInvoice() adds .print-invoice to body and calls window.print().
   Only the invoice card prints, on A4, with the app chrome and the payment
   panel gone. Colours are forced so the header tint and badges survive
   the browser's default "no backgrounds" print setting. */
@media print{
  @page{size:A4;margin:14mm 14mm 16mm}
  body.print-invoice{background:#fff;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  body.print-invoice .app{display:block}
  body.print-invoice .sidebar,body.print-invoice .topbar,body.print-invoice .hintbar,
  body.print-invoice .inv-toolbar,body.print-invoice #v-invoice .grid2,body.print-invoice .gate,
  body.print-invoice .app.nav-open::before{display:none !important}
  body.print-invoice .content{padding:0;max-width:none}
  body.print-invoice .card.invoice{border:0;box-shadow:none;border-radius:0;break-inside:avoid}
  body.print-invoice .inv-head{background:#F6F5F1}
  body.print-invoice .tbl tr{break-inside:avoid}
  body.print-invoice a[href]::after{content:none}
}

.inv-head{padding:26px 28px;background:linear-gradient(180deg,#FBFAF6,#F6F5F1)}
.inv-brand img{display:block;height:38px;width:auto;margin-bottom:7px}
.inv-brand span{font-family:var(--body);font-weight:600;font-size:9.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--muted)}
.inv-id .no{font-size:23px}
.inv-parties{padding:24px 28px}
.inv-tot{padding:20px 28px 26px}
.inv-note{padding:0 28px 24px}
.invoice .tbl th:first-child,.invoice .tbl td:first-child{padding-left:28px}
.invoice .tbl th:last-child,.invoice .tbl td:last-child{padding-right:28px}

/* a back link that is not mistaken for a status */
.backlink{display:inline-flex;align-items:center;gap:7px;margin-bottom:16px;font-family:var(--display);font-weight:700;
  font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);transition:color .15s var(--ease)}
.backlink:hover{color:var(--ink)}
.paylink{display:block;font-size:10.5px;margin-top:4px}

/* ---------- One style per role of text ---------- */
/* Playfair, uppercase, for anything that titles a region. Inter for anything
   that explains one. Product names are the single exception: they are content,
   not headings, so they stay in Inter sentence case. */
.tb-title h1{font-family:var(--display);font-weight:800;font-size:23px;letter-spacing:-.01em;text-transform:uppercase}
.tb-title p{font-family:var(--body);font-weight:400;font-size:12.5px;color:var(--muted);margin-top:3px}
.card-h h3,.upsell h4,.inv-parties h5,.paynow-amt .lb,.paynow-ref .lb,.pay-addr-box .lb,.reorder .lb,.payfield-lb{
  font-family:var(--display);font-weight:700;text-transform:uppercase}
.card-h h3{font-size:15px;letter-spacing:.01em}
.upsell h4{font-size:15px;letter-spacing:.01em}
.card-h .hint,.sub2,.hint2,.co-trust li,.cta-note{font-family:var(--body)}

/* asset and network pickers get a label so the two rows are not guesswork */
.payfield{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}
.payfield-lb{flex:0 0 62px;font-size:10px;letter-spacing:.16em;color:var(--muted)}
.payfield .pay-net{flex:1;min-width:210px;margin-bottom:0}

/* ---------- Brand bar: the first thing to do on the packaging page ---------- */
.brandbar{display:flex;align-items:center;gap:18px;padding:16px 20px;margin-bottom:18px;border:1px solid var(--line);
  border-radius:16px;background:linear-gradient(180deg,#FBFAF6,#fff 60%);flex-wrap:wrap}
.bb-mark{width:56px;height:56px;border-radius:13px;border:1px solid var(--line);background:var(--surface);display:grid;place-items:center;flex:none;overflow:hidden}
.bb-mark img{max-width:82%;max-height:82%;object-fit:contain}
.bb-mark .empty{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:#b3ab9c;text-align:center;line-height:1.3;padding:0 4px}
.bb-copy{flex:1;min-width:200px}
.bb-copy h3{font-family:var(--display);font-weight:700;font-size:13px;letter-spacing:.05em;text-transform:uppercase;margin:0 0 3px}
.bb-copy p{margin:0;font-size:12px;color:var(--muted);line-height:1.5}
.bb-palette{display:flex;gap:6px}
.bb-palette i{width:24px;height:24px;border-radius:7px;border:1px solid var(--line);display:block}
.bb-act{flex:none}
@media(max-width:700px){.brandbar{gap:12px}.bb-act{width:100%}.bb-act .btn{width:100%;justify-content:center}}

/* packaging cart line, same shape as the compound cart */
.pkline{padding:13px 0;border-top:1px solid rgba(188,151,69,.20)}
.pkline:first-child{border-top:0}
.pkline .cl-top{margin-bottom:2px}
.pkline .cl-meta{margin-bottom:9px}

/* ---------- Cart: long orders stay usable ---------- */
/* Six SKUs pushed the totals and the action below the fold. The list scrolls;
   what you decide with does not move. */
.cartscroll{max-height:min(46vh,420px);overflow-y:auto;overscroll-behavior:contain;margin:0 -4px;padding:0 4px}
.cartscroll::-webkit-scrollbar{width:6px}
.cartscroll::-webkit-scrollbar-thumb{background:#ddd8cc;border-radius:3px}
.cartscroll::-webkit-scrollbar-track{background:transparent}
.cartscroll{scrollbar-width:thin;scrollbar-color:#ddd8cc transparent}
.cartscroll:focus-visible{outline:2px solid var(--acc);outline-offset:2px}

/* progress to the order minimum */
.moqbar{margin:14px 0 0}
.moq-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:11.5px;color:var(--ink-soft);margin-bottom:6px}
.moq-top b{font-weight:600;color:var(--ink)}
.moq-pct{font-family:var(--fig);font-size:11.5px;font-variant-numeric:tabular-nums}
.moq-track{height:6px;border-radius:99px;background:var(--surface-3);overflow:hidden}
.moq-track i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,var(--acc),#d8b45f);transition:width .45s var(--ease)}

/* the value ladder */
.ladder{margin-top:14px;padding:13px 14px;border:1px solid rgba(63,122,82,.32);border-radius:12px;background:rgba(63,122,82,.06)}
.ladder-lb{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:#2f6b42;margin-bottom:5px}
.ladder-body{font-size:12px;line-height:1.5;color:#3d4a41;margin-bottom:10px}
.ladder-body b{font-weight:600;color:var(--ink)}
.ladder .btn.xs{border-color:rgba(63,122,82,.45);background:rgba(63,122,82,.12);color:#2f6b42}
.ladder .btn.xs:hover{background:#2f6b42;border-color:#2f6b42;color:#fff}

/* ---------- Colourway splits ---------- */
.swatchgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:10px}
.swatchrow{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:11px;padding:9px 11px;background:var(--surface)}
.swatchrow.on{border-color:var(--acc);background:rgba(188,151,69,.07)}
.swatchrow i{width:22px;height:22px;border-radius:7px;border:1px solid rgba(20,16,10,.18);flex:none}
.swatchrow .nm{flex:1;min-width:0;font-size:12.5px;font-weight:600}
.swatchrow input{width:74px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-family:var(--fig);
  font-size:12px;text-align:right;background:var(--surface);color:var(--ink)}
.swatchrow input:focus{outline:none;border-color:var(--acc);box-shadow:0 0 0 3px rgba(188,151,69,.20)}

/* spec form */
.specgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
@media(max-width:820px){.specgrid{grid-template-columns:1fr}}
.specgrid .field{margin:0}
.specnote{margin-top:14px;font-size:11.5px;color:var(--muted);line-height:1.55}
.artrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}

/* destination */
.destbox{margin-top:14px}
.dest-lb{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin-bottom:7px}
.destopt{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:11px;padding:10px 12px;margin-bottom:7px;cursor:pointer;background:var(--surface);transition:.15s var(--ease)}
.destopt:hover{border-color:var(--line-soft)}
.destopt.on{border-color:var(--act-edge);background:var(--act-soft)}
.destopt input{margin:2px 0 0;accent-color:var(--act);flex:none}
.destopt b{display:block;font-size:12.5px;font-weight:600;line-height:1.3}
.destopt small{display:block;font-size:11px;color:var(--muted);line-height:1.45;margin-top:3px}

/* what still has to be answered before this can be produced */
.pending{margin-top:14px;border:1px solid rgba(196,122,46,.42);background:rgba(196,122,46,.08);border-radius:12px;padding:12px 13px}
.pending-lb{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:#8a5b00;margin-bottom:6px}
.pending ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:5px}
.pending li{font-size:11.5px;color:var(--ink-soft);display:flex;gap:8px;align-items:baseline}
.pending li a{margin-left:auto;white-space:nowrap}

/* colourways, on the shot */
.swatchstrip{position:absolute;left:9px;bottom:9px;display:flex;gap:4px;padding:4px 6px;border-radius:999px;
  background:rgba(255,255,255,.92);border:1px solid var(--line);box-shadow:0 2px 6px -3px rgba(10,10,10,.3)}
.swatchstrip i{width:11px;height:11px;border-radius:50%;border:1px solid rgba(20,16,10,.2);display:block;opacity:.5}
.swatchstrip i.on{opacity:1;box-shadow:0 0 0 2px rgba(188,151,69,.55)}

/* artwork collection */
.artline{display:flex;align-items:center;gap:12px;padding:11px 0;border-top:1px solid var(--line);flex-wrap:wrap}
.artline:first-of-type{border-top:0}
.art-nm{flex:1;min-width:180px;font-size:13px;font-weight:600;line-height:1.3}
.art-nm small{display:block;font-weight:400;font-size:11.5px;color:var(--muted);margin-top:2px}

/* ---------- A text control must look like a control ---------- */
/* Anything clickable without a frame is underlined, so it is never mistaken
   for a label. */
.rowlink,.cl-rm,.backlink{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}
.rowlink:hover,.cl-rm:hover{text-decoration-thickness:2px}
.backlink{text-decoration-color:rgba(138,129,119,.5)}
.backlink:hover{text-decoration-color:currentColor}
.paylink{text-decoration:underline;text-underline-offset:2px}
.cl-note{margin-top:8px;font-size:11.5px;line-height:1.4}
.cl-note.good{color:#2f6b42}
.cl-note.bad{color:#b23b3b;font-weight:600}
.shipbox{margin-top:12px;padding:12px 13px;border:1px solid var(--line);border-radius:12px;background:var(--surface)}
.shipbox .field{margin-bottom:8px}
.invoice .thumb-row{gap:11px}
.invoice .thumb{width:38px;height:38px}

/* ---------- Mobile ---------- */
/* Everything below 760px: one column, thumb-sized controls, tables that scroll
   inside their own card instead of stretching the page. */
@media(max-width:760px){
  .content{padding:16px 14px 48px}
  .topbar{padding:10px 14px;gap:10px}
  .tb-title h1{font-size:18px}
  .tb-title p{font-size:11.5px}
  .tb-live,.tb-spacer{display:none}

  .ordergrid{gap:14px}
  .card{padding:16px;border-radius:14px}
  .card-h{gap:8px;margin-bottom:12px}
  .card-h h3{font-size:14px;white-space:normal}
  .card-h .right{width:100%;margin-left:0}

  /* product grid: two up is unreadable on a phone */
  .bigcards,.pkg-grid{grid-template-columns:1fr;gap:12px}
  .bigcard-shot{aspect-ratio:16/10}
  .ordergrid .bigcards{grid-template-columns:1fr}

  /* controls big enough to hit */
  .qtybtn{width:44px;height:44px;font-size:18px}
  .qtyin{width:74px;font-size:15px;padding:10px 6px}
  .btn{padding:11px 16px}
  .btn.xs{padding:8px 14px;font-size:11px}
  .btn.cta{padding:15px 18px;font-size:13px}
  .cl-bot{gap:8px}
  .cl-rm{margin-left:0}

  /* the cart is the page on mobile, not a sidebar */
  .cartscroll{max-height:none;overflow:visible}
  .cartcol{position:static}

  /* wide data scrolls inside its card */
  .tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .tbl th,.tbl td{white-space:nowrap}
  .tbl th:first-child,.tbl td:first-child{white-space:normal;min-width:170px}

  /* stacked panels */
  .paynow-grid{flex-direction:column;align-items:stretch;gap:14px}
  .paynow-ref{border:0;border-top:1px solid rgba(47,107,66,.24);border-bottom:1px solid rgba(47,107,66,.24);
    padding:12px 0;flex-direction:row;justify-content:space-between;align-items:baseline}
  .paynow-act{min-width:0}
  .paynow-steps{grid-template-columns:1fr;margin:16px -16px -16px;border-radius:0 0 13px 13px}
  .paynow-steps div{border-left:0;border-top:1px solid rgba(47,107,66,.14)}
  .paynow-steps div:first-child{border-top:0}
  .pay-net{flex-direction:column}
  .pay-net button{width:100%}
  .payfield{flex-direction:column;align-items:stretch;gap:6px}
  .payfield-lb{flex:none}
  .inv-head{padding:18px 16px;flex-direction:column;gap:14px}
  .inv-id{margin-left:0;text-align:left}
  .inv-parties{padding:18px 16px;gap:16px}
  .inv-tot{padding:16px}
  .inv-note{padding:0 16px 18px}
  .invoice .tbl th:first-child,.invoice .tbl td:first-child{padding-left:16px}
  .invoice .tbl th:last-child,.invoice .tbl td:last-child{padding-right:16px}

  /* order tracker stays readable at four stages */
  .steps{margin:14px 0 2px}
  .step .dot{width:34px;height:34px}
  .step .dot svg{width:17px;height:17px}
  .step::before{top:17px}
  .step .lbl{font-size:10px;letter-spacing:0}

  .brandbar{gap:12px;padding:14px}
  .bb-copy{flex:1 0 100%;order:2}
  .bb-act{flex:1 0 100%;order:3}
  .bb-act .btn{width:100%;justify-content:center}
  .swatchgrid{grid-template-columns:1fr}
  .specgrid{grid-template-columns:1fr}
  .destopt{padding:12px}
  .co-recap span{font-size:10.5px}
  .searchmeta{margin-bottom:10px}
}
@media(max-width:420px){
  .content{padding:14px 11px 44px}
  .card{padding:14px}
  .tile .val{font-size:24px}
  .paynow-amt .val{font-size:25px}
  .sumrow.total b{font-size:18px}
}

/* the filter reset is a control, sitting opposite the count rather than
   trailing off the end of a sentence */
.searchmeta{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.btn.xs.reset{padding:4px 11px;font-size:10px}
@media(max-width:560px){.searchmeta{gap:8px}.btn.xs.reset{width:100%;justify-content:center}}

/* ---------- Partners, back office ---------- */
.po{display:grid;grid-template-columns:1.3fr .8fr 1.6fr 1.4fr;gap:14px;align-items:center;
  padding:13px 0;border-bottom:1px solid var(--line)}
.po:last-child{border-bottom:0}
.po-who b{display:block;font-size:13.5px}
.po-who span{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
.po-amt{font-family:var(--fig);font-weight:600;font-size:15px;font-variant-numeric:tabular-nums lining-nums}
.po-amt span{display:block;font-family:var(--body);font-weight:400;font-size:11px;color:var(--muted);margin-top:2px}
.po-addr code{display:block;font-family:var(--fig);font-size:11px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.po-act{display:flex;gap:8px;align-items:center}
.po-act .inp{height:32px;font-size:12px;flex:1;min-width:0}

.pr{border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:11px;background:var(--surface)}
.pr-head{display:flex;justify-content:space-between;align-items:flex-start;gap:18px;flex-wrap:wrap}
.pr-head b{font-size:14.5px}
.pr-nums{display:flex;gap:22px;flex-wrap:wrap}
.pr-nums div{text-align:right}
.pr-nums b{display:block;font-family:var(--fig);font-weight:600;font-size:15px;
  letter-spacing:-.01em;font-variant-numeric:tabular-nums lining-nums}
.pr-nums span{display:block;font-size:10.5px;color:var(--muted);margin-top:1px}
.pr-nums .due b{color:var(--acc)}
.pr-row{display:flex;align-items:center;gap:10px;margin-top:10px;font-size:12px}
.pr-row code{font-family:var(--fig);font-size:11.5px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
.pr-lb{width:104px;flex:none;color:var(--muted-2);font-family:var(--display);font-weight:700;
  font-size:10px;text-transform:uppercase;letter-spacing:.11em}
.pr-clients{margin-top:11px;padding-top:11px;border-top:1px solid var(--line);
  display:flex;gap:6px;flex-wrap:wrap}
@media(max-width:900px){
  .po{grid-template-columns:1fr 1fr;gap:10px}
  .po-addr,.po-act{grid-column:1/-1}
  .pr-nums{gap:16px}
  .pr-nums div{text-align:left}
}

/* ---------- Partner dashboard, its own page ----------
   Type follows the house rules rather than inventing a second set. Measured off
   the back office rather than guessed at:
     headline figures  var(--fig)  IBM Plex Mono 600, tabular  (same rule as .tile .val)
     section labels    var(--display) 700, 10.5px, .14em caps  (.tile .lb)
     card headings     var(--display) 700, 15px                (.card-h h3)
     numbers in a column  var(--num) Inter, tabular figures
   Playfair's percent and dollar glyphs are decorative at display sizes, which
   is exactly why the house puts figures in the mono face instead. */
.pt-body{background:var(--paper);color:var(--ink);font-family:var(--body);margin:0}
.pt-brand{display:flex;align-items:center;justify-content:center;gap:8px;
  font-family:var(--display);font-size:19px;font-weight:700;letter-spacing:.01em;line-height:1}
.pt-brand img{width:24px;height:24px;object-fit:contain}
.pt-brand span{font-family:var(--body);font-weight:600;font-size:9px;letter-spacing:.18em;
  text-transform:uppercase;opacity:.55}

/* sign in */
.pt-gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}
.pt-gate-card{width:100%;max-width:390px;background:var(--surface);border:1px solid var(--line);
  border-radius:16px;padding:30px 28px 26px;text-align:center}
.pt-gate-card h1{font-family:var(--display);font-size:24px;font-weight:700;letter-spacing:.01em;margin:16px 0 6px}
.pt-gate-card p{font-size:13px;color:var(--muted);margin:0 0 18px;line-height:1.55}
.pt-gate-card .inp{width:100%;margin-bottom:10px}
.pt-gate-card .btn{width:100%;justify-content:center}
.pt-err{margin-top:12px;font-size:12.5px;color:var(--bad);min-height:16px;line-height:1.5}

/* frame */
.pt-wrap{max-width:1040px;margin:0 auto;padding:0 24px 64px}
.pt-top{display:flex;align-items:center;gap:18px;padding:22px 0;border-bottom:1px solid var(--line)}
.pt-top .pt-brand{justify-content:flex-start}
.pt-who{margin-left:auto;text-align:right;line-height:1.35}
.pt-who b{display:block;font-size:13.5px}
.pt-who span{display:block;font-size:11px;color:var(--muted);margin-top:1px}
.pt-out{font-size:12px;color:var(--muted);text-decoration:none;border:1px solid var(--line);
  border-radius:9px;padding:8px 13px;white-space:nowrap;transition:.16s var(--ease)}
.pt-out:hover{color:var(--ink);border-color:var(--ink)}
.pt-main{padding-top:24px;display:flex;flex-direction:column;gap:18px}

/* headline figure */
.pt-hero{display:grid;grid-template-columns:1.15fr 1fr;border:1px solid var(--line);
  border-radius:16px;overflow:hidden;background:var(--surface)}
.pt-hero-l{padding:24px 26px;display:flex;flex-direction:column}
.pt-hero-l .lb{font-family:var(--display);font-weight:700;font-size:10.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted-2)}
.pt-big{font-family:var(--fig);font-weight:600;font-size:38px;letter-spacing:-.02em;
  line-height:1;margin:11px 0 9px;font-variant-numeric:tabular-nums lining-nums}
.pt-note{font-size:12.5px;color:var(--muted);line-height:1.55;margin:0;max-width:38ch}
#ptReqBtn{margin-top:16px;align-self:flex-start}
.pt-msg{font-size:12.5px;line-height:1.55;margin-top:10px;min-height:16px}
.pt-msg.good{color:var(--good)} .pt-msg.bad{color:var(--bad)}
.pt-hero-r{border-left:1px solid var(--line);background:var(--paper-2);
  display:grid;grid-template-columns:1fr 1fr}
.pt-mini{padding:17px 20px;border-bottom:1px solid var(--line);min-width:0}
.pt-mini:nth-child(even){border-left:1px solid var(--line)}
.pt-mini:nth-last-child(-n+2){border-bottom:0}
.pt-mini span{display:block;font-size:11px;color:var(--muted);letter-spacing:.01em}
.pt-mini b{display:block;font-family:var(--fig);font-weight:600;font-size:19px;
  letter-spacing:-.02em;line-height:1.15;margin-top:6px;font-variant-numeric:tabular-nums lining-nums}

/* cards */
.pt-card{border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:20px 22px}
.pt-card-h{display:flex;align-items:baseline;gap:12px;margin-bottom:14px}
.pt-card-h h2{font-family:var(--display);font-size:15px;font-weight:700;letter-spacing:.01em;margin:0}
.pt-card-h span{font-size:11.5px;color:var(--muted);margin-left:auto;text-align:right}

/* the link card, as a path rather than a list ------------------------------
   The steps used to be instructions sitting above an unrelated field, so
   nothing said where to begin. Now step one holds the field and the button,
   the two ahead are dimmed, and a rail joins them so the eye travels down. */
.pt-flow{list-style:none;margin:0;padding:0;position:relative}
.pt-step{position:relative;display:grid;grid-template-columns:34px 1fr;gap:14px;
  padding:0 0 22px}
.pt-step:last-child{padding-bottom:0}
/* the rail between the numbers */
.pt-step:not(:last-child)::before{content:'';position:absolute;left:16px;top:34px;bottom:6px;
  width:2px;border-radius:2px;background:var(--line)}
.pt-step.is-now:not(:last-child)::before{
  background:linear-gradient(180deg,var(--acc),var(--line))}
.pt-step-n{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-family:var(--fig);font-weight:600;font-size:14px;
  background:var(--paper);border:2px solid var(--line);color:var(--muted-2);
  box-sizing:border-box;position:relative;z-index:1}
.pt-step.is-now .pt-step-n{background:var(--acc);border-color:var(--acc);color:var(--acc-ink)}
.pt-step-b{min-width:0;padding-top:5px}
.pt-step-b h3{font-family:var(--display);font-weight:700;font-size:15px;letter-spacing:.01em;
  margin:0 0 5px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.pt-step-b p{font-size:12.5px;line-height:1.65;color:var(--muted);margin:0 0 14px;max-width:70ch}
.pt-step-b p:last-child{margin-bottom:0}
.pt-step-b p b{color:var(--ink);font-weight:600}
.pt-step-tag{font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.11em;
  text-transform:uppercase;color:#8a6a1f;background:#FBF2DE;
  border:1px solid rgba(188,151,69,.42);border-radius:999px;padding:3px 9px}
/* the steps still ahead */
.pt-step.is-next .pt-step-b h3{color:var(--muted-2)}
.pt-step.is-next .pt-step-b p{opacity:.72}

.pt-warn{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;margin-bottom:16px;
  border:1px solid rgba(188,151,69,.42);border-radius:10px;background:#FBF6EA;
  font-size:12.5px;line-height:1.6;color:var(--ink-soft)}
.pt-warn svg{flex:none;margin-top:1px;color:#8a6a1f}
.pt-warn b{color:var(--ink);font-weight:600}
.pt-lead{font-size:13px;line-height:1.65;color:var(--muted);margin:0 0 16px;max-width:74ch}
.pt-lead b{color:var(--ink);font-weight:600}

.pt-field{margin-bottom:14px;max-width:340px}
.pt-field label{display:block;font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.11em;text-transform:uppercase;color:var(--muted-2);margin-bottom:7px}
.pt-field .inp,.pt-field .sel{width:100%;height:40px;box-sizing:border-box}
.pt-field .inp.mono{font-family:var(--fig);font-size:13px;letter-spacing:.01em}
.pt-hint{font-size:11.5px;line-height:1.5;color:var(--muted);margin-top:7px}
.pt-hint.good{color:#0a7a55}
.pt-hint.bad{color:var(--bad)}
.pt-preview{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 16px;
  padding:11px 14px;border:1px dashed var(--line-soft);border-radius:10px;background:var(--paper-2)}
.pt-preview span{font-size:11px;color:var(--muted);flex:none}
.pt-preview code{font-family:var(--fig);font-size:12px;color:var(--ink-soft);
  overflow-wrap:anywhere;min-width:0}

/* The action. Flat and obviously unavailable until the code is valid, then it
   asks to be pressed: a slow ring, not a jitter, so it reads as ready rather
   than as something going wrong. */
#ptCreateBtn{height:40px;padding:0 20px;box-sizing:border-box;position:relative}
#ptCreateBtn[disabled]{opacity:.42;cursor:not-allowed;pointer-events:none;box-shadow:none}
#ptCreateBtn.is-ready{animation:ptReady 2.2s ease-in-out infinite}
@keyframes ptReady{
  0%,100%{box-shadow:0 1px 0 rgba(20,16,10,.10),0 0 0 0 rgba(188,151,69,.55)}
  50%{box-shadow:0 1px 0 rgba(20,16,10,.10),0 0 0 7px rgba(188,151,69,0)}
}
@media(prefers-reduced-motion:reduce){#ptCreateBtn.is-ready{animation:none}}

/* the finished link, code and username, each one copyable */
.pt-facts{border:1px solid var(--line);border-radius:12px;overflow:hidden}
.pt-fact{display:flex;align-items:center;gap:12px;padding:12px 14px;
  border-bottom:1px solid var(--line);min-width:0}
.pt-fact:last-child{border-bottom:0}
.pt-fact:first-child{background:var(--paper-2)}
.pt-fact-lb{flex:none;width:120px;font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.11em;text-transform:uppercase;color:var(--muted-2)}
.pt-fact code{flex:1;min-width:0;font-family:var(--fig);font-size:12.5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pt-fact .btn{flex:none}

/* getting paid */
.pt-pay{display:grid;grid-template-columns:340px 1fr;gap:30px;align-items:start}
.pt-pay-form .btn{height:38px;padding:0 18px;box-sizing:border-box}
.pt-sub-h{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--muted-2);margin-bottom:10px}

/* tables, one rule for every numeric column on the page */
.pt-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.pt-tbl th{text-align:left;font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.11em;text-transform:uppercase;color:var(--muted-2);
  padding:0 0 9px;border-bottom:1px solid var(--line);white-space:nowrap}
.pt-tbl td{padding:11px 0;border-bottom:1px solid var(--line);vertical-align:middle}
.pt-tbl tr:last-child td{border-bottom:0}
.pt-tbl .r{text-align:right;font-family:var(--fig);font-weight:600;
  font-variant-numeric:tabular-nums lining-nums;white-space:nowrap}
.pt-tbl th.r{font-family:var(--display)}
.pt-tbl .mono{font-family:var(--fig);color:var(--muted);font-size:11px}
.pt-tbl .earn{font-weight:600;color:var(--acc)}
.pt-empty{padding:4px 0 2px}
.pt-empty b{font-size:13px}
.pt-empty p{font-size:12.5px;color:var(--muted);line-height:1.6;margin:6px 0 0;max-width:58ch}

/* withdrawals */
.pt-po{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:11px 0;
  border-bottom:1px solid var(--line)}
.pt-po:last-child{border-bottom:0}
.pt-po b{font-family:var(--fig);font-weight:600;font-size:14px;font-variant-numeric:tabular-nums lining-nums}
.pt-po span{display:block;font-size:11px;color:var(--muted);margin-top:2px}
.pt-st{margin-left:auto;font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.11em;
  text-transform:uppercase;border-radius:999px;padding:5px 11px;border:1px solid var(--line);color:var(--muted)}
.pt-st.paid{color:#0a7a55;border-color:rgba(10,122,85,.35);background:rgba(10,122,85,.07)}
.pt-tx{flex-basis:100%;font-family:var(--fig);font-size:11px;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis}

/* wallet */
.pt-wal label{display:block;font-size:11px;color:var(--muted);margin-bottom:6px}
.pt-wal .inp,.pt-wal .sel{width:100%;margin-bottom:10px}
.pt-fine{font-size:11.5px;color:var(--muted);line-height:1.55;margin:12px 0 0}

@media(max-width:880px){
  .pt-hero{grid-template-columns:1fr}
  .pt-hero-r{border-left:0;border-top:1px solid var(--line)}
  .pt-pay{grid-template-columns:1fr;gap:24px}
  .pt-big{font-size:34px}
}
@media(max-width:560px){
  .pt-wrap{padding:0 15px 44px}
  .pt-top{gap:10px;padding:16px 0}
  .pt-brand{font-size:16px}
  .pt-who span{display:none}
  .pt-out{padding:7px 10px;font-size:11px}
  .pt-hero-l{padding:20px}
  .pt-mini{padding:14px 16px}
  .pt-card{padding:17px 16px}
  .pt-field{max-width:none}
  #ptCreateBtn{width:100%;justify-content:center}
  .pt-fact{flex-wrap:wrap;gap:8px}
  .pt-fact-lb{width:100%}
  .pt-fact code{flex:1 1 100%}
  /* The order count is the least useful column on a phone. */
  .pt-tbl th:nth-child(3),.pt-tbl td:nth-child(3){display:none}
}

/* ---------- Referral landing page ---------- */
.jn-body{background:var(--paper);color:var(--ink);font-family:var(--body);margin:0}
.jn-top{max-width:1040px;margin:0 auto;padding:22px 24px 0}
.jn-top .pt-brand{justify-content:flex-start}
.jn-wrap{max-width:1040px;margin:0 auto;padding:34px 24px 70px;
  display:grid;grid-template-columns:1fr 1fr;gap:46px;align-items:start}
.jn-ref{display:inline-flex;align-items:center;gap:8px;font-size:11.5px;color:var(--muted);
  border:1px solid var(--line);border-radius:999px;padding:7px 14px;margin-bottom:20px}
.jn-ref code{font-family:var(--fig);color:var(--acc);font-size:11.5px}
.jn-intro h1{font-family:var(--display);font-size:37px;font-weight:700;line-height:1.16;
  letter-spacing:-.02em;margin:0 0 16px;max-width:15ch}
.jn-lede{font-size:14px;line-height:1.7;color:var(--muted);margin:0 0 24px;max-width:48ch}
.jn-points{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.jn-points li{font-size:13px;line-height:1.6;color:var(--muted);padding:14px 0;
  border-bottom:1px solid var(--line)}
.jn-points b{color:var(--ink);font-weight:600}
.jn-form-card{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:26px}
.jn-form-card h2{font-family:var(--display);font-size:20px;font-weight:700;letter-spacing:.01em;margin:0 0 5px}
.jn-sub{font-size:12.5px;color:var(--muted);margin:0 0 20px}
.jn-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px}
.jn-form-card .field{margin-bottom:13px}
.jn-grid .field{margin-bottom:0}
.jn-form-card .field label{display:block;font-size:11px;color:var(--muted);margin-bottom:6px}
.jn-form-card .field label span{color:var(--acc);font-size:9.5px;letter-spacing:.09em;
  text-transform:uppercase;margin-left:5px;font-family:var(--display);font-weight:700}
.jn-form-card .inp,.jn-form-card .sel{width:100%}
.jn-area{min-height:76px;padding:10px 12px;line-height:1.5;resize:vertical;font-family:var(--body)}
.jn-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.jn-msg{font-size:12.5px;line-height:1.6;margin-top:12px;min-height:16px}
.jn-msg.bad{color:var(--bad)}
.jn-msg a{color:var(--ink);text-decoration:underline}
.jn-fine{font-size:11.5px;color:var(--muted);line-height:1.55;margin:14px 0 0}
.jn-done{position:fixed;inset:0;background:var(--paper);display:flex;align-items:center;
  justify-content:center;padding:24px;z-index:40}
.jn-done-card{max-width:440px;text-align:center}
.jn-tick{width:52px;height:52px;border-radius:50%;margin:0 auto 18px;display:flex;
  align-items:center;justify-content:center;background:rgba(10,122,85,.11);color:#0a7a55}
.jn-done-card h2{font-family:var(--display);font-size:26px;font-weight:700;letter-spacing:.01em;margin:0 0 10px}
.jn-done-card p{font-size:13.5px;line-height:1.65;color:var(--muted);margin:0}
.jn-ref-note{margin-top:12px !important;font-size:12px !important}
@media(max-width:880px){
  .jn-wrap{grid-template-columns:1fr;gap:30px;padding-top:26px}
  .jn-intro h1{font-size:31px;max-width:none}
  .jn-lede{max-width:none}
}
@media(max-width:560px){
  .jn-wrap{padding:22px 15px 50px}
  .jn-top{padding:16px 15px 0}
  .jn-grid{grid-template-columns:1fr}
  .jn-form-card{padding:20px 17px}
  .jn-intro h1{font-size:27px}
}

/* ---------- Signups inbox, back office ---------- */
.su{display:grid;grid-template-columns:1.5fr 1.1fr 1fr auto;gap:14px;align-items:center;
  padding:13px 0;border-bottom:1px solid var(--line)}
.su:last-child{border-bottom:0}
.su-co b{display:block;font-size:13.5px}
.su-co span{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
.su-ref{font-size:11.5px;color:var(--muted);line-height:1.45}
.su-ref b{display:block;color:var(--ink);font-size:12.5px;font-weight:600}
.su-meta{font-size:11.5px;color:var(--muted);line-height:1.5;font-variant-numeric:tabular-nums}
.su-act{display:flex;gap:8px;align-items:center;white-space:nowrap}
.su-note{grid-column:1/-1;font-size:12px;color:var(--muted);line-height:1.55;margin-top:-2px}
@media(max-width:900px){
  .su{grid-template-columns:1fr 1fr}
  .su-meta,.su-act{grid-column:1/-1}
}

.pr-fixed{flex:none;font-family:var(--display);font-weight:700;font-size:9.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--muted-2);border:1px solid var(--line);border-radius:999px;padding:3px 9px}
.pr-none{color:var(--muted-2);font-style:italic}

/* ---------- The commission ladder ----------
   The climb is the point, so it is drawn. Rungs are real rows so their names
   and rates sit on the same type scale as the rest of the site, with the rail
   and the marker behind them. The marker rises from the bottom rung to the
   current one once, on load: it says "you moved" in a way a badge cannot. */
.pt-ladder{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:34px;align-items:center}
.ld{--rung-h:58px;position:relative;padding-left:34px}
.ld-rail{position:absolute;left:11px;top:calc(var(--rung-h) / 2);
  height:calc((var(--rungs) - 1) * var(--rung-h));width:2px;border-radius:2px;
  background:linear-gradient(180deg,var(--line),var(--acc))}
.ld-rung{position:relative;display:flex;align-items:center;gap:11px;height:var(--rung-h);
  border-bottom:1px solid var(--line)}
.ld-rung:last-child{border-bottom:0}
.ld-peg{position:absolute;left:-28px;width:10px;height:10px;border-radius:50%;
  background:var(--paper);border:2px solid var(--line);box-sizing:border-box}
.ld-rung.is-done .ld-peg,.ld-rung.is-here .ld-peg{border-color:var(--acc);background:var(--acc)}
.ld-name{font-family:var(--display);font-weight:700;font-size:13.5px;letter-spacing:.01em;
  color:var(--muted-2);white-space:nowrap}
.ld-from{font-family:var(--fig);font-size:11px;color:var(--muted-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ld-rate{margin-left:auto;font-family:var(--fig);font-weight:600;font-size:14px;
  color:var(--muted-2);font-variant-numeric:tabular-nums lining-nums}
.ld-rung.is-done .ld-name,.ld-rung.is-done .ld-rate{color:var(--ink-soft)}
.ld-rung.is-here .ld-name{color:var(--ink);font-size:15px}
.ld-rung.is-here .ld-rate{color:var(--acc);font-size:16px}
.ld-rung.is-todo .ld-name,.ld-rung.is-todo .ld-rate{opacity:.6}

.ld-climber{position:absolute;left:-33px;top:0;width:22px;height:var(--rung-h);
  display:flex;align-items:center;justify-content:center;color:#fff;z-index:2;
  transform:translateY(calc((var(--rungs) - 1) * var(--rung-h)));
  animation:ldClimb 1.15s .2s cubic-bezier(.22,.9,.3,1) forwards}
.ld-climber svg{position:relative;z-index:1}
.ld-halo{position:absolute;top:50%;left:50%;width:22px;height:22px;margin:-11px 0 0 -11px;
  border-radius:50%;background:var(--acc);box-shadow:0 0 0 5px rgba(188,151,69,.18)}
@keyframes ldClimb{to{transform:translateY(calc(var(--row) * var(--rung-h)))}}
@media(prefers-reduced-motion:reduce){
  .ld-climber{transform:translateY(calc(var(--row) * var(--rung-h)));animation:none}
}

.pt-ladder-side{min-width:0}
.pt-rung-now{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding-bottom:14px;border-bottom:1px solid var(--line);margin-bottom:16px}
.pt-rung-lb{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--muted-2)}
.pt-rung-now b{font-family:var(--display);font-weight:700;font-size:22px;letter-spacing:.01em}
.pt-rung-rate{margin-left:auto;font-family:var(--fig);font-size:12px;color:var(--muted)}
.pt-climb-h{display:flex;align-items:baseline;gap:9px;margin-bottom:9px}
.pt-climb-h > span:first-child{font-family:var(--display);font-weight:700;font-size:10px;
  letter-spacing:.11em;text-transform:uppercase;color:var(--muted-2)}
.pt-climb-h b{font-family:var(--display);font-weight:700;font-size:14px}
.pt-climb-rate{margin-left:auto;font-family:var(--fig);font-weight:600;font-size:13px;color:var(--acc)}
/* The gauge. An empty bar at the start of a climb says nothing, so the share
   of the way there is set as a figure beside it and the track keeps a slow
   sheen travelling along the part still to go. */
.pt-gauge{display:flex;align-items:center;gap:18px}
/* Laid out in normal flow. Absolutely positioning the caption made it hang
   over whatever came next as soon as the figure changed width. */
.pt-gauge-fig{flex:none;padding-right:18px;border-right:1px solid var(--line);
  display:flex;flex-direction:column;justify-content:center}
.pt-gauge-fig b{font-family:var(--fig);font-weight:600;font-size:30px;letter-spacing:-.03em;
  line-height:1;color:var(--ink);font-variant-numeric:tabular-nums lining-nums}
.pt-gauge-fig i{font-style:normal;font-family:var(--fig);font-size:14px;color:var(--muted);
  margin-left:1px}
.pt-gauge-fig span{display:block;margin-top:6px;white-space:nowrap;font-size:10.5px;color:var(--muted)}
.pt-gauge-track{flex:1;min-width:0}
.pt-bar{position:relative;height:10px;border-radius:99px;background:var(--paper-2);
  border:1px solid var(--line);overflow:hidden}
.pt-bar i{display:block;height:100%;width:var(--frac);border-radius:99px;
  background:linear-gradient(90deg,#D9BC72,var(--acc));
  animation:ldFill 1.1s .3s cubic-bezier(.22,.9,.3,1) backwards}
/* the sheen, over the distance still to cover */
.pt-bar u{position:absolute;top:0;bottom:0;left:var(--frac);right:0;
  background:linear-gradient(90deg,transparent,rgba(188,151,69,.22),transparent);
  background-size:60% 100%;background-repeat:no-repeat;
  animation:ldSheen 2.6s 1.3s linear infinite}
@keyframes ldFill{from{width:0}}
@keyframes ldSheen{from{background-position:-60% 0}to{background-position:160% 0}}
@media(prefers-reduced-motion:reduce){
  .pt-bar i{animation:none}
  .pt-bar u{animation:none;display:none}
}
@media(max-width:560px){
  .pt-gauge{gap:14px}
  .pt-gauge-fig{padding-right:14px}
  .pt-gauge-fig b{font-size:25px}
}
.pt-climb-f{display:flex;justify-content:space-between;margin-top:8px;
  font-family:var(--fig);font-size:11px;color:var(--muted)}
.pt-climb-top{font-size:13px;color:var(--ink-soft);padding:8px 0}
.pt-ladder-note{margin-top:16px;font-size:12.5px;line-height:1.65;color:var(--muted)}
.pt-ladder-note b{color:var(--ink);font-weight:600}
.pt-ladder-foot{margin-top:20px;padding-top:14px;border-top:1px solid var(--line);
  font-size:11.5px;color:var(--muted);line-height:1.55}
.pt-mini i{display:block;font-style:normal;font-family:var(--body);font-size:11px;
  color:var(--muted);margin-top:3px}
@media(max-width:880px){
  .pt-ladder{grid-template-columns:1fr;gap:26px}
  .pt-ladder-art{order:2}
}

/* ---------- Commission ladder, back office ---------- */
.lad-badge{display:inline-block;font-family:var(--display);font-weight:700;font-size:9.5px;
  letter-spacing:.09em;text-transform:uppercase;color:#8a6a1f;background:#FBF2DE;
  border:1px solid rgba(188,151,69,.42);border-radius:999px;padding:3px 9px;vertical-align:2px}
.lad-h,.lad-row{display:grid;grid-template-columns:1.4fr 1fr .8fr 80px;gap:12px;align-items:center}
.lad-h{padding-bottom:9px;border-bottom:1px solid var(--line);margin-bottom:4px}
.lad-h span{font-family:var(--display);font-weight:700;font-size:10px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--muted-2)}
.lad-row{padding:7px 0}
.lad-row .inp{width:100%;height:36px}
.lad-row .pm-pct{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.lad-act{text-align:right;font-size:12px}
.lad-add{margin-top:10px;padding-top:12px;border-top:1px solid var(--line)}
.lad-cost td.bad{color:var(--bad)}
@media(max-width:820px){
  .lad-h{display:none}
  .lad-row{grid-template-columns:1fr 1fr;gap:8px}
  .lad-act{grid-column:1/-1;text-align:left}
}

/* partner account actions */
.pr-acts{display:flex;gap:16px;flex-wrap:wrap;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--line);font-size:12px}
.pr-acts .rowlink.danger{color:var(--bad)}
.pr-acts .rowlink.danger:hover{color:var(--bad);opacity:.75}
.pr.is-off{background:var(--paper-2);border-style:dashed}
.pr.is-off .pr-nums,.pr.is-off .pr-row,.pr.is-off .pr-clients{opacity:.6}
.pr-off{display:inline-block;font-family:var(--display);font-weight:700;font-size:9.5px;
  letter-spacing:.09em;text-transform:uppercase;color:var(--bad);
  border:1px solid color-mix(in srgb,var(--bad) 40%,transparent);border-radius:999px;
  padding:3px 9px;vertical-align:2px}

/* ---------- The ask dialog ----------
   Replaces the browser's confirm() where the question actually matters. Same
   shape as a card so it reads as part of the site rather than as the browser
   interrupting it. */
.ask{position:fixed;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;
  padding:24px;opacity:0;transition:opacity .18s var(--ease)}
.ask.is-open{opacity:1}
.ask-veil{position:absolute;inset:0;background:rgba(26,22,17,.42);backdrop-filter:blur(3px)}
.ask-box{position:relative;width:100%;max-width:430px;background:var(--surface);
  border:1px solid var(--line);border-radius:16px;padding:26px 26px 22px;
  box-shadow:0 30px 70px -28px rgba(20,16,10,.5);
  transform:translateY(10px) scale(.985);transition:transform .2s var(--ease)}
.ask.is-open .ask-box{transform:none}
.ask-mark{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;
  justify-content:center;background:#FBF2DE;color:#8a6a1f;
  border:1px solid rgba(188,151,69,.4);margin-bottom:15px}
.ask-box h2{font-family:var(--display);font-weight:700;font-size:19px;letter-spacing:.01em;
  margin:0 0 9px;line-height:1.3}
.ask-body{font-size:13px;line-height:1.65;color:var(--muted)}
.ask-body b{color:var(--ink);font-weight:600}
.ask-body code{display:block;font-family:var(--fig);font-size:12px;color:var(--ink-soft);
  background:var(--paper-2);border:1px solid var(--line);border-radius:9px;
  padding:9px 11px;margin:11px 0;overflow-wrap:anywhere}
.ask-body .ask-warn{display:block;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--line);color:var(--ink-soft)}
.ask-acts{display:flex;justify-content:flex-end;gap:9px;margin-top:20px}
@media(prefers-reduced-motion:reduce){
  .ask,.ask-box{transition:none}
}
@media(max-width:480px){
  .ask-acts{flex-direction:column-reverse}
  .ask-acts .btn{width:100%;justify-content:center}
}
.btn.xs.cpy.is-copied{background:#EAF3ED;border-color:rgba(10,122,85,.4);color:#0a7a55}
.pt-gauge-num{display:flex;align-items:baseline}

/* ---------- One face for money, everywhere ----------
   Figures were drifting between the body sans and the mono face depending on
   which widget drew them, so the same amount looked different on two screens.
   Every displayed figure now uses var(--fig). Number INPUTS are deliberately
   left alone: the mono face is wider, and several of those boxes are sized to
   the pixel. */
.brk b,.pm-total b,.mg-stats b,.mg-demo-row b,.sug-move,.pl-row b,.mg-next,
.pm-compound b,.pm-stats b,.catbar-val,.action-num,.sumrow b,.cart-sum .kv dd,
.cl-tot,.bigcard-total,.tile .val{
  font-family:var(--fig);font-variant-numeric:tabular-nums lining-nums}


/* ======================= phones ======================= */
/* The order form is a six-column table. On a phone the price, the quantity
   box and the line total sat 400px off the right edge inside a scrolling card,
   so a client could read the compound names and could not order anything.
   Each strength becomes a card: name, price per box, the quantity control,
   the line total. The compound name (a rowspan cell) heads its first card. */
@media(max-width:640px){
  .tbl.catalog thead{display:none}
  .tbl.catalog,.tbl.catalog tbody{display:block}
  .tbl.catalog tr{display:grid;grid-template-columns:1fr auto;gap:2px 12px;
    padding:10px 14px;border-bottom:1px solid var(--line-soft)}
  .tbl.catalog tr.cat-row{display:block;padding:8px 14px}
  .tbl.catalog td{display:block;padding:0;border:0;white-space:normal;min-width:0;text-align:left}
  .tbl.catalog td.pname{grid-column:1/-1;width:auto;padding:0 0 6px;border-right:0;
    font-size:14px}
  .tbl.catalog td.pname b{font-size:15px}
  /* Cells fall into the two columns in document order: spec | per box, then
     qty | line total. Per vial is dropped — per box is what they order by. */
  .tbl.catalog td.num:not(.strong):not(.qtycell){display:none}
  .tbl.catalog td.strong:not([id^="notot_"]){text-align:right;align-self:end;font-size:14px}
  .tbl.catalog td.qtycell{justify-self:start;padding-top:6px}
  .tbl.catalog td[id^="notot_"]{text-align:right;align-self:center;padding-top:6px}
  .tbl.catalog td .spec{font-weight:500}
  .qtybar.cat .qtyin{width:58px}
  /* the category filters read across, not down a whole screen */
  .cattabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    padding-bottom:8px;margin-bottom:10px;gap:6px}
  .cattabs::-webkit-scrollbar{display:none}
  .cattab{flex:0 0 auto;white-space:nowrap}
  /* packaging category chips likewise */
  .catchips{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:6px}
  .catchips::-webkit-scrollbar{display:none}
  .catchips > *{flex:0 0 auto}
  /* the cart sits under 49 rows of table; a bar at the bottom carries the
     total and the way to it */
  .mobbar{position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;align-items:center;gap:12px;
    padding:10px 14px calc(10px + env(safe-area-inset-bottom));background:var(--surface);
    border-top:1px solid var(--line);box-shadow:0 -8px 24px -16px rgba(10,10,10,.35)}
  .mobbar .mb-sum{flex:1;min-width:0;font-size:12.5px;color:var(--muted)}
  .mobbar .mb-sum b{display:block;font-family:var(--num);font-size:16px;color:var(--ink);font-variant-numeric:tabular-nums}
  .mobbar .btn{flex:0 0 auto}
  body.has-mobbar .content{padding-bottom:92px}
}
@media(max-width:640px){
  /* the "in your order" tint belongs to the card, not to two of its cells */
  .tbl.catalog tr.on{background:var(--gold-wash,rgba(188,151,69,.10))}
  .tbl.catalog tr.on td{background:transparent}
  /* Lists read in their card without sideways scrolling: the columns nobody
     needs on a phone go. Orders: Placed and Packaging. Billing: Issued and
     Due. Invoice and order lines: SKU and unit price. */
  #v-orders .tbl th:nth-child(2),#v-orders .tbl td:nth-child(2),
  #v-orders .tbl th:nth-child(7),#v-orders .tbl td:nth-child(7),
  #v-billing .tbl th:nth-child(3),#v-billing .tbl td:nth-child(3),
  #v-billing .tbl th:nth-child(4),#v-billing .tbl td:nth-child(4),
  #v-invoice .tbl th:nth-child(2),#v-invoice .tbl td:nth-child(2),
  #v-invoice .tbl th:nth-child(4),#v-invoice .tbl td:nth-child(4),
  #v-orderdetail .tbl th:nth-child(2),#v-orderdetail .tbl td:nth-child(2),
  #v-orderdetail .tbl th:nth-child(4),#v-orderdetail .tbl td:nth-child(4){display:none}
  /* Orders and Billing become a card per row. Five columns of nowrap text
     still needed 700px; a card needs 320. */
  #v-orders .tbl thead,#v-billing .tbl thead{display:none}
  #v-orders .tbl,#v-orders .tbl tbody,#v-billing .tbl,#v-billing .tbl tbody{display:block}
  #v-orders .tbl tr,#v-billing .tbl tr{display:grid;grid-template-columns:1fr auto;gap:4px 12px;
    padding:12px 14px;border-bottom:1px solid var(--line-soft)}
  #v-orders .tbl td,#v-billing .tbl td{display:block;padding:0;border:0;white-space:normal;min-width:0;text-align:left}
  /* orders: [Order | Total] / [What, full width] / [Fulfilment | Billing] */
  #v-orders .tbl td:nth-child(1){grid-column:1;font-size:15px}
  #v-orders .tbl td:nth-child(4){grid-column:2;text-align:right;font-size:15px}
  #v-orders .tbl td:nth-child(3){grid-column:1/-1;padding:2px 0 4px}
  #v-orders .tbl td:nth-child(5){grid-column:1}
  #v-orders .tbl td:nth-child(6){grid-column:2;text-align:right}
  /* billing: [Invoice | Amount] / [Order | Status] / [action] */
  #v-billing .tbl td:nth-child(1){grid-column:1;font-size:15px}
  #v-billing .tbl td:nth-child(5){grid-column:2;text-align:right;font-size:15px}
  #v-billing .tbl td:nth-child(2){grid-column:1}
  #v-billing .tbl td:nth-child(6){grid-column:2;text-align:right}
  #v-billing .tbl td:nth-child(7){grid-column:1/-1;padding-top:4px}
  #v-orders .tbl tr:hover td,#v-billing .tbl tr:hover td{background:transparent}
}
@media(min-width:641px){.mobbar{display:none!important}}

/* ---- back office on a phone: the pages an operator actually opens there ---- */
/* Today, the order queue, an order, the client list, a client. Everything
   else (products, margins, analytics, wallets, logins) is desk work and keeps
   scrolling inside its card. */
@media(max-width:640px){
  /* queue rows (Today and Orders share the columns: Order, Client, Items, Stage, action) */
  #ccBody,#fqBody{display:block}
  table:has(> #ccBody) thead,table:has(> #fqBody) thead{display:none}
  table:has(> #ccBody),table:has(> #fqBody){display:block}
  #ccBody tr,#fqBody tr{display:grid;grid-template-columns:1fr auto;gap:3px 12px;padding:12px 14px;border-bottom:1px solid var(--line-soft)}
  #ccBody td,#fqBody td{display:block;padding:0;border:0;white-space:normal;min-width:0;text-align:left}
  #ccBody td:nth-child(1),#fqBody td:nth-child(1){grid-column:1;font-size:15px}
  #ccBody td:nth-child(4),#fqBody td:nth-child(4){grid-column:2;text-align:right}
  #ccBody td:nth-child(2),#fqBody td:nth-child(2),#ccBody td:nth-child(3),#fqBody td:nth-child(3){grid-column:1/-1}
  #ccBody td:nth-child(5),#fqBody td:nth-child(5){grid-column:1/-1;padding-top:6px}
  /* an order's lines: Product | Line total, then Qty. SKU, spec and unit price go. */
  table:has(> #odLines) thead{display:none}
  table:has(> #odLines),#odLines{display:block}
  #odLines tr{display:grid;grid-template-columns:1fr auto;gap:3px 12px;padding:12px 14px;border-bottom:1px solid var(--line-soft)}
  #odLines td{display:block;padding:0;border:0;white-space:normal;min-width:0;text-align:left}
  #odLines td:nth-child(1),#odLines td:nth-child(3),#odLines td:nth-child(5){display:none}
  #odLines td:nth-child(2){grid-column:1}
  #odLines td:nth-child(6){grid-column:2;text-align:right;font-size:15px}
  #odLines td:nth-child(4){grid-column:1/-1;color:var(--muted)}
  table:has(> #odLines) tfoot td{white-space:normal}
  /* the client list: Client | Status, then tier, then the action */
  table:has(> #clientsBody) thead{display:none}
  table:has(> #clientsBody),#clientsBody{display:block}
  #clientsBody tr{display:grid;grid-template-columns:1fr auto;gap:3px 12px;padding:12px 14px;border-bottom:1px solid var(--line-soft)}
  #clientsBody td{display:block;padding:0;border:0;white-space:normal;min-width:0;text-align:left}
  #clientsBody td:nth-child(2),#clientsBody td:nth-child(4){display:none}
  #clientsBody td:nth-child(1){grid-column:1;font-size:15px}
  #clientsBody td:nth-child(5){grid-column:2;text-align:right}
  #clientsBody td:nth-child(3){grid-column:1/-1;color:var(--muted)}
  #clientsBody td:nth-child(6){grid-column:1/-1;padding-top:4px}
  /* a client's orders: drop the Items column so the four fit */
  #v-clientdetail .tbl th:nth-child(2),#v-clientdetail .tbl td:nth-child(2){display:none}
  #v-clientdetail .tbl td{white-space:normal}
  /* the order page: action links wrap instead of running off */
  #odAdvanceBtn{margin-bottom:8px}
  #odCancelBtn,#odDeleteBtn{display:inline-block;margin:0 12px 0 0}
  .od-files{gap:8px}
}
.toastbar{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:80;max-width:min(92vw,520px);
  background:var(--rail,#2B2119);color:#F4EFE6;font-size:13px;line-height:1.45;padding:10px 16px;border-radius:12px;
  box-shadow:0 12px 30px -12px rgba(10,10,10,.5)}
