/* Drilling pattern generator · shelves.odincad.com
   OdinCAD design system: warm paper UI, white panels with hairlines, slate actions,
   small machined radii, Source Sans 3 + Source Code Pro for every number.
   Layout: top bar (title + view tabs) · inspector panel left · drawing on the dark canvas right; stacks on phones. */
:root{
  /* palette (OdinCAD tokens) */
  --slate-50:#eef2f4; --slate-100:#dce3e8; --slate-200:#bac6ce; --slate-300:#94a6b2; --slate-400:#6f8799;
  --slate-500:#556f83; --slate-600:#4a6072; --slate-700:#3d4f5e; --slate-800:#313f4a; --slate-900:#232e37;
  --neutral-0:#ffffff; --paper:#fbf9f4; --neutral-50:#f4f0e7; --neutral-100:#ece6da; --neutral-200:#dcd4c5;
  --neutral-300:#c5bba8; --neutral-400:#9e968a; --neutral-500:#756f66; --neutral-600:#555049; --neutral-900:#1b1916;
  --amber-100:#f2e4c4; --amber-700:#8f6418; --rust-100:#f0dad0; --rust-500:#b4502e; --rust-700:#8a3b20;
  /* roles */
  --surface-app:var(--paper); --surface-card:var(--neutral-0); --surface-sunken:var(--neutral-50); --surface-canvas:#2b343c;
  --text-primary:var(--neutral-900); --text-secondary:var(--neutral-600); --text-tertiary:var(--neutral-500); --text-link:var(--slate-600);
  --border-subtle:var(--neutral-200); --border-default:var(--neutral-300); --border-strong:var(--neutral-400); --border-focus:var(--slate-500);
  --action:var(--slate-500); --action-hover:var(--slate-600); --action-press:var(--slate-700); --action-text:var(--neutral-0);
  --focus-ring:0 0 0 3px rgba(85,111,131,.30);
  --shadow-xs:0 1px 1px rgba(27,25,22,.05); --shadow-sm:0 1px 2px rgba(27,25,22,.08),0 1px 1px rgba(27,25,22,.04);
  --shadow-inset:inset 0 1px 2px rgba(27,25,22,.07);
  --r-xs:3px; --r-sm:5px; --r-md:7px; --r-lg:10px;
  --ease:cubic-bezier(.2,0,.1,1); --dur:140ms;
  --f-sans:'Source Sans 3',ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --f-mono:'Source Code Pro',ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  --f-stencil:'Saira Stencil One','Source Sans 3',sans-serif;
  color-scheme:light;
  padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);
}
*{box-sizing:border-box}
html{background:var(--surface-app)}
body{margin:0;background:var(--surface-app);color:var(--text-primary);font:400 15px/1.5 var(--f-sans);-webkit-text-size-adjust:100%}
img{max-width:100%}
[hidden]{display:none!important}
button,input,select{font:inherit;color:inherit}

/* ---------- top bar ---------- */
.topbar{position:sticky;top:env(safe-area-inset-top,0px);z-index:100;background:var(--surface-card);border-bottom:1px solid var(--border-subtle)}
body::before{content:"";position:fixed;inset:0 0 auto;height:env(safe-area-inset-top,0px);z-index:101;background:var(--surface-card)}
.topbar-in{max-width:1560px;margin:0 auto;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));
  min-height:56px;display:flex;flex-wrap:wrap;align-items:center;gap:4px 28px}
.brand{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;padding-block:10px;min-width:0}
h1{margin:0;font:600 20px/1.3 var(--f-sans);letter-spacing:-.02em;text-wrap:balance}
.byline{font:400 13px/1.3 var(--f-sans);color:var(--text-tertiary);white-space:nowrap}
.byline b{font:400 13px/1 var(--f-stencil);letter-spacing:.04em;color:var(--text-tertiary);margin-left:2px}
.apptabs{display:flex;gap:4px;align-self:stretch;align-items:stretch}
.apptab{background:none;border:0;border-bottom:2px solid transparent;padding:0 12px;font:500 14px/1 var(--f-sans);color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;gap:8px;transition:color var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.apptab:hover{color:var(--text-primary)}
.apptab[aria-selected="true"]{color:var(--slate-700);border-bottom-color:var(--action)}
.apptab:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--r-xs)}
.count{font:500 12px/1 var(--f-mono);background:var(--slate-100);color:var(--slate-700);border-radius:999px;padding:3px 7px}
.count:empty{display:none}
.kota{margin-left:auto;font:400 12px/1.3 var(--f-mono);color:var(--text-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;padding-block:8px}

/* ---------- page ---------- */
.page{max-width:1560px;margin:0 auto;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));padding-block:20px 48px}
.layout{display:grid;grid-template-columns:minmax(300px,360px) minmax(0,1fr);gap:20px;align-items:start}
@media (max-width:900px){.layout{grid-template-columns:minmax(0,1fr)}}

/* inspector */
form.controls{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--r-md);box-shadow:var(--shadow-xs);display:flex;flex-direction:column;min-width:0}
fieldset{margin:0;border:0;border-top:1px solid var(--border-subtle);padding:16px 16px 18px;display:flex;flex-direction:column;gap:12px;min-width:0}
fieldset:first-child{border-top:0}
legend{float:left;width:100%;padding:0;margin-bottom:2px;font:600 11px/1.3 var(--f-sans);text-transform:uppercase;letter-spacing:.08em;color:var(--slate-600)}
legend+*{clear:both}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
.fld{display:flex;flex-direction:column;gap:4px;min-width:0}
.fld>span:first-child{font:500 13px/1.3 var(--f-sans);color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.in{display:flex;align-items:center;background:var(--neutral-0);border:1px solid var(--border-default);border-radius:var(--r-sm);box-shadow:var(--shadow-inset);min-width:0;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.in:hover{border-color:var(--border-strong)}
.in:focus-within{border-color:var(--border-focus);box-shadow:var(--focus-ring)}
.in input{flex:1;min-width:0;border:0;background:transparent;font:400 14px/1.3 var(--f-mono);padding:7px 9px;outline:none;font-variant-numeric:tabular-nums}
.in input[type=text]{font:400 15px/1.3 var(--f-sans)}
.in input::placeholder{color:var(--neutral-400)}
.in i{font-style:normal;font:400 12px/1 var(--f-mono);color:var(--text-tertiary);padding-right:9px}
.hint{font:400 13px/1.5 var(--f-sans);color:var(--text-tertiary);margin:0;max-width:60ch}
.seg{display:flex;border:1px solid var(--border-default);border-radius:var(--r-sm);background:var(--neutral-0);padding:2px;gap:2px}
.seg input{position:absolute;opacity:0;pointer-events:none}
.seg label{flex:1;text-align:center;padding:5px 8px;font:500 13px/1.3 var(--f-sans);color:var(--text-secondary);border-radius:var(--r-xs);border:1px solid transparent;cursor:pointer;user-select:none;white-space:nowrap;transition:background-color var(--dur) var(--ease),color var(--dur) var(--ease)}
.seg label:hover{background:var(--neutral-50);color:var(--text-primary)}
.seg input:checked+label{background:var(--slate-100);border-color:var(--slate-200);color:var(--slate-700)}
.seg input:focus-visible+label{box-shadow:var(--focus-ring)}
.check{display:flex;align-items:center;gap:8px;cursor:pointer;font:400 14px/1.3 var(--f-sans)}
.check input{width:16px;height:16px;accent-color:var(--action);margin:0}
.check.big{font:600 15px/1.3 var(--f-sans)}
.sublabel{font:500 13px/1.3 var(--f-sans);color:var(--text-secondary);display:flex;justify-content:space-between;align-items:center;gap:8px}
.tag{font:500 11px/1 var(--f-sans);color:var(--text-secondary);background:var(--neutral-100);border-radius:999px;padding:3px 7px;margin-left:6px;vertical-align:1px}
.linkbtn{background:none;border:0;padding:0;color:var(--text-link);font:500 13px/1.3 var(--f-sans);cursor:pointer;text-decoration:none}
.linkbtn:hover{text-decoration:underline;text-underline-offset:3px}
.linkbtn:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--r-xs)}
.list{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px 10px}
.li{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto auto;column-gap:6px;align-items:center}
.li-n{font:500 12px/1 var(--f-mono);color:var(--text-tertiary);width:24px}
.li .ro{grid-column:2;font:400 11px/1.3 var(--f-mono);color:var(--text-tertiary);min-height:1.3em;padding-top:2px}
.li .ro.moved{color:var(--slate-600)}
.saved-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.saved-state{font:400 12px/1.3 var(--f-sans);color:var(--text-tertiary);min-height:1.3em}
.saved-state.dirty{color:var(--slate-600)}

/* buttons */
.btns{display:flex;flex-wrap:wrap;gap:8px}
.btn{display:inline-flex;align-items:center;justify-content:center;height:34px;padding:0 14px;border-radius:var(--r-sm);border:1px solid var(--action);background:var(--action);color:var(--action-text);font:600 14px/1 var(--f-sans);cursor:pointer;white-space:nowrap;transition:background-color var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.btn:hover{background:var(--action-hover);border-color:var(--action-hover)}
.btn:active{background:var(--action-press);border-color:var(--action-press);transform:translateY(.5px)}
.btn.alt{background:var(--neutral-0);border-color:var(--border-default);color:var(--text-primary);box-shadow:var(--shadow-xs)}
.btn.alt:hover{background:var(--neutral-50);border-color:var(--border-strong)}
.btn.danger{background:var(--rust-500);border-color:var(--rust-500);color:var(--neutral-0)}
.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.btn:focus-visible{outline:none;box-shadow:var(--focus-ring)}

/* output */
.out{display:flex;flex-direction:column;gap:12px;min-width:0}
.bar{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:flex-end}
.status{font:400 13px/1.4 var(--f-sans);color:var(--text-secondary);min-height:1.4em}
.warns{display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}
.warns:empty{display:none}
.warns li{display:flex;gap:10px;align-items:baseline;padding:8px 12px;border-radius:var(--r-sm);font:400 14px/1.4 var(--f-sans);background:var(--amber-100);color:var(--amber-700)}
.warns li.bad{background:var(--rust-100);color:var(--rust-700)}
.warns li b{font:600 12px/1 var(--f-sans);flex:none}
.viewer{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--r-md);box-shadow:var(--shadow-xs);overflow:hidden;min-width:0}
.vhead{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--border-subtle)}
.tabs{display:flex;gap:4px}
.tab{font:400 12px/1 var(--f-mono);color:var(--text-secondary);background:var(--surface-sunken);border-radius:var(--r-xs);padding:5px 8px}
.vopts{display:flex;gap:16px;align-items:center}
.vopts .check{font-size:13px}
.legend{display:flex;gap:6px 18px;flex-wrap:wrap;font:400 12px/1.3 var(--f-sans);color:var(--text-tertiary);padding:8px 12px;border-top:1px solid var(--border-subtle)}
.legend span{display:inline-flex;gap:6px;align-items:center}
.sw{width:9px;height:9px;border-radius:50%;display:inline-block;flex:none}
.sw.pin{background:var(--text-primary)}
.sw.plate{border:1px solid var(--text-primary);background:linear-gradient(var(--text-primary),var(--text-primary)) center/100% 1px no-repeat,linear-gradient(var(--text-primary),var(--text-primary)) center/1px 100% no-repeat}
.sw.rem{border:1px dashed #b5432a}
.sw.band{border-radius:2px;background:#e4e4e4;border:1px solid var(--border-subtle);width:14px}
.vhint{color:var(--text-tertiary);margin-left:auto}
/* the drawing sits on the dark workspace canvas with a faint grid */
.sheetwrap{position:relative;overflow:auto;padding:20px;background-color:var(--surface-canvas);
  background-image:radial-gradient(rgba(255,255,255,.07) 1px,transparent 1.2px);background-size:24px 24px}
.sheet{display:block;width:100%;height:auto;background:#ffffff;margin:0 auto;box-shadow:0 8px 24px rgba(0,0,0,.25)}
.sheetwrap.zoom .sheet{width:250%;max-width:none}
@media (max-width:620px){.sheetwrap{padding:12px}.sheetwrap.zoom .sheet{width:420%}}
#sheet .ed{cursor:text;outline:none}
#sheet .edh{fill:#ff0000;fill-opacity:0}
#sheet .ed:hover .edh,#sheet .ed:focus-visible .edh{fill-opacity:.12}
#sheet .ed:focus-visible .edh{stroke:#556f83;stroke-width:.3}
#sheet .dh{fill:#556f83;fill-opacity:0;cursor:ns-resize;touch-action:none}
#sheet .dh:hover,#sheet.dragging .dh{fill-opacity:.16}
#sheet.dragging{cursor:ns-resize;user-select:none}
.dimedit{position:absolute;z-index:3;width:84px;font:400 13px/1.3 var(--f-mono);padding:4px 6px;border:1px solid #ff0000;border-radius:var(--r-xs);background:#ffffff;color:var(--text-primary);outline:none;box-shadow:0 0 0 3px rgba(255,0,0,.15)}

/* ---------- saved setups ---------- */
#viewSaved{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--r-md);box-shadow:var(--shadow-xs);padding:16px}
.sv-bar{display:flex;flex-wrap:wrap;gap:12px 20px;align-items:center;justify-content:space-between;margin-bottom:8px}
.sv-left{display:flex;flex-wrap:wrap;gap:12px 20px;align-items:center;min-width:0}
.sv-find{width:280px;max-width:100%}
.sv-count{font:400 13px/1.3 var(--f-sans);color:var(--text-tertiary)}
.sv-tablewrap{overflow-x:auto;border:1px solid var(--border-subtle);border-radius:var(--r-sm)}
.sv-table{width:100%;border-collapse:collapse;font:400 14px/1.4 var(--f-sans);min-width:760px}
.sv-table th{font:600 11px/1.3 var(--f-sans);letter-spacing:.08em;text-transform:uppercase;color:var(--slate-600);text-align:left;padding:9px 12px;background:var(--surface-sunken);border-bottom:1px solid var(--border-subtle);white-space:nowrap}
.sv-table td{padding:9px 12px;border-bottom:1px solid var(--border-subtle);vertical-align:middle}
.sv-table tr:last-child td{border-bottom:0}
.sv-table tbody tr:hover td{background:var(--neutral-50)}
.sv-table td.mono{font:400 13px/1.3 var(--f-mono);font-variant-numeric:tabular-nums;white-space:nowrap}
.sv-table td.muted{color:var(--text-secondary)}
.sv-table tr.sel td{background:var(--slate-50)}
.sv-table tr.on td:first-child{box-shadow:inset 2px 0 0 var(--action)}
.sv-table input[type=checkbox]{width:16px;height:16px;accent-color:var(--action);margin:0}
.sv-name{background:none;border:0;padding:0;color:var(--text-primary);cursor:pointer;font:600 14px/1.3 var(--f-sans);text-align:left}
.sv-name:hover{color:var(--text-link);text-decoration:underline;text-underline-offset:3px}
.sv-name:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:var(--r-xs)}
.sv-loaded{font:500 11px/1 var(--f-sans);color:var(--slate-700);background:var(--slate-100);border-radius:999px;padding:3px 7px;margin-left:8px}
.empty{font:400 14px/1.5 var(--f-sans);color:var(--text-tertiary);margin:8px 0}
.sv-backup{margin-top:20px;padding-top:16px;border-top:1px solid var(--border-subtle);display:flex;flex-direction:column;gap:10px}
.sv-backup label.btn{display:inline-flex}

@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* ---------- print: only the drawing sheets, 1:1 on the paper they were laid out for ---------- */
#printRoot{display:none}
@page{margin:0}
@page sheetA4{size:A4 portrait;margin:0}
@page sheetA3{size:A3 landscape;margin:0}
@media print{
  :root{padding:0}
  html,body{background:#ffffff!important;margin:0}
  body::before{display:none}
  body>*:not(#printRoot){display:none!important}
  #printRoot{display:block}
  .psheet{overflow:hidden;break-after:page;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .psheet:last-child{break-after:auto}
  .ps-A4{page:sheetA4;width:210mm;height:297mm}
  .ps-A3{page:sheetA3;width:420mm;height:297mm}
  .psheet svg{display:block;width:100%;height:100%;box-shadow:none}
}
.linkbtn-start{align-self:flex-start}
