/* Pattern Translator — web UI (runs in a WebView2/Chromium desktop window).
   NEOBRUTALISM design system: bright yellow + black + white with pink/blue/green
   accents, hard 3px black borders, hard OFFSET shadows (no blur), zero-radius
   blocks, heavy uppercase Archivo. High-contrast, blocky, confident.
   Every page shares these classes, so the whole tool restyles from this one file.
   (The PDF renderer is untouched — this is screen-only CSS.)
   The legacy --accent/--line/--tint/... var NAMES are kept as neobrutalism-valued
   aliases so the inline styles still in some templates keep resolving. */
@import url('https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&display=swap');

:root{
  --bg:#f3efe4; --card:#ffffff; --ink:#141414; --muted:#5b5751;
  --yellow:#ffdd00; --pink:#ff5da2; --blue:#4d61ff;
  --high:#00b964; --med:#ffb800; --low:#ff4d4d; --prose:#9a93a8;
  --display:'Archivo',system-ui,sans-serif;
  --sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
  --bd:3px solid var(--ink);
  --sh:5px 5px 0 var(--ink); --sh-sm:3px 3px 0 var(--ink);
  /* legacy aliases (kept so inline template styles still resolve) */
  --accent:#ff5da2; --accent-ink:#c4327a; --accent2:#00b964; --line:#141414;
  --tint:#fff7c2; --shadow:5px 5px 0 var(--ink); --shadow-sm:3px 3px 0 var(--ink);
  --nb-yellow:#ffdd00; --nb-ink:#141414;
}
*{box-sizing:border-box}
body{margin:0;padding-top:60px;color:var(--ink);font-family:var(--sans);line-height:1.55;
  background-color:var(--bg);
  background-image:radial-gradient(rgba(20,20,20,.07) 1.4px,transparent 1.4px);
  background-size:22px 22px;}
.wrap{max-width:920px;margin:0 auto;padding:30px 20px 64px}
header{margin-bottom:22px}
.logo{font-family:var(--display);font-size:30px;font-weight:900;letter-spacing:-.5px;
  text-transform:uppercase;color:var(--ink);line-height:1.02}
.tag{color:var(--muted);font-size:14px;margin-top:6px;font-weight:500}
h2{font-family:var(--display);font-weight:800;text-transform:uppercase;letter-spacing:-.3px;margin:32px 0 10px}
h3{font-family:var(--display);font-weight:800;text-transform:uppercase;letter-spacing:-.2px}

.card{background:var(--card);border:var(--bd);border-radius:0;padding:24px;box-shadow:var(--sh)}
.card.center{text-align:center}

/* drag-and-drop dropzone */
.drop{display:block;border:3px dashed var(--ink);border-radius:0;background:var(--yellow);
  padding:36px;text-align:center;cursor:pointer;transition:transform .12s,box-shadow .12s,background .12s;box-shadow:var(--sh-sm)}
.drop:hover{background:#ffe84d;transform:translate(-2px,-2px);box-shadow:6px 6px 0 var(--ink)}
.drop.over{border-style:solid;background:var(--pink);transform:translate(-2px,-2px);box-shadow:6px 6px 0 var(--ink)}
.drop-icon{font-size:34px;color:var(--ink)}
.drop-title{font-weight:800;font-size:19px;margin-top:8px;font-family:var(--display);text-transform:uppercase}
.drop-sub{color:var(--ink);font-size:13px;margin-top:4px;font-weight:500;opacity:.65}

.grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:18px}
.field{margin-top:16px;display:flex;flex-direction:column}
.field label{font-size:13px;font-weight:700;margin-bottom:6px;text-transform:uppercase;letter-spacing:.3px}
.field input[type=text],.field input[type=number],.field input[type=password],select{
  padding:12px 13px;border:var(--bd);border-radius:0;font-size:14px;
  font-family:inherit;background:#fff;color:var(--ink);width:100%}
.field input:focus,select:focus{outline:none;box-shadow:var(--sh-sm);transform:translate(-1px,-1px)}
button:focus-visible,a:focus-visible{outline:3px solid var(--blue);outline-offset:2px}
.muted{color:var(--muted);font-weight:500}
.help{color:var(--muted);font-size:12px;margin-top:6px;font-weight:500}

/* batch folder display — filled by native Browse, editable as the browser fallback */
.pathbox{margin-top:8px;padding:11px 13px;border:3px dashed var(--ink);border-radius:0;
  background:#fff;color:var(--muted);font-size:13px;width:100%;font-family:inherit}
.pathbox:focus{outline:none;box-shadow:var(--sh-sm);color:var(--ink)}
.pathbox.filled{color:var(--ink);border-style:solid}

/* legacy theme swatches (kept for any template still using them) */
.themes{display:flex;gap:14px}
.theme{display:flex;align-items:center;gap:7px;font-size:14px;cursor:pointer}
.sw{width:18px;height:18px;display:inline-block;border:2px solid var(--ink)}
.sw.pastel{background:var(--pink)}.sw.mint{background:var(--high)}.sw.minimal{background:#222}
.sw.ai{background:conic-gradient(var(--yellow),var(--pink),var(--blue),var(--high),var(--yellow))}

.toggles{margin-top:18px;display:flex;flex-direction:column;gap:10px}
.chk{font-size:14px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-weight:500}
.warn{color:#b45309;font-size:12px;font-weight:600}

/* ------------------------------------------------------------------ buttons
   .go = the ONE main action (solid black block) · .btn2 = secondary (white +
   border) · .ghost = quiet. All do the neobrutalism press: hover lifts and grows
   the offset shadow, :active presses down into it. */
.go{display:inline-block;width:100%;margin-top:22px;padding:15px;border:var(--bd);border-radius:0;
  background:var(--ink);color:#fff;font-size:16px;font-weight:800;cursor:pointer;text-transform:uppercase;
  letter-spacing:.5px;text-align:center;text-decoration:none;font-family:var(--display);box-shadow:var(--sh);
  transition:transform .1s,box-shadow .1s,background .1s}
.go:hover{background:#000;transform:translate(-2px,-2px);box-shadow:7px 7px 0 var(--ink)}
.go:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--ink)}
.go:disabled{background:#c4c0b8;border-color:#c4c0b8;color:#fff;cursor:not-allowed;transform:none;box-shadow:none}
.go.dl{background:var(--yellow);color:var(--ink)}
.go.dl:hover{background:#ffe84d}
.go.dl:disabled{background:#e6e2d6;border-color:#e6e2d6}

.btn2{display:inline-block;padding:13px 20px;border:var(--bd);border-radius:0;background:#fff;
  color:var(--ink);font-size:14px;font-weight:800;cursor:pointer;text-transform:uppercase;letter-spacing:.4px;
  text-align:center;text-decoration:none;font-family:var(--display);box-shadow:var(--sh-sm);
  transition:transform .1s,box-shadow .1s,background .1s}
.btn2:hover{background:var(--yellow);transform:translate(-2px,-2px);box-shadow:5px 5px 0 var(--ink)}
.btn2:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--ink)}
.btn2:disabled{color:#aaa;border-color:#ccc;cursor:not-allowed;transform:none;box-shadow:none;background:#fff}

.ghost{color:var(--ink);text-decoration:none;font-size:14px;cursor:pointer;font-weight:600}
button.ghost{background:#fff;border:2px solid var(--ink);padding:7px 12px;border-radius:0;
  font-family:var(--display);font-size:13px;text-transform:uppercase;letter-spacing:.3px;box-shadow:2px 2px 0 var(--ink)}
.ghost:hover{color:var(--ink)}
button.ghost:hover{background:var(--yellow);transform:translate(-1px,-1px);box-shadow:3px 3px 0 var(--ink)}
button.ghost:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--ink)}
.ghost:disabled,button.ghost:disabled{color:#aaa;border-color:#ccc;cursor:not-allowed;transform:none;box-shadow:none;background:#fff}

/* a button that reads like a link (used inside tables, keeps keyboard focus) */
.linkish{background:none;border:0;padding:0;margin:0;font:inherit;font-size:13px;font-weight:700;
  color:var(--ink);text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:2px;cursor:pointer}
.linkish:hover{background:var(--yellow)}

/* busy submit: greyed + a small inline spinner so a click visibly "took" */
.busy{pointer-events:none;opacity:.85}
.busy::after{content:"";display:inline-block;width:13px;height:13px;margin-left:9px;vertical-align:-2px;
  border:2.5px solid rgba(255,255,255,.4);border-top-color:#fff;border-radius:50%;animation:sp .7s linear infinite}
.btn2.busy::after,.ghost.busy::after,.linkish.busy::after{border-color:rgba(20,20,20,.25);border-top-color:var(--ink)}

.note{color:var(--muted);font-size:12.5px;margin-top:14px;text-align:center;font-weight:500}
footer{color:var(--muted);font-size:12px;text-align:center;margin-top:30px;font-weight:600}

/* ============================================================ neobrutalism nav
   FIXED top bar shared by every page. Bold yellow/black, hard borders + offset
   shadows, zero radius — and position:fixed, so it stays pinned and renders
   IDENTICALLY across full-page navigations (the old in-flow header re-flowed/
   jumped on every click). Out of normal flow, so it spans the whole window;
   body padding-top:60px keeps page content clear of it. */
.nb-nav{position:fixed;top:0;left:0;right:0;z-index:1000;display:flex;align-items:center;
  gap:14px;height:56px;padding:0 18px;background:var(--nb-yellow);color:var(--nb-ink);
  border-bottom:3px solid var(--nb-ink);box-shadow:0 4px 0 rgba(0,0,0,.16);font-family:'Archivo',var(--sans)}
.nb-brand{display:flex;align-items:center;gap:6px;text-decoration:none;color:var(--nb-ink);
  font-weight:900;font-size:18px;letter-spacing:-.4px;text-transform:uppercase;flex:0 0 auto}
.nb-brand-b{background:var(--nb-ink);color:var(--nb-yellow);padding:2px 8px;
  border:2px solid var(--nb-ink);transform:rotate(-2deg)}
.nb-links{display:flex;gap:4px;align-items:center;margin-left:auto;flex-wrap:wrap}
.nb-link{text-decoration:none;text-transform:uppercase;font-weight:700;font-size:12.5px;
  letter-spacing:.4px;color:var(--nb-ink);padding:7px 12px;border:2px solid transparent;
  transition:transform .08s,box-shadow .08s,background .08s}
.nb-link:hover{background:#fff;border-color:var(--nb-ink);box-shadow:3px 3px 0 var(--nb-ink);transform:translate(-1px,-1px)}
.nb-link:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--nb-ink)}
.nb-link.active{background:var(--nb-ink);color:var(--nb-yellow);border-color:var(--nb-ink)}
.nb-link.active:hover{box-shadow:3px 3px 0 rgba(0,0,0,.35);transform:translate(-1px,-1px)}
.nb-link:focus-visible{outline:2px solid var(--nb-ink);outline-offset:2px}

/* loading spinner */
.spin{width:32px;height:32px;border:4px solid var(--ink);border-top-color:var(--yellow);
  border-radius:50%;animation:sp .7s linear infinite;margin:6px auto}
.spin.big{width:50px;height:50px;border-width:5px;margin:6px auto 16px}
@keyframes sp{to{transform:rotate(360deg)}}

/* result */
.banner{border:var(--bd);border-radius:0;padding:16px 18px;margin:18px 0;background:#fff;box-shadow:var(--sh-sm)}
.banner.high{background:#cdfbe2}.banner.medium{background:#fff0bf}.banner.low{background:#ffd9d9}
.banner-h{font-size:18px;font-weight:800;font-family:var(--display);text-transform:uppercase}
.banner-s{color:var(--muted);font-size:13px;margin-top:3px;font-weight:500}
.alert{background:var(--yellow);border:var(--bd);color:var(--ink);padding:12px 14px;border-radius:0;
  margin:12px 0;font-size:14px;font-weight:600;box-shadow:var(--sh-sm)}

table.rounds{width:100%;border-collapse:collapse;font-size:13px;margin-top:12px;background:#fff;border:var(--bd)}
.rounds th{background:var(--ink);color:#fff;text-align:left;padding:10px;font-size:12px;text-transform:uppercase;font-family:var(--display);letter-spacing:.3px}
.rounds td{padding:9px 10px;border-top:2px solid var(--ink);vertical-align:top}
.rounds .eng{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
.nowrap{white-space:nowrap}
.badge{font-size:11px;font-weight:800;padding:3px 8px;border:2px solid var(--ink);color:var(--ink);
  text-transform:uppercase;font-family:var(--display);display:inline-block}
.b-high{background:var(--high)}.b-medium{background:var(--med)}.b-prose{background:var(--prose);color:#fff}.b-low{background:var(--low);color:#fff}
tr.r-low{background:#ffe2e2}
.actions{display:flex;gap:14px;align-items:center;margin-top:24px;flex-wrap:wrap}
code{background:var(--yellow);padding:2px 6px;border:1.5px solid var(--ink);border-radius:0;font-size:12px;font-family:ui-monospace,Consolas,monospace}

/* ---------------------------------------------------------- shared tables
   One look for the library / queue lists instead of per-page re-styling. */
table.tbl{width:100%;border-collapse:collapse;font-size:13px;background:#fff;border:var(--bd)}
.tbl th{background:var(--ink);color:#fff;text-align:left;padding:10px;font-size:12px;text-transform:uppercase;font-family:var(--display);letter-spacing:.3px}
.tbl td{padding:9px 10px;border-top:2px solid var(--ink)}
.tbl tbody tr:hover{background:var(--yellow)}

/* status pills (library verdicts + queue states share one vocabulary) — blocky + bordered */
.pill{font-size:11px;font-weight:800;padding:3px 9px;border:2px solid var(--ink);color:var(--ink);
  white-space:nowrap;text-transform:uppercase;font-family:var(--display);display:inline-block}
.pill.ship{background:var(--high)}.pill.review{background:var(--med)}.pill.fix{background:var(--low);color:#fff}
.pill.pending{background:#fff}.pill.running{background:var(--blue);color:#fff}
.pill.done{background:var(--high)}.pill.error{background:var(--low);color:#fff}

/* dashboard counters (library) */
.cards{display:flex;gap:14px;flex-wrap:wrap;margin:16px 0}
.kpi{flex:1;min-width:120px;background:#fff;border:var(--bd);border-radius:0;padding:16px;text-align:center;box-shadow:var(--sh-sm)}
.kpi b{font-size:30px;display:block;font-family:var(--display);font-weight:900;line-height:1}
.kpi span{color:var(--muted);font-size:12px;text-transform:uppercase;font-weight:700;letter-spacing:.3px}
.kpi.ship b{color:#009a53}.kpi.review b{color:#cc8800}.kpi.fix b{color:var(--low)}

/* friendly empty states (library / queue / remix before first translation) */
.empty{text-align:center;padding:44px 24px}
.empty .ico{font-size:46px;line-height:1}
.empty h3{margin:14px 0 8px;font-size:22px}
.empty p{color:var(--muted);font-size:14px;margin:0 auto 20px;max-width:430px;font-weight:500}

/* collapsible section (the accuracy report on the result page) */
details.fold{margin-top:22px;background:#fff;border:var(--bd);border-radius:0;box-shadow:var(--sh-sm)}
details.fold>summary{cursor:pointer;list-style:none;padding:15px 18px;font-weight:800;
  font-size:14px;display:flex;align-items:center;gap:8px;text-transform:uppercase;font-family:var(--display)}
details.fold>summary::-webkit-details-marker{display:none}
details.fold>summary::before{content:"▸"}
details.fold[open]>summary::before{content:"▾"}
details.fold .fold-body{padding:0 18px 16px}

@media(max-width:680px){
  .grid{grid-template-columns:1fr}
  .wrap{padding:22px 14px 48px}
  .actions{gap:10px}
  .actions .go,.actions .btn2{flex:1 1 100%}
  .nb-nav{flex-wrap:wrap;height:auto;padding:8px 12px;gap:8px}
  .nb-links{width:100%;margin-left:0;overflow-x:auto;flex-wrap:nowrap}
  body{padding-top:108px}
}

/* ================================================================== ADDITIVE
   2026-06-12 upgrade components (audit table · hub · studio · settings ·
   batch board).  NEVER rename anything above — the legacy aliases and class
   names are load-bearing across all templates. */

/* ---- accuracy AUDIT table (result.html + pattern.html, on top of .rounds) */
table.audit-table .ru{font-family:Georgia,'Times New Roman',serif;color:var(--muted);font-size:12.5px}
table.audit-table td.math{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
table.audit-table .pg{color:var(--muted);font-size:11px;font-weight:700}
table.audit-table tr.row-flag{background:#fff0bf}            /* amber: a number not in the original */
table.audit-table tr.row-flag td:first-child{box-shadow:inset 4px 0 0 var(--med)}
.audit-tools{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin:10px 0 2px}
.audit-tools .chk{margin:0}

/* ---- small category/craft tags (pattern detail header, library rows) */
.chip{display:inline-block;font-size:11px;font-weight:800;padding:3px 9px;border:2px solid var(--ink);
  background:#fff;color:var(--ink);text-transform:uppercase;font-family:var(--display);letter-spacing:.3px}

/* ---- detail-page thumbnail */
.thumbrow{flex:0 0 auto}
.thumbrow img{width:230px;max-width:100%;border:var(--bd);box-shadow:var(--sh-sm);display:block;background:#fff}

/* ---- design swatch card (studio gallery + pattern re-render preview) */
.design-swatch{display:inline-flex;flex-direction:column;gap:8px;background:#fff;border:var(--bd);
  box-shadow:var(--sh-sm);padding:13px 15px;min-width:170px;vertical-align:top;
  transition:transform .1s,box-shadow .1s}
.design-swatch .dots{display:flex;gap:6px}
.design-swatch .dot{width:20px;height:20px;border:2px solid var(--ink);display:inline-block;background:#fff;border-radius:0}
.design-swatch .name{font-family:var(--display);font-weight:800;font-size:13.5px;text-transform:uppercase;letter-spacing:.2px;line-height:1.15}
.design-swatch .skin{font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.4px}
.design-swatch .fam{font-size:11.5px;color:var(--muted);font-weight:500}
a.design-swatch,button.design-swatch{cursor:pointer;text-decoration:none;color:var(--ink);font:inherit;text-align:left}
a.design-swatch:hover,button.design-swatch:hover{transform:translate(-2px,-2px);box-shadow:5px 5px 0 var(--ink)}

/* ---- bool setting toggle (settings.html) — a chunky neobrutalism switch */
.toggle{display:flex;align-items:center;gap:10px;cursor:pointer;font-weight:600;font-size:14px;
  text-transform:none;letter-spacing:0}
.toggle input[type=checkbox]{appearance:none;-webkit-appearance:none;width:46px;height:26px;margin:0;
  border:var(--bd);background:#fff;position:relative;cursor:pointer;flex:0 0 auto;transition:background .12s}
.toggle input[type=checkbox]::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;
  background:var(--ink);transition:left .12s}
.toggle input[type=checkbox]:checked{background:var(--high)}
.toggle input[type=checkbox]:checked::after{left:24px}
.toggle input[type=checkbox]:focus-visible{outline:3px solid var(--blue);outline-offset:2px}

/* ---- pagination (library hub) */
.pager{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:18px 0}
.pager a,.pager .cur,.pager .gap{display:inline-block;min-width:34px;padding:7px 11px;text-align:center;
  font-family:var(--display);font-weight:800;font-size:13px;text-decoration:none;color:var(--ink)}
.pager a{background:#fff;border:2px solid var(--ink);box-shadow:2px 2px 0 var(--ink);
  transition:transform .08s,box-shadow .08s,background .08s}
.pager a:hover{background:var(--yellow);transform:translate(-1px,-1px);box-shadow:3px 3px 0 var(--ink)}
.pager a:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--ink)}
.pager .cur{background:var(--ink);color:#fff;border:2px solid var(--ink)}
.pager .gap{color:var(--muted);min-width:auto;padding:7px 2px}

/* ---- batch review board (batch_board.html: ship/review/fix/error sections) */
.board-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:16px;margin:14px 0}
.board-grid .bcard{background:#fff;border:var(--bd);box-shadow:var(--sh-sm);padding:14px;
  display:flex;flex-direction:column;gap:8px;min-width:0}
.board-grid .bcard img{width:100%;border:2px solid var(--ink);display:block;background:#fff}
.board-grid .bcard .bt{font-family:var(--display);font-weight:800;font-size:14px;line-height:1.2;
  overflow:hidden;text-overflow:ellipsis}
.board-grid .bcard .why{color:var(--muted);font-size:12px;font-weight:500}
.board-grid .bcard .row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:auto}

@media(max-width:680px){
  .board-grid{grid-template-columns:1fr 1fr}
  .thumbrow img{width:170px}
}
