:root{
  --ink:#17242f; --muted:#5b6b7c;
  --brand:#0f72bc; --brand2:#2b8fe0;
  --good:#1f9d6b; --warn:#bd7d1a; --bad:#d1453f;
  --line:rgba(21,60,105,.14); --chip:rgba(15,114,188,.09);
  --glass:rgba(255,255,255,.58); --glass2:rgba(255,255,255,.46);
  --glassbord:rgba(255,255,255,.7);
  --shadow:0 10px 30px rgba(20,55,100,.12);
  --radius:14px; font-synthesis:none;
}
*{box-sizing:border-box}
body{margin:0;color:var(--ink);min-height:100vh;
  font:15px/1.5 "Segoe UI",system-ui,-apple-system,sans-serif;
  background:
    radial-gradient(1100px 620px at 8% -12%, rgba(43,143,224,.24), transparent 60%),
    radial-gradient(1000px 560px at 112% 4%, rgba(15,114,188,.18), transparent 56%),
    radial-gradient(900px 760px at 50% 122%, rgba(43,143,224,.14), transparent 60%),
    linear-gradient(180deg,#eaf2fb 0%,#f3f8fc 100%);
  background-attachment:fixed}
h1,h2{margin:0;font-weight:700}
button{font:inherit;cursor:pointer}

/* liquid-glass surfaces */
.panel,.topbar,.matchcard,.swagedcard,.companion-panel{
  background:var(--glass);
  -webkit-backdrop-filter:blur(16px) saturate(165%);
  backdrop-filter:blur(16px) saturate(165%);
  border:1px solid var(--glassbord);
  box-shadow:var(--shadow), inset 0 1px 0 rgba(255,255,255,.55);
}

/* top bar */
.topbar{display:flex;align-items:center;justify-content:space-between;
  padding:12px 22px;border:none;border-bottom:1px solid var(--line);border-radius:0;
  position:sticky;top:0;z-index:5}
.brand{display:flex;gap:16px;align-items:center}
.logo{height:42px;width:auto;display:block}
.brand-sep{width:1px;height:34px;background:var(--line)}
.topbar h1{font-size:19px;color:var(--ink)}
.sub{margin:2px 0 0;color:var(--muted);font-size:12.5px}
.status{color:var(--brand);font-size:12.5px;background:var(--chip);
  padding:6px 12px;border-radius:20px;border:1px solid var(--line)}

/* layout */
.grid{display:grid;grid-template-columns:minmax(360px,1fr) minmax(420px,1.25fr);
  gap:18px;padding:18px;max-width:1400px;margin:0 auto}
.panel{border-radius:var(--radius);padding:16px;min-height:70vh}
@media(max-width:900px){.grid{grid-template-columns:1fr}}

/* tabs */
.tabs{display:flex;gap:6px;margin-bottom:12px}
.tab{background:var(--glass2);color:var(--muted);border:1px solid var(--line);
  padding:8px 14px;border-radius:10px;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.tab.active{background:var(--brand);color:#fff;border-color:var(--brand);
  box-shadow:0 4px 14px rgba(15,114,188,.3)}
.hint{color:var(--muted);font-size:13px;margin:2px 0 12px}
.hidden{display:none!important}

/* uploader + samples */
.uploader{display:flex;align-items:center;justify-content:center;height:80px;
  border:1.5px dashed var(--brand);border-radius:12px;color:var(--brand);
  background:rgba(15,114,188,.05);cursor:pointer;transition:.15s;font-weight:600}
.uploader:hover{border-color:var(--brand2);background:rgba(15,114,188,.1);color:var(--brand2)}
.uploadnote{margin-top:10px;padding:9px 12px;border-radius:8px;font-size:12.5px;
  background:rgba(31,157,107,.12);border:1px solid rgba(31,157,107,.4);color:#146b48}
.samples{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.sample{display:flex;justify-content:space-between;align-items:center;
  background:var(--glass2);border:1px solid var(--line);border-radius:11px;
  padding:10px 12px;cursor:pointer;transition:.15s;
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.sample:hover{border-color:var(--brand2);box-shadow:0 4px 14px rgba(20,55,100,.1)}
.sample.sel{border-color:var(--brand);box-shadow:0 0 0 1.5px var(--brand) inset}
.sample .who{font-weight:600}
.sample .meta{color:var(--muted);font-size:12px}
.badge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:20px;
  background:var(--chip);border:1px solid var(--line)}
.badge.AE{color:#7c4dd1}.badge.BE{color:var(--brand)}.badge.CE{color:var(--good)}

/* param form */
.sec{margin-bottom:14px}
.sec h3{font-size:12px;text-transform:uppercase;letter-spacing:.5px;
  color:var(--muted);margin:0 0 8px;border-bottom:1px solid var(--line);padding-bottom:5px}
.fields{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.field{display:flex;flex-direction:column;gap:3px}
.field label{font-size:11.5px;color:var(--muted)}
.field.hard label{color:var(--brand);font-weight:700}
.field input,.field select{background:rgba(255,255,255,.72);border:1px solid var(--line);
  color:var(--ink);border-radius:8px;padding:7px 8px;font:inherit}
.field input:focus,.field select:focus{outline:none;border-color:var(--brand);
  box-shadow:0 0 0 3px rgba(15,114,188,.12)}

/* action bar */
.actionbar{display:flex;gap:10px;margin-top:14px}
.primary{background:var(--brand);color:#fff;border:none;padding:10px 16px;border-radius:10px;
  font-weight:600;box-shadow:0 6px 16px rgba(15,114,188,.28)}
.primary:hover{background:var(--brand2)}
.ghost{background:rgba(255,255,255,.5);color:var(--muted);border:1px solid var(--line);
  padding:10px 16px;border-radius:10px}
.ghost:hover{color:var(--ink);border-color:var(--brand)}

/* results */
.empty{display:flex;height:60vh;align-items:center;justify-content:center}
.emptymsg{color:var(--muted);text-align:center}
.matchcard{border:1px solid var(--brand);border-radius:14px;padding:16px;margin-bottom:16px;
  box-shadow:0 10px 30px rgba(15,114,188,.14), inset 0 1px 0 rgba(255,255,255,.6)}
.matchcard .top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.matchcard h2{font-size:16px}
.starting{color:var(--good);font-size:12.5px;font-weight:600;margin-top:2px}
.sameowner{color:#a6690f;font-size:12px;font-weight:600;margin-top:4px;
  background:rgba(189,125,26,.12);border:1px solid rgba(189,125,26,.4);border-radius:6px;
  padding:4px 8px;display:inline-block}
.score{text-align:center;min-width:92px}
.score .pct{font-size:30px;font-weight:800;color:var(--brand);line-height:1}
.score small{color:var(--muted);font-size:11px}
.pillrow{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
.pill{font-size:12px;background:var(--chip);border:1px solid var(--line);
  padding:3px 10px;border-radius:20px;color:var(--ink)}
.difftable{width:100%;border-collapse:collapse;margin-top:8px;font-size:13px}
.difftable th,.difftable td{text-align:left;padding:6px 8px;border-bottom:1px solid var(--line)}
.difftable th{color:var(--muted);font-weight:600;font-size:11.5px;text-transform:uppercase}
.d-same{color:var(--good)}.d-diff{color:var(--warn)}
.linkrow{margin-top:10px;display:flex;gap:10px;align-items:center}
.linkrow a{color:var(--brand);font-size:13px;text-decoration:none}
.linkrow a:hover{text-decoration:underline}
.cand{color:var(--muted);font-size:12px;margin-top:6px}

/* steps */
#stepsBlock h2{font-size:15px;margin-bottom:10px}
.steps{margin:0;padding-left:0;list-style:none;counter-reset:s}
.steps li{counter-increment:s;position:relative;padding:10px 12px 10px 42px;
  background:var(--glass2);border:1px solid var(--line);border-radius:11px;margin-bottom:8px;
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.steps li::before{content:counter(s);position:absolute;left:10px;top:10px;
  width:22px;height:22px;border-radius:50%;background:var(--brand);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}
.steps .st-title{font-weight:600}
.steps .st-src{font-size:11.5px;margin-top:2px;color:var(--muted)}
.src-base{color:var(--brand)}.src-reg{color:var(--good)}.src-input{color:var(--warn)}
.steps li.src-edit{border-color:rgba(189,125,26,.5)}
.steps li.src-edit .st-src{color:var(--warn)}
.steps li.src-constraint{margin-left:26px;background:rgba(31,157,107,.08);
  border-color:rgba(31,157,107,.4)}
.steps li.src-constraint .st-src{color:var(--good)}
.steps li.src-constraint::before{display:none}
.steps li.src-constraint{padding-left:14px}

/* companion */
.companion{position:fixed;right:20px;bottom:20px;z-index:20}
.companion-toggle{background:var(--brand);color:#fff;border:none;
  padding:12px 18px;border-radius:26px;font-weight:600;box-shadow:0 8px 22px rgba(15,114,188,.4)}
.companion-toggle:hover{background:var(--brand2)}
.companion-panel{position:absolute;right:0;bottom:56px;width:360px;height:460px;
  border-radius:16px;display:flex;flex-direction:column}
.companion-head{display:flex;justify-content:space-between;align-items:center;
  padding:12px 14px;border-bottom:1px solid var(--line);font-weight:600}
.companion-head button{background:none;border:none;color:var(--muted);font-size:16px}
.companion-log{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px}
.msg{max-width:85%;padding:9px 12px;border-radius:12px;font-size:13.5px;white-space:pre-wrap}
.msg.user{align-self:flex-end;background:var(--brand);color:#fff;border-bottom-right-radius:3px}
.msg.bot{align-self:flex-start;background:rgba(255,255,255,.72);border:1px solid var(--line);
  color:var(--ink);border-bottom-left-radius:3px}
.msg.sys{align-self:center;color:var(--muted);font-size:12px;background:none}
.companion-input{display:flex;gap:8px;padding:10px;border-top:1px solid var(--line)}
.companion-input input{flex:1;background:rgba(255,255,255,.72);border:1px solid var(--line);
  color:var(--ink);border-radius:20px;padding:9px 14px;font:inherit}
.companion-input input:focus{outline:none;border-color:var(--brand);
  box-shadow:0 0 0 3px rgba(15,114,188,.12)}
.companion-input .primary{border-radius:20px;padding:9px 14px}

/* execute-steps bar + live status badges on the plan */
.execbar{display:flex;align-items:center;gap:14px;margin-top:14px;flex-wrap:wrap}
.execstatus{color:var(--muted);font-size:13px}
.execdone{color:var(--good)}
.steps li.running::before{background:var(--warn);color:#fff;
  animation:pulse 1s ease-in-out infinite}
.steps li.running .st-title{color:var(--warn)}
.steps li.done::before{content:'✓';background:var(--good);color:#fff}
.steps li.done{opacity:.92}
@keyframes pulse{0%,100%{box-shadow:0 0 0 3px rgba(189,125,26,.22)}50%{box-shadow:0 0 0 7px rgba(189,125,26,.05)}}

/* generated swaged dished end card */
#swagedBlock{margin-top:20px}
#swagedBlock>h2{font-size:15px;margin:0 0 10px}
.swagedcard{display:grid;grid-template-columns:1fr 300px;gap:16px;align-items:start;
  border:1px solid var(--brand);border-radius:14px;padding:16px;
  box-shadow:0 10px 30px rgba(15,114,188,.14), inset 0 1px 0 rgba(255,255,255,.6)}
.swmeta{color:var(--muted);font-size:13px;line-height:1.55;margin:8px 0 12px}
.swmeta b{color:var(--ink)}
.swfile{color:var(--muted);font-size:11.5px;font-family:ui-monospace,Consolas,monospace;margin-top:10px}
.swthumbs{display:flex;flex-direction:column;gap:8px}
.swthumbs img{width:100%;border-radius:10px;border:1px solid var(--line);background:#eaf2fb}
.openswaged{font-size:14px}
.openswaged.locked,.openswaged:disabled{background:rgba(120,140,160,.25);color:var(--muted);
  border:1px solid var(--line);cursor:not-allowed;box-shadow:none}
.openswaged:not(.locked):not(:disabled){box-shadow:0 6px 16px rgba(15,114,188,.3)}
.lockhint{color:var(--muted);font-size:12px}
#swagedBlock:not(.hidden) .swagedcard{animation:fadeup .45s ease both}
@keyframes fadeup{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@media(max-width:900px){.swagedcard{grid-template-columns:1fr}}

/* ===== EXECUTION SCREEN =================================================== */
.execscreen{max-width:1240px;margin:18px auto;padding:0 18px 40px}
.exec-top{display:flex;align-items:center;gap:18px;padding:14px 18px;margin-bottom:16px;
  border-radius:var(--radius);background:var(--glass);border:1px solid var(--glassbord);
  -webkit-backdrop-filter:blur(16px) saturate(165%);backdrop-filter:blur(16px) saturate(165%);
  box-shadow:var(--shadow), inset 0 1px 0 rgba(255,255,255,.55)}
.exec-title{flex:1;min-width:0}
.exec-title h2{font-size:19px}
.exec-title .sub{margin:3px 0 0;font-size:13px;color:var(--muted)}
.exec-count{font-size:12px;color:var(--muted);white-space:nowrap;
  background:var(--chip);border:1px solid var(--line);border-radius:20px;padding:5px 12px}
.exec-body{display:grid;grid-template-columns:262px 1fr;gap:18px;align-items:start}
.exec-rail ol{margin:0;padding:14px;list-style:none;border-radius:var(--radius);
  background:var(--glass2);border:1px solid var(--glassbord);box-shadow:var(--shadow)}
.exec-rail li{display:flex;gap:10px;align-items:flex-start;padding:9px 4px;
  font-size:12.5px;color:var(--muted);border-bottom:1px dashed var(--line)}
.exec-rail li:last-child{border-bottom:none}
.exec-rail .rn{flex:none;width:20px;height:20px;border-radius:50%;display:grid;place-items:center;
  background:var(--chip);border:1px solid var(--line);font-size:11px;font-weight:700}
.exec-rail li.running{color:var(--warn);font-weight:600}
.exec-rail li.running .rn{background:var(--warn);color:#fff;border-color:transparent}
.exec-rail li.done{color:var(--good)}
.exec-rail li.done .rn{background:var(--good);color:#fff;border-color:transparent}
.exec-stage{min-width:0}
.exec-stage > div + div{margin-top:18px}
#execRest h3{margin:0 0 10px;font-size:14px}

/* ===== NOZZLE TABLE ====================================================== */
.nztable{padding:16px 18px 18px;border-radius:var(--radius);
  background:var(--glass);border:1px solid var(--glassbord);
  -webkit-backdrop-filter:blur(16px) saturate(165%);backdrop-filter:blur(16px) saturate(165%);
  box-shadow:var(--shadow), inset 0 1px 0 rgba(255,255,255,.55)}
.nzhead{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:12px}
.nzhead h3{margin:0;font-size:16px}
.nzmeta{font-size:12px;color:var(--muted);margin-top:3px}
.nzscroll{overflow-x:auto}
table.nz{width:100%;border-collapse:collapse;font-size:13px;min-width:760px}
table.nz th{text-align:left;font-size:11px;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);font-weight:700;padding:0 10px 8px;border-bottom:1px solid var(--line);white-space:nowrap}
table.nz td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
table.nz tr:last-child td{border-bottom:none}
table.nz tbody tr:hover{background:rgba(15,114,188,.05)}
.nz-tag{font-weight:700;color:var(--brand)}
.nz-c{color:var(--muted)}
.nz-sw{white-space:nowrap}
.nz-sw b{font-variant-numeric:tabular-nums}
.nz-out{color:var(--muted);font-size:12px}
.nz-note{font-size:11px;color:var(--muted);margin-top:2px;white-space:normal}
.nz-svc{color:var(--muted);font-size:12.5px;max-width:230px}
.chip{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:20px;
  font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;vertical-align:middle}
.chip.plan{background:rgba(189,125,26,.14);color:var(--warn)}
.chip.ok{background:rgba(31,157,107,.14);color:var(--good)}
.nzcheck{margin-top:12px;padding:9px 12px;border-radius:10px;font-size:12.5px}
.nzcheck.ok{background:rgba(31,157,107,.09);color:var(--good);border:1px solid rgba(31,157,107,.28)}
.nzcheck.warn{background:rgba(189,125,26,.09);color:var(--warn);border:1px solid rgba(189,125,26,.28)}
.nzactions{display:flex;align-items:center;gap:14px;margin-top:14px;flex-wrap:wrap}
.nzactions .hint{margin:0}
@media (max-width:1000px){ .exec-body{grid-template-columns:1fr} }

/* editable nozzle cells */
.nzin{font:inherit;font-size:12.5px;color:var(--ink);width:100%;
  background:rgba(255,255,255,.55);border:1px solid transparent;border-radius:7px;
  padding:5px 7px;transition:border-color .12s,background .12s}
.nzin:hover{border-color:var(--line);background:rgba(255,255,255,.8)}
.nzin:focus{outline:none;border-color:var(--brand);background:#fff;
  box-shadow:0 0 0 3px rgba(15,114,188,.13)}
.nzin-num{width:88px;font-variant-numeric:tabular-nums}
.nzin-tag{width:64px;font-weight:700;color:var(--brand)}
.nzin-sw{width:104px;font-variant-numeric:tabular-nums}
.nzin-svc{min-width:170px}
.nzin.nz-man{background:rgba(189,125,26,.10);border-color:rgba(189,125,26,.34)}
.nzin.nz-man:focus{border-color:var(--warn);box-shadow:0 0 0 3px rgba(189,125,26,.15)}
table.nz td{padding:5px 8px}
table.nz tr.nz-bad td{background:rgba(209,69,63,.07)}
table.nz tr.nz-bad .nzin[data-f=angle]{border-color:var(--bad);color:var(--bad);font-weight:700}
.primary.danger{background:var(--bad)}
.primary.danger:hover{background:#e05a54}
.uploadnote.bad{background:rgba(209,69,63,.10);color:var(--bad);border:1px solid rgba(209,69,63,.30)}
.uploader.drag{border-color:var(--brand);background:rgba(15,114,188,.10)}

/* ---- real generation panel (Approve -> /api/generate -> /api/status) ---- */
.execbad{color:var(--bad,#c0392b)}
.chip.bad{background:rgba(192,57,43,.14);color:var(--bad,#c0392b)}
.pill.warn{color:var(--warn);border-color:var(--warn)}
.genpanel{margin:12px 0;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--panel,transparent)}
.genhead{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.genlog{margin:0;max-height:220px;overflow:auto;font:12px/1.45 ui-monospace,Consolas,monospace;
  white-space:pre-wrap;background:rgba(0,0,0,.05);border-radius:8px;padding:8px 10px}
.nzcheck.bad{background:rgba(192,57,43,.10);color:var(--bad,#c0392b);border:1px solid rgba(192,57,43,.35);font-weight:500}
button.primary.danger:disabled{opacity:.85;cursor:not-allowed}
