/* ============================================================================
   SERVICEDESK — DESIGN SYSTEM
   Supplied by the owner as the approved design. Linked before site.css.

   Theme:   <body data-theme="carbon" data-layout="classic">
   Themes:  carbon green cloud midnight steel racing sunset mint paper sand neon
   Layouts: classic (sidebar) | top (top bar) | icon (icon rail) | mobile (bottom tabs)

   Every colour, radius, shadow and font comes from a CSS variable in the theme
   block below. Never hardcode a colour in a component.

   NOT EDITED except where noted:
     · .search:before glyph, which arrived mojibaked in transit
   Anything Garagex needs on top of this lives in site.css, never in here — so a
   newer version of this file can replace it wholesale.
   ============================================================================ */


/* ============================================================
   THEME TOKENS — every design is one block below.
   Switch with the "Design" dropdown in the top bar.
   ============================================================ */
:root, body[data-theme="carbon"]{
  --disp:'Space Grotesk',system-ui,sans-serif;
  --body:'Public Sans',system-ui,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
  --hcase:none; --htrack:-.015em; --hweight:700;

  --paper:#F4F6F8; --card:#FFFFFF; --card-2:#FAFBFC;
  --line:#E2E7EC; --line-2:#EEF1F4;
  --ink:#161A20; --slate:#697585; --slate-2:#98A3B1;

  --carbon:#101318; --carbon-2:#191D24; --carbon-3:#252B34;
  --rail-tx:#AEB8C6; --rail-strong:#FFFFFF; --rail-bd:transparent;

  --orange:#F04E23; --orange-d:#CE3D16; --orange-w:#FFF1EC; --on-acc:#FFFFFF;
  --teal:#0E7C86; --teal-w:#E4F4F5;
  --amber:#B8790C; --amber-w:#FCF2DF;
  --green:#12784F; --green-w:#E3F4EC;
  --violet:#5645B8; --violet-w:#EDEBFA;
  --red:#C4321F;
  --lane:#EDF0F3;

  --r:12px; --r2:9px; --r3:8px; --pill:20px;
  --sh:0 1px 2px rgba(16,19,24,.05),0 1px 3px rgba(16,19,24,.04);
  --sh-2:0 4px 16px rgba(16,19,24,.08);
  --navmark:1;
}

/* ---- Design 1: Workshop Green (the original look) ---- */
body[data-theme="green"]{
  --disp:'Barlow Condensed','Arial Narrow',sans-serif;
  --body:'IBM Plex Sans',system-ui,sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,monospace;
  --hcase:uppercase; --htrack:.02em; --hweight:700;

  --paper:#E7EBE8; --card:#FFFFFF; --card-2:#F6F8F7;
  --line:#CBD3CE; --line-2:#EDF1EF;
  --ink:#10231C; --slate:#6E7A76; --slate-2:#93A09A;

  --carbon:#12483A; --carbon-2:#0E3B2F; --carbon-3:#1D5F4D;
  --rail-tx:#BFD1C9; --rail-strong:#FFFFFF; --rail-bd:transparent;

  --orange:#C8892A; --orange-d:#A66F1C; --orange-w:#FAF1E1; --on-acc:#231604;
  --teal:#17507E; --teal-w:#DCEAF7;
  --amber:#8E6410; --amber-w:#FBEFD8;
  --green:#1C5C42; --green-w:#D9EFE4;
  --violet:#3D3273; --violet-w:#E6E2F5;
  --red:#8E2E1C;
  --lane:#DCE3DF;

  --r:5px; --r2:5px; --r3:4px; --pill:3px;
  --sh:none; --sh-2:0 8px 24px rgba(16,35,28,.14);
  --navmark:0;
}

/* ---- Design 3: Cloud (light + minimal) ---- */
body[data-theme="cloud"]{
  --disp:'Inter',system-ui,sans-serif;
  --body:'Inter',system-ui,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
  --hcase:none; --htrack:-.025em; --hweight:700;

  --paper:#F8FAFC; --card:#FFFFFF; --card-2:#F8FAFC;
  --line:#E5E9F0; --line-2:#F1F4F8;
  --ink:#0F172A; --slate:#64748B; --slate-2:#94A3B8;

  --carbon:#FFFFFF; --carbon-2:#F1F5F9; --carbon-3:#E2E8F0;
  --rail-tx:#475569; --rail-strong:#0F172A; --rail-bd:#E5E9F0;

  --orange:#4F46E5; --orange-d:#4338CA; --orange-w:#EEF0FE; --on-acc:#FFFFFF;
  --teal:#0891B2; --teal-w:#E0F5FA;
  --amber:#B45309; --amber-w:#FEF3E2;
  --green:#047857; --green-w:#E4F7F0;
  --violet:#7C3AED; --violet-w:#F2ECFE;
  --red:#DC2626;
  --lane:#F1F5F9;

  --r:14px; --r2:11px; --r3:9px; --pill:20px;
  --sh:0 1px 2px rgba(15,23,42,.04);
  --sh-2:0 8px 24px rgba(15,23,42,.08);
  --navmark:0;
}

/* ---- Design 4: Midnight (dark) ---- */
body[data-theme="midnight"]{
  --disp:'Space Grotesk',system-ui,sans-serif;
  --body:'Inter',system-ui,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
  --hcase:none; --htrack:-.02em; --hweight:600;

  --paper:#0A0F1E; --card:#131A2B; --card-2:#182034;
  --line:#252E45; --line-2:#1E2637;
  --ink:#E8EDF8; --slate:#95A0B8; --slate-2:#6B7690;

  --carbon:#060A14; --carbon-2:#141B2C; --carbon-3:#252E45;
  --rail-tx:#95A0B8; --rail-strong:#FFFFFF; --rail-bd:#1B2334;

  --orange:#2DD4BF; --orange-d:#14B8A6; --orange-w:#10302E; --on-acc:#04211E;
  --teal:#38BDF8; --teal-w:#132A3E;
  --amber:#FBBF24; --amber-w:#33280C;
  --green:#4ADE80; --green-w:#12301F;
  --violet:#A78BFA; --violet-w:#231C3D;
  --red:#F87171;
  --lane:#0E1524;

  --r:12px; --r2:10px; --r3:8px; --pill:20px;
  --sh:0 1px 2px rgba(0,0,0,.4);
  --sh-2:0 10px 30px rgba(0,0,0,.5);
  --navmark:1;
}

/* ---- Steel Blue ---- */
body[data-theme="steel"]{
  --disp:'Sora',system-ui,sans-serif; --body:'DM Sans',system-ui,sans-serif; --mono:'JetBrains Mono',monospace;
  --hcase:none; --htrack:-.02em; --hweight:700;
  --paper:#F1F5F9; --card:#FFFFFF; --card-2:#F8FAFC;
  --line:#DDE5EE; --line-2:#EDF2F7;
  --ink:#0B1B2B; --slate:#5B7085; --slate-2:#8DA0B3;
  --carbon:#0F2438; --carbon-2:#183149; --carbon-3:#264259;
  --rail-tx:#A9BDD1; --rail-strong:#FFFFFF; --rail-bd:transparent;
  --orange:#2E90FA; --orange-d:#1B6FD1; --orange-w:#E7F2FE; --on-acc:#FFFFFF;
  --teal:#0E7490; --teal-w:#E0F4FA; --amber:#A96A00; --amber-w:#FDF0DC;
  --green:#0F7A52; --green-w:#E2F5EC; --violet:#5B4BC4; --violet-w:#ECEAFB; --red:#C2372A;
  --lane:#E7EDF4; --r:10px; --r2:8px; --r3:7px; --pill:20px;
  --sh:0 1px 2px rgba(11,27,43,.06); --sh-2:0 6px 20px rgba(11,27,43,.1); --navmark:1;
}
/* ---- Racing Red ---- */
body[data-theme="racing"]{
  --disp:'Archivo',system-ui,sans-serif; --body:'Archivo',system-ui,sans-serif; --mono:'JetBrains Mono',monospace;
  --hcase:uppercase; --htrack:-.01em; --hweight:700;
  --paper:#EEEEF0; --card:#FFFFFF; --card-2:#F6F6F8;
  --line:#D6D6DB; --line-2:#E8E8EC;
  --ink:#0B0B0D; --slate:#63636B; --slate-2:#95959E;
  --carbon:#0B0B0D; --carbon-2:#161619; --carbon-3:#2A2A2F;
  --rail-tx:#A8A8B0; --rail-strong:#FFFFFF; --rail-bd:transparent;
  --orange:#E10600; --orange-d:#B00500; --orange-w:#FDE8E7; --on-acc:#FFFFFF;
  --teal:#00707F; --teal-w:#DEF1F3; --amber:#9A6600; --amber-w:#FBEEDA;
  --green:#0C7444; --green-w:#DFF3E9; --violet:#4B3FA6; --violet-w:#E9E7F7; --red:#C10D00;
  --lane:#E3E3E7; --r:2px; --r2:2px; --r3:2px; --pill:2px;
  --sh:none; --sh-2:0 6px 18px rgba(0,0,0,.14); --navmark:1;
}
/* ---- Sunset Warm ---- */
body[data-theme="sunset"]{
  --disp:'Sora',system-ui,sans-serif; --body:'DM Sans',system-ui,sans-serif; --mono:'JetBrains Mono',monospace;
  --hcase:none; --htrack:-.022em; --hweight:600;
  --paper:#FAF3EC; --card:#FFFDFA; --card-2:#F7EFE6;
  --line:#E7DACB; --line-2:#F1E7DB;
  --ink:#3A2A20; --slate:#8A7566; --slate-2:#B0A092;
  --carbon:#4A2F24; --carbon-2:#5C3C2E; --carbon-3:#6F4B3A;
  --rail-tx:#DCC7B8; --rail-strong:#FFF7F0; --rail-bd:transparent;
  --orange:#D96A32; --orange-d:#B65324; --orange-w:#FBEADF; --on-acc:#FFFFFF;
  --teal:#3E7A72; --teal-w:#E3F0ED; --amber:#A57314; --amber-w:#F9EEDA;
  --green:#4C7A3E; --green-w:#E9F1E3; --violet:#7A5390; --violet-w:#F1E9F5; --red:#B4402C;
  --lane:#F0E5D8; --r:14px; --r2:11px; --r3:9px; --pill:20px;
  --sh:0 1px 2px rgba(58,42,32,.06); --sh-2:0 8px 24px rgba(58,42,32,.12); --navmark:1;
}
/* ---- Forest Mint ---- */
body[data-theme="mint"]{
  --disp:'Manrope',system-ui,sans-serif; --body:'Manrope',system-ui,sans-serif; --mono:'JetBrains Mono',monospace;
  --hcase:none; --htrack:-.03em; --hweight:700;
  --paper:#F1F8F4; --card:#FFFFFF; --card-2:#F6FBF8;
  --line:#DCEAE2; --line-2:#EBF4EF;
  --ink:#0E2A20; --slate:#5C7A6C; --slate-2:#8FA89A;
  --carbon:#FFFFFF; --carbon-2:#F1F8F4; --carbon-3:#DCEAE2;
  --rail-tx:#41604F; --rail-strong:#0E2A20; --rail-bd:#DCEAE2;
  --orange:#10B981; --orange-d:#059669; --orange-w:#E4F8F0; --on-acc:#FFFFFF;
  --teal:#0E7490; --teal-w:#E1F3F8; --amber:#A97400; --amber-w:#FBF0DC;
  --green:#12784F; --green-w:#E1F5EC; --violet:#6D51C6; --violet-w:#EEEAFB; --red:#C4342A;
  --lane:#E8F3EC; --r:16px; --r2:13px; --r3:11px; --pill:20px;
  --sh:0 1px 2px rgba(14,42,32,.05); --sh-2:0 8px 26px rgba(14,42,32,.09); --navmark:0;
}
/* ---- Newsprint ---- */
body[data-theme="paper"]{
  --disp:'Archivo',system-ui,sans-serif; --body:'IBM Plex Sans',system-ui,sans-serif; --mono:'IBM Plex Mono',monospace;
  --hcase:uppercase; --htrack:.01em; --hweight:700;
  --paper:#FBFAF6; --card:#FFFFFF; --card-2:#F4F2EC;
  --line:#DAD5C8; --line-2:#EAE6DC;
  --ink:#171614; --slate:#6B665B; --slate-2:#9C968A;
  --carbon:#171614; --carbon-2:#232120; --carbon-3:#37342F;
  --rail-tx:#B6B0A4; --rail-strong:#FFFFFF; --rail-bd:transparent;
  --orange:#B32B1E; --orange-d:#8E2116; --orange-w:#F8E6E3; --on-acc:#FFFFFF;
  --teal:#1F5E6E; --teal-w:#E2EFF2; --amber:#8A6510; --amber-w:#F7EEDA;
  --green:#2C6444; --green-w:#E4EFE8; --violet:#4A3C74; --violet-w:#EBE8F3; --red:#A5271B;
  --lane:#F1EEE6; --r:0px; --r2:0px; --r3:0px; --pill:0px;
  --sh:none; --sh-2:0 4px 14px rgba(23,22,20,.14); --navmark:1;
}
/* ---- Desert Sand ---- */
body[data-theme="sand"]{
  --disp:'Archivo',system-ui,sans-serif; --body:'DM Sans',system-ui,sans-serif; --mono:'IBM Plex Mono',monospace;
  --hcase:none; --htrack:-.015em; --hweight:700;
  --paper:#F4EEE1; --card:#FFFCF5; --card-2:#F7F2E7;
  --line:#E2D7C1; --line-2:#EDE6D6;
  --ink:#2E2718; --slate:#7C7059; --slate-2:#A79B84;
  --carbon:#33301F; --carbon-2:#403C28; --carbon-3:#524D35;
  --rail-tx:#C3BCA1; --rail-strong:#FFFBF0; --rail-bd:transparent;
  --orange:#6F7F35; --orange-d:#57652A; --orange-w:#EDF0DF; --on-acc:#FFFFFF;
  --teal:#3D6E74; --teal-w:#E3EFF0; --amber:#9A6D12; --amber-w:#F8EED9;
  --green:#4A7040; --green-w:#E8F0E4; --violet:#6B5680; --violet-w:#EFEAF3; --red:#A9432B;
  --lane:#EBE3D1; --r:8px; --r2:7px; --r3:6px; --pill:20px;
  --sh:0 1px 2px rgba(46,39,24,.06); --sh-2:0 8px 22px rgba(46,39,24,.12); --navmark:1;
}
/* ---- Neon Violet ---- */
body[data-theme="neon"]{
  --disp:'Space Grotesk',system-ui,sans-serif; --body:'Manrope',system-ui,sans-serif; --mono:'JetBrains Mono',monospace;
  --hcase:none; --htrack:-.02em; --hweight:600;
  --paper:#0C0A1A; --card:#161231; --card-2:#1D1840;
  --line:#2E2760; --line-2:#241E4C;
  --ink:#EDE9FF; --slate:#9E95D0; --slate-2:#6F669F;
  --carbon:#070516; --carbon-2:#161231; --carbon-3:#2E2760;
  --rail-tx:#9E95D0; --rail-strong:#FFFFFF; --rail-bd:#1D1840;
  --orange:#D946EF; --orange-d:#B926D0; --orange-w:#37103E; --on-acc:#FFFFFF;
  --teal:#38BDF8; --teal-w:#0F2B44; --amber:#FBBF24; --amber-w:#3A2C0B;
  --green:#4ADE80; --green-w:#123122; --violet:#A78BFA; --violet-w:#251E45; --red:#FB7185;
  --lane:#100D24; --r:12px; --r2:10px; --r3:8px; --pill:20px;
  --sh:0 1px 2px rgba(0,0,0,.45); --sh-2:0 12px 34px rgba(0,0,0,.6); --navmark:1;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--paper);color:var(--ink);font-family:var(--body);font-size:14px;-webkit-font-smoothing:antialiased;
  transition:background .18s,color .18s}
button,input,select,textarea{font-family:inherit;font-size:14px;color:inherit}
input,select,textarea{background:var(--card);color:var(--ink)}
h1,h2,h3,h4{margin:0;font-family:var(--disp);font-weight:var(--hweight);letter-spacing:var(--htrack);text-transform:var(--hcase)}
.mono{font-family:var(--mono)}
.hide{display:none !important}
::selection{background:var(--orange);color:var(--on-acc)}
:focus-visible{outline:2px solid var(--orange);outline-offset:2px}

/* ============ SHELL ============ */
#app{display:grid;grid-template-columns:244px 1fr;min-height:100vh}
.rail{background:var(--carbon);display:flex;flex-direction:column;position:sticky;top:0;height:100vh;color:var(--rail-tx);
  border-right:1px solid var(--rail-bd)}
.wsw{margin:14px 12px 6px;background:var(--carbon-2);border:1px solid var(--carbon-3);border-radius:var(--r2);padding:10px 12px;display:flex;gap:10px;align-items:center}
.wsw .lg{width:32px;height:32px;border-radius:var(--r3);background:var(--orange);color:var(--on-acc);display:grid;place-items:center;
  font-family:var(--disp);font-weight:700;font-size:15px;flex-shrink:0}
.wsw .tx{min-width:0;flex:1}
.wsw .t1{color:var(--rail-strong);font-weight:600;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsw .t2{color:var(--slate-2);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.branchpick{margin:0 12px 8px}
.branchpick select{width:100%;background:var(--carbon-2);border:1px solid var(--carbon-3);color:var(--rail-strong);border-radius:var(--r3);
  padding:8px 10px;font-size:12.5px;font-weight:600;cursor:pointer}
.branchpick select:disabled{opacity:.7;cursor:default}
.nav{padding:6px 12px 12px;flex:1;overflow:auto}
.nav .grp{padding:14px 6px 6px;font-size:10px;letter-spacing:.15em;color:var(--slate-2);text-transform:uppercase;font-weight:700}
.nav a,.nav button{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:none;border:0;color:var(--rail-tx);
  padding:8px 10px;cursor:pointer;border-radius:var(--r3);font-size:13.5px;font-weight:500;position:relative;text-decoration:none}
.nav a:hover,.nav button:hover{background:var(--carbon-2);color:var(--rail-strong)}
.nav a.on,.nav button.on{background:var(--carbon-2);color:var(--rail-strong);font-weight:600}
.nav a.on:before,.nav button.on:before{content:'';position:absolute;left:-12px;top:9px;bottom:9px;width:3px;background:var(--orange);
  border-radius:0 3px 3px 0;opacity:var(--navmark)}
body[data-theme="green"] .nav a.on,body[data-theme="green"] .nav button.on{background:var(--orange);color:var(--on-acc)}
body[data-theme="cloud"] .nav a.on,body[data-theme="cloud"] .nav button.on,
body[data-theme="mint"] .nav a.on,body[data-theme="mint"] .nav button.on{background:var(--orange-w);color:var(--orange-d)}
body[data-theme="racing"] .nav a.on,body[data-theme="racing"] .nav button.on,
body[data-theme="paper"] .nav a.on,body[data-theme="paper"] .nav button.on{background:var(--orange);color:var(--on-acc)}
.nav .ic{width:16px;display:grid;place-items:center;opacity:.85}
.nav .cnt{margin-left:auto;font-family:var(--mono);font-size:10.5px;background:var(--carbon-3);padding:1px 6px;border-radius:20px;color:var(--rail-tx)}
.nav .cnt.hot{background:var(--orange);color:var(--on-acc)}
.railfoot{padding:12px;border-top:1px solid var(--carbon-2);display:flex;gap:10px;align-items:center}
.railfoot .nm{color:var(--rail-strong);font-size:13px;font-weight:600;line-height:1.2}
.railfoot .rl{color:var(--slate-2);font-size:11px}
.iconbtn{background:none;border:1px solid var(--carbon-3);color:var(--rail-tx);width:28px;height:28px;border-radius:var(--r3);cursor:pointer;display:grid;place-items:center;text-decoration:none}
.iconbtn:hover{color:var(--rail-strong)}

.main{min-width:0;display:flex;flex-direction:column}
.topbar{background:var(--paper);border-bottom:1px solid var(--line);padding:0 26px;min-height:56px;display:flex;align-items:center;
  gap:12px;position:sticky;top:0;z-index:20;flex-wrap:wrap}
.crumb{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--slate);font-weight:500}
.crumb b{color:var(--ink);font-weight:600}
.crumb .sep{opacity:.4}
.themepick{display:flex;align-items:center;gap:8px;margin-left:auto}
.themepick .lb{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--slate);font-weight:700}
.themepick select{border:1px solid var(--line);background:var(--card);border-radius:var(--r3);padding:6px 10px;font-weight:600;
  font-size:12.5px;cursor:pointer;box-shadow:var(--sh)}
.swatch{display:flex;gap:3px}
.swatch i{width:11px;height:11px;border-radius:3px;display:block}
.content{padding:24px 26px 44px;flex:1;max-width:1360px;width:100%}
/* The way back out of a sub-screen (Views/Shared/_BackLink.cshtml).

   Here rather than in site.css, which is the reason this was worth moving: the platform panel's
   shell loads the design system and site.css is not among its stylesheets, so every screen under
   the panel's dashboard drew its back link as a bare underlined anchor sitting on top of the
   eyebrow. A component the shared shell renders on every screen belongs in the stylesheet every
   shell loads.

   Above the heading and hard against the left edge of the content, so it is the first thing under
   the bar on every screen that has one and always in the same place. Quiet until it is wanted: a
   chip in the card colour, and the arrow only takes the accent under the pointer. */
.page-back{display:inline-flex;align-items:center;gap:8px;margin:0 0 14px;padding:5px 13px 5px 5px;
  border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--slate);
  font-size:12.5px;font-weight:600;line-height:1.2;text-decoration:none;box-shadow:var(--sh)}
.page-back:hover{border-color:var(--orange);color:var(--ink)}
.page-back:focus-visible{outline:2px solid var(--orange);outline-offset:2px}
.page-back-arrow{display:grid;place-items:center;width:22px;height:22px;border-radius:999px;
  background:var(--line-2);color:var(--ink);font-size:14px;line-height:1}
.page-back:hover .page-back-arrow{background:var(--orange);color:var(--on-acc)}

/* Where the arrow points at a record rather than a section the label is that record's own name — a
   number plate, a bill number, a customer. Those can be long, and a chip that grows with one pushes
   the heading off the top of a phone. */
.page-back-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:44ch}

.phead{display:flex;align-items:flex-start;gap:16px;margin-bottom:20px;flex-wrap:wrap}
.phead .eyebrow{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--orange);font-weight:700;margin-bottom:5px}
.phead h1{font-size:27px;line-height:1.1}
.phead .sub{color:var(--slate);font-size:13.5px;margin-top:5px}
.phead .sp{flex:1}
.acts{display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* ============ BITS ============ */
.btn{border:1px solid var(--line);background:var(--card);color:var(--ink);padding:8px 13px;border-radius:var(--r3);cursor:pointer;
  font-weight:600;font-size:13px;display:inline-flex;align-items:center;gap:7px;box-shadow:var(--sh);transition:.13s;text-decoration:none}
.btn:hover{border-color:var(--slate-2)}
.btn.pri{background:var(--orange);border-color:var(--orange-d);color:var(--on-acc)}
.btn.pri:hover{background:var(--orange-d);color:var(--on-acc)}
.btn.dark{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.btn.quiet{box-shadow:none;background:transparent;border-color:transparent;color:var(--slate)}
.btn.quiet:hover{background:var(--line-2);color:var(--ink)}
.btn.danger{color:var(--red);border-color:var(--red);background:transparent}
.btn.danger:hover{background:var(--red);color:#fff}
.btn.sm{padding:5px 10px;font-size:12px}
.btn:disabled{opacity:.45;cursor:not-allowed}

/* ---------------------------------------------------- something is happening
   Set by busy.js. Both halves of the loader are defined here rather than beside the screens that
   use them, because "working" has to look the same on a bill as it does on a job card.

   The spinner goes in front of the label instead of replacing it. Replacing it means hiding the
   text, and a hidden label cannot be coloured by currentColor — which is the only thing that makes
   one rule work on a white button, an orange one and a red one at once. It costs a few pixels of
   movement when it appears, and buys a button that still says what it is doing. */

.gx-bar{position:fixed;top:0;left:0;height:2px;width:0;z-index:200;
  background:var(--orange);box-shadow:0 0 9px var(--orange);border-radius:0 2px 2px 0;
  opacity:0;transition:width .24s ease,opacity .22s ease;pointer-events:none}
.gx-bar.on{opacity:1}

.btn[data-busy]{pointer-events:none;opacity:.72}
.btn[data-busy]:before{content:'';width:13px;height:13px;flex:0 0 auto;border-radius:50%;
  border:2px solid currentColor;border-right-color:transparent;animation:gx-spin .62s linear infinite}
.btn.sm[data-busy]:before{width:11px;height:11px;border-width:1.6px}

@keyframes gx-spin{to{transform:rotate(360deg)}}

/* A form that is posting stops taking presses — every submit button on it, not only the one that
   was pressed. On a bill, two presses are two bills, and the second one is found by an accountant
   rather than by whoever pressed it. */
form[data-busy]{cursor:progress}
form[data-busy] button[type=submit],form[data-busy] input[type=submit]{pointer-events:none}

@media (prefers-reduced-motion:reduce){
  .btn[data-busy]:before{animation:none;opacity:.55}
  .gx-bar{transition:opacity .22s ease}
}

.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh)}
.card .hd{padding:14px 16px;border-bottom:1px solid var(--line-2);display:flex;align-items:center;gap:10px}
.card .hd h3{font-size:15.5px}
.card .hd .sp{flex:1}
.card .bd{padding:16px}
/* A card that is a form has a footer, the same way a dialog does — the buttons on a bar of their
   own rather than loose under the last field, where on a long form they read as belonging to it.
   Written to match `.modal .mf` exactly, because the two are the same row: half these screens are
   opened as a dialog and half as a page, and the same file draws both. */
.ft{padding:13px 16px;border-top:1px solid var(--line-2);display:flex;gap:8px;justify-content:flex-end;align-items:center;flex-wrap:wrap;background:var(--card-2)}
.card > .ft{border-radius:0 0 var(--r) var(--r)}
/* A form whose fields are several cards ends with the row standing on its own, so it needs its own
   edges rather than borrowing the last card's. */
form > .ft{border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh)}
/* Anything pushed to the left of that row — a Remove that must not sit beside Save. */
.ft .sp{flex:1}
.grid{display:grid;gap:14px}
.g4{grid-template-columns:repeat(4,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g2{grid-template-columns:1fr 1fr}

.stat{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:15px 16px;box-shadow:var(--sh);position:relative}
body[data-theme="green"] .stat{border-left:4px solid var(--orange)}
.stat .k{font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--slate);font-weight:700}
.stat .v{font-family:var(--disp);font-size:30px;line-height:1.1;margin-top:7px;letter-spacing:var(--htrack)}
.stat .n{font-size:12px;color:var(--slate);margin-top:4px}
.stat .chip{position:absolute;top:14px;right:14px;width:30px;height:30px;border-radius:var(--r3);display:grid;place-items:center;font-size:14px}
.c-o{background:var(--orange-w);color:var(--orange-d)}
.c-t{background:var(--teal-w);color:var(--teal)}
.c-g{background:var(--green-w);color:var(--green)}
.c-a{background:var(--amber-w);color:var(--amber)}
.c-v{background:var(--violet-w);color:var(--violet)}

table{width:100%;border-collapse:collapse}
th{text-align:left;font-size:10.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--slate);font-weight:700;
  padding:10px 16px;border-bottom:1px solid var(--line);background:var(--card-2);white-space:nowrap}
td{padding:11px 16px;border-bottom:1px solid var(--line-2);vertical-align:middle}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover{background:var(--card-2)}
.num{text-align:right;font-family:var(--mono);font-weight:500;white-space:nowrap;font-size:13px}
.tblwrap{overflow:auto}

.pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:var(--pill);font-size:11px;font-weight:700}
.pill:before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor}
body[data-theme="green"] .pill{text-transform:uppercase;letter-spacing:.08em;font-size:10.5px}
body[data-theme="green"] .pill:before{display:none}
.p-open{background:var(--orange-w);color:var(--orange-d)}
.p-prog{background:var(--teal-w);color:var(--teal)}
.p-done{background:var(--green-w);color:var(--green)}
.p-bill{background:var(--violet-w);color:var(--violet)}
.p-low{background:var(--amber-w);color:var(--amber)}

/* A right taken off somebody, beside the ones given to them. Red, because the two lists sit in one
   column and "− See suppliers" in the same amber as "Raise bills" reads as another grant. */
.p-stop{background:var(--orange-w);color:var(--red)}

.search{position:relative}
.search input{padding:8px 12px 8px 32px;border:1px solid var(--line);border-radius:var(--r3);width:230px;box-shadow:var(--sh)}
.search:before{content:'\2315';position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--slate);font-size:16px}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chip-f{padding:5px 11px;border:1px solid var(--line);background:var(--card);border-radius:var(--pill);font-size:12.5px;font-weight:600;cursor:pointer;color:var(--slate);text-decoration:none;display:inline-block}
.chip-f.on{background:var(--ink);border-color:var(--ink);color:var(--paper)}

/* A row of filters that is not all pills: the preset chips sit above in .chips, and this carries the
   two things that need a box rather than a pill - a typed date range, and the control pushed to the
   far end by .sp. Wraps rather than scrolls, because on a narrow screen the second half is still a
   filter and not an overflow. */
.filterbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.daterange{display:flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--card);
  border-radius:var(--pill);padding:4px 5px 4px 12px}
.daterange label{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--slate);font-weight:700}
.daterange input[type=date]{border:1px solid var(--line);background:var(--card);color:var(--ink);
  border-radius:var(--r3);padding:4px 8px;font-size:12.5px;font-weight:600;font-family:inherit}
.daterange input[type=date]:focus{outline:0;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-w)}

.plate{display:inline-flex;align-items:stretch;border:2px solid #12161C;border-radius:5px;overflow:hidden;background:#fff;
  font-family:var(--mono);font-weight:700;line-height:1}
.plate .ind{background:#12377E;color:#fff;padding:0 4px;font-size:7px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:1px;letter-spacing:.04em;font-family:var(--body);font-weight:700}
.plate .ind i{font-style:normal;color:#FFC93C;font-size:7px;line-height:1}
.plate .no{padding:5px 9px;font-size:13.5px;letter-spacing:.05em;color:#0F1319}
.plate.lg .no{font-size:20px;padding:9px 14px;letter-spacing:.06em}
.plate.sm .no{font-size:11px;padding:3px 6px}
.plate.sm .ind{font-size:6px;padding:0 3px}

.tagid{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);background:var(--card-2);
  border-radius:var(--r3);padding:4px 9px;font-family:var(--mono);font-weight:700;font-size:12.5px;color:var(--ink);line-height:1}
.tagid .hash{color:var(--orange);font-weight:700}
.tagid.lg{font-size:16px;padding:8px 13px}
.tagid.sm{font-size:11px;padding:3px 7px}
/* A choice card is a <label>, and `.field label` styles form labels — block, uppercase, slate,
   letter-spaced. That rule sits later in this file, so on equal specificity it wins and flattens
   the card: the radio drops onto its own line, the icon onto the next, and the wording comes out
   shouting. The component therefore states its own layout at a specificity the form rule cannot
   reach, and resets the label typography it would otherwise inherit. */
.bizcard,.field label.bizcard{display:flex;gap:11px;align-items:center;width:100%;text-align:left;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r2);padding:11px 12px;
  cursor:pointer;margin:0 0 7px;
  font-size:13.5px;font-weight:400;line-height:1.35;letter-spacing:normal;text-transform:none;color:var(--ink)}
.bizcard:hover{border-color:var(--orange)}
/* `.on` is stamped on the server so the first paint is already right. `:has` keeps the highlight
   with the radio as it is clicked — without it the card only catches up after a round trip, and a
   picker whose selection does not move is a picker people press twice. */
.bizcard.on,.bizcard:has(input:checked){border-color:var(--orange);background:var(--orange-w)}
.bizcard:has(input:focus-visible){box-shadow:0 0 0 3px var(--orange-w)}
/* Sized here rather than inline, because `.field input{width:100%}` would otherwise stretch the
   radio across the card. */
.bizcard input[type=radio],.field .bizcard input[type=radio]{width:auto;margin:0;flex-shrink:0;accent-color:var(--orange)}
.bizcard .ic{width:32px;height:32px;border-radius:var(--r3);background:var(--card-2);display:grid;place-items:center;font-size:16px;flex-shrink:0}
.bizcard.on .ic,.bizcard:has(input:checked) .ic{background:var(--orange);color:var(--on-acc)}
.bizcard .tx{display:block;min-width:0}
.bizcard b{display:block;font-size:13.5px;font-weight:700;color:var(--ink)}
.bizcard .d{display:block;font-size:12px;font-weight:400;color:var(--slate);text-transform:none;letter-spacing:normal}
.meter{height:5px;background:var(--line);border-radius:20px;overflow:hidden;width:74px;margin-top:5px}
.meter i{display:block;height:100%;border-radius:20px;background:var(--green)}
.meter.low i{background:var(--amber)}
.meter.out i{background:var(--red)}

.board{display:grid;grid-template-columns:repeat(4,minmax(230px,1fr));gap:14px;align-items:start}
.lane{background:var(--lane);border:1px solid var(--line);border-radius:var(--r);min-height:150px}
.lane.over{border-color:var(--orange);background:var(--orange-w)}
.lane .lh{padding:11px 13px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--line)}
.lane .lh h4{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--slate);font-family:var(--body);font-weight:700}
.lane .lh .n{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--slate)}
.lane .lb{padding:10px;display:grid;gap:9px}
.jc{background:var(--card);border:1px solid var(--line);border-radius:var(--r2);padding:11px;cursor:grab;box-shadow:var(--sh)}
.jc:hover{box-shadow:var(--sh-2)}
.jc:active{cursor:grabbing}
.jc .top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.jc .no{font-family:var(--mono);font-size:11px;color:var(--slate);font-weight:700}
.jc .amt{margin-left:auto;font-family:var(--mono);font-size:12.5px;font-weight:700}
.jc .car{font-size:12.5px;color:var(--slate);margin-top:7px}
.jc .cx{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:12px;color:var(--slate);border-top:1px dashed var(--line);padding-top:8px}
.jc .cx .dot{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700;color:#fff}
.lane .none{padding:22px 12px;text-align:center;color:var(--slate-2);font-size:12.5px}

.vcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(238px,1fr));gap:14px}
.vcard{background:var(--card);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;cursor:pointer;box-shadow:var(--sh);transition:.14s}
.vcard:hover{box-shadow:var(--sh-2);transform:translateY(-1px)}
.vcard .ph{height:138px;background:var(--lane);display:grid;place-items:center;overflow:hidden;position:relative}
.vcard .ph img{width:100%;height:100%;object-fit:cover;display:block}
.vcard .ph .ni{color:var(--slate-2);font-size:11px;letter-spacing:.16em;font-weight:700}
.vcard .ph .cnt{position:absolute;bottom:8px;right:8px;background:rgba(10,14,22,.74);color:#fff;font-size:10.5px;padding:2px 7px;border-radius:20px;font-family:var(--mono)}
.vcard .bd{padding:12px}
.vcard .mk{font-weight:700;margin-top:9px;font-size:14px}
.vcard .ow{font-size:12.5px;color:var(--slate);margin-top:2px}
/* The delete sits over the card's corner, not in the flow: the whole card is one link, and a form
   inside an anchor is markup a browser throws away. */
.vcard-wrap{position:relative;display:flex;flex-direction:column}
.vcard-wrap>.vcard{flex:1}
.vcard-del{position:absolute;top:8px;right:8px;z-index:2;line-height:0}
/* The whole card is the way into the record it stands for. Laid over the card rather than wrapped
   around it, because a card carries its own row of buttons and a button nested inside an anchor is
   not markup a browser will keep. Everything meant to stay pressable lifts itself above this. */
.vcard-open{position:absolute;inset:0;z-index:1;border-radius:var(--r)}
.vcard-open:focus-visible{outline:2px solid var(--orange);outline-offset:2px}
.vcard-acts{position:relative;z-index:2;display:flex;gap:6px;margin-top:10px}
.vcard-del button{background:rgba(10,14,22,.72);color:#fff;border:0;border-radius:7px;width:26px;height:26px;cursor:pointer;line-height:1;font-size:13px;display:grid;place-items:center;padding:0}
.vcard-del button:hover,.vcard-del button:focus-visible{background:var(--red)}
/* It is on the card at all times. Revealing it on hover meant a counter on a touch screen had no
   way to find it at all, and on a mouse it meant the button only existed once you were already
   pointing at the card you wanted it on. */

.thumbs{display:flex;gap:8px;flex-wrap:wrap}
.thumb{width:94px;height:70px;border:1px solid var(--line);border-radius:var(--r3);overflow:hidden;position:relative;background:var(--lane)}
.thumb img{width:100%;height:100%;object-fit:cover;display:block}
.thumb button{position:absolute;top:3px;right:3px;background:rgba(10,14,22,.72);color:#fff;border:0;border-radius:5px;width:19px;height:19px;cursor:pointer;line-height:1;font-size:12px}
.drop{border:1.5px dashed var(--line);border-radius:var(--r2);padding:18px;text-align:center;color:var(--slate);cursor:pointer;background:var(--card-2);font-size:13px}
.drop:hover{border-color:var(--orange);color:var(--orange-d);background:var(--orange-w)}

.stepper{display:flex;align-items:center;position:relative;z-index:0;margin:2px 0 4px}
.stepper .st{flex:1;text-align:center;position:relative;font-size:10.5px;font-weight:700;color:var(--slate-2);letter-spacing:.05em;text-transform:uppercase}
.stepper .st .d{width:11px;height:11px;border-radius:50%;background:var(--line);margin:0 auto 6px;border:2px solid var(--card);box-shadow:0 0 0 1px var(--line)}
.stepper .st:after{content:'';position:absolute;top:5px;left:50%;width:100%;height:2px;background:var(--line);z-index:-1}
.stepper .st:last-child:after{display:none}
.stepper .st.done{color:var(--ink)}
.stepper .st.done .d{background:var(--orange);box-shadow:0 0 0 1px var(--orange)}

.field{margin-bottom:13px}
.field label,.field .lb{display:block;font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--slate);font-weight:700;margin-bottom:6px}
.field input,.field select,.field textarea{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:var(--r3)}
.field input:focus,.field select:focus,.field textarea:focus{outline:0;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-w)}
/* A control standing alone in a summary row or a side card — the .field look without the .field
   wrapper, sized by the row it sits in instead of stretched across it. */
.ctl{padding:6px 9px;border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:var(--r3);font-size:13px}
.ctl:focus{outline:0;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-w)}
select.ctl{cursor:pointer;font-weight:600}
.row{display:grid;gap:13px}
.r2{grid-template-columns:1fr 1fr}
.r3{grid-template-columns:1fr 1fr 1fr}
.hintbox{background:var(--card-2);border:1px solid var(--line-2);border-radius:var(--r3);padding:10px 12px;font-size:12.5px;color:var(--slate)}
/* The refused/saved flash strips. One class each, so every screen's notice is the same notice. */
.hintbox.bad{border-color:var(--red);color:var(--red);margin-bottom:14px}
.hintbox.ok{margin-bottom:14px}

/* Utilities the screens kept hand-writing inline, named once so every copy is the same copy. */
.btn.block{width:100%;justify-content:center}
/* "big" rather than "lg": inside #login, .lg is the logo badge and would shrink the button. */
.btn.big{padding:11px 16px}
/* The small uppercase label over a section — the same look .phead's eyebrow has, available to any card. */
.eyebrow{display:block;font-size:10.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--slate);font-weight:700}
/* A table's closing sum row. */
.totals{background:var(--card-2);border-top:1px solid var(--line)}
/* One label-and-figure line in a summary stack (bill totals, timelines). */
.kvrow{display:flex;justify-content:space-between;gap:12px;padding:4px 0;font-size:13px}
/* Secondary text: quieter, and the small size the screens kept asking for by hand. */
.dim{color:var(--slate)}
.fine{font-size:12.5px;color:var(--slate)}

.empty{padding:44px 22px;text-align:center}
.empty .ico{width:46px;height:46px;border-radius:var(--r2);background:var(--card-2);display:grid;place-items:center;margin:0 auto 12px;font-size:20px}
.empty h3{font-size:16.5px;margin-bottom:5px}
.empty p{color:var(--slate);font-size:13.5px;margin:0 0 14px}

#modalWrap{position:fixed;inset:0;background:rgba(8,12,20,.5);display:none;z-index:60;padding:26px;overflow:auto}
#modalWrap.on{display:block}
.modal{background:var(--card);max-width:640px;margin:0 auto;border-radius:var(--r);box-shadow:var(--sh-2);animation:pop .15s ease-out;border:1px solid var(--line)}
.modal.wide{max-width:900px}
@keyframes pop{from{transform:translateY(12px) scale(.99);opacity:0}to{transform:none;opacity:1}}
.modal .mh{padding:16px 18px;border-bottom:1px solid var(--line-2);display:flex;align-items:center;gap:12px}
.modal .mh h3{font-size:18px;flex:1}
.modal .mb{padding:18px;max-height:66vh;overflow:auto}
.modal .mf{padding:13px 18px;border-top:1px solid var(--line-2);display:flex;gap:8px;justify-content:flex-end;background:var(--card-2);border-radius:0 0 var(--r) var(--r)}
.x{background:none;border:0;font-size:20px;cursor:pointer;color:var(--slate);line-height:1;padding:2px 6px;border-radius:6px}
.x:hover{background:var(--card-2);color:var(--ink)}

#toast{position:fixed;right:24px;top:74px;z-index:99;background:var(--ink);color:var(--paper);padding:12px 16px;border-radius:var(--r2);
  font-weight:500;font-size:13.5px;box-shadow:var(--sh-2);transform:translateX(130%);transition:.24s cubic-bezier(.2,.8,.2,1);max-width:330px}
#toast.on{transform:none}
#toast.bad{background:var(--red);color:#fff}

/* login */
#login{min-height:100vh;display:grid;grid-template-columns:1.02fr .98fr}
#login .left{background:var(--carbon);color:var(--rail-strong);padding:56px 52px;display:flex;flex-direction:column;justify-content:center;position:relative;overflow:hidden}
#login .left:after{content:'';position:absolute;right:-90px;bottom:-90px;width:320px;height:320px;border-radius:50%;
  background:radial-gradient(circle,var(--orange),transparent 68%);opacity:.22}
#login .lg{width:44px;height:44px;border-radius:var(--r2);background:var(--orange);color:var(--on-acc);display:grid;place-items:center;
  font-family:var(--disp);font-weight:700;font-size:20px;margin-bottom:22px}
#login .left h1{font-size:44px;line-height:1.04}
#login .left h1 em{font-style:normal;color:var(--orange)}
#login .left p{color:var(--slate-2);max-width:400px;line-height:1.65;margin:16px 0 32px;font-size:14.5px}
#login .feat{display:grid;gap:13px;max-width:420px;position:relative;z-index:1}
#login .feat div{display:flex;gap:11px;align-items:flex-start;font-size:13.5px;color:var(--rail-tx);line-height:1.5}
#login .feat b{color:var(--orange);font-family:var(--mono);font-size:11px;padding-top:2px;flex-shrink:0}
#login .right{display:grid;place-items:center;padding:40px;background:var(--card)}
.loginbox{width:100%;max-width:372px}
.loginbox h2{font-size:24px;margin-bottom:5px}
.loginbox .hint{color:var(--slate);font-size:13.5px;margin-bottom:20px}
.duser{display:flex;gap:11px;align-items:center;width:100%;text-align:left;background:var(--card);border:1px solid var(--line);
  border-radius:var(--r2);padding:10px 12px;cursor:pointer;margin-bottom:8px;transition:.13s}
.duser:hover{border-color:var(--orange);background:var(--orange-w)}
.av{width:30px;height:30px;border-radius:var(--r3);display:grid;place-items:center;font-family:var(--disp);font-size:12.5px;font-weight:700;color:#fff;flex-shrink:0}
.duser .nm{font-weight:700;font-size:13.5px}
.duser .rl{font-size:11.5px;color:var(--slate)}

/* The last row of a list of people, and the only one that is not a person. Drawn to the same width
   and the same corners as the names above it so the list reads as one block of choices, and dashed
   so the one that is not a name does not look like a seventh customer. A small button floating at
   its own width under a stack of full-width rows read as a stray control. */
.dnone{display:flex;width:100%;align-items:center;justify-content:center;gap:7px;
  background:transparent;border:1px dashed var(--line);border-radius:var(--r2);padding:9px 12px;
  font-family:inherit;font-weight:600;font-size:12.5px;color:var(--slate);cursor:pointer;transition:.13s}
.dnone:hover{border-style:solid;border-color:var(--orange);background:var(--orange-w);color:var(--orange-d)}
.dnone:focus-visible{outline:2px solid var(--orange);outline-offset:2px}
.divider{display:flex;align-items:center;gap:11px;color:var(--slate-2);font-size:10.5px;letter-spacing:.14em;margin:20px 0;font-weight:700}
.divider:before,.divider:after{content:'';flex:1;height:1px;background:var(--line)}
.loginTheme{display:flex;align-items:center;gap:8px;position:absolute;top:20px;right:20px;z-index:3}
.loginTheme select{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:var(--r3);padding:6px 10px;font-weight:600;font-size:12.5px;cursor:pointer}

/* bill — always light so it prints correctly */
.bill{background:#fff;padding:34px;max-width:790px;margin:0 auto;color:#111;position:relative;font-family:var(--body)}
.bill .bh{display:flex;justify-content:space-between;gap:20px;padding-bottom:16px;border-bottom:2px solid #111;margin-bottom:18px}
.bill .gname{font-family:var(--disp);font-size:25px;line-height:1.1;color:#111}
.bill .binfo{font-size:11.5px;color:#5A6572;margin-top:6px;line-height:1.6}
.bill .bmeta{text-align:right;flex-shrink:0}
.bill .bmeta .ttl{display:inline-block;background:#111;color:#fff;font-family:var(--disp);font-size:12px;letter-spacing:.14em;padding:5px 11px;border-radius:5px}
.bill .bmeta .no{font-family:var(--mono);font-size:15px;font-weight:700;margin-top:9px;color:#111}
.bill .bmeta .dt{font-size:12px;color:#5A6572;margin-top:2px}
.bill .parties{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:18px}
.bill .bx{border:1px solid #DFE4E9;border-radius:9px;padding:12px}
.bill .lbl{font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:#6B7684;font-weight:700;margin-bottom:7px}
.bill table{border:1px solid #DFE4E9;border-radius:9px;overflow:hidden}
.bill th{background:#F5F7F9;color:#6B7684;padding:9px 12px;border-bottom:1px solid #DFE4E9}
.bill td{padding:9px 12px;border-bottom:1px solid #EDF0F3;color:#111}
.bill tbody tr:hover{background:transparent}
.bill .tot{margin-left:auto;width:300px;margin-top:14px}
.bill .tot div{display:flex;justify-content:space-between;padding:5px 0;font-size:13px;color:#39414B}
.bill .tot .gr{border-top:2px solid #111;margin-top:7px;padding-top:11px;font-weight:700;font-size:19px;font-family:var(--disp);color:#111}
.bill .sign{margin-top:44px;display:flex;justify-content:space-between;font-size:11.5px;color:#5A6572}
.bill .sign div{border-top:1px solid #A8B0BA;padding-top:6px;width:180px;text-align:center}
.stamp{position:absolute;top:96px;right:44px;border:3px solid #12784F;color:#12784F;font-family:var(--disp);font-size:22px;
  letter-spacing:.16em;padding:6px 16px;border-radius:7px;transform:rotate(-11deg);opacity:.82}
.billwrap{background:var(--lane);border-radius:var(--r);padding:16px}

/* ============================================================
   LAYOUTS — each design picks one of these four shells
   ============================================================ */
body[data-layout="classic"] #app{display:grid;grid-template-columns:244px 1fr;min-height:100vh}
body[data-layout="icon"]    #app{display:grid;grid-template-columns:74px 1fr;min-height:100vh}
body[data-layout="top"]     #app{display:block;min-height:100vh}
body[data-layout="mobile"]  #app{display:block;max-width:680px;margin:0 auto;min-height:100vh;
  background:var(--paper);border-left:1px solid var(--line);border-right:1px solid var(--line);padding-bottom:78px}
body[data-layout="mobile"]{background:var(--lane)}

/* ---- top bar layout ---- */
.tnav{background:var(--carbon);color:var(--rail-tx);position:sticky;top:0;z-index:30;border-bottom:1px solid var(--rail-bd)}
.tn-in{max-width:1440px;margin:0 auto;padding:0 24px;height:62px;display:flex;align-items:center;gap:20px}
.tn-brand{display:flex;align-items:center;gap:10px;flex-shrink:0;text-decoration:none}
.tn-brand .lg{width:32px;height:32px;border-radius:var(--r3);background:var(--orange);color:var(--on-acc);
  display:grid;place-items:center;font-family:var(--disp);font-weight:700;font-size:15px}
.tn-brand .t1{color:var(--rail-strong);font-weight:700;font-size:14px;line-height:1.15}
.tn-brand .t2{color:var(--slate-2);font-size:11px}
.tn-links{display:flex;gap:2px;flex:1;overflow:auto;scrollbar-width:none}
.tn-links::-webkit-scrollbar{display:none}
.tn-links a,.tn-links button{background:none;border:0;color:var(--rail-tx);padding:8px 12px;border-radius:var(--r3);cursor:pointer;
  font-weight:600;font-size:13.5px;white-space:nowrap;display:flex;gap:7px;align-items:center;text-decoration:none}
.tn-links a:hover,.tn-links button:hover{background:var(--carbon-2);color:var(--rail-strong)}
.tn-links a.on,.tn-links button.on{background:var(--orange);color:var(--on-acc)}
.tn-links .cnt{font-family:var(--mono);font-size:10px;background:var(--carbon-3);padding:1px 5px;border-radius:20px}
.tn-links a.on .cnt,.tn-links button.on .cnt{background:rgba(255,255,255,.25);color:inherit}
.tn-right{display:flex;align-items:center;gap:9px;flex-shrink:0}
.tn-right select{background:var(--carbon-2);border:1px solid var(--carbon-3);color:var(--rail-strong);border-radius:var(--r3);
  padding:6px 9px;font-size:12.5px;font-weight:600;cursor:pointer}
body[data-layout="top"] .content{max-width:1440px;margin:0 auto;padding:24px}
body[data-theme="paper"] .content{max-width:none}
body[data-theme="paper"] .card{border-left:0;border-right:0}

/* ---- icon rail layout ---- */
.irail{background:var(--carbon);position:sticky;top:0;height:100vh;display:flex;flex-direction:column;align-items:center;
  gap:5px;padding:14px 0;border-right:1px solid var(--rail-bd)}
.irail .lg{width:40px;height:40px;border-radius:var(--r3);background:var(--orange);color:var(--on-acc);display:grid;
  place-items:center;font-family:var(--disp);font-weight:700;font-size:16px;margin-bottom:8px}
.irail .ib{width:44px;height:44px;border-radius:var(--r3);display:grid;place-items:center;color:var(--rail-tx);
  background:none;border:0;cursor:pointer;position:relative;font-size:17px;text-decoration:none}
.irail .ib:hover{background:var(--carbon-2);color:var(--rail-strong)}
.irail .ib.on{background:var(--orange);color:var(--on-acc)}
.irail .ib .tip{position:absolute;left:54px;background:var(--ink);color:var(--paper);padding:5px 9px;border-radius:var(--r3);
  font-size:12px;font-weight:600;white-space:nowrap;opacity:0;pointer-events:none;transition:.12s;z-index:45;box-shadow:var(--sh-2)}
.irail .ib:hover .tip{opacity:1}
.irail .ib .bdg{position:absolute;top:4px;right:4px;min-width:16px;height:16px;border-radius:9px;background:var(--orange);
  color:var(--on-acc);font-size:9px;display:grid;place-items:center;font-family:var(--mono);padding:0 4px;font-weight:700}
.irail .ib.on .bdg{background:var(--card);color:var(--ink)}
.irail .sep{width:24px;height:1px;background:var(--carbon-3);margin:5px 0}
.irail .grow{flex:1}
body[data-layout="icon"] .content{padding:18px 22px 40px}
body[data-layout="icon"] td{padding:8px 14px}
body[data-layout="icon"] th{padding:8px 14px}
body[data-layout="icon"] .card .bd{padding:13px}
body[data-layout="icon"] .phead h1{font-size:24px}

/* ---- mobile app layout ---- */
.mbar{position:sticky;top:0;z-index:30;background:var(--carbon);color:var(--rail-strong);padding:11px 14px;
  display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--rail-bd)}
.mbar .lg{width:30px;height:30px;border-radius:var(--r3);background:var(--orange);color:var(--on-acc);display:grid;
  place-items:center;font-family:var(--disp);font-weight:700;font-size:14px}
.mbar .t{flex:1;min-width:0}
.mbar .t1{font-family:var(--disp);font-size:15px;font-weight:700;line-height:1.15;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mbar .t2{font-size:11px;color:var(--slate-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mbar select{background:transparent;border:1px solid var(--carbon-3);color:var(--rail-strong);border-radius:var(--r3);
  padding:5px 7px;font-size:11.5px;font-weight:600;max-width:126px}
.mtabs{position:fixed;bottom:0;left:0;right:0;max-width:680px;margin:0 auto;background:var(--card);
  border-top:1px solid var(--line);display:flex;z-index:40;box-shadow:0 -2px 14px rgba(0,0,0,.07)}
.mtabs a,.mtabs button{flex:1;background:none;border:0;padding:9px 3px 12px;color:var(--slate);font-size:10px;font-weight:700;
  display:grid;gap:3px;justify-items:center;cursor:pointer;position:relative;text-decoration:none}
.mtabs a .i,.mtabs button .i{font-size:17px}
.mtabs a.on,.mtabs button.on{color:var(--orange)}
.mtabs a .bdg,.mtabs button .bdg{position:absolute;top:5px;right:24%;min-width:15px;height:15px;border-radius:8px;background:var(--orange);
  color:var(--on-acc);font-size:9px;display:grid;place-items:center;font-family:var(--mono);padding:0 3px}
body[data-layout="mobile"] .content{padding:14px 14px 20px;max-width:none}
body[data-layout="mobile"] .g4,body[data-layout="mobile"] .g3{grid-template-columns:1fr 1fr}
body[data-layout="mobile"] .g2,body[data-layout="mobile"] .board,body[data-layout="mobile"] .jdetail,
body[data-layout="mobile"] .r2,body[data-layout="mobile"] .r3{grid-template-columns:1fr !important}
body[data-layout="mobile"] .vcards{grid-template-columns:1fr 1fr;gap:11px}
body[data-layout="mobile"] .vcard .ph{height:104px}
body[data-layout="mobile"] .phead h1{font-size:22px}
body[data-layout="mobile"] .phead{gap:10px;margin-bottom:14px}
body[data-layout="mobile"] .search input{width:100%}
body[data-layout="mobile"] .acts{width:100%}
body[data-layout="mobile"] .acts .search{flex:1}
body[data-layout="mobile"] .stat .v{font-size:24px}
body[data-layout="mobile"] .stat .chip{display:none}
body[data-layout="mobile"] td,body[data-layout="mobile"] th{padding:9px 11px}
body[data-layout="mobile"] .modal{max-width:none}
body[data-layout="mobile"] #modalWrap{padding:12px}
body[data-layout="mobile"] #toast{right:14px;left:14px;max-width:none;top:auto;bottom:88px;transform:translateY(140%)}
body[data-layout="mobile"] #toast.on{transform:none}
body[data-layout="mobile"] .billwrap{padding:0}
body[data-layout="mobile"] .bill{padding:16px}

@media (max-width:900px){
  body[data-layout="classic"] #app,body[data-layout="icon"] #app{grid-template-columns:1fr}
  .irail{position:static;height:auto;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;padding:8px 12px}
  .irail .grow{display:none}
  .irail .ib .tip{display:none}
  .tn-in{height:auto;padding:10px 14px;flex-wrap:wrap}
  body[data-layout="top"] .content{padding:14px}
}

#saveDot{position:fixed;left:16px;bottom:16px;z-index:95;background:var(--card);border:1px solid var(--line);
  color:var(--slate);padding:6px 12px;border-radius:var(--pill);font-size:12px;font-weight:600;box-shadow:var(--sh-2);
  opacity:0;transform:translateY(8px);transition:.2s;pointer-events:none}
#saveDot.on{opacity:1;transform:none}
#saveDot.ok{color:var(--green);border-color:var(--green)}
#saveDot.bad{color:var(--red);border-color:var(--red)}
.authtabs{display:flex;gap:4px;background:var(--card-2);padding:4px;border-radius:var(--r2);margin-bottom:20px;border:1px solid var(--line)}
.authtabs a,.authtabs button{flex:1;background:none;border:0;padding:9px 8px;border-radius:var(--r3);cursor:pointer;font-weight:700;
  font-size:12.5px;color:var(--slate);text-align:center;text-decoration:none}
.authtabs a.on,.authtabs button.on{background:var(--card);color:var(--ink);box-shadow:var(--sh)}
.loginbox{max-width:430px}
.branchbadge{display:inline-flex;align-items:center;gap:6px;background:var(--orange-w);color:var(--orange-d);
  padding:4px 10px;border-radius:var(--pill);font-size:11.5px;font-weight:700}

/* ---- paper ------------------------------------------------------------------
   What comes out of the printer is the document on the screen and nothing around it.

   This block used to hide `#app` and show `#printRoot`, which is how the prototype worked: one
   page, and the bill lifted out into a container of its own before printing. The product does not
   work that way — every screen is server-rendered inside `#app`, and no element with that id has
   ever existed here. So `#app{display:none}` hid the entire application from the printer and every
   bill, slip and sale invoice came out as a blank sheet with the mobile tab bar along the bottom:
   the tab bar sits outside `#app`, and a sheet of A4 is narrow enough to match the phone
   breakpoint, so the one thing that printed was the one thing that should never have.

   What replaces it says the same intent against this markup: the shell's chrome goes, and the
   boxes between <body> and the document stop being a two-column grid with a scrolling main
   column, because paper has one column and does not scroll. */
@media print{
  html,body{background:#fff !important;margin:0 !important;padding:0 !important;
    height:auto !important;overflow:visible !important}

  /* The chrome, all of it. `.tabbar` and `.rail-scrim` are named because they live outside the
     shell and would otherwise survive on their own. */
  .rail,.appbar,.tabbar,.rail-scrim,.visitband,.page-back,#modalWrap,#toast,#saveDot{display:none !important}

  /* Anything inside a printable document that belongs to the counter rather than to the reader —
     the button that removes a payment sits in the middle of the sale invoice, and a customer's
     copy with a row of × down it is a copy that raises a question nobody meant to ask. */
  .no-print{display:none !important}

  /* !important throughout, because the layout picker writes `body[data-layout] #app` rules that
     outrank a bare `#app` on specificity. */
  #app,.shell,.shell-main,.content{display:block !important;
    width:auto !important;max-width:none !important;min-height:0 !important;height:auto !important;
    margin:0 !important;padding:0 !important;overflow:visible !important}

  /* The grey mount a document sits on is a screen affordance. On a phone it also scrolls
     sideways, and a clipping container on paper crops the bill rather than shrinking it. */
  .paper-frame{background:none !important;border-radius:0 !important;padding:0 !important;
    overflow:visible !important;contain:none !important}

  /* A document that lives in a dialog — the yard's sale invoice is one — prints as the document.
     The screen behind it goes, and so does the dialog's own frame: a title bar, a Close button and
     a Record payment button are the counter's, not the buyer's. `.mb` scrolls inside itself on
     screen at 66vh, which on paper would cut the invoice off at two thirds of a page. */
  #modalWrap.on{display:block !important;position:static !important;background:none !important;
    padding:0 !important;overflow:visible !important}
  body:has(#modalWrap.on) #app{display:none !important}
  #modalWrap.on .modal{max-width:none;margin:0;border:0;border-radius:0;box-shadow:none;animation:none}
  #modalWrap.on .mh,#modalWrap.on .mf{display:none !important}
  #modalWrap.on .mb{padding:0;max-height:none;overflow:visible}

  .bill{padding:0;max-width:none}

  @page{margin:13mm}
}
@media (max-width:1080px){.board{grid-template-columns:repeat(2,1fr)}.g4{grid-template-columns:1fr 1fr}}
@media (max-width:900px){
  #app{grid-template-columns:1fr}
  .rail{position:static;height:auto}
  .nav{display:flex;flex-wrap:wrap;gap:4px;padding:4px 12px 12px}
  .nav .grp{display:none}
  .nav a,.nav button{width:auto}
  .nav a.on:before,.nav button.on:before{display:none}
  .g4,.g3,.g2,.r2,.r3,.board{grid-template-columns:1fr}
  #login{grid-template-columns:1fr}
  #login .left{padding:34px 24px}
  #login .left h1{font-size:32px}
  .content{padding:16px}
  .topbar{padding:8px 16px}
  .jdetail{grid-template-columns:1fr !important}
}
@media (prefers-reduced-motion:reduce){*{animation:none !important;transition:none !important}}

/* ---- the dropdown panel ----------------------------------------------------
   The list a <select> drops, drawn by us instead of by the operating system.

   The control itself is still a real <select> and is deliberately left alone —
   it already has the right look in all six places one appears (a form field,
   the rail's branch picker, the theme picker, the top bar, the filter bar, the
   mobile bar), and re-creating that on a <div> would be six chances to get it
   wrong. Only the popup is ours: a panel that belongs to the theme, that scrolls
   inside itself rather than off the screen, and that can be typed into when the
   list is long enough to be worth searching.

   Positioned fixed and parented to <body> so no dialog, card or overflow:hidden
   can clip it. */
.gxdd{position:fixed;z-index:80;background:var(--card);border:1px solid var(--line);border-radius:var(--r2);
  box-shadow:var(--sh-2);display:flex;flex-direction:column;overflow:hidden;min-width:180px}
.gxdd[hidden]{display:none}

.gxdd .gxdd-find{padding:8px;border-bottom:1px solid var(--line);flex-shrink:0}
.gxdd .gxdd-find input{width:100%;padding:7px 9px;border:1px solid var(--line);border-radius:var(--r3);
  background:var(--card);color:var(--ink);font-size:13px}
.gxdd .gxdd-find input:focus{outline:0;border-color:var(--orange);box-shadow:0 0 0 3px var(--orange-w)}

.gxdd .gxdd-list{overflow-y:auto;overscroll-behavior:contain;padding:5px;flex:1}

/* A group heading reads as a heading and never as something you can pick. */
.gxdd .gxdd-grp{padding:8px 9px 4px;font-size:10px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--slate-2);font-weight:700}

.gxdd .gxdd-opt{display:flex;align-items:center;gap:8px;padding:8px 9px;border-radius:var(--r3);
  font-size:13.5px;color:var(--ink);cursor:pointer;user-select:none;line-height:1.35}
.gxdd .gxdd-opt .tick{width:13px;flex-shrink:0;color:var(--orange);font-weight:700}

/* One highlight, driven by the keyboard and by the mouse alike, so arrowing down
   and then moving the mouse does not leave two rows looking chosen. */
.gxdd .gxdd-opt.on{background:var(--orange-w);color:var(--orange-d)}
.gxdd .gxdd-opt[aria-selected="true"]{font-weight:600}
.gxdd .gxdd-opt[aria-disabled="true"]{color:var(--slate-2);cursor:default;background:none}

.gxdd .gxdd-none{padding:14px 10px;text-align:center;color:var(--slate);font-size:12.5px}

/* On the dark chrome the panel would otherwise be a white card hanging off a
   carbon control. It follows what it was opened from, not where it is parented. */
.gxdd.on-dark{background:var(--carbon);border-color:var(--carbon-3)}
.gxdd.on-dark .gxdd-find{border-bottom-color:var(--carbon-3)}
.gxdd.on-dark .gxdd-find input{background:var(--carbon-2);border-color:var(--carbon-3);color:var(--rail-strong)}
.gxdd.on-dark .gxdd-opt{color:var(--rail-tx)}
.gxdd.on-dark .gxdd-opt.on{background:var(--carbon-2);color:var(--rail-strong)}
.gxdd.on-dark .gxdd-grp,.gxdd.on-dark .gxdd-none{color:var(--slate-2)}

/* ---------------------------------------------------------------- the product's mark on dark
   Our own artwork is drawn for paper: near-black on a transparent ground (the opaque pixels
   average 37/255). On the carbon bars it therefore disappears, so it is given a white plate rather
   than being inverted into a version of the brand that does not exist.

   Defined once here because it appears on four surfaces that share no other stylesheet — the
   platform bar, the platform sign-in, the garage sign-in and the landing footer — and it had drifted
   into three different radii, three paddings and two shadows. A plate that is 7px round in one
   place and 10px in the next reads as an accident; one definition reads as a decision.

   Only the height is set per surface. Everything that makes it a plate lives here. */

.brandplate{display:block;width:auto;object-fit:contain;background:#fff;
  border-radius:10px;padding:7px 10px;box-shadow:0 4px 18px rgba(0,0,0,.28)}

/* On a bar, where the plate sits beside text rather than above it and has to stay out of the way. */
.brandplate.sm{border-radius:7px;padding:4px 6px;box-shadow:0 2px 8px rgba(0,0,0,.3)}
