/* ═════════════════════════════════════════════════════════════════════════
 * factory-crm-v2.css — Factory CRM V2 visual redesign
 * Lifted verbatim from spartan-factory-crm-polished.html (WIP-FACTORY-CRM-V2-01).
 *
 * All selectors scoped under `.fv2` so this CSS never leaks into other CRM
 * pages. The Factory CRM V2 module wraps every rendered page in a
 * `<div class="fv2">…</div>` so these styles apply only there.
 * ════════════════════════════════════════════════════════════════════════ */

.fv2 {
  /* Brand */
  --red:#C41230; --red-dark:#A50E27; --red-soft:#FBF3F4; --ink:#0A0A0A;
  /* Warm stone palette */
  --s50:#FAFAF9; --s100:#F5F5F4; --s200:#E7E5E4; --s300:#D6D3D1;
  --s400:#A8A29E; --s500:#78716C; --s600:#57534E; --s700:#44403C;
  --s800:#292524; --s900:#1C1917;
  /* Status */
  --ok-bg:#DCFCE7; --ok-fg:#15803D; --ok-light:#22C55E; --ok-deep:#166534;
  --due-bg:#FEE2E2; --due-fg:#DC2626; --due-light:#EF4444; --due-deep:#991B1B;
  --pending-bg:#FEF3C7; --pending-fg:#D97706; --pending-light:#F59E0B; --pending-deep:#92400E;
  --warn-bg:#FEF3C7; --warn-fg:#D97706;
  --info-bg:#DBEAFE; --info-fg:#1D4ED8; --info-light:#3B82F6;
  --purple:#7C3AED; --purple-bg:#F3E8FF; --purple-fg:#6D28D9;
  --tip:#0EA5E9; --tip-deep:#0369A1; --tip-bg:#E0F2FE;
  --cyan-bg:#CFFAFE; --cyan-fg:#155E75;
  --shadow-rest:0 1px 2px rgba(10,10,10,.03),0 1px 1px rgba(10,10,10,.02);
  --shadow-hover:0 1px 2px rgba(10,10,10,.04),0 12px 28px -12px rgba(10,10,10,.18);
  --ease:cubic-bezier(.4,0,.2,1); --t:180ms var(--ease);
  font-family:'Archivo',system-ui,sans-serif;
  color:var(--ink);
  font-size:14px;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
}

/* ═══════════════════════════════════════════════════════════════════════
 * WIP-FACTORY-CRM-FIX-01 §2 — Subtitle text collapse fix.
 * Production screenshots showed `.sub` prose rendering with collapsed
 * whitespace ("Realtimeacross8stations...") while purple-hi-light spans
 * stayed readable. Root cause: `.sub` inheriting Archivo Narrow + a
 * negative letter-spacing from a parent (page-title h1 carries
 * letter-spacing:-.028em which inherits). These rules force explicit
 * Archivo + zero letter/word-spacing + ligature/kerning hints. Placed
 * AFTER the original .page-title .sub rule so we win specificity.
 * ═══════════════════════════════════════════════════════════════════════ */
.fv2 .page-title .sub,
.fv2 .hiring-text,
.fv2 .section-sub,
.fv2 .final-design-sub,
.fv2 .doc-link-sub,
.fv2 .banner .b-content {
  font-family: 'Archivo', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
  font-stretch: normal;
  font-weight: 500;
  letter-spacing: 0 !important;
  word-spacing: normal !important;
  font-feature-settings: 'kern' 1, 'liga' 1;
  font-kerning: normal;
  white-space: normal;
  text-rendering: optimizeLegibility;
}
.fv2 .page-title .sub b,
.fv2 .hiring-text b,
.fv2 .section-sub b,
.fv2 .final-design-sub b,
.fv2 .banner .b-content b,
.fv2 .banner .b-content strong {
  font-family: 'Archivo', system-ui, sans-serif !important;
  font-weight: 700;
  letter-spacing: 0 !important;
}
.fv2 .page-title .sub code,
.fv2 .hiring-text code,
.fv2 .section-sub code,
.fv2 .banner .b-content code {
  font-family: 'Archivo Narrow', 'Archivo', system-ui, sans-serif;
  letter-spacing: 0.01em;
  word-spacing: normal;
  font-feature-settings: 'kern' 1;
}
.fv2 .purple-hi-light,
.fv2 .purple-hi {
  font-family: 'Archivo', system-ui, sans-serif;
  white-space: nowrap;
  letter-spacing: 0;
  margin: 0 1px;
}
@keyframes fv2-pulse-banner-critical { 0%,100%{box-shadow:0 0 0 0 rgba(220,38,38,.35),inset 0 0 0 1.5px rgba(220,38,38,.6)} 50%{box-shadow:0 0 0 6px rgba(220,38,38,0),inset 0 0 0 2px rgba(220,38,38,.9)} }
@keyframes fv2-pulse-cell-critical   { 0%,100%{box-shadow:0 0 0 0 rgba(220,38,38,.4)} 50%{box-shadow:0 0 0 5px rgba(220,38,38,0)} }
@keyframes fv2-pulse-row-critical    { 0%,100%{background:rgba(220,38,38,.02)} 50%{background:rgba(220,38,38,.08)} }
@keyframes fv2-pulse-dot-hot         { 0%,100%{box-shadow:0 0 0 0 rgba(34,197,94,.55)} 70%{box-shadow:0 0 0 7px rgba(34,197,94,0)} }
@keyframes fv2-pulse-now-line        { 0%,100%{opacity:.85} 50%{opacity:1} }
@keyframes fv2-fade-in               { from{opacity:0;transform:translateY(3px)} to{opacity:1;transform:translateY(0)} }
@keyframes fv2-flash-row             { 0%{background:var(--red-soft)} 100%{background:transparent} }
/* WIP-UI-FACTORY-CRM-V2-02 — pulsing red on every .btn-r primary so the
 * CTA breathes the same colour as the brand. Larger glow + shadow swell. */
@keyframes fv2-pulse-btn-r {
  0%,100%{ box-shadow:0 1px 2px rgba(196,18,48,.25), 0 6px 18px -4px rgba(196,18,48,.55), 0 0 0 0 rgba(196,18,48,.55); }
  60%   { box-shadow:0 2px 8px rgba(196,18,48,.35), 0 14px 30px -8px rgba(196,18,48,.8),  0 0 0 8px rgba(196,18,48,0); }
}

.fv2 .dot-hot { animation: fv2-pulse-dot-hot 1.8s infinite; }
[data-pause-motion="true"] .fv2 * { animation-duration:.001s !important; }
@media (prefers-reduced-motion: reduce){
  .fv2 .hiring-banner.critical,
  .fv2 .gantt-row.critical,
  .fv2 .kanban-card.critical,
  .fv2 .kpi.critical,
  .fv2 .kpi.is-critical,
  .fv2 .heat-cell.critical { animation: none !important; }
}

.fv2 .num { font-variant-numeric:tabular-nums }
.fv2 .eyebrow { font-family:'Archivo Narrow',sans-serif; font-size:10px; font-weight:700; letter-spacing:.16em; text-transform:uppercase; color:var(--s500); }
.fv2 .eyebrow.red::before { content:''; display:inline-block; width:5px; height:5px; border-radius:50%; background:var(--red); margin-right:8px; vertical-align:middle; }
.fv2 .ico { width:14px; height:14px; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; fill:none; flex-shrink:0 }
.fv2 .ico-sm { width:12px; height:12px } .fv2 .ico-lg { width:18px; height:18px }
.fv2 .purple-hi { color:#fff; font-weight:700; background:rgba(124,58,237,.18); padding:1px 5px; border-radius:3px; white-space:nowrap }
.fv2 .purple-hi-light { color:var(--purple); font-weight:700; background:var(--purple-bg); padding:1px 5px; border-radius:3px; white-space:nowrap }

/* Buttons — V2.1 system. Large, pulse-red primaries */
.fv2 .btn { display:inline-flex; align-items:center; justify-content:center; gap:7px; padding:9px 14px; font-size:13px; font-weight:600; border-radius:9px; cursor:pointer; transition:all var(--t); border:1px solid transparent; white-space:nowrap; font-family:inherit; }
.fv2 .btn-r { background:var(--red); color:#fff; border-color:var(--red); box-shadow:0 1px 2px rgba(196,18,48,.2), 0 4px 12px -4px rgba(196,18,48,.4); animation:fv2-pulse-btn-r 2.4s ease-in-out infinite; }
.fv2 .btn-r:hover { background:var(--red-dark); transform:translateY(-1px); box-shadow:0 2px 6px rgba(196,18,48,.25), 0 8px 20px -6px rgba(196,18,48,.5); animation:none; }
@media (prefers-reduced-motion: reduce) { .fv2 .btn-r { animation:none !important; } }
.fv2 .btn-w { background:#fff; color:var(--s700); border-color:var(--s200); box-shadow:var(--shadow-rest); }
.fv2 .btn-w:hover { border-color:var(--ink); color:var(--ink); transform:translateY(-1px); box-shadow:var(--shadow-hover); }
.fv2 .btn-d { background:var(--ink); color:#fff; border-color:var(--ink); }
.fv2 .btn-d:hover { background:var(--s900); transform:translateY(-1px); box-shadow:var(--shadow-hover); }
.fv2 .btn-g { background:transparent; color:var(--s700); border-color:transparent; }
.fv2 .btn-g:hover { background:var(--s100); color:var(--ink); }
.fv2 .btn-sm { padding:6px 11px; font-size:12px; border-radius:7px; }
.fv2 .btn-xs { padding:4px 9px; font-size:11px; border-radius:6px; }
.fv2 .btn .ico { width:13px; height:13px; }

.fv2 .toggle-group { display:inline-flex; background:var(--s100); border:1px solid var(--s200); border-radius:8px; padding:3px; gap:2px; }
.fv2 .toggle-btn { padding:5px 12px; background:transparent; border:none; color:var(--s600); font-family:'Archivo Narrow'; font-size:11px; font-weight:700; cursor:pointer; border-radius:5px; transition:all var(--t); letter-spacing:.04em; text-transform:uppercase; }
.fv2 .toggle-btn:hover { color:var(--ink); }
.fv2 .toggle-btn.active, .fv2 .toggle-btn.on { background:#fff; color:var(--ink); box-shadow:0 1px 2px rgba(0,0,0,.06); }

.fv2-page { padding:24px 32px 80px; max-width:1640px; margin:0 auto; animation:fv2-fade-in 200ms var(--ease); background:var(--s50); min-height:100vh; box-sizing:border-box; }
.fv2 .page-header { display:flex; justify-content:space-between; align-items:flex-end; margin-bottom:24px; padding-bottom:18px; border-bottom:1px solid var(--s200); gap:28px; flex-wrap:wrap; }
.fv2 .page-title { display:flex; flex-direction:column; gap:6px; min-width:0; }
.fv2 .page-title h1 { font-size:30px; font-weight:800; letter-spacing:-.028em; line-height:1.05; color:var(--ink); margin:0; }
.fv2 .page-title .sub { font-size:13px; color:var(--s500); font-weight:500; max-width:760px; line-height:1.55; }
.fv2 .page-title .sub b { color:var(--ink); font-weight:700; }
.fv2 .page-title .sub code { font-family:'Archivo Narrow'; background:var(--s100); padding:1px 6px; border-radius:4px; color:var(--s700); font-size:11.5px; font-weight:600; }
.fv2 .page-title .eye { font-family:'Archivo Narrow'; font-size:10.5px; letter-spacing:.18em; text-transform:uppercase; color:var(--s500); font-weight:700; display:inline-flex; align-items:center; gap:8px; }
.fv2 .page-title .eye::before { content:''; display:inline-block; width:4px; height:4px; border-radius:50%; background:var(--red); }
.fv2 .page-actions { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }

/* Pills */
.fv2 .pill { display:inline-flex; align-items:center; gap:5px; padding:2px 8px; border-radius:99px; font-family:'Archivo Narrow'; font-size:10.5px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; white-space:nowrap; line-height:1.4; }
.fv2 .pill .dot { width:5px; height:5px; border-radius:50%; flex-shrink:0; }
.fv2 .pill.info { background:var(--info-bg); color:var(--info-fg); } .fv2 .pill.info .dot { background:var(--info-fg); }
.fv2 .pill.warn { background:var(--pending-bg); color:var(--pending-deep); } .fv2 .pill.warn .dot { background:var(--pending-fg); }
.fv2 .pill.ok { background:var(--ok-bg); color:var(--ok-deep); } .fv2 .pill.ok .dot { background:var(--ok-fg); }
.fv2 .pill.red { background:var(--red-soft); color:var(--red); } .fv2 .pill.red .dot { background:var(--red); }
.fv2 .pill.purple { background:var(--purple-bg); color:var(--purple-fg); } .fv2 .pill.purple .dot { background:var(--purple-fg); }
.fv2 .pill.gray { background:var(--s100); color:var(--s700); } .fv2 .pill.gray .dot { background:var(--s500); }
.fv2 .pill.cyan { background:var(--cyan-bg); color:var(--cyan-fg); } .fv2 .pill.cyan .dot { background:var(--cyan-fg); }
.fv2 .pill.critical { background:var(--due-bg); color:var(--due-deep); animation:fv2-pulse-cell-critical 2s ease-in-out infinite; }
.fv2 .pill.critical .dot { background:var(--due-fg); }
.fv2 .pill-overdue { background:var(--due-bg); color:var(--due-deep); }
.fv2 .pill-overdue .dot { background:var(--due-fg); animation:fv2-pulse-dot-hot 1.5s ease-in-out infinite; }
.fv2 .station-code { font-family:'Archivo Narrow'; font-weight:700; color:var(--s600); font-size:10px; background:var(--s100); padding:3px 7px; border-radius:4px; letter-spacing:.06em; min-width:24px; text-align:center; border:1px solid var(--s200); display:inline-block; }

/* Hiring banner — banner-grade pulse */
.fv2 .hiring-banner { background:linear-gradient(135deg,#FEF3C7 0%,#FDE68A 100%); border:1.5px solid var(--pending-fg); border-radius:14px; padding:16px 20px; display:flex; align-items:center; gap:16px; position:relative; overflow:hidden; margin-bottom:16px; }
.fv2 .hiring-banner.critical { background:linear-gradient(135deg,#FEE2E2 0%,#FECACA 100%); border-color:var(--due-fg); animation:fv2-pulse-banner-critical 2.4s ease-in-out infinite; }
.fv2 .hiring-banner::before { content:''; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--pending-fg); }
.fv2 .hiring-banner.critical::before { background:var(--due-fg); }
.fv2 .hiring-icon { width:40px; height:40px; border-radius:10px; background:var(--pending-fg); color:#fff; display:flex; align-items:center; justify-content:center; flex-shrink:0; box-shadow:0 4px 12px -4px rgba(217,119,6,.5); }
.fv2 .hiring-banner.critical .hiring-icon { background:var(--due-fg); box-shadow:0 4px 12px -4px rgba(220,38,38,.5); }
.fv2 .hiring-icon .ico { width:20px; height:20px; stroke-width:2.2; }
.fv2 .hiring-body { flex:1; display:flex; flex-direction:column; gap:3px; min-width:0; }
.fv2 .hiring-title { font-size:14.5px; font-weight:800; color:var(--pending-deep); letter-spacing:-.005em; }
.fv2 .hiring-banner.critical .hiring-title { color:var(--due-deep); }
.fv2 .hiring-text { font-size:12.5px; line-height:1.45; color:var(--s800); }
.fv2 .hiring-text b { color:var(--ink); font-weight:700; }
.fv2 .hiring-actions { display:flex; gap:7px; flex-shrink:0; }
.fv2 .hiring-action { padding:7px 12px; font-family:'Archivo Narrow'; font-size:11px; font-weight:700; background:#fff; border:1px solid var(--pending-fg); border-radius:7px; color:var(--pending-deep); cursor:pointer; letter-spacing:.04em; text-transform:uppercase; display:flex; align-items:center; gap:5px; }
.fv2 .hiring-banner.critical .hiring-action { border-color:var(--due-fg); color:var(--due-deep); }
.fv2 .hiring-action:hover { background:var(--ink); color:#fff; border-color:var(--ink); }
.fv2 .hiring-action.primary { background:var(--pending-fg); color:#fff; border-color:var(--pending-fg); }
/* Critical-state primary action ("Open variance"): the parent .hiring-banner.critical
 * .hiring-action rule colours all chrome to dark red, which made the primary's
 * text unreadable (dark-red-on-red). Force white + give it the same banner-grade
 * red pulse the banner uses so the eye is drawn straight to the CTA. */
.fv2 .hiring-banner.critical .hiring-action.primary {
  background: var(--due-fg);
  border-color: var(--due-fg);
  color: #fff !important;
  animation: fv2-pulse-banner-critical 2.4s ease-in-out infinite;
  box-shadow: 0 1px 2px rgba(220,38,38,.25), 0 6px 16px -4px rgba(220,38,38,.55);
}
.fv2 .hiring-banner.critical .hiring-action.primary:hover {
  background: var(--due-deep);
  border-color: var(--due-deep);
  color: #fff !important;
  animation: none;
}
.fv2 .hiring-banner.critical .hiring-action.primary .ico,
.fv2 .hiring-banner.critical .hiring-action.primary svg { color: #fff; stroke: #fff; }
@media (prefers-reduced-motion: reduce) {
  .fv2 .hiring-banner.critical .hiring-action.primary { animation: none !important; }
}

/* KPI strip */
.fv2 .kpi-strip { display:grid; grid-template-columns:repeat(6,1fr); gap:10px; margin-bottom:18px; }
.fv2 .kpi { background:#fff; border:1px solid var(--s200); border-radius:11px; padding:14px 16px; transition:all var(--t); box-shadow:var(--shadow-rest); position:relative; overflow:hidden; }
.fv2 .kpi::before { content:''; position:absolute; left:0; top:0; bottom:0; width:0; background:var(--s300); transition:width var(--t); }
.fv2 .kpi:hover { border-color:var(--s300); transform:translateY(-1px); box-shadow:var(--shadow-hover); }
.fv2 .kpi:hover::before { width:3px; }
.fv2 .kpi-label { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--s500); font-weight:700; }
.fv2 .kpi-value { font-size:28px; font-weight:800; margin-top:4px; letter-spacing:-.028em; color:var(--ink); font-variant-numeric:tabular-nums; line-height:1; display:inline-flex; align-items:baseline; }
.fv2 .kpi-value .unit { font-size:16px; color:var(--s400); font-weight:700; margin-left:1px; }
.fv2 .kpi-trend { display:flex; align-items:center; gap:4px; margin-top:8px; font-size:11px; color:var(--s500); font-weight:500; }
.fv2 .kpi-trend.up { color:var(--ok-fg); } .fv2 .kpi-trend.warn { color:var(--pending-fg); } .fv2 .kpi-trend.down { color:var(--due-fg); }
.fv2 .kpi.primary { background:linear-gradient(180deg,#fff 0%,var(--red-soft) 100%); border-color:rgba(196,18,48,.2); }
.fv2 .kpi.primary::before { width:3px; background:var(--red); }
.fv2 .kpi.primary .kpi-label { color:var(--red); font-weight:800; }
.fv2 .kpi.primary .kpi-value { font-size:34px; color:var(--red); letter-spacing:-.03em; }
.fv2 .kpi.primary .kpi-value .unit { color:rgba(196,18,48,.4); }
.fv2 .kpi.primary.critical, .fv2 .kpi.is-critical { animation:fv2-pulse-banner-critical 2.4s ease-in-out infinite; border-color:var(--due-fg); }
.fv2 .kpi-spark { margin-top:6px; height:18px; display:flex; align-items:flex-end; gap:2px; }
.fv2 .kpi-spark .sb { flex:1; background:rgba(196,18,48,.2); border-radius:1px; min-height:2px; }
.fv2 .kpi-spark .sb.hi { background:var(--red); }

/* Cards / sections */
.fv2 .card { background:#fff; border:1px solid var(--s200); border-radius:11px; padding:18px 20px; box-shadow:var(--shadow-rest); transition:border-color var(--t); }
.fv2 .card:hover { border-color:var(--s300); }
.fv2 .card-title { font-family:'Archivo Narrow'; font-size:11px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; color:var(--s700); margin-bottom:16px; display:flex; justify-content:space-between; align-items:center; gap:12px; }
.fv2 .card-title .meta { color:var(--s500); font-size:11px; letter-spacing:0; text-transform:none; font-family:'Archivo'; font-weight:400; }
.fv2 .dashboard-grid { display:grid; grid-template-columns:1.55fr 1fr; gap:14px; margin-bottom:14px; }

/* Bottleneck bars */
.fv2 .bottleneck-bars { display:flex; flex-direction:column; gap:14px; }
.fv2 .bar-row { display:grid; grid-template-columns:200px 1fr 64px; gap:16px; align-items:center; font-size:13px; padding:5px 6px; margin:-5px -6px; border-radius:7px; transition:background var(--t); }
.fv2 .bar-row:hover { background:var(--s50); }
.fv2 .bar-label { display:flex; align-items:center; gap:9px; color:var(--s700); font-size:13px; font-weight:500; min-width:0; }
.fv2 .bar-label .name { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.fv2 .bar-track { height:10px; background:var(--s100); border-radius:5px; position:relative; overflow:visible; }
.fv2 .bar-fill { height:100%; border-radius:5px; transition:width 400ms var(--ease); position:relative; z-index:1; }
.fv2 .bar-fill.ok { background:linear-gradient(90deg,var(--ok-light),var(--ok-fg)); }
.fv2 .bar-fill.warn { background:linear-gradient(90deg,var(--pending-light),var(--pending-fg)); }
.fv2 .bar-fill.over { background:linear-gradient(90deg,var(--due-light),var(--red)); }
.fv2 .bar-fill.info { background:linear-gradient(90deg,var(--info-light),var(--info-fg)); }
.fv2 .bar-track[data-show-marker="true"]::after { content:''; position:absolute; right:0; top:-3px; bottom:-3px; width:2px; background:var(--ink); border-radius:1px; }
.fv2 .bar-pct { font-family:'Archivo Narrow'; font-size:13px; font-weight:800; text-align:right; color:var(--s700); font-variant-numeric:tabular-nums; letter-spacing:-.01em; }
.fv2 .bar-pct.over { color:var(--red); } .fv2 .bar-pct.warn { color:var(--pending-fg); }

/* Heat */
.fv2 .heat-cal { display:grid; grid-template-columns:36px repeat(7,1fr); gap:5px; }
.fv2 .heat-h { font-family:'Archivo Narrow'; font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--s400); text-align:center; padding:4px 0; font-weight:700; }
.fv2 .wk-label { font-family:'Archivo Narrow'; font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--s400); display:flex; align-items:center; justify-content:center; font-weight:700; }
.fv2 .heat-cell { aspect-ratio:1; min-height:54px; background:#fff; border:1px solid var(--s200); border-radius:7px; padding:6px 8px; cursor:pointer; transition:all var(--t); position:relative; overflow:hidden; box-shadow:var(--shadow-rest); }
.fv2 .heat-cell:hover { border-color:var(--s400); transform:translateY(-1px); box-shadow:var(--shadow-hover); z-index:1; }
.fv2 .heat-cell .day { font-family:'Archivo Narrow'; font-size:10px; color:var(--s500); font-weight:700; letter-spacing:.04em; }
.fv2 .heat-cell .pct { position:absolute; bottom:6px; left:8px; font-weight:800; font-size:14px; font-variant-numeric:tabular-nums; letter-spacing:-.02em; }
.fv2 .heat-cell .jobs { position:absolute; bottom:7px; right:8px; font-family:'Archivo Narrow'; font-size:9.5px; color:var(--s400); font-weight:700; }
.fv2 .heat-cell.weekend { background:repeating-linear-gradient(45deg,var(--s50),var(--s50) 4px,transparent 4px,transparent 8px); border-color:var(--s200); opacity:.6; cursor:default; }
.fv2 .heat-cell.weekend:hover { transform:none; box-shadow:var(--shadow-rest); border-color:var(--s200); }
.fv2 .heat-cell.l1 { background:#F0FDF4; border-color:#BBF7D0; } .fv2 .heat-cell.l1 .pct { color:var(--ok-fg); }
.fv2 .heat-cell.l2 { background:#DCFCE7; border-color:#86EFAC; } .fv2 .heat-cell.l2 .pct { color:var(--ok-fg); }
.fv2 .heat-cell.l3 { background:linear-gradient(180deg,#FEF3C7,#FDE68A); border-color:#FCD34D; } .fv2 .heat-cell.l3 .pct { color:var(--pending-fg); }
.fv2 .heat-cell.l4 { background:linear-gradient(180deg,#FED7AA,#FDBA74); border-color:#FB923C; } .fv2 .heat-cell.l4 .pct { color:#9A3412; }
.fv2 .heat-cell.l5 { background:linear-gradient(180deg,var(--red-soft),#FEE2E2); border-color:rgba(196,18,48,.35); } .fv2 .heat-cell.l5 .pct { color:var(--red); }
.fv2 .heat-cell.l5.critical { animation:fv2-pulse-cell-critical 2.2s ease-in-out infinite; border-color:var(--due-fg); }
.fv2 .heat-cell.today { box-shadow:inset 0 0 0 1.5px var(--ink), var(--shadow-rest); }
.fv2 .heat-cell.today::before { content:''; position:absolute; top:0; right:0; border-top:8px solid var(--ink); border-left:8px solid transparent; }

/* Activity */
.fv2 .activity { display:flex; flex-direction:column; max-height:380px; overflow-y:auto; }
.fv2 .act-row { display:grid; grid-template-columns:50px 22px 1fr; gap:10px; padding:10px 4px; align-items:center; border-bottom:1px solid var(--s100); font-size:12.5px; transition:background var(--t); }
.fv2 .act-row:hover { background:var(--s50); }
.fv2 .act-row:last-child { border-bottom:none; }
.fv2 .act-row .a-time { font-family:'Archivo Narrow'; font-size:10px; color:var(--s400); font-weight:700; font-variant-numeric:tabular-nums; }
.fv2 .act-row .a-icon { display:flex; align-items:center; justify-content:center; width:22px; height:22px; border-radius:6px; background:var(--s100); color:var(--s600); }
.fv2 .act-row .a-icon svg { width:12px; height:12px; }
.fv2 .act-row .a-text { color:var(--s700); font-size:12.5px; line-height:1.5; }
.fv2 .act-row .a-text strong { color:var(--ink); font-weight:700; }
.fv2 .act-row .code { font-family:'Archivo Narrow'; color:var(--red); font-weight:700; font-size:11.5px; cursor:pointer; border-bottom:1px dotted transparent; transition:border-color var(--t); }
.fv2 .act-row .code:hover { border-bottom-color:var(--red); }
.fv2 .act-row.is-new { animation:fv2-flash-row 2400ms ease-out; }

/* Section block */
.fv2 .section { background:#fff; border:1px solid var(--s200); border-radius:14px; box-shadow:var(--shadow-rest); overflow:hidden; margin-bottom:14px; }

/* Gantt */
.fv2 .scheduler-controls { display:flex; justify-content:space-between; align-items:center; margin-bottom:12px; gap:14px; flex-wrap:wrap; }
.fv2 .scheduler-controls .legend { display:flex; gap:14px; flex-wrap:wrap; font-size:11.5px; color:var(--s600); }
.fv2 .legend-item { display:flex; align-items:center; gap:6px; font-family:'Archivo Narrow'; font-weight:600; }
.fv2 .legend-item .dot { width:8px; height:8px; border-radius:2px; }
.fv2 .gantt { background:#fff; border:1px solid var(--s200); border-radius:11px; overflow:hidden; box-shadow:var(--shadow-rest); position:relative; }
.fv2 .gantt-header { display:grid; grid-template-columns:220px repeat(14,1fr); border-bottom:1px solid var(--s200); background:linear-gradient(180deg,var(--s50) 0%,transparent 100%); }
.fv2 .gantt-header-cell { font-family:'Archivo Narrow'; font-size:10.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--s500); font-weight:700; padding:12px 8px; text-align:center; border-right:1px solid var(--s100); position:relative; }
.fv2 .gantt-header-cell:last-child { border-right:none; }
.fv2 .gantt-header-cell.row-head { text-align:left; padding-left:18px; color:var(--s600); border-right:1px solid var(--s200); }
.fv2 .gantt-header-cell.today { color:var(--red); font-weight:800; }
.fv2 .gantt-header-cell.today::after { content:''; position:absolute; left:8px; right:8px; bottom:0; height:2px; background:var(--red); border-radius:1px 1px 0 0; }
.fv2 .gantt-header-cell.weekend { color:var(--s400); opacity:.7; background:repeating-linear-gradient(45deg,var(--s50),var(--s50) 3px,transparent 3px,transparent 6px); }
.fv2 .gantt-row { display:grid; grid-template-columns:220px repeat(14,1fr); border-bottom:1px solid var(--s100); position:relative; min-height:64px; transition:background var(--t); }
.fv2 .gantt-row:hover { background:var(--s50); }
.fv2 .gantt-row:last-child { border-bottom:none; }
.fv2 .gantt-row.critical { animation:fv2-pulse-row-critical 2.4s ease-in-out infinite; }
.fv2 .gantt-row.critical .gantt-row-head { box-shadow:inset 3px 0 0 var(--due-fg); }
.fv2 .gantt-row-head { padding:12px 18px; border-right:1px solid var(--s100); display:flex; flex-direction:column; justify-content:center; background:transparent; min-width:0; cursor:pointer; transition:background var(--t); }
.fv2 .gantt-row-head:hover { background:var(--s50); }
.fv2 .gantt-row-head .job-code { font-family:'Archivo Narrow'; font-weight:700; font-size:11px; color:var(--s500); letter-spacing:.06em; }
.fv2 .gantt-row-head .customer { font-size:13px; color:var(--ink); font-weight:700; margin-top:2px; letter-spacing:-.005em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.fv2 .gantt-row-head .meta { font-family:'Archivo Narrow'; font-size:10.5px; color:var(--s500); margin-top:3px; font-weight:600; }
.fv2 .gantt-day-cell { border-right:1px solid var(--s100); position:relative; }
.fv2 .gantt-day-cell:last-child { border-right:none; }
.fv2 .gantt-day-cell.weekend { background:repeating-linear-gradient(45deg,var(--s50),var(--s50) 4px,transparent 4px,transparent 8px); }
.fv2 .gantt-day-cell.today { background:linear-gradient(180deg,rgba(196,18,48,.06) 0%,rgba(196,18,48,.02) 100%); }
.fv2 .gantt-day-cell.today::before { content:''; position:absolute; left:0; top:0; bottom:0; width:1px; background:rgba(196,18,48,.2); }
.fv2 .gantt-bar { position:absolute; top:12px; bottom:12px; border-radius:6px; padding:0 10px; display:flex; align-items:center; gap:6px; font-family:'Archivo Narrow'; font-size:10.5px; font-weight:700; cursor:grab; user-select:none; transition:all var(--t); overflow:hidden; white-space:nowrap; letter-spacing:.02em; z-index:1; }
.fv2 .gantt-bar:hover { transform:translateY(-1px); box-shadow:var(--shadow-hover); z-index:2; }
.fv2 .gantt-bar.info { background:var(--info-bg); color:var(--info-fg); border:1px solid rgba(29,78,216,.18); }
.fv2 .gantt-bar.purple { background:var(--purple-bg); color:var(--purple-fg); border:1px solid rgba(109,40,217,.18); }
.fv2 .gantt-bar.warn { background:var(--pending-bg); color:var(--pending-deep); border:1px solid rgba(217,119,6,.2); }
.fv2 .gantt-bar.cyan { background:var(--cyan-bg); color:var(--cyan-fg); border:1px solid rgba(21,94,117,.18); }
.fv2 .gantt-bar.ok { background:var(--ok-bg); color:var(--ok-deep); border:1px solid rgba(21,128,61,.18); }
.fv2 .gantt-now-line { position:absolute; top:0; bottom:0; width:1.5px; background:var(--red); pointer-events:none; z-index:3; box-shadow:0 0 6px rgba(196,18,48,.5); animation:fv2-pulse-now-line 2s ease-in-out infinite; }

/* Kanban */
.fv2 .kanban { display:flex; gap:12px; overflow-x:auto; padding-bottom:12px; min-height:580px; }
.fv2 .kanban-col { flex-shrink:0; width:268px; background:#fff; border:1px solid var(--s200); border-radius:12px; display:flex; flex-direction:column; max-height:calc(100vh - 220px); transition:all var(--t); box-shadow:var(--shadow-rest); }
.fv2 .kanban-col:hover { border-color:var(--s300); }
.fv2 .kanban-col.drag-over { border-color:var(--red); background:var(--red-soft); transform:scale(1.005); box-shadow:0 0 0 3px rgba(196,18,48,.08), var(--shadow-hover); }
.fv2 .kanban-col-header { padding:12px 14px; border-bottom:1px solid var(--s200); display:flex; align-items:center; gap:10px; position:sticky; top:0; background:#fff; z-index:1; border-radius:12px 12px 0 0; }
.fv2 .col-icon { width:30px; height:30px; background:var(--s50); border:1px solid var(--s200); border-radius:8px; display:flex; align-items:center; justify-content:center; color:var(--s700); flex-shrink:0; }
.fv2 .col-icon svg { width:15px; height:15px; }
.fv2 .kanban-col-title { flex:1; min-width:0; }
.fv2 .kanban-col-title .name { font-weight:700; font-size:13px; color:var(--ink); margin-top:3px; letter-spacing:-.005em; }
.fv2 .kanban-col-stats { text-align:right; font-family:'Archivo Narrow'; font-size:10.5px; color:var(--s500); font-weight:700; }
.fv2 .kanban-col-stats .count { font-weight:800; color:var(--ink); font-size:16px; font-variant-numeric:tabular-nums; letter-spacing:-.02em; display:block; }
.fv2 .kanban-cards { padding:10px; display:flex; flex-direction:column; gap:9px; overflow-y:auto; flex:1; min-height:80px; }
.fv2 .kanban-cards:empty::before { content:'Empty'; font-family:'Archivo Narrow'; font-size:10px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; color:var(--s400); text-align:center; padding:18px 0; display:block; opacity:.7; }
.fv2 .kanban-card { background:#fff; border:1px solid var(--s200); border-radius:10px; padding:12px 13px; cursor:grab; transition:all var(--t); position:relative; box-shadow:var(--shadow-rest); }
.fv2 .kanban-card:hover { border-color:var(--ink); transform:translateY(-2px); box-shadow:var(--shadow-hover); }
.fv2 .kanban-card.critical { border:1.5px solid var(--due-fg); animation:fv2-pulse-banner-critical 2.4s ease-in-out infinite; }
.fv2 .kanban-card.dragging { opacity:.5; cursor:grabbing; transform:rotate(1.5deg) scale(.98); }
.fv2 .kanban-card .card-head { display:flex; justify-content:space-between; align-items:flex-start; margin-bottom:4px; gap:8px; }
.fv2 .kanban-card .job-code { font-family:'Archivo Narrow'; font-size:11px; font-weight:700; color:var(--s500); letter-spacing:.06em; cursor:pointer; }
.fv2 .kanban-card .job-code:hover { color:var(--red); }
.fv2 .kanban-card .card-customer { font-size:13px; color:var(--ink); font-weight:700; line-height:1.3; margin-top:2px; letter-spacing:-.005em; }
.fv2 .kanban-card .card-suburb { font-family:'Archivo Narrow'; font-size:11px; color:var(--s500); font-weight:600; margin-top:1px; }
.fv2 .kanban-card .frame-meta { display:flex; align-items:center; gap:8px; margin-top:9px; padding-top:9px; border-top:1px solid var(--s100); }
.fv2 .kanban-card .frame-meta .lbl { font-family:'Archivo Narrow'; font-size:9.5px; color:var(--s400); font-weight:700; letter-spacing:.1em; text-transform:uppercase; }
.fv2 .kanban-card .frame-meta .v { font-family:'Archivo Narrow'; font-size:12px; font-weight:700; color:var(--ink); font-variant-numeric:tabular-nums; }
.fv2 .kanban-card .progress { flex:1; height:4px; background:var(--s100); border-radius:2px; overflow:hidden; }
.fv2 .kanban-card .progress-fill { height:100%; background:linear-gradient(90deg,var(--ok-light),var(--ok-fg)); border-radius:2px; }
.fv2 .kanban-card .cad-time { display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:8px; margin-top:9px; padding:8px 10px; background:var(--s50); border:1px solid var(--s200); border-radius:7px; font-family:'Archivo Narrow'; font-size:11px; font-weight:700; }
.fv2 .kanban-card .cad-time .lbl { color:var(--s500); letter-spacing:.12em; text-transform:uppercase; font-size:9.5px; font-weight:800; padding:2px 6px; background:#fff; border:1px solid var(--s200); border-radius:3px; }
.fv2 .kanban-card .cad-time .est-row { display:inline-flex; align-items:baseline; gap:5px; font-variant-numeric:tabular-nums; justify-self:center; }
.fv2 .kanban-card .cad-time .est { color:var(--info-fg); font-weight:700; font-size:12px; }
.fv2 .kanban-card .cad-time .est-arrow { color:var(--s400); font-size:10px; }
.fv2 .kanban-card .cad-time .act { color:var(--ink); font-weight:800; font-size:12.5px; letter-spacing:-.01em; }
.fv2 .kanban-card .cad-time .var { font-size:10px; padding:2px 6px; border-radius:3px; font-variant-numeric:tabular-nums; font-weight:800; }
.fv2 .kanban-card .cad-time .var.over { background:var(--red-soft); color:var(--red); }
.fv2 .kanban-card .cad-time .var.under { background:var(--ok-bg); color:var(--ok-fg); }
.fv2 .kanban-card .blocked { margin-top:9px; padding:6px 10px; background:var(--pending-bg); border:1px solid rgba(217,119,6,.2); border-radius:6px; font-size:11px; color:var(--pending-deep); display:flex; align-items:center; gap:6px; font-weight:600; }
.fv2 .kanban-card .blocked.is-critical { background:var(--due-bg); border-color:var(--due-fg); color:var(--due-deep); font-weight:700; }
.fv2 .kanban-card .blocked svg { width:11px; height:11px; flex-shrink:0; }
.fv2 .kanban-card .card-footer { display:flex; justify-content:space-between; align-items:center; margin-top:9px; padding-top:9px; border-top:1px dashed var(--s200); }
.fv2 .kanban-card .operator-avatar { width:24px; height:24px; background:var(--ink); color:#fff; border-radius:50%; font-size:9.5px; font-weight:700; display:flex; align-items:center; justify-content:center; }
.fv2 .kanban-card .timer { font-family:'Archivo Narrow'; font-size:11.5px; color:var(--s600); font-variant-numeric:tabular-nums; font-weight:700; }
.fv2 .kanban-card .timer.live::before { content:''; display:inline-block; width:6px; height:6px; background:var(--ok-fg); border-radius:50%; margin-right:6px; vertical-align:middle; animation:fv2-pulse-dot-hot 1.8s infinite; }
.fv2 .kanban-card .unassigned { font-family:'Archivo Narrow'; font-size:10px; color:var(--s400); font-weight:700; letter-spacing:.08em; text-transform:uppercase; }

/* FSO card */
.fv2 .fso-card { background:#fff; border:1px solid var(--s200); border-left:3px solid var(--red); border-radius:12px; padding:16px 20px; margin-bottom:16px; display:flex; align-items:center; gap:18px; flex-wrap:wrap; box-shadow:var(--shadow-rest); }
.fv2 .fso-card .icon { width:42px; height:42px; background:var(--red-soft); border-radius:10px; display:flex; align-items:center; justify-content:center; color:var(--red); flex-shrink:0; }
.fv2 .fso-card .icon .ico { width:19px; height:19px; }
.fv2 .fso-card .text { flex:1; min-width:220px; }
.fv2 .fso-card .text strong { font-weight:800; font-size:14px; color:var(--ink); }
.fv2 .fso-card .text .sub { color:var(--s600); font-size:12.5px; margin-top:4px; line-height:1.4; }
.fv2 .fso-card .pos { display:flex; gap:6px; flex-wrap:wrap; }

.fv2 .status-line { display:flex; justify-content:space-between; align-items:center; padding:11px 18px; background:#fff; border:1px solid var(--s200); border-radius:9px; margin-bottom:14px; font-size:12.5px; color:var(--s600); flex-wrap:wrap; gap:10px; box-shadow:var(--shadow-rest); }
.fv2 .status-line strong { color:var(--ink); font-weight:700; }

/* Capacity */
.fv2 .capacity-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px; }
.fv2 .what-if { background:#fff; border:1px solid var(--s200); border-radius:12px; padding:18px 20px; box-shadow:var(--shadow-rest); }
.fv2 .slider-row { display:grid; grid-template-columns:110px 1fr 60px; gap:14px; align-items:center; padding:8px 0; font-size:12.5px; }
.fv2 .slider-row .lbl { color:var(--s600); font-family:'Archivo Narrow'; font-size:10.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; }
.fv2 .slider-row input[type="range"] { width:100%; appearance:none; -webkit-appearance:none; height:4px; background:var(--s100); border-radius:2px; outline:none; cursor:pointer; }
.fv2 .slider-row input[type="range"]::-webkit-slider-thumb { appearance:none; -webkit-appearance:none; width:18px; height:18px; border-radius:50%; background:var(--ink); cursor:pointer; border:3px solid #fff; box-shadow:0 1px 4px rgba(0,0,0,.18); }
.fv2 .slider-row .val { font-weight:800; font-size:15px; text-align:right; font-variant-numeric:tabular-nums; letter-spacing:-.02em; }

/* Banner */
.fv2 .banner { display:flex; align-items:center; gap:14px; padding:14px 18px; background:var(--pending-bg); border:1px solid rgba(217,119,6,.2); border-left:3px solid var(--pending-fg); border-radius:10px; margin-bottom:14px; font-size:13px; color:var(--pending-deep); }
.fv2 .banner.info { background:var(--info-bg); border-color:rgba(29,78,216,.18); border-left-color:var(--info-fg); color:var(--info-fg); }
.fv2 .banner strong { font-weight:700; }
.fv2 .banner .b-icon { display:flex; align-items:center; justify-content:center; flex-shrink:0; width:30px; height:30px; background:rgba(255,255,255,.7); border-radius:8px; }
.fv2 .banner .b-icon svg { width:16px; height:16px; }
.fv2 .banner .b-content { flex:1; line-height:1.55; }
.fv2 .banner code { font-family:'Archivo Narrow'; background:rgba(255,255,255,.85); padding:1px 6px; border-radius:4px; font-size:11.5px; font-weight:600; }

/* Tabs */
.fv2 .tabs { display:flex; align-items:center; border-bottom:1px solid var(--s200); padding:0 4px; gap:2px; margin-bottom:14px; }
.fv2 .tab { padding:11px 16px; font-size:12.5px; font-weight:700; color:var(--s500); position:relative; display:inline-flex; align-items:center; gap:7px; background:none; border:none; cursor:pointer; transition:all var(--t); letter-spacing:.04em; text-transform:uppercase; font-family:'Archivo Narrow'; }
.fv2 .tab:hover { color:var(--ink); }
.fv2 .tab.active, .fv2 .tab.on { color:var(--ink); }
.fv2 .tab.active::after, .fv2 .tab.on::after { content:''; position:absolute; left:12px; right:12px; bottom:-1px; height:2px; background:var(--red); border-radius:1px 1px 0 0; }
.fv2 .tab .count, .fv2 .tab .tab-c { font-size:10px; font-weight:800; padding:1px 6px; border-radius:5px; background:var(--s100); color:var(--s600); font-family:'Archivo Narrow'; }
.fv2 .tab.active .count, .fv2 .tab.active .tab-c, .fv2 .tab.on .count, .fv2 .tab.on .tab-c { background:var(--red); color:#fff; }

/* Data table */
.fv2 .data-table { width:100%; background:#fff; border:1px solid var(--s200); border-radius:12px; border-collapse:separate; border-spacing:0; overflow:hidden; box-shadow:var(--shadow-rest); }
.fv2 .data-table th { font-family:'Archivo Narrow'; font-size:10.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--s500); font-weight:700; text-align:left; padding:12px 18px; background:var(--s50); border-bottom:1px solid var(--s200); }
.fv2 .data-table td { padding:14px 18px; border-bottom:1px solid var(--s100); font-size:13px; vertical-align:middle; color:var(--s700); }
.fv2 .data-table tr:last-child td { border-bottom:none; }
.fv2 .data-table tbody tr { cursor:pointer; transition:background var(--t); }
.fv2 .data-table tbody tr:hover { background:var(--s50); }
.fv2 .data-table tbody tr.is-new { animation:fv2-flash-row 2400ms ease-out; }
.fv2 .data-table .po-code { font-family:'Archivo Narrow'; font-size:12.5px; font-weight:700; color:var(--ink); letter-spacing:.02em; }
.fv2 .data-table .job-code { font-family:'Archivo Narrow'; font-size:12px; font-weight:700; color:var(--s700); letter-spacing:.04em; cursor:pointer; transition:color var(--t); }
.fv2 .data-table .job-code:hover { color:var(--red); }
.fv2 .data-table .amount { font-weight:800; text-align:right; color:var(--ink); font-variant-numeric:tabular-nums; letter-spacing:-.01em; }
.fv2 .ship-flag { font-family:'Archivo Narrow'; font-size:10px; padding:2px 7px; border-radius:4px; text-transform:uppercase; letter-spacing:.08em; font-weight:700; display:inline-block; border:1px solid; }
.fv2 .ship-flag.factory { background:var(--s100); color:var(--s700); border-color:var(--s200); }
.fv2 .ship-flag.site { background:var(--info-bg); color:var(--info-fg); border-color:rgba(29,78,216,.18); }

/* Variance + sparkline */
.fv2 .variance-table { width:100%; background:#fff; border:1px solid var(--s200); border-radius:12px; border-collapse:separate; border-spacing:0; overflow:hidden; box-shadow:var(--shadow-rest); }
.fv2 .variance-table th { font-family:'Archivo Narrow'; font-size:10.5px; letter-spacing:.14em; text-transform:uppercase; color:var(--s500); font-weight:700; text-align:right; padding:12px; background:var(--s50); border-bottom:1px solid var(--s200); white-space:nowrap; }
.fv2 .variance-table th:first-child { text-align:left; padding-left:20px; }
.fv2 .variance-table th:last-child { text-align:center; }
.fv2 .variance-table td { padding:13px 12px; border-bottom:1px solid var(--s100); font-size:12.5px; text-align:right; font-variant-numeric:tabular-nums; }
.fv2 .variance-table td:first-child { text-align:left; padding-left:20px; }
.fv2 .variance-table td:last-child { text-align:center; }
.fv2 .variance-table tr:last-child td { border-bottom:none; }
.fv2 .variance-table tr:hover td { background:var(--s50); }
.fv2 .variance-table .row-head { display:flex; align-items:center; gap:10px; }
.fv2 .variance-table .row-head .name { font-weight:700; color:var(--ink); }
.fv2 .cell-est { color:var(--info-fg); font-weight:700; }
.fv2 .cell-act { color:var(--ink); font-weight:800; }
.fv2 .cell-var { display:inline-block; padding:3px 8px; border-radius:5px; font-family:'Archivo Narrow'; font-weight:800; font-size:11px; letter-spacing:.02em; min-width:52px; text-align:center; }
.fv2 .cell-var.over { background:var(--red-soft); color:var(--red); }
.fv2 .cell-var.under { background:var(--ok-bg); color:var(--ok-fg); }
.fv2 .cell-var.flat { background:var(--s100); color:var(--s500); }
.fv2 .cell-empty { color:var(--s300); font-weight:600; }
.fv2 .conf-bar { display:inline-flex; align-items:center; gap:6px; }
.fv2 .conf-bar .conf-track { width:46px; height:5px; background:var(--s100); border-radius:3px; overflow:hidden; }
.fv2 .conf-bar .conf-fill { height:100%; background:var(--ok-fg); border-radius:3px; }
.fv2 .conf-bar .conf-fill.med { background:var(--pending-fg); } .fv2 .conf-bar .conf-fill.low { background:var(--s400); }
.fv2 .conf-bar .conf-num { font-family:'Archivo Narrow'; font-size:10.5px; font-weight:800; color:var(--s700); font-variant-numeric:tabular-nums; }
.fv2 .spark { display:inline-flex; align-items:flex-end; gap:1.5px; height:22px; padding:2px 4px; }
.fv2 .spark-bar { width:3px; background:var(--s300); border-radius:1px; min-height:2px; }
.fv2 .spark-bar.over { background:var(--red); } .fv2 .spark-bar.under { background:var(--ok-fg); } .fv2 .spark-bar.flat { background:var(--s400); }
.fv2 .pill-mini { padding:2px 6px; border-radius:4px; font-size:10px; font-family:'Archivo Narrow'; font-weight:800; }

/* Terminal */
.fv2 .terminal-strip { display:flex; gap:8px; overflow-x:auto; padding-bottom:4px; margin-bottom:16px; }
.fv2 .terminal-chip { padding:10px 14px; background:#fff; border:1px solid var(--s200); border-radius:8px; font-size:12.5px; font-weight:500; cursor:pointer; display:flex; align-items:center; gap:9px; white-space:nowrap; transition:all var(--t); box-shadow:var(--shadow-rest); }
.fv2 .terminal-chip:hover { background:var(--s50); border-color:var(--s400); }
.fv2 .terminal-chip.active, .fv2 .terminal-chip.on { background:var(--ink); color:#fff; border-color:var(--ink); box-shadow:0 4px 12px -4px rgba(10,10,10,.4); }
.fv2 .terminal-chip .status-dot { width:7px; height:7px; border-radius:50%; background:var(--ok-fg); }
.fv2 .terminal-chip.offline .status-dot { background:var(--s400); }
.fv2 .terminal-chip .term-code { font-family:'Archivo Narrow'; font-size:10px; font-weight:800; color:var(--s500); letter-spacing:.06em; }
.fv2 .terminal-chip.active .term-code, .fv2 .terminal-chip.on .term-code { color:var(--s400); }
.fv2 .terminal-chip > div > div:last-child { font-weight:600; font-size:12.5px; }

/* MES */
.fv2 .mes-screen { background:#fff; border:1px solid var(--s200); border-radius:14px; overflow:hidden; box-shadow:var(--shadow-rest); }
.fv2 .mes-header { background:linear-gradient(135deg,var(--ink) 0%,var(--s900) 100%); color:#fff; padding:18px 22px; display:flex; justify-content:space-between; align-items:center; border-bottom:1px solid var(--s800); }
.fv2 .mes-header .station-name { font-weight:800; font-size:17px; display:flex; align-items:center; gap:12px; letter-spacing:-.01em; }
.fv2 .mes-header .station-name .code { font-family:'Archivo Narrow'; font-size:10.5px; background:rgba(255,255,255,.1); border:1px solid rgba(255,255,255,.15); padding:3px 8px; border-radius:5px; font-weight:700; letter-spacing:.06em; color:rgba(255,255,255,.85); }
.fv2 .mes-header .op-info { font-family:'Archivo Narrow'; font-size:11px; color:rgba(255,255,255,.65); letter-spacing:.1em; font-weight:700; text-transform:uppercase; }
.fv2 .mes-content { padding:20px 22px; display:grid; grid-template-columns:1.45fr 1fr; gap:18px; }
.fv2 .mes-main { display:flex; flex-direction:column; gap:16px; }
.fv2 .mes-job-big { font-size:36px; font-weight:900; color:var(--red); letter-spacing:-.035em; line-height:1; font-variant-numeric:tabular-nums; cursor:pointer; }
.fv2 .mes-job-big:hover { opacity:.8; }
.fv2 .mes-job-customer { font-size:17px; color:var(--ink); margin-top:5px; font-weight:600; }
.fv2 .mes-frame-counter { background:var(--s50); border:1px solid var(--s200); border-radius:10px; padding:18px; display:flex; justify-content:space-around; text-align:center; }
.fv2 .mes-frame-counter .item .label { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; color:var(--s500); text-transform:uppercase; font-weight:700; }
.fv2 .mes-frame-counter .item .num { font-size:34px; font-weight:800; margin-top:5px; font-variant-numeric:tabular-nums; line-height:1; letter-spacing:-.03em; }
.fv2 .mes-frame-counter .item .num.done { color:var(--ok-fg); }
.fv2 .mes-actions { display:grid; grid-template-columns:1fr 1fr; gap:9px; }
.fv2 .mes-action-btn { padding:18px; background:#fff; border:1px solid var(--s200); border-radius:10px; font-weight:700; font-size:13px; cursor:pointer; color:var(--ink); transition:all var(--t); display:flex; flex-direction:column; align-items:center; gap:6px; text-transform:uppercase; letter-spacing:.06em; font-family:'Archivo Narrow'; }
.fv2 .mes-action-btn:hover { background:var(--s50); border-color:var(--s400); transform:translateY(-1px); box-shadow:var(--shadow-hover); }
.fv2 .mes-action-btn[disabled] { opacity:.5; cursor:not-allowed; pointer-events:none; }
.fv2 .mes-action-btn svg { width:17px; height:17px; }
.fv2 .mes-action-btn.primary { background:var(--ok-fg); border-color:var(--ok-fg); color:#fff; }
.fv2 .mes-action-btn.primary:hover { background:var(--ok-deep); }
.fv2 .mes-action-btn.warn { background:var(--pending-bg); border-color:var(--pending-fg); color:var(--pending-deep); }
.fv2 .mes-action-btn.danger { background:var(--red-soft); border-color:var(--red); color:var(--red); }
.fv2 .mes-side { display:flex; flex-direction:column; gap:12px; }
.fv2 .mes-timer { background:linear-gradient(180deg,var(--ink) 0%,var(--s900) 100%); color:#fff; border-radius:10px; padding:18px; text-align:center; border:1px solid var(--s800); }
.fv2 .mes-timer .label { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:rgba(255,255,255,.55); font-weight:700; }
.fv2 .mes-timer .time { font-size:46px; font-weight:900; letter-spacing:-.035em; margin-top:6px; font-variant-numeric:tabular-nums; line-height:1; }
.fv2 .mes-timer .target { font-family:'Archivo Narrow'; font-size:12px; color:rgba(255,255,255,.65); margin-top:8px; font-weight:600; display:flex; align-items:center; justify-content:center; gap:8px; }
.fv2 .mes-timer .target .var-tag { display:inline-flex; align-items:center; gap:3px; padding:3px 8px; border-radius:5px; font-weight:800; font-size:11.5px; letter-spacing:.02em; font-variant-numeric:tabular-nums; }
.fv2 .mes-timer .target .var-tag.over { background:var(--due-fg); color:#fff; }
.fv2 .mes-timer .target .var-tag.under { background:var(--ok-fg); color:#fff; }
.fv2 .mes-side .panel { background:var(--s50); border:1px solid var(--s200); border-radius:10px; padding:14px; }
.fv2 .mes-side .panel .ptitle { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--s500); margin-bottom:10px; font-weight:700; }
.fv2 .mes-queue-item { padding:9px 11px; background:#fff; border:1px solid var(--s200); border-radius:7px; margin-bottom:6px; display:flex; justify-content:space-between; align-items:center; font-size:12px; font-family:'Archivo Narrow'; font-weight:600; cursor:pointer; }
.fv2 .mes-queue-item:hover { border-color:var(--s400); }
.fv2 .mes-queue-item .num { color:var(--s400); margin-right:8px; }
.fv2 .mes-queue-item .frames { color:var(--s500); font-variant-numeric:tabular-nums; }

/* Drawers — Job Detail + PO */
.fv2-drawer-backdrop { position:fixed; inset:0; background:rgba(10,10,10,.45); z-index:9000; opacity:0; pointer-events:none; transition:opacity 220ms; backdrop-filter:blur(3px); }
.fv2-drawer-backdrop.open { opacity:1; pointer-events:auto; }
.fv2-drawer { position:fixed; top:0; right:0; bottom:0; width:640px; max-width:96vw; background:#fff; border-left:1px solid #E7E5E4; z-index:9001; transform:translateX(100%); transition:transform 320ms cubic-bezier(.4,0,.2,1); overflow-y:auto; box-shadow:-8px 0 32px rgba(0,0,0,.1); display:flex; flex-direction:column; font-family:'Archivo',system-ui,sans-serif; color:#0A0A0A; }
.fv2-drawer.open { transform:translateX(0); }
.fv2-drawer .drawer-header { padding:22px 24px 18px; border-bottom:1px solid #E7E5E4; display:flex; justify-content:space-between; align-items:flex-start; position:sticky; top:0; background:#fff; z-index:2; gap:12px; }
.fv2-drawer .drawer-content { padding:0; flex:1; overflow-y:auto; }
.fv2-drawer .drawer-section { padding:18px 24px; border-bottom:1px solid #F5F5F4; }
.fv2-drawer .drawer-section:last-child { border-bottom:none; }
.fv2-drawer .drawer-section-title { font-family:'Archivo Narrow'; font-size:10.5px; letter-spacing:.14em; text-transform:uppercase; color:#78716C; margin-bottom:12px; font-weight:700; display:flex; align-items:center; justify-content:space-between; gap:10px; }
.fv2-drawer .icon-btn { width:32px; height:32px; display:inline-flex; align-items:center; justify-content:center; border-radius:8px; background:transparent; border:1px solid #E7E5E4; color:#57534E; cursor:pointer; }
.fv2-drawer .icon-btn:hover { background:#F5F5F4; color:#0A0A0A; }

/* Job Detail drawer — Final Design + Production tabs */
.fv2-drawer .job-drawer-header { padding:20px 24px 0; border-bottom:1px solid #E7E5E4; background:linear-gradient(180deg,#FAFAF9 0%,#fff 100%); position:sticky; top:0; z-index:2; }
.fv2-drawer .job-drawer-eyebrow { display:flex; align-items:center; gap:10px; margin-bottom:6px; }
.fv2-drawer .job-drawer-title-row { display:flex; justify-content:space-between; align-items:flex-end; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.fv2-drawer .job-drawer-title { font-size:26px; font-weight:800; letter-spacing:-.028em; line-height:1; color:#0A0A0A; }
.fv2-drawer .job-drawer-customer { font-size:14px; color:#57534E; font-weight:500; margin-top:4px; }
.fv2-drawer .job-drawer-meta-strip { display:flex; gap:18px; padding:0 0 14px; flex-wrap:wrap; }
.fv2-drawer .job-meta { display:flex; flex-direction:column; gap:1px; }
.fv2-drawer .job-meta .lbl { font-family:'Archivo Narrow'; font-size:9.5px; letter-spacing:.14em; color:#78716C; text-transform:uppercase; font-weight:700; }
.fv2-drawer .job-meta .v { font-size:13px; font-weight:700; color:#0A0A0A; font-variant-numeric:tabular-nums; }
.fv2-drawer .job-tabs { display:flex; border-top:1px solid #E7E5E4; padding:0 4px; gap:2px; }
.fv2-drawer .job-tab { padding:13px 16px; font-size:12px; font-weight:700; color:#78716C; position:relative; display:inline-flex; align-items:center; gap:7px; background:none; border:none; cursor:pointer; letter-spacing:.06em; text-transform:uppercase; font-family:'Archivo Narrow'; }
.fv2-drawer .job-tab:hover { color:#0A0A0A; }
.fv2-drawer .job-tab.on { color:#0A0A0A; }
.fv2-drawer .job-tab.on::after { content:''; position:absolute; left:12px; right:12px; bottom:-1px; height:2px; background:#C41230; border-radius:1px 1px 0 0; }
.fv2-drawer .job-tab .ico { width:13px; height:13px; }

.fv2-drawer .final-design-hero { padding:18px 24px; background:linear-gradient(135deg,#FAFAF9 0%,#fff 100%); border-bottom:1px solid #F5F5F4; }
.fv2-drawer .final-design-status { display:flex; align-items:center; gap:10px; margin-bottom:10px; }
.fv2-drawer .final-design-sub { font-size:11.5px; color:#57534E; line-height:1.5; }
.fv2-drawer .final-design-sub b { color:#0A0A0A; font-weight:700; }
.fv2-drawer .elev-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:12px; padding:20px 24px; background:#FAFAF9; border-bottom:1px solid #F5F5F4; }
.fv2-drawer .elev-card { background:#fff; border:1px solid #E7E5E4; border-radius:9px; overflow:hidden; cursor:pointer; transition:all 180ms cubic-bezier(.4,0,.2,1); }
.fv2-drawer .elev-card:hover { border-color:#0A0A0A; transform:translateY(-1px); box-shadow:0 12px 28px -12px rgba(10,10,10,.18); }
.fv2-drawer .elev-svg { background:linear-gradient(135deg,#F5F5F4 0%,#FAFAF9 100%); padding:14px; height:140px; display:flex; align-items:center; justify-content:center; }
.fv2-drawer .elev-svg svg { max-width:100%; max-height:100%; }
.fv2-drawer .elev-meta { padding:9px 11px; border-top:1px solid #F5F5F4; display:flex; justify-content:space-between; align-items:center; }
.fv2-drawer .elev-meta .code { font-family:'Archivo Narrow'; font-size:11px; font-weight:700; color:#0A0A0A; letter-spacing:.04em; }
.fv2-drawer .elev-meta .dim { font-family:'Archivo Narrow'; font-size:10px; font-weight:600; color:#78716C; font-variant-numeric:tabular-nums; }

.fv2-drawer .specs-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; padding:20px 24px; }
.fv2-drawer .spec-block { padding:14px; background:#FAFAF9; border:1px solid #E7E5E4; border-radius:9px; }
.fv2-drawer .spec-title { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; color:#78716C; text-transform:uppercase; font-weight:700; margin-bottom:10px; display:flex; align-items:center; gap:6px; }
.fv2-drawer .spec-title .ico { width:11px; height:11px; color:#C41230; }
.fv2-drawer .spec-row { display:flex; justify-content:space-between; font-size:12.5px; padding:5px 0; border-bottom:1px dashed #E7E5E4; }
.fv2-drawer .spec-row:last-child { border-bottom:none; }
.fv2-drawer .spec-row .l { color:#57534E; font-weight:500; }
.fv2-drawer .spec-row .r { color:#0A0A0A; font-weight:700; font-variant-numeric:tabular-nums; }
.fv2-drawer .docs-list { padding:20px 24px; display:flex; flex-direction:column; gap:7px; }
.fv2-drawer .doc-link { display:flex; align-items:center; gap:11px; padding:11px 13px; background:#FAFAF9; border:1px solid #E7E5E4; border-radius:8px; cursor:pointer; transition:all 180ms cubic-bezier(.4,0,.2,1); }
.fv2-drawer .doc-link:hover { border-color:#0A0A0A; background:#fff; }
.fv2-drawer .doc-link-ico { width:32px; height:32px; background:#fff; border:1px solid #E7E5E4; border-radius:8px; display:flex; align-items:center; justify-content:center; color:#C41230; flex-shrink:0; }
.fv2-drawer .doc-link-ico .ico { width:14px; height:14px; }
.fv2-drawer .doc-link-text { flex:1; min-width:0; }
.fv2-drawer .doc-link-title { font-size:12.5px; font-weight:700; color:#0A0A0A; letter-spacing:-.005em; }
.fv2-drawer .doc-link-sub { font-family:'Archivo Narrow'; font-size:10.5px; color:#78716C; font-weight:600; margin-top:1px; }
.fv2-drawer .doc-link-action { font-family:'Archivo Narrow'; font-size:10px; font-weight:700; color:#78716C; letter-spacing:.08em; text-transform:uppercase; }

/* CAD station times panel */
.fv2-drawer .cad-times-panel { background:#FAFAF9; border:1px solid #E7E5E4; border-radius:10px; padding:14px; position:relative; margin:0 24px 20px; }
.fv2-drawer .cad-times-panel .cad-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:12px; }
.fv2-drawer .cad-times-panel .cad-head .lbl { font-family:'Archivo Narrow'; font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:#78716C; font-weight:700; }
.fv2-drawer .cad-times-panel .source-tag { display:inline-flex; align-items:center; gap:5px; font-family:'Archivo Narrow'; font-size:9.5px; font-weight:800; color:#1D4ED8; background:#fff; padding:3px 7px; border-radius:4px; border:1px solid rgba(29,78,216,.2); letter-spacing:.08em; text-transform:uppercase; }
.fv2-drawer .cad-times-panel .source-tag svg { width:10px; height:10px; }
.fv2-drawer .cad-row { display:grid; grid-template-columns:34px 1fr 64px 64px 56px; gap:10px; align-items:center; padding:9px 6px; font-size:12px; border-bottom:1px solid #E7E5E4; font-variant-numeric:tabular-nums; border-radius:5px; transition:background 180ms cubic-bezier(.4,0,.2,1); }
.fv2-drawer .cad-row:hover { background:#fff; }
.fv2-drawer .cad-row:last-child { border-bottom:none; }
.fv2-drawer .cad-row.total { font-weight:800; border-top:1.5px solid #0A0A0A; padding-top:12px; margin-top:6px; border-bottom:none; background:transparent; }
.fv2-drawer .cad-row.total:hover { background:transparent; }
.fv2-drawer .cad-row .label { color:#44403C; font-weight:600; }
.fv2-drawer .cad-row.total .label { color:#0A0A0A; font-weight:800; }
.fv2-drawer .cad-row .est { color:#1D4ED8; font-weight:700; text-align:right; }
.fv2-drawer .cad-row .act { color:#0A0A0A; font-weight:800; text-align:right; }
.fv2-drawer .cad-row .var { text-align:right; }
.fv2-drawer .cell-est { color:#1D4ED8; font-weight:700; }
.fv2-drawer .cell-act { color:#0A0A0A; font-weight:800; }
.fv2-drawer .cell-var { display:inline-block; padding:3px 8px; border-radius:5px; font-family:'Archivo Narrow'; font-weight:800; font-size:11px; letter-spacing:.02em; min-width:52px; text-align:center; }
.fv2-drawer .cell-var.over { background:#FBF3F4; color:#C41230; }
.fv2-drawer .cell-var.under { background:#DCFCE7; color:#15803D; }
.fv2-drawer .cell-var.flat { background:#F5F5F4; color:#78716C; }
.fv2-drawer .cell-empty { color:#D6D3D1; font-weight:600; }
.fv2-drawer .pill-mini { padding:2px 6px; border-radius:4px; font-size:10px; font-family:'Archivo Narrow'; font-weight:800; }
.fv2-drawer .station-code { font-family:'Archivo Narrow'; font-weight:700; color:#57534E; font-size:10px; background:#F5F5F4; padding:3px 7px; border-radius:4px; letter-spacing:.06em; min-width:24px; text-align:center; border:1px solid #E7E5E4; display:inline-block; }

/* QC checklist */
.fv2-drawer .qc-list { padding:14px 24px 20px; display:flex; flex-direction:column; gap:6px; }
.fv2-drawer .qc-item { display:flex; align-items:center; gap:11px; padding:10px 13px; background:#FAFAF9; border:1px solid #E7E5E4; border-radius:8px; }
.fv2-drawer .qc-item.done { background:rgba(220,252,231,.4); border-color:rgba(21,128,61,.15); }
.fv2-drawer .qc-item .check { width:22px; height:22px; border-radius:50%; display:flex; align-items:center; justify-content:center; flex-shrink:0; background:#F5F5F4; color:#A8A29E; }
.fv2-drawer .qc-item.done .check { background:#15803D; color:#fff; }
.fv2-drawer .qc-item .check svg { width:11px; height:11px; stroke-width:2.5; }
.fv2-drawer .qc-item-text { flex:1; font-size:12.5px; color:#44403C; }
.fv2-drawer .qc-item.done .qc-item-text { color:#78716C; }
.fv2-drawer .qc-meta { font-family:'Archivo Narrow'; font-size:10.5px; color:#78716C; font-weight:600; }

/* Drawer pills/buttons inherit basics */
.fv2-drawer .pill { display:inline-flex; align-items:center; gap:5px; padding:2px 8px; border-radius:99px; font-family:'Archivo Narrow'; font-size:10.5px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; white-space:nowrap; line-height:1.4; }
.fv2-drawer .pill .dot { width:5px; height:5px; border-radius:50%; flex-shrink:0; }
.fv2-drawer .pill.ok { background:#DCFCE7; color:#166534; } .fv2-drawer .pill.ok .dot { background:#15803D; }
.fv2-drawer .pill.warn { background:#FEF3C7; color:#92400E; } .fv2-drawer .pill.warn .dot { background:#D97706; }
.fv2-drawer .pill.info { background:#DBEAFE; color:#1D4ED8; } .fv2-drawer .pill.info .dot { background:#1D4ED8; }
.fv2-drawer .pill.gray { background:#F5F5F4; color:#44403C; } .fv2-drawer .pill.gray .dot { background:#78716C; }
.fv2-drawer .pill.red { background:#FBF3F4; color:#C41230; } .fv2-drawer .pill.red .dot { background:#C41230; }
.fv2-drawer .pill.purple { background:#F3E8FF; color:#6D28D9; } .fv2-drawer .pill.purple .dot { background:#6D28D9; }
.fv2-drawer .btn { display:inline-flex; align-items:center; justify-content:center; gap:7px; padding:9px 14px; font-size:13px; font-weight:600; border-radius:9px; cursor:pointer; transition:all 180ms cubic-bezier(.4,0,.2,1); border:1px solid transparent; white-space:nowrap; font-family:inherit; }
.fv2-drawer .btn-r { background:#C41230; color:#fff; border-color:#C41230; box-shadow:0 1px 2px rgba(196,18,48,.2), 0 4px 12px -4px rgba(196,18,48,.4); }
.fv2-drawer .btn-r:hover { background:#A50E27; transform:translateY(-1px); }
.fv2-drawer .btn-w { background:#fff; color:#44403C; border-color:#E7E5E4; }
.fv2-drawer .btn-w:hover { border-color:#0A0A0A; color:#0A0A0A; }
.fv2-drawer .btn-d { background:#0A0A0A; color:#fff; border-color:#0A0A0A; }
.fv2-drawer .btn-d:hover { background:#1C1917; }
.fv2-drawer .btn-g { background:transparent; color:#44403C; border-color:transparent; }
.fv2-drawer .btn-g:hover { background:#F5F5F4; color:#0A0A0A; }
.fv2-drawer .btn-sm { padding:6px 11px; font-size:12px; border-radius:7px; }
.fv2-drawer .btn-xs { padding:4px 9px; font-size:11px; border-radius:6px; }
.fv2-drawer .btn .ico { width:13px; height:13px; }
.fv2-drawer .ico { width:14px; height:14px; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; fill:none; flex-shrink:0; }
.fv2-drawer .ico-sm { width:12px; height:12px; }

/* Empty / loading */
.fv2 .empty-state { padding:40px 24px; text-align:center; background:var(--s50); border:1px dashed var(--s300); border-radius:12px; display:flex; flex-direction:column; gap:8px; align-items:center; }
.fv2 .empty-state .icon { width:40px; height:40px; border-radius:11px; background:#fff; color:var(--s500); display:flex; align-items:center; justify-content:center; border:1px solid var(--s200); }
.fv2 .empty-state .title { font-weight:700; font-size:13px; color:var(--s700); }
.fv2 .empty-state .sub { font-size:11.5px; color:var(--s500); line-height:1.5; max-width:480px; }

/* Sidebar count badges */
.fv2 .sb-item-count { margin-left:auto; font-size:10px; font-weight:700; background:rgba(255,255,255,.08); color:var(--s300); padding:2px 6px; border-radius:8px; }
.fv2 .sb-item.on .sb-item-count { background:rgba(255,255,255,.18); color:#fff; }
.fv2 .sb-item-count.alert { background:rgba(220,38,38,.28); color:#FCA5A5; }

/* ════════════════════════════════════════════════════════════════════════
 * V2 page content rendered INSIDE the legacy main area (Phoenix 2026-05-26:
 * no separate shell; single-platform chrome). The .fv2-shell rules below
 * are kept as dormant fallbacks in case the shell is re-enabled later via
 * window.fv2.ensureShell(); they have no effect unless body.fv2-shell-active
 * is set, which the boot() flow no longer sets.
 * ════════════════════════════════════════════════════════════════════════ */
.fv2-shell { position:fixed; top:40px; left:0; right:0; bottom:0; z-index:25; background:var(--s50); display:grid; grid-template-columns:248px 1fr; min-height:0; font-family:'Archivo',system-ui,sans-serif; color:var(--ink); }
.fv2-shell *, .fv2-shell *::before, .fv2-shell *::after { box-sizing:border-box; }
.fv2-shell .sb { background:#1a1a1a; color:#fff; height:calc(100vh - 40px); display:flex; flex-direction:column; border-right:1px solid #0a0a0a; overflow:hidden; }
.fv2-shell .sb-brand { padding:0 12px; height:56px; border-bottom:1px solid rgba(255,255,255,.08); display:flex; align-items:center; gap:12px; flex-shrink:0; }
.fv2-shell .sb-logo { width:32px; height:32px; border-radius:8px; flex-shrink:0; object-fit:contain; background:linear-gradient(135deg,var(--red) 0%,var(--red-dark) 100%); display:flex; align-items:center; justify-content:center; font-weight:900; font-size:13px; color:#fff; box-shadow:0 4px 14px -4px rgba(196,18,48,.5); }
.fv2-shell .sb-logo img { width:32px; height:32px; border-radius:8px; object-fit:contain; display:block; }
.fv2-shell .sb-brand-name { font-family:'Syne','Archivo',sans-serif; font-weight:800; color:#fff; font-size:14px; white-space:nowrap; }
.fv2-shell .sb-brand-sub { font-size:10px; color:#666; white-space:nowrap; }
.fv2-shell .sb-nav { flex:1; padding:14px 10px; display:flex; flex-direction:column; gap:1px; overflow-y:auto; }
.fv2-shell .sb-section { font-family:'Archivo Narrow'; font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:.16em; color:var(--s500); padding:14px 12px 6px; }
.fv2-shell .sb-section:first-child { padding-top:0; }
.fv2-shell .sb-item { display:flex; align-items:center; gap:10px; padding:8px 12px; color:var(--s300); font-size:13px; font-weight:500; border-radius:7px; cursor:pointer; transition:all 180ms cubic-bezier(.4,0,.2,1); border:none; background:transparent; width:100%; text-align:left; font-family:inherit; }
.fv2-shell .sb-item:hover { background:rgba(255,255,255,.05); color:#fff; }
.fv2-shell .sb-item.on { background:var(--red); color:#fff; box-shadow:0 2px 8px -2px rgba(196,18,48,.5); }
.fv2-shell .sb-item .ico { width:15px; height:15px; }
.fv2-shell .sb-item-count { margin-left:auto; font-size:10px; font-weight:700; background:rgba(255,255,255,.08); color:var(--s300); padding:2px 6px; border-radius:8px; }
.fv2-shell .sb-item.on .sb-item-count { background:rgba(255,255,255,.18); color:#fff; }
.fv2-shell .sb-item-count.alert { background:rgba(220,38,38,.28); color:#FCA5A5; }
.fv2-shell .sb-foot { padding:14px; border-top:1px solid #0a0a0a; display:flex; align-items:center; gap:10px; flex-shrink:0; }
.fv2-shell .sb-avatar { width:32px; height:32px; background:var(--s700); border-radius:50%; display:flex; align-items:center; justify-content:center; font-weight:700; font-size:12px; color:var(--s200); }
.fv2-shell .sb-foot-name { font-size:12px; font-weight:600; color:#fff; }
.fv2-shell .sb-foot-sub { font-size:10px; color:var(--s500); }
.fv2-shell .main { display:flex; flex-direction:column; min-width:0; overflow:hidden; padding-top:56px; }
.fv2-shell .main-scroll { flex:1; overflow-y:auto; overflow-x:hidden; }

/* Dormant — only fires when body.fv2-shell-active is set (which boot()
 * no longer does). Kept in case the shell is re-enabled later. */
body.fv2-shell-active #app > #sidebar,
body.fv2-shell-active #app > .sidebar,
body.fv2-shell-active #app > main,
body.fv2-shell-active #app > .main-content,
body.fv2-shell-active #app aside.sidebar { display: none !important; }
body.fv2-shell-active #topbar { left: 248px !important; }
body.fv2-shell-active #modalRoot,
body.fv2-shell-active #toastRack { z-index:9100; }

/* Page-content layout — V2 pages render inside the legacy <main> element.
 * Trim padding so we don't double up with legacy main's own 24px padding. */
.fv2 .page-header { display:flex; justify-content:space-between; align-items:flex-end; margin-bottom:24px; padding-bottom:18px; border-bottom:1px solid var(--s200); gap:28px; flex-wrap:wrap; }
.fv2 .page-header .page-title { flex:1 1 360px; min-width:0; }
.fv2 .page-header .page-actions { flex:0 0 auto; }
.fv2 .page-header > .hiring-banner { flex:1 1 100%; order:3; margin-top:6px; margin-bottom:0; }
/* fv2-page wrapper sits inside legacy main — keep horizontal padding light
 * since main already pads 24px, but preserve breathing room above/below. */
.fv2-page { padding:8px 0 60px; max-width:1640px; margin:0 auto; animation:fv2-fade-in 200ms var(--ease); background:transparent; min-height:0; box-sizing:border-box; }
