:root{
  --bg:#eef1f5; --panel:#ffffff; --ink:#1b2430; --muted:#5d6b7a; --line:#d7dde4; --line2:#e7ebf0;
  --title:#16202c; --side:#1f2b3a; --side-ink:#c9d3df; --side-act:#2a3b50; --accent:#1f6feb; --accent-ink:#fff;
  --ok:#1a7f37; --warn:#b26a00; --bad:#cf222e; --sel:#e8f0fe; --row:#fafbfc;
  --font:"Segoe UI","Segoe UI Variable",system-ui,-apple-system,Roboto,Arial,sans-serif;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{height:100%}
body{margin:0;font:13px/1.4 var(--font);color:var(--ink);background:var(--bg);display:grid;
  grid-template:"top top" 46px "side main" 1fr "foot foot" 26px / 196px 1fr;overflow:hidden}
button,input,select{font:inherit;color:inherit}
kbd{font:600 10px/1 var(--font);padding:2px 4px;border:1px solid #9aa6b2;border-bottom-width:2px;border-radius:3px;color:#5d6b7a;background:#f6f8fa}

/* title bar */
.titlebar{grid-area:top;background:var(--title);color:#fff;display:flex;align-items:center;gap:18px;padding:0 12px}
.brand{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px;letter-spacing:.2px;width:172px}
.jobfields{display:flex;gap:14px}
.jobfields label{display:flex;align-items:center;gap:6px;color:#9fb0c3;font-size:12px}
.jobfields input{background:#24313f;border:1px solid #33465a;border-radius:4px;color:#fff;padding:4px 8px;width:220px}
.jobfields input:focus{outline:none;border-color:var(--accent)}
.tbtns{display:flex;gap:4px}
.tbtns button{background:transparent;border:1px solid #33465a;color:#dbe4ee;padding:5px 12px;border-radius:4px;cursor:pointer}
.tbtns button:hover{background:#24313f}
.spacer{flex:1}

/* side nav */
.side{grid-area:side;background:var(--side);padding:10px 0;display:flex;flex-direction:column;user-select:none}
.side a{display:flex;align-items:center;gap:10px;padding:9px 14px;color:var(--side-ink);cursor:pointer;border-left:3px solid transparent}
.side a i{font-style:normal;width:18px;text-align:center;opacity:.85}
.side a span{flex:1}
.side a kbd{background:transparent;color:#7d8fa3;border-color:#3d4f64}
.side a:hover{background:#243245;color:#fff}
.side a.active{background:var(--side-act);color:#fff;border-left-color:var(--accent)}
.side a.disabled{opacity:.45}
.navsep{height:1px;background:#2f4054;margin:8px 12px}
.navfoot{margin-top:auto;padding:10px 14px;color:#7d8fa3;font-size:11px;line-height:1.5}

/* main */
main{grid-area:main;overflow:auto;position:relative}
.view{display:none;padding:18px 22px 30px}
.view.active{display:block}
.vhead{display:flex;align-items:baseline;gap:14px;margin-bottom:12px;flex-wrap:wrap}
.vhead h1,.pdhead h1{font-size:19px;margin:0;font-weight:600}
.vsub{color:var(--muted)}
.toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.toolbar button,.card button,.pdbtns button,.bigbtnrow button{background:#fff;border:1px solid var(--line);padding:5px 12px;border-radius:4px;cursor:pointer}
.toolbar button:hover,.card button:hover,.pdbtns button:hover{border-color:#a8b3bf;background:#f6f8fa}
button.primary{background:var(--accent)!important;border-color:var(--accent)!important;color:#fff}
button.primary:hover{filter:brightness(1.07)}
button.danger-ghost{color:var(--bad)}
.tsep{width:1px;height:20px;background:var(--line);margin:0 4px}
.chk{display:inline-flex;align-items:center;gap:6px;color:var(--muted);cursor:pointer}
.hint{color:var(--muted);font-size:12px;margin:2px 0 8px}
.muted{color:var(--muted)}

/* grid */
.gridwrap{background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:auto;max-height:calc(100vh - 210px)}
table.grid{border-collapse:separate;border-spacing:0;width:100%;font-variant-numeric:tabular-nums}
.grid th{position:sticky;top:0;z-index:1;background:#f3f5f8;border-bottom:1px solid var(--line);font-weight:600;color:#3b4856;
  text-align:left;padding:6px 6px;white-space:nowrap;font-size:12px}
.grid td{border-bottom:1px solid var(--line2);padding:0;height:29px}
.grid tr:nth-child(even) td{background:var(--row)}
.grid tr.sel td{background:var(--sel)!important}
.grid td.rn{color:#8a97a5;text-align:right;padding:0 8px;width:38px;cursor:pointer;user-select:none}
.grid td input,.grid td select{width:100%;height:28px;border:1px solid transparent;background:transparent;padding:0 6px;border-radius:0}
.grid td input:focus,.grid td select:focus{outline:none;border-color:var(--accent);background:#fff;box-shadow:inset 0 0 0 1px var(--accent)}
.grid td input.num{text-align:right}
.grid td input[type=checkbox]{width:auto;height:auto;margin:0 auto;display:block}
.grid td.bad input,.grid td.bad select{background:#fde2e1}
.grid td.warn input{background:#fff3cd}
.grid.ro td{padding:5px 8px;height:auto}
.grid .numc{text-align:right}

/* cards & forms */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:14px;align-items:start}
.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px 16px}
.card h3{margin:0 0 10px;font-size:14px;font-weight:600}
.card label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted);margin-bottom:10px}
.card label input,.card label select{border:1px solid var(--line);border-radius:4px;padding:6px 8px;color:var(--ink);background:#fff}
.card label input:focus,.card label select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #1f6feb22}
.card label small{color:#7a8794}
.card label.chk{flex-direction:row}
.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.fieldrow{display:flex;flex-wrap:wrap;gap:14px;align-items:flex-end;margin:6px 0}
.fieldrow label{margin:0}
.unit{position:relative}
.kvgrid{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;margin-bottom:10px}
.kvgrid div:nth-child(odd){color:var(--muted)}
.bigbtnrow{display:flex;gap:8px;margin-top:12px;align-items:center}
button.big{font-size:15px;padding:10px 22px!important;border-radius:6px!important}
button.big kbd{margin-left:6px;background:transparent;color:#d6e4ff;border-color:#8fb3f7}
.progress{margin-top:12px}
.pbar{height:10px;background:#e3e8ee;border-radius:5px;overflow:hidden}
.pbar div{height:100%;width:0;background:linear-gradient(90deg,#1f6feb,#3f8cff);transition:width .25s}
.ptext{color:var(--muted);margin-top:4px;font-size:12px}
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:12px}
.kpi{border:1px solid var(--line);border-radius:6px;padding:8px 10px;background:#fbfcfd}
.kpi span{display:block;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em}
.kpi b{font-size:20px;font-variant-numeric:tabular-nums}
table.mini{border-collapse:collapse;width:100%;font-variant-numeric:tabular-nums}
.mini th,.mini td{border-bottom:1px solid var(--line2);padding:5px 6px;text-align:left}
.mini th{color:var(--muted);font-weight:600;font-size:12px}
.mini td.n,.mini th.n{text-align:right}
.msg{border-radius:5px;padding:8px 10px;margin-top:10px}
.msg.warn{background:#fff8e1;border:1px solid #f3d27a}
.msg.bad{background:#fde2e1;border:1px solid #f2a7a4}
.msg.ok{background:#e6f4ea;border:1px solid #a6d8b4}
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}
.tile{border:1px solid var(--line);border-radius:6px;padding:10px 12px;cursor:pointer;display:flex;flex-direction:column;gap:3px;background:#fbfcfd}
.tile:hover{border-color:var(--accent);background:#f3f8ff}
.tile span{color:var(--muted);font-size:12px}
.tile.accent{border-color:var(--accent);background:#eef4ff}
code{background:#f1f3f5;padding:0 3px;border-radius:3px;font-size:12px}

/* plans */
#view-plans{padding:0;height:100%}
#view-plans.active{display:block}
.planslayout{display:grid;grid-template-columns:250px 1fr;height:100%}
.planlist{border-right:1px solid var(--line);background:#f7f9fb;overflow:auto;padding:8px}
.pitem{display:grid;grid-template-columns:76px 1fr;gap:8px;padding:6px;border-radius:6px;cursor:pointer;border:1px solid transparent;margin-bottom:4px}
.pitem:hover{background:#fff;border-color:var(--line)}
.pitem.active{background:#fff;border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.pitem svg{width:76px;height:auto;border:1px solid #c5ccd4;background:#fff}
.pitem b{display:block}
.pitem small{color:var(--muted);display:block;line-height:1.35}
.pmat{font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;padding:8px 6px 4px}
.plandetail{overflow:auto;padding:16px 20px 30px;position:relative}
.pdhead{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}
.pdbtns{display:flex;gap:6px}
.pdkpis{display:flex;gap:18px;flex-wrap:wrap;margin:10px 0}
.pdkpis div span{display:block;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em}
.pdkpis div b{font-size:16px;font-variant-numeric:tabular-nums}
.svgwrap{background:#fff;border:1px solid var(--line);border-radius:6px;padding:10px}
.svgwrap svg{width:100%;height:auto;max-height:calc(100vh - 330px);display:block}
.svgwrap rect.pc{cursor:pointer}
.svgwrap rect.pc:hover{stroke:#1f6feb;stroke-width:6}
.seqh{margin:16px 0 6px;font-size:14px}
.seq{max-height:none}
.tip{position:fixed;pointer-events:none;background:#16202c;color:#fff;padding:6px 9px;border-radius:5px;font-size:12px;z-index:50;max-width:280px}

/* footer, modal, toast */
.status{grid-area:foot;background:#e3e8ee;border-top:1px solid var(--line);display:flex;align-items:center;padding:0 12px;color:#4b5866;font-size:12px;gap:16px}
.modal{position:fixed;inset:0;background:#0b1320aa;display:flex;align-items:center;justify-content:center;z-index:100}
.modal[hidden]{display:none}
.mbox{background:#fff;border-radius:8px;width:min(640px,92vw);max-height:80vh;display:flex;flex-direction:column;box-shadow:0 10px 40px #0005}
.mhead{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--line)}
.mhead .x{border:0;background:none;font-size:20px;cursor:pointer;color:var(--muted)}
.mbody{padding:12px 16px;overflow:auto}
.flist div{display:flex;justify-content:space-between;padding:8px 10px;border-radius:5px;cursor:pointer}
.flist div:hover{background:var(--sel)}
.flist small{color:var(--muted)}
.toast{position:fixed;right:18px;bottom:40px;background:#16202c;color:#fff;padding:10px 14px;border-radius:6px;box-shadow:0 6px 20px #0004;z-index:120;max-width:480px}
.toast.bad{background:var(--bad)}
.toast.ok{background:#1a6b35}
@media print{.titlebar,.side,.status{display:none}}

/* user menu */
.usermenu{position:relative}
.umbtn{background:transparent;border:1px solid #33465a;color:#dbe4ee;padding:5px 10px;border-radius:4px;cursor:pointer;display:flex;gap:6px;align-items:center}
.umbtn .avatar{color:#3fb950;font-size:10px}
.umdrop{position:absolute;right:0;top:36px;background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:6px;box-shadow:0 8px 24px #0003;min-width:200px;z-index:60;padding:4px}
.umdrop a{display:block;padding:8px 10px;border-radius:4px;cursor:pointer}
.umdrop a:hover{background:var(--sel)}
.filter{width:100%;border:1px solid var(--line);border-radius:5px;padding:7px 9px;margin-bottom:8px}
.flist .del{border:0;background:none;cursor:pointer;opacity:.5;margin-left:6px}
.flist .del:hover{opacity:1}
.mini td.n{white-space:nowrap}
.mini button{background:#fff;border:1px solid var(--line);padding:3px 8px;border-radius:4px;cursor:pointer;font-size:12px}
@media (max-width:900px){
  body{grid-template:"top" auto "side" auto "main" 1fr "foot" 26px / 1fr}
  .titlebar{flex-wrap:wrap;padding:6px 10px;gap:8px}
  .jobfields{display:none}
  .side{flex-direction:row;overflow-x:auto;padding:0}
  .side a{border-left:0;border-bottom:3px solid transparent;white-space:nowrap}
  .side a.active{border-bottom-color:var(--accent)}
  .side a kbd,.navsep,.navfoot{display:none}
  .planslayout{grid-template-columns:1fr}
  .planlist{max-height:180px;display:flex;gap:6px;overflow-x:auto}
  .pitem{min-width:200px}
  .cards{grid-template-columns:1fr}
  .status{white-space:nowrap;overflow:hidden;font-size:11px}
  #stRight{display:none}
  .view{padding:12px 10px 24px}
}

/* price */
.pricecards{grid-template-columns:minmax(380px,1fr) minmax(380px,1fr)}
.plgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px 16px}
.plgrid label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}
.plgrid input,.plgrid select{padding:5px 7px;border:1px solid var(--line);border-radius:4px;background:#fff;color:var(--ink)}
.plgrid .wide{grid-column:1/-1}
.subh{margin:14px 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
table.mini td input{width:100%;padding:3px 6px;border:1px solid var(--line);border-radius:3px}
table.mini td.n input{text-align:right}
tr.tot td{font-weight:700;border-top:2px solid var(--line)}
.small{font-size:11.5px}
@media (max-width:1100px){.pricecards{grid-template-columns:1fr}}

/* part preview, edges */
td.prevc{padding:0 4px!important;text-align:center;line-height:0}
svg.pprev{display:inline-block;vertical-align:middle}
svg.pprev .ehit{cursor:pointer}
svg.pprev .ehit:hover{stroke:rgba(31,111,235,.35)}
.grid td select.esel.thin{color:#1f6feb;font-weight:600}
.grid td select.esel.thick{color:#b45309;font-weight:600}

/* roles, users, orders */
body.is-client .shoponly{display:none!important}
body:not(.is-client) .clientonly{display:none!important}
.badge{display:inline-block;background:var(--accent);color:#fff;border-radius:9px;padding:0 7px;font-size:11px;font-weight:600;line-height:17px;vertical-align:middle}
.badge.st-ordered{background:#d97706}.badge.st-accepted{background:#1f6feb}.badge.st-done{background:var(--ok)}.badge.st-rejected{background:#8a97a5}
.role{display:inline-block;border-radius:3px;padding:1px 7px;font-size:11.5px;font-weight:600}
.role.r-admin{background:#fde2e1;color:#a40e26}.role.r-staff{background:#e8f0fe;color:#174ea6}.role.r-client{background:#e6f4ea;color:#1a7f37}
#usersTable td,#ordersTable td{padding:6px 8px;vertical-align:middle;height:auto}
#usersTable tr.dis td{opacity:.55}
td.acts{white-space:nowrap;text-align:right}
td.acts button,#ordersTable select{background:#fff;border:1px solid var(--line);padding:3px 9px;border-radius:4px;cursor:pointer}
.bad-t{color:var(--bad);font-weight:600}
.uform{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px;min-width:min(560px,80vw)}
.uform label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}
.uform label.chk{flex-direction:row;align-items:center}
.uform input,.uform select{padding:6px 8px;border:1px solid var(--line);border-radius:4px;color:var(--ink);background:#fff}
.uform .roleinfo,.uform .bigbtnrow{grid-column:1/-1;margin:0}
.uform .pwrow{display:flex;gap:6px}.uform .pwrow input{flex:1;font-family:Consolas,monospace}
.uform button{background:#fff;border:1px solid var(--line);padding:6px 12px;border-radius:4px;cursor:pointer}
.uform button.primary{color:#fff}
pre.logininfo{background:#f3f5f8;border:1px solid var(--line);border-radius:6px;padding:12px 14px;font:13px/1.6 Consolas,monospace;user-select:all}
#view-admin .toolbar select,#view-admin .filter{padding:5px 8px;border:1px solid var(--line);border-radius:4px}

/* photo / typed parts list */
.scanbtn{font-weight:600}
.fab{display:none;position:fixed;right:16px;bottom:40px;width:58px;height:58px;border-radius:50%;border:0;background:var(--accent);color:#fff;font-size:26px;box-shadow:0 6px 18px #0004;z-index:5;cursor:pointer}
.scanwait{display:flex;gap:16px;align-items:center}
.scanwait img{max-width:180px;max-height:220px;border:1px solid var(--line);border-radius:4px}
.spinner{width:34px;height:34px;border:4px solid #d7dde4;border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite;margin-bottom:8px}
@keyframes spin{to{transform:rotate(360deg)}}
.scanphoto img{max-width:100%;max-height:60vh;border:1px solid var(--line);margin-top:6px}
.scanphoto summary{cursor:pointer;color:var(--accent);margin-bottom:6px}
.scantable{max-height:55vh;overflow:auto;border:1px solid var(--line);border-radius:6px;margin:8px 0}
#scanTable td{height:auto}
#scanTable td input[data-f=length],#scanTable td input[data-f=width]{width:70px}
#scanTable td input[data-f=qty]{width:50px}
#scanTable td input[data-f=ref]{min-width:110px}
#scanTable tr.unsure td{background:#fff3cd}
#scanTable .swap{border:1px solid var(--line);background:#fff;border-radius:4px;cursor:pointer;padding:2px 6px}
textarea.typed{width:100%;font:14px/1.5 Consolas,monospace;border:1px solid var(--line);border-radius:6px;padding:8px}
.scanform{display:flex;flex-direction:column;gap:8px}
.scanform label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}
.scanform label.chk{flex-direction:row;align-items:center}
.scanform input:not([type=checkbox]){padding:6px 8px;border:1px solid var(--line);border-radius:4px}
.okt{color:var(--ok);font-size:12px;font-weight:600}
#scanState .bad-t{font-size:12px}
@media (max-width:900px){
  .fab{display:block}
  .mbox{width:100vw!important;max-width:100vw!important;max-height:100vh;border-radius:0}
  .uform{grid-template-columns:1fr}
}
.mbox:has(#scanTable){width:min(1040px,96vw)}
@media (max-width:640px){
  #scanTable thead{display:none}
  #scanTable tbody tr{display:grid;grid-template-columns:34px 1fr 1fr 40px;grid-template-areas:"use len wid swap" "qty ref ref ref" "grain prev mat mat";gap:4px 6px;padding:8px 6px;border-bottom:1px solid var(--line)}
  #scanTable td{border:0;padding:0}
  #scanTable td:nth-child(1){grid-area:use;align-self:center}#scanTable td:nth-child(2){grid-area:len}#scanTable td:nth-child(3){grid-area:wid}
  #scanTable td:nth-child(4){grid-area:swap;align-self:center}#scanTable td:nth-child(5){grid-area:qty}#scanTable td:nth-child(6){grid-area:ref}
  #scanTable td:nth-child(7){grid-area:grain}#scanTable td:nth-child(8){grid-area:prev;text-align:left}#scanTable td:nth-child(9){grid-area:mat}
  #scanTable td input,#scanTable td select{width:100%!important;min-width:0!important;height:38px;border:1px solid var(--line)!important;border-radius:5px;font-size:16px}
  #scanTable tr.unsure{background:#fff3cd}
  .scantable{max-height:none;overflow:visible;border:0}
  .bigbtnrow{flex-wrap:wrap}
}
@media (max-width:640px){#scanTable td input[type=checkbox]{width:26px!important;height:26px;margin:6px auto}}
.unitnote{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.unitnote button{background:#fff;border:1px solid var(--line);border-radius:4px;padding:4px 10px;cursor:pointer}
.perms{grid-column:1/-1;display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--ink);background:#f6f8fa;border:1px solid var(--line);border-radius:6px;padding:8px 10px}
.perms small{color:var(--muted)}
button.tg{border:1px solid var(--line);background:#f3f4f6;color:#8a97a5;border-radius:10px;padding:1px 9px;font-size:11.5px;cursor:pointer;text-decoration:line-through}
button.tg.on{background:#e6f4ea;color:#1a7f37;border-color:#b7dfc2;text-decoration:none}
.perms label.mf{display:flex;flex-direction:column;gap:3px;margin-top:4px;color:var(--muted)}.perms label.mf input{padding:5px 8px;border:1px solid var(--line);border-radius:4px}
.mach .machgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px 10px;margin-top:6px}
.mach .machgrid label{display:flex;flex-direction:column;gap:2px;font-size:11.5px;color:var(--muted)}
.mach .machgrid input,.mach .machgrid select{padding:4px 6px;border:1px solid var(--line);border-radius:4px;width:100%}
.mach .machgrid input:disabled,.mach .machgrid select:disabled{background:#f1f3f5;color:#98a2ad}
.ownsaw{display:inline-block;background:#fff4e5;color:#b45309;border:1px solid #f5d5a8;border-radius:10px;padding:0 8px;font-size:11.5px}
@media (max-width:640px){.mach .machgrid{grid-template-columns:1fr 1fr}}
.mbox:has(#uForm){width:min(760px,96vw)}
