/* 개발 현황표(네온 전광판) — 2026-11-13 시안 docs/mockups/2026-11-13-flow-board.html · static/board.js */
.nboard{--nb-sans:-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo","Pretendard","Noto Sans KR","Noto Sans CJK KR",system-ui,sans-serif;
 --nb-mono:"JetBrains Mono","SF Mono","D2Coding","DejaVu Sans Mono","Noto Sans Mono CJK KR",ui-monospace,monospace;
 --bg:#030407;--cy:#22f3ff;--mg:#ff2bd6;--lm:#b6ff3b;--am:#ffb020;
 --ink:#e9f4f7;--ink-2:#a9bcc4;--ink-3:#5f7480;--edge:rgba(34,243,255,.22);--edge-2:rgba(34,243,255,.10);
 position:relative;overflow:hidden;color:var(--ink);font-family:var(--nb-sans);font-size:15px;line-height:1.55;word-break:keep-all;-webkit-font-smoothing:antialiased;
 padding:16px 18px 20px;border-radius:12px;isolation:isolate;
 background:radial-gradient(1200px 600px at 50% -10%,rgba(34,243,255,.07),transparent 60%),
  linear-gradient(rgba(34,243,255,.045) 1px,transparent 1px) 0 0/32px 32px,
  linear-gradient(90deg,rgba(34,243,255,.045) 1px,transparent 1px) 0 0/32px 32px,var(--bg)}
.nboard::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:9;background:repeating-linear-gradient(0deg,rgba(0,0,0,.28) 0 1px,transparent 1px 3px);mix-blend-mode:multiply}
.nboard *{box-sizing:border-box}
.nboard h2,.nboard h3,.nboard p{margin:0}
.nboard .nb-scan{position:absolute;left:0;right:0;height:120px;top:-120px;pointer-events:none;z-index:8;background:linear-gradient(180deg,transparent,rgba(34,243,255,.05),transparent);animation:nb-scan 7s linear infinite}
@keyframes nb-scan{to{top:100%}}
@keyframes nb-blink{50%{opacity:.35}}
.nboard .nb-blink{animation:nb-blink 1.6s steps(1) infinite}
@media (prefers-reduced-motion:reduce){.nboard .nb-scan{display:none}.nboard .nb-blink{animation:none!important}}
.nboard .nb-mono{font-family:var(--nb-mono);font-variant-numeric:tabular-nums}
.nboard .nb-g-c{color:var(--cy);text-shadow:0 0 6px rgba(34,243,255,.75),0 0 18px rgba(34,243,255,.35)}
.nboard .nb-g-m{color:var(--mg);text-shadow:0 0 6px rgba(255,43,214,.75),0 0 18px rgba(255,43,214,.35)}
.nboard .nb-g-l{color:var(--lm);text-shadow:0 0 6px rgba(182,255,59,.7),0 0 18px rgba(182,255,59,.3)}
.nboard .nb-amber{color:var(--am)}
.nboard .nb-dim{color:var(--ink-3)}
/* 머리 띠 · 판넬 모서리 */
.nboard .nb-bar{display:flex;align-items:center;gap:18px;border:1px solid var(--edge);padding:10px 16px;background:rgba(3,8,12,.7);position:relative;z-index:1}
.nboard .nb-bar::before,.nboard .nb-bar::after,.nboard .nb-pn::before,.nboard .nb-pn::after{content:"";position:absolute;width:10px;height:10px;border:solid var(--cy);filter:drop-shadow(0 0 4px var(--cy))}
.nboard .nb-bar::before,.nboard .nb-pn::before{left:-1px;top:-1px;border-width:2px 0 0 2px}
.nboard .nb-bar::after,.nboard .nb-pn::after{right:-1px;bottom:-1px;border-width:0 2px 2px 0}
.nboard .nb-bar .nb-id{font-family:var(--nb-mono);font-size:12px;letter-spacing:.22em;color:var(--ink-2);white-space:nowrap}
.nboard .nb-bar .nb-id b{color:var(--cy);font-weight:600}
.nboard .nb-bar h2{font-size:18px;font-weight:700;letter-spacing:-.01em;color:var(--ink);min-width:0;flex:1 1 auto;line-height:1.35}
.nboard .nb-bar .nb-sp{flex:0}
.nboard .nb-live{display:flex;align-items:center;gap:8px;font-family:var(--nb-mono);font-size:12px;letter-spacing:.14em;color:var(--lm)}
.nboard .nb-live i{width:8px;height:8px;border-radius:50%;background:var(--lm);box-shadow:0 0 8px var(--lm),0 0 16px var(--lm)}
.nboard .nb-clock{font-size:13px;color:var(--ink-2);letter-spacing:.06em;white-space:nowrap}
.nboard .nb-fs,.nboard .nb-close{font:600 12px/1 var(--nb-mono);letter-spacing:.1em;color:var(--cy);background:rgba(34,243,255,.06);border:1px solid var(--edge);padding:8px 12px;cursor:pointer;white-space:nowrap}
.nboard .nb-fs:hover,.nboard .nb-close:hover{background:rgba(34,243,255,.14);box-shadow:0 0 12px rgba(34,243,255,.3)}
.nboard .nb-fs:focus-visible,.nboard .nb-close:focus-visible{outline:2px solid var(--cy);outline-offset:2px}
.nboard .nb-grid{display:grid;grid-template-columns:1.05fr 1.6fr;gap:14px;margin-top:14px;position:relative;z-index:1}
.nboard .nb-grid2{display:grid;grid-template-columns:1.6fr 1fr;gap:14px;margin-top:14px;position:relative;z-index:1}
.nboard .nb-pn{border:1px solid var(--edge);background:linear-gradient(180deg,rgba(6,16,22,.82),rgba(3,7,10,.82));padding:16px 18px;position:relative;min-width:0}
.nboard .nb-ph{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.nboard .nb-ph .nb-code{font-family:var(--nb-mono);font-size:11px;letter-spacing:.2em;color:var(--ink-3)}
.nboard .nb-ph h3{font-size:15px;font-weight:700;color:var(--ink)}
.nboard .nb-ph .nb-r{margin-left:auto;font-family:var(--nb-mono);font-size:11px;color:var(--ink-3);letter-spacing:.12em;text-align:right}
/* 진행률 */
.nboard .nb-prog{display:flex;align-items:flex-end;gap:18px}
.nboard .nb-seg7{display:flex;gap:6px}
.nboard .nb-seg7 svg{height:112px;width:auto;display:block;filter:drop-shadow(0 0 6px rgba(34,243,255,.7)) drop-shadow(0 0 16px rgba(34,243,255,.3))}
.nboard .nb-seg7 path{fill:rgba(34,243,255,.07)}
.nboard .nb-seg7 path.nb-on{fill:#22f3ff}
.nboard .nb-seg7.nb-off svg{filter:none}.nboard .nb-seg7.nb-off path.nb-on{fill:rgba(34,243,255,.45)}
.nboard .nb-pct{font-family:var(--nb-mono);font-size:34px;line-height:1;margin-bottom:8px}
.nboard .nb-pmeta{margin-left:auto;text-align:right;font-size:13px;color:var(--ink-2)}
.nboard .nb-pmeta .nb-mono{font-size:22px;display:block;line-height:1.2}
.nboard .nb-segbar{display:grid;grid-template-columns:repeat(40,1fr);gap:3px;margin-top:16px}
.nboard .nb-segbar i{height:16px;background:rgba(34,243,255,.08);border:1px solid rgba(34,243,255,.12)}
.nboard .nb-segbar i.nb-on{background:var(--cy);border-color:var(--cy);box-shadow:0 0 6px rgba(34,243,255,.8)}
.nboard .nb-segbar i.nb-rv{background:var(--mg);border-color:var(--mg);box-shadow:0 0 6px rgba(255,43,214,.8)}
.nboard .nb-segbar i.nb-wk{background:rgba(182,255,59,.55);border-color:var(--lm);box-shadow:0 0 6px rgba(182,255,59,.6)}
.nboard .nb-legend{display:flex;gap:16px;margin-top:10px;font-size:12px;color:var(--ink-2);flex-wrap:wrap}
.nboard .nb-legend span{display:flex;align-items:center;gap:6px}
.nboard .nb-legend i{width:10px;height:10px;display:block}
.nboard .nb-lg-d{background:var(--cy);box-shadow:0 0 6px var(--cy)}.nboard .nb-lg-r{background:var(--mg);box-shadow:0 0 6px var(--mg)}
.nboard .nb-lg-b{background:var(--lm);box-shadow:0 0 6px var(--lm)}.nboard .nb-lg-w{background:rgba(34,243,255,.12);border:1px solid rgba(34,243,255,.25)}
.nboard .nb-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:16px}
.nboard .nb-kpi{border:1px solid var(--edge-2);padding:10px 12px;background:rgba(34,243,255,.03);min-width:0}
.nboard .nb-kpi .nb-l{font-size:12px;color:var(--ink-2)}
.nboard .nb-kpi .nb-v{font-family:var(--nb-mono);font-size:24px;line-height:1.25;font-variant-numeric:tabular-nums}
.nboard .nb-kpi .nb-s{font-size:12px;color:var(--ink-3)}
.nboard .nb-spark{margin-top:16px;border-top:1px solid var(--edge-2);padding-top:12px}
.nboard .nb-spark .nb-sl{display:flex;justify-content:space-between;font-size:12px;color:var(--ink-2)}
.nboard .nb-spark .nb-sl .nb-mono{color:var(--ink-3);letter-spacing:.12em;font-size:11px}
.nboard .nb-bars{display:grid;grid-template-columns:repeat(7,1fr);gap:10px;align-items:end;height:84px;margin-top:10px}
.nboard .nb-bars div{position:relative;background:linear-gradient(180deg,var(--cy),rgba(34,243,255,.15));box-shadow:0 0 10px rgba(34,243,255,.35)}
.nboard .nb-bars div.nb-t{background:linear-gradient(180deg,var(--lm),rgba(182,255,59,.15));box-shadow:0 0 10px rgba(182,255,59,.4)}
.nboard .nb-bars div.nb-z{background:rgba(34,243,255,.18);box-shadow:none}
.nboard .nb-bars div b{position:absolute;top:-17px;left:0;right:0;text-align:center;font-family:var(--nb-mono);font-size:11px;color:var(--ink-2);font-weight:400}
.nboard .nb-days{display:grid;grid-template-columns:repeat(7,1fr);gap:10px;font-size:11px;color:var(--ink-3);text-align:center;margin-top:6px}
/* 매트릭스 */
.nboard table{width:100%;border-collapse:collapse}
.nboard th{white-space:nowrap;font-weight:600;font-size:12px;color:var(--ink-3);text-align:left;padding:0 8px 8px;font-family:var(--nb-mono);letter-spacing:.08em;background:none;border:0}
.nboard th.nb-c{text-align:center}.nboard th.nb-r{text-align:right}
.nboard td{padding:8px 8px;border-top:1px solid var(--edge-2);border-bottom:0;font-size:14px;vertical-align:middle;color:var(--ink);background:none}
.nboard td.nb-nm{font-weight:600;max-width:280px}
.nboard td.nb-nm small{display:block;font-weight:400;color:var(--ink-3);font-size:12px;font-family:var(--nb-mono)}
.nboard td.nb-cell{text-align:center;width:13%}
.nboard .nb-dot{display:inline-block;width:34px;height:12px;border:1px solid rgba(169,188,196,.16);background:rgba(169,188,196,.03);vertical-align:middle}
.nboard .nb-dot.nb-w{background:rgba(169,188,196,.35);border-color:rgba(169,188,196,.6)}
.nboard .nb-dot.nb-b{background:var(--lm);border-color:var(--lm);box-shadow:0 0 8px rgba(182,255,59,.8)}
.nboard .nb-dot.nb-r{background:var(--mg);border-color:var(--mg);box-shadow:0 0 8px rgba(255,43,214,.8)}
.nboard .nb-dot.nb-d{background:var(--cy);border-color:var(--cy);box-shadow:0 0 8px rgba(34,243,255,.8)}
.nboard td.nb-who{white-space:nowrap;font-size:13px;color:var(--ink-2)}
.nboard td.nb-pc{font-family:var(--nb-mono);font-size:13px;text-align:right;color:var(--ink-2);width:56px}
.nboard .nb-more{margin-top:10px;font-size:11px;color:var(--ink-3);letter-spacing:.12em}
.nboard .nb-empty{display:grid;place-items:center;text-align:center;gap:10px;padding:34px 12px;min-height:260px}
.nboard .nb-empty .nb-ring{width:96px;height:96px;border-radius:50%;border:1px dashed rgba(34,243,255,.35);box-shadow:0 0 24px rgba(34,243,255,.15) inset,0 0 18px rgba(34,243,255,.12);position:relative}
.nboard .nb-empty .nb-ring::after{content:"";position:absolute;inset:18px;border-radius:50%;border:2px solid transparent;border-top-color:var(--cy);filter:drop-shadow(0 0 6px var(--cy));animation:nb-spin 2.4s linear infinite}
@keyframes nb-spin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.nboard .nb-empty .nb-ring::after{animation:none}}
.nboard .nb-empty b{font-size:13px;letter-spacing:.24em}
.nboard .nb-empty p{font-size:14px;color:var(--ink-2);max-width:360px}
/* AI 램프 */
.nboard .nb-crew{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:14px;position:relative;z-index:1}
.nboard .nb-crew.nb-c1{grid-template-columns:1fr}.nboard .nb-crew.nb-c2{grid-template-columns:repeat(2,1fr)}.nboard .nb-crew.nb-c3{grid-template-columns:repeat(3,1fr)}
.nboard .nb-ai{border:1px solid var(--edge);background:rgba(4,10,14,.85);padding:14px 16px;position:relative;min-width:0}
.nboard .nb-ai.nb-hold{border-color:rgba(182,255,59,.55);box-shadow:0 0 0 1px rgba(182,255,59,.15),0 0 28px rgba(182,255,59,.12) inset}
.nboard .nb-ai .nb-top{display:flex;align-items:center;gap:10px}
.nboard .nb-lamp{width:14px;height:14px;border-radius:50%;flex:none}
.nboard .nb-lamp.nb-l{background:var(--lm);box-shadow:0 0 6px var(--lm),0 0 18px var(--lm)}
.nboard .nb-lamp.nb-m{background:var(--mg);box-shadow:0 0 6px var(--mg),0 0 18px var(--mg)}
.nboard .nb-lamp.nb-c{background:var(--cy);box-shadow:0 0 6px var(--cy),0 0 18px var(--cy)}
.nboard .nb-lamp.nb-a{background:var(--am);box-shadow:0 0 6px var(--am),0 0 14px var(--am)}
.nboard .nb-lamp.nb-o{background:#24323a;box-shadow:inset 0 0 0 1px #3c515c}
.nboard .nb-ai .nb-nm{font-weight:700;font-size:16px}
.nboard .nb-ai .nb-rl{font-size:12px;color:var(--ink-3);margin-left:auto;font-family:var(--nb-mono);letter-spacing:.06em;white-space:nowrap}
.nboard .nb-ai .nb-stt{font-family:var(--nb-mono);font-size:12px;letter-spacing:.16em;margin-top:10px}
.nboard .nb-ai .nb-stt .nb-kr{font-family:var(--nb-sans);letter-spacing:0;font-size:13px}
.nboard .nb-ai .nb-now{font-size:14px;color:var(--ink);margin-top:4px;min-height:44px;overflow-wrap:anywhere}
.nboard .nb-baton{position:absolute;top:-1px;right:-1px;font-family:var(--nb-mono);font-size:10px;letter-spacing:.18em;color:#071006;background:var(--lm);padding:2px 8px;box-shadow:0 0 10px rgba(182,255,59,.8)}
.nboard .nb-ai.nb-hold .nb-rl{margin-right:58px}
.nboard .nb-quota{margin-top:10px}
.nboard .nb-quota .nb-ql{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--ink-2)}
.nboard .nb-quota .nb-ql .nb-mono{color:var(--ink)}
.nboard .nb-qbar{display:grid;grid-template-columns:repeat(20,1fr);gap:2px;margin-top:5px}
.nboard .nb-qbar i{height:6px;background:rgba(169,188,196,.12)}
.nboard .nb-qbar.nb-c i.nb-on{background:var(--cy);box-shadow:0 0 4px var(--cy)}
.nboard .nb-qbar.nb-a i.nb-on{background:var(--am);box-shadow:0 0 4px var(--am)}
/* 로그 · 남은 작업 */
.nboard .nb-log{font-family:var(--nb-mono);font-size:13px;line-height:1.5;display:grid;gap:7px;max-height:262px;overflow:hidden;
 -webkit-mask-image:linear-gradient(180deg,#000 75%,transparent);mask-image:linear-gradient(180deg,#000 75%,transparent)}
.nboard .nb-log.nb-empty{-webkit-mask-image:none;mask-image:none}
.nboard .nb-log div{display:grid;grid-template-columns:62px 82px 1fr;gap:10px;align-items:baseline}
.nboard .nb-log .nb-t{color:var(--ink-3)}
.nboard .nb-log .nb-a{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nboard .nb-log .nb-x{font-family:var(--nb-sans);color:var(--ink);font-size:14px;min-width:0;overflow-wrap:anywhere}
.nboard .nb-a.nb-cl{color:#ff9a6e}.nboard .nb-a.nb-gp{color:#37e0b0}.nboard .nb-a.nb-gm{color:#79b0ff}.nboard .nb-a.nb-gk{color:#c3a8ff}.nboard .nb-a.nb-sy{color:var(--cy)}.nboard .nb-a.nb-me{color:var(--ink)}
.nboard .nb-waitln{font-size:12px;color:var(--ink-3);margin-top:6px}
.nboard .nb-cur{display:inline-block;width:8px;height:14px;background:var(--cy);box-shadow:0 0 6px var(--cy);vertical-align:-2px}
.nboard .nb-rest{display:grid;gap:10px}
.nboard .nb-rest .nb-big{display:flex;align-items:baseline;gap:10px}
.nboard .nb-rest .nb-big .nb-mono{font-size:46px;line-height:1}
.nboard .nb-rest .nb-big span{color:var(--ink-2);font-size:14px}
.nboard .nb-eta{border:1px solid var(--edge-2);padding:10px 12px;background:rgba(255,43,214,.04)}
.nboard .nb-eta .nb-l{font-size:12px;color:var(--ink-2)}
.nboard .nb-eta .nb-v{font-family:var(--nb-mono);font-size:20px}
.nboard .nb-eta .nb-s{font-size:12px;color:var(--ink-3)}
.nboard .nb-next{font-size:13px;color:var(--ink-2);display:grid;gap:4px}
.nboard .nb-next b{color:var(--ink);font-weight:600;white-space:nowrap}
.nboard .nb-next div{display:flex;gap:8px}.nboard .nb-next div::before{content:"›";color:var(--mg);font-family:var(--nb-mono)}
/* 전체 화면(전광판) */
html.nb-lock,html.nb-lock body{overflow:hidden}
.nb-ov{position:fixed;inset:0;z-index:1000;overflow:auto;background:#030407;overscroll-behavior:contain}
.nb-ov .nboard{min-height:100%;border-radius:0;padding:22px 32px 36px;font-size:16px}
.nb-ov .nboard .nb-bar h2{font-size:22px}
.nb-ov .nboard .nb-seg7 svg{height:150px}
.nb-ov .nboard .nb-pct{font-size:44px}
.nb-ov .nboard .nb-ai .nb-now{font-size:15px}
.nb-ov .nboard .nb-log{max-height:none}
/* 좁은 화면 · 휴대폰: 세로 배치 */
@media (max-width:1100px){.nboard .nb-crew{grid-template-columns:repeat(2,1fr)!important}.nboard .nb-grid{grid-template-columns:1fr}}
@media (max-width:760px){
 .nboard{padding:12px 10px 18px;border-radius:10px}
 .nb-ov .nboard{padding:12px 12px 28px}
 .nboard .nb-bar{flex-wrap:wrap;gap:6px 12px;padding:10px 12px}
 .nboard .nb-bar .nb-id{width:100%;font-size:10px;letter-spacing:.16em}
 .nboard .nb-bar h2{font-size:16px;white-space:normal;flex:1 1 100%}
 .nboard .nb-bar .nb-sp,.nboard .nb-clock{display:none}
 .nboard .nb-fs,.nboard .nb-close{margin-left:auto}
 .nboard .nb-grid,.nboard .nb-grid2{grid-template-columns:1fr}
 .nboard .nb-crew{gap:10px}
 .nboard .nb-ai{padding:12px}
 .nboard .nb-ai .nb-rl{display:none}
 .nboard .nb-ai.nb-hold .nb-top{padding-right:52px}
 .nboard .nb-ai .nb-now{font-size:13px;min-height:0}
 .nboard .nb-quota .nb-ql .nb-mono{display:none}
 .nboard .nb-seg7 svg,.nb-ov .nboard .nb-seg7 svg{height:84px}
 .nboard .nb-pct{font-size:28px}
 .nboard .nb-pmeta .nb-mono{font-size:18px}
 .nboard .nb-segbar{gap:2px}.nboard .nb-segbar i{height:12px}
 .nboard .nb-kpis{gap:6px}.nboard .nb-kpi{padding:8px}
 .nboard .nb-kpi .nb-v{font-size:20px}
 .nboard .nb-pn{padding:14px 12px}
 .nboard th.nb-h-who,.nboard td.nb-who{display:none}
 .nboard td.nb-nm{max-width:none}
 .nboard td.nb-cell{width:auto;padding:8px 2px}
 .nboard .nb-dot{width:18px;height:10px}
 .nboard th{padding:0 2px 8px;font-size:10px;letter-spacing:0}
 .nboard .nb-log div{grid-template-columns:44px 62px 1fr;gap:6px}
 .nboard .nb-log{font-size:12px}.nboard .nb-log .nb-x{font-size:13px}
}
@media (max-width:420px){.nboard .nb-crew{grid-template-columns:1fr 1fr!important}.nboard .nb-ai .nb-stt{letter-spacing:.08em}}
.tab-b:has(> #board-host){padding:12px}
@media (max-width:760px){.tab-b:has(> #board-host){padding:6px}}
