// Operator app — flowNETWORK / flowTWIN console (v2)
// Re-skin of the real FreightRoll YMS in YardFlow's dark+neon visual language.
// Nav, widgets, and screens match the actual product structure documented in
// the FreightRoll YMS Quick Start training deck.

const { useState, useEffect, useMemo, useRef } = React;

// ─── Icons (subset, geometric stroke 1.5) ────────────────────────────
const I = (paths) => ({ size = 16, className = '', style }) =>
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" className={className} style={style}>{paths}</svg>;

const IDashboard = I(<><rect x="3" y="3" width="8" height="8" rx="1.5" /><rect x="13" y="3" width="8" height="5" rx="1.5" /><rect x="13" y="10" width="8" height="11" rx="1.5" /><rect x="3" y="13" width="8" height="8" rx="1.5" /></>);
const IShipments = I(<><path d="M3 8h12V4H3v4zM15 8h4l2 3v3h-6V8z" /><circle cx="7" cy="17" r="2" /><circle cx="17" cy="17" r="2" /></>);
const IDriver = I(<><circle cx="12" cy="8" r="3.5" /><path d="M5 20c0-3.866 3.134-7 7-7s7 3.134 7 7" /></>);
const IChat = I(<><path d="M21 11a8 8 0 1 1-3-6.24" /><path d="M3 21l1.2-3.6A8 8 0 0 1 3 13" /><circle cx="9" cy="12" r="0.6" fill="currentColor" /><circle cx="13" cy="12" r="0.6" fill="currentColor" /><circle cx="17" cy="12" r="0.6" fill="currentColor" /></>);
const IDock = I(<><rect x="3" y="3" width="18" height="18" rx="1" /><path d="M3 9h18M9 9v12M15 9v12" opacity="0.5" /></>);
const IYard = I(<><circle cx="12" cy="10" r="3" /><path d="M12 2v3M22 12h-3M12 22v-3M2 12h3" opacity="0.5" /><path d="M12 13v9" /></>);
const IBoard = I(<><rect x="3" y="3" width="18" height="14" rx="1.5" /><path d="M3 9h18" /><path d="M12 17v4M8 21h8" /></>);
const IHistory = I(<><circle cx="12" cy="12" r="9" /><path d="M12 7v5l3 2" /></>);
const ITask = I(<><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M8 11l3 3 5-6" strokeWidth="2" /></>);
const ITaskApp = I(<><rect x="4" y="3" width="16" height="18" rx="2" /><path d="M9 8h6M9 12h6M9 16h4" /></>);
const ICalendar = I(<><rect x="3" y="4" width="18" height="17" rx="2" /><path d="M3 9h18M8 2v4M16 2v4" /><circle cx="8" cy="13" r="0.9" fill="currentColor" /><circle cx="12" cy="13" r="0.9" fill="currentColor" /><circle cx="16" cy="13" r="0.9" fill="currentColor" /><circle cx="8" cy="17" r="0.9" fill="currentColor" /><circle cx="12" cy="17" r="0.9" fill="currentColor" /></>);
const ITrailers = I(<><path d="M2 8h12V5H2v3zM14 8h5l2 3v3h-7V8z" /><circle cx="6" cy="16" r="2" /><circle cx="16" cy="16" r="2" /><path d="M8 16h6" /></>);
const IFacility = I(<><path d="M3 21V8l9-6 9 6v13" /><path d="M3 21h18" /><rect x="8" y="12" width="8" height="9" /></>);
const IUsers = I(<><circle cx="9" cy="8" r="3" /><circle cx="17" cy="9" r="2.5" /><path d="M3 21v-1a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v1" /></>);
const ISearch = I(<><circle cx="10" cy="10" r="6" /><path d="M14.5 14.5L20 20" strokeWidth="2" /></>);
const IRefresh = I(<><path d="M4 12a8 8 0 0 1 14.5-4.5M20 12a8 8 0 0 1-14.5 4.5" /><path d="M20 4v4h-4M4 20v-4h4" /></>);
const ISave = I(<><path d="M5 3h11l3 3v15H5z" /><path d="M7 3v5h9V3" /><path d="M9 14h6" opacity="0.5" /></>);
const ISettings = I(<><circle cx="12" cy="12" r="3" /><path d="M19 12a7 7 0 0 0-.1-1.2l2-1.5-2-3.5-2.4 1a7 7 0 0 0-2.1-1.2L14 3h-4l-.4 2.6a7 7 0 0 0-2.1 1.2l-2.4-1-2 3.5 2 1.5A7 7 0 0 0 5 12c0 .4 0 .8.1 1.2l-2 1.5 2 3.5 2.4-1a7 7 0 0 0 2.1 1.2L10 21h4l.4-2.6a7 7 0 0 0 2.1-1.2l2.4 1 2-3.5-2-1.5c.1-.4.1-.8.1-1.2z" /></>);
const IPause = I(<><rect x="6" y="5" width="4" height="14" /><rect x="14" y="5" width="4" height="14" /></>);
const IMove = I(<><path d="M5 12h14M13 6l6 6-6 6" strokeWidth="2" /></>);
const ICrosshair = I(<><circle cx="12" cy="12" r="9" /><circle cx="12" cy="12" r="4" opacity="0.5" /><path d="M12 2v4M12 18v4M2 12h4M18 12h4" /><circle cx="12" cy="12" r="1.5" fill="currentColor" /></>);
const IMetrics  = I(<><rect x="3" y="3" width="18" height="18" rx="2" opacity="0.3" /><path d="M7 17v-4M12 17V8M17 17v-7" strokeWidth="2.5" /></>);
const ISim = I(<><path d="M3 12a9 9 0 0 1 9-9 9 9 0 0 1 9 9" /><path d="M12 12l5-3" strokeWidth="2" /><circle cx="12" cy="12" r="1.6" fill="currentColor" /><path d="M5 19l2-2M19 19l-2-2" opacity="0.6" /><path d="M3 12h2M19 12h2" opacity="0.6" /></>);
const IConfirm  = I(<><circle cx="12" cy="12" r="10" opacity="0.3" /><path d="M7 12.5l3 3 7-7" strokeWidth="2" /></>);
const INexus    = I(<><circle cx="12" cy="12" r="9" /><ellipse cx="12" cy="12" rx="9" ry="4" opacity="0.5" /><path d="M3 12h18" opacity="0.5" /><circle cx="12" cy="12" r="2" fill="currentColor" /></>);
const ICheck    = I(<path d="M5 12.5l4 4 10-10" strokeWidth="2" />);
const ICaution = I(<><path d="M12 2L2 20h20L12 2z" /><path d="M12 9v4" strokeWidth="2" /><circle cx="12" cy="16" r="1" fill="currentColor" /></>);
const IClose = I(<path d="M6 6l12 12M18 6l-12 12" strokeWidth="2" />);
const IUp = I(<path d="M6 15l6-6 6 6" strokeWidth="2" />);
const IDown = I(<path d="M6 9l6 6 6-6" strokeWidth="2" />);
const IDrag = I(<><circle cx="9"  cy="7"  r="1.2" fill="currentColor" /><circle cx="15" cy="7"  r="1.2" fill="currentColor" /><circle cx="9"  cy="12" r="1.2" fill="currentColor" /><circle cx="15" cy="12" r="1.2" fill="currentColor" /><circle cx="9"  cy="17" r="1.2" fill="currentColor" /><circle cx="15" cy="17" r="1.2" fill="currentColor" /></>);

const LogoMark = ({ size = 28 }) =>
  <svg width={size} height={size} viewBox="0 0 32 32" fill="none" stroke="#00B4FF" strokeWidth="2.5" strokeLinecap="round">
    <path d="M4 24 C8 24, 10 21, 14 17" />
    <path d="M14 30 C14 24, 14 21, 14 17" />
    <path d="M14 17 C18 13, 22 13, 28 18" />
    <circle cx="4" cy="24" r="2.5" fill="#00B4FF" />
    <circle cx="14" cy="30" r="2.5" fill="#00B4FF" />
    <circle cx="28" cy="18" r="2.5" fill="#00B4FF" />
    <circle cx="14" cy="17" r="3" fill="#00B4FF" />
  </svg>;

// ─── Sidebar ─────────────────────────────────────────────────────────
const NAV = [
  { key: 'dashboard',    label: 'Dashboard',     icon: IDashboard },
  { key: 'shipments',    label: 'Shipments',     icon: IShipments },
  { key: 'appointments', label: 'Appointments',  icon: ICalendar, meta: 'NEW' },
  { key: 'driver-mgt',   label: 'Driver Mgt',    icon: IDriver },
  { key: 'driver-comms', label: 'Driver Comms',  icon: IChat, badge: 17 },
  { key: 'dock-mgt',     label: 'Dock Mgt',      icon: IDock },
  { key: 'yard-spot',    label: 'Yard Spot Mgt', icon: IYard },
  { key: 'whiteboard',   label: 'White Board',   icon: IBoard },
  { key: 'trailer-hist', label: 'Trailer History', icon: IHistory },
  { key: 'task-hist',    label: 'Task History',  icon: ITask },
  { key: 'task-app',     label: 'Task App',      icon: ITaskApp, meta: '15' },
  { key: 'trailers',     label: 'Trailers',      icon: ITrailers, meta: '253' },
  { key: 'flow-sim',     label: 'flowSIM',       icon: ISim, meta: 'NEW' },
  { key: 'flow-twin',    label: 'flowTWIN',      icon: IMetrics, meta: 'RTLS' },
  { key: 'flow-gate',    label: 'flowGATE',      icon: ICrosshair, meta: 'LIVE' },
];

const NAV_FOOT = [
  { key: 'facility-mgt', label: 'Facility Mgt', icon: IFacility },
  { key: 'user-mgt',     label: 'User Mgt',     icon: IUsers },
];

const Sidebar = ({ active, onChange }) => (
  <aside className="op-sidebar">
    <div className="op-brand">
      <LogoMark size={26} />
      <div className="op-brand-text">
        <span style={{ color: '#fff' }}>Yard</span><span style={{ color: 'var(--neon)' }}>Flow</span>
        <span className="by">CONSOLE · v3.7</span>
      </div>
    </div>

    <div className="op-side-heading">Operations</div>
    {NAV.map(it => (
      <div key={it.key} className={`op-side-item ${active === it.key ? 'is-active' : ''}`} onClick={() => onChange(it.key)}>
        <it.icon size={16} className="op-side-icon" />
        <span>{it.label}</span>
        {it.badge && <span className="op-side-badge">{it.badge}</span>}
        {it.meta && !it.badge && <span className="op-side-meta">{it.meta}</span>}
      </div>
    ))}

    <div className="op-side-heading">Admin</div>
    {NAV_FOOT.map(it => (
      <div key={it.key} className={`op-side-item ${active === it.key ? 'is-active' : ''}`} onClick={() => onChange(it.key)}>
        <it.icon size={16} className="op-side-icon" />
        <span>{it.label}</span>
      </div>
    ))}

    <div className="op-side-foot">
      <div className="op-avatar">AS</div>
      <div>
        <div style={{ color: '#fff', fontWeight: 600, fontSize: 12 }}>Allison Stafford</div>
        <div style={{ fontSize: 10, color: 'var(--steel-dim)' }}>Ops Lead · primobrands.com</div>
      </div>
    </div>
  </aside>
);

// ─── Topbar ──────────────────────────────────────────────────────────
const Topbar = ({ activeLabel, activeFacility, autoRefresh, setAutoRefresh, compact, setCompact, theme, setTheme }) => {
  const fac = (typeof FACILITIES !== 'undefined' ? FACILITIES.find(x => x.code === activeFacility) : null);
  const code = activeFacility || 'PWN-04';
  const name = fac ? fac.name : 'US PL Mecosta Factory';
  return (
  <div className="op-topbar">
    <div className="op-crumb">
      <span>{activeLabel}</span>
      <span className="sep">/</span>
      <span className="sub">{name}</span>
    </div>

    <div className="op-facility">
      <IFacility size={14} />
      <span><span className="code">{code} ·</span> <span className="name">{name}</span></span>
      <span style={{ color: 'var(--steel-dim)' }}>▾</span>
    </div>

    <div className="op-topbar-right">
      <div className={`op-toggle ${autoRefresh ? '' : 'is-off'}`} onClick={() => setAutoRefresh(!autoRefresh)}>
        <span className="sw" /> Auto-refresh
      </div>
      <div className={`op-toggle ${compact ? '' : 'is-off'}`} onClick={() => setCompact(!compact)}>
        <span className="sw" /> Compact
      </div>
      <div className="op-toggle op-theme-toggle" onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')} title="Toggle light / dark">
        <span className="sw" /> {theme === 'light' ? 'Light' : 'Dark'}
      </div>
      <span style={{ color: 'rgba(255,255,255,0.06)' }}>|</span>
      <div className="op-icon-btn" title="Save layout"><ISave size={16} /></div>
      <div className="op-icon-btn" title="Settings"><ISettings size={16} /></div>
      <div className="op-icon-btn" title="Refresh now"><IRefresh size={16} /></div>
      <span style={{ color: 'rgba(255,255,255,0.06)' }}>|</span>
      <div className="op-topbar-pulse">
        <span className="op-pulse"><span /></span>
        <span>Live · 30s</span>
      </div>
    </div>
  </div>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Operations Dashboard
// ═══════════════════════════════════════════════════════════════════
const DashboardView = ({ setActive }) => {
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Operations Dashboard</h1>
          <p className="op-view-sub">6 widgets active · Auto-refreshing every 30s · Last sync 14:42:08 UTC</p>
        </div>
      </div>

      <div className="op-dash">

        {/* ─── Drivers Needing Attention ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <IDriver size={18} className="ico" />
            <h3>Drivers Needing Attention</h3>
            <div className="actions"><IRefresh size={14} /></div>
          </div>
          <div className="op-chip-row">
            <span className="chip chip--ember">2 Need Attention</span>
            <span className="chip chip--warn">0 Pending</span>
            <span className="chip chip--steel">0 Checked In</span>
            <span className="chip chip--neon">2 Assigned</span>
          </div>
          <div className="op-widget-body">
            <div className="op-tile-grid">
              <div className="op-tile warn">
                <div className="op-tile-name">Witold Podolak</div>
                <div className="op-tile-meta">T925366622</div>
              </div>
              <div className="op-tile warn">
                <div className="op-tile-name">Ulrin Robertson</div>
                <div className="op-tile-meta">ASSIGNED · T925817129</div>
              </div>
            </div>
          </div>
          <div className="op-widget-foot">
            <span>&nbsp;</span><a onClick={() => setActive('driver-mgt')} style={{ cursor: 'pointer' }}>Manage all →</a>
          </div>
        </div>

        {/* ─── Tasks Needing Attention ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <ITask size={18} className="ico" />
            <h3>Tasks Needing Attention</h3>
            <div className="actions"><IRefresh size={14} /></div>
          </div>
          <div className="op-chip-row">
            <span className="chip chip--ember">220 Need Attention</span>
            <span className="chip chip--warn">217 Older than 4h</span>
            <span className="chip chip--neon">0 Active</span>
            <span className="chip chip--steel">0 Pending</span>
          </div>
          <div className="op-widget-body">
            <div className="op-tile-grid">
              {[
                ['UNASSIGNED', '32226'],   ['UNASSIGNED', '32861'],   ['UNASSIGNED', '53643'],
                ['ASSIGNED',   '835018'],  ['ASSIGNED',   '006478'],  ['ASSIGNED',   '51014'],
                ['ASSIGNED',   '5633308'], ['ASSIGNED',   '11620'],   ['ASSIGNED',   '4300098'],
                ['ASSIGNED',   '170523'],  ['ASSIGNED',   '31879'],   ['ASSIGNED',   '506718'],
              ].map(([state, id], i) => (
                <div key={i} className="op-tile warn">
                  <div className="op-tile-name" style={{ fontSize: 10, letterSpacing: '0.08em', color: '#FFB000' }}>MOVE TRAILER</div>
                  <div className="op-tile-meta" style={{ color: '#fff', marginTop: 4 }}>{state}</div>
                  <div className="op-tile-meta">{id}</div>
                  {state === 'ASSIGNED' && i === 3 && <span className="op-tile-badge" style={{ display: 'none' }}>2</span>}
                </div>
              ))}
            </div>
          </div>
          <div className="op-widget-foot">
            <span style={{ color: 'var(--steel-dim)' }}>+195 more needing attention</span>
            <a onClick={() => setActive('task-hist')} style={{ cursor: 'pointer' }}>Manage all →</a>
          </div>
        </div>

        {/* ─── Doors Needing Attention ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <IDock size={18} className="ico" />
            <h3>Doors Needing Attention</h3>
            <div className="actions"><IRefresh size={14} /></div>
          </div>
          <div className="op-chip-row">
            <span className="chip chip--ember">29 Need Attention</span>
            <span className="chip chip--neon">30 Occupied</span>
            <span className="chip chip--success">14 Available</span>
          </div>
          <div className="op-widget-body">
            <div className="op-tile-grid" style={{ gridTemplateColumns: 'repeat(3, 1fr)' }}>
              {[
                ['D01', 'ready',  'TRAILER READY', '32230'],
                ['D05', 'ready',  'TRAILER READY', '269334'],
                ['D06', 'empty',  'EMPTY', '383'],
                ['D07', 'empty',  'EMPTY', '5353RCI'],
                ['D08', 'loading','LOADING START…', '147014'],
                ['D09', 'loading','LOADED', 'PRTZ171020'],
                ['D10', 'loading','LOADING START…', '140290'],
                ['D11', 'loading','LOADING START…', 'RJ8473'],
                ['D12', 'ready',  'TRAILER READY', 'U33076'],
                ['D13', 'loading','LOADING START…', 'U30203'],
                ['D14', 'ready',  'TRAILER READY', '55448'],
                ['D15', 'ready',  'TRAILER READY', '13222'],
              ].map(([code, state, label, t]) => (
                <div key={code} className={`op-door ${state}`}>
                  <div className="op-door-code">{code}</div>
                  <div className="op-door-state">{label}</div>
                  <div className="op-door-trailer">{t}</div>
                </div>
              ))}
            </div>
          </div>
          <div className="op-widget-foot">
            <span style={{ color: 'var(--steel-dim)' }}>+17 more needing attention</span>
            <a onClick={() => setActive('dock-mgt')} style={{ cursor: 'pointer' }}>View all doors →</a>
          </div>
        </div>

        {/* ─── Customer Feedback ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <IConfirm size={18} className="ico" />
            <h3>Customer Feedback</h3>
            <span className="chip chip--success">●  Live</span>
          </div>
          <div className="op-widget-body" style={{ padding: 0 }}>
            <div className="op-testimonial">
              <div className="op-testimonial-eyebrow">
                <span className="chip chip--neon">Survey #869</span>
                <span className="chip chip--steel">Primo Brands → Walmart</span>
              </div>
              <p className="op-testimonial-quote">
                <span className="q">"</span>
                I lost my paperwork at the shipper. I got in trouble — was losing my load. Then I went back through and found this shipping manifest, downloaded it, and gave it to Walmart the receiver. My company called me missing a page so I just sent them right off my phone. <strong>It was easy and it saved my butt.</strong>
              </p>
              <div className="op-testimonial-meta">
                <span>Driver · 509-386-0785</span>
                <a onClick={() => setActive('driver-comms')} style={{ cursor: 'pointer' }}>View all feedback →</a>
              </div>
            </div>
          </div>
        </div>

        {/* ─── Driver Messages ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <IChat size={18} className="ico" />
            <h3>Driver Messages</h3>
            <span className="chip chip--steel">24h</span>
          </div>
          <div className="op-widget-body" style={{ padding: 0 }}>
            <div className="op-msg-empty">
              <IChat size={28} className="ico" style={{ color: 'rgba(0,180,255,0.25)' }} />
              <div className="h">No recent driver messages</div>
              <div className="s">Messages from drivers will appear here</div>
            </div>
          </div>
        </div>

        {/* ─── Empty Trailers by SCAC ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <ITrailers size={18} className="ico" />
            <h3>Empty Trailers by SCAC</h3>
            <span className="chip chip--neon">115 total</span>
          </div>
          <div className="op-widget-body">
            <table className="op-table">
              <thead><tr><th>SCAC</th><th className="right">Empty</th></tr></thead>
              <tbody>
                {[
                  ['MEIJ', 19], ['HIRS', 13], ['FAKE', 8], ['HOSD', 6],
                  ['RWXD', 6], ['NFIL', 6], ['RUAN', 5], ['TJTL', 4],
                  ['INJM', 4], ['WSXI', 4],
                ].map(([s, n]) => (
                  <tr key={s}><td className="white">{s}</td><td className="right">{n}</td></tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        {/* ─── BOL Awaiting Signature ─── */}
        <div className="op-widget">
          <div className="op-widget-head">
            <ITask size={18} className="ico" />
            <h3>BOL Awaiting Signature</h3>
            <span className="chip chip--ember">16 overdue</span>
            <span className="chip chip--steel" style={{ marginLeft: 4 }}>16 total</span>
          </div>
          <div className="op-widget-body">
            <table className="op-table">
              <thead><tr><th>Ref #</th><th>Dir</th><th>Carrier</th><th>Status</th><th className="right">Age</th></tr></thead>
              <tbody>
                {[
                  ['T924046250', 'OB', 'RWXD', 'in_transit', '691h 33m'],
                  ['T922936752', 'OB', 'WEDD', 'in_transit', '687h 57m'],
                  ['T922995080', 'OB', 'CVBG', 'in_transit', '682h 55m'],
                  ['T924048976', 'OB', 'CEFV', 'in_transit', '589h 2m'],
                  ['T924048976', 'OB', 'CEFV', 'in_transit', '589h 2m'],
                  ['T924026477', 'OB', 'RWXD', 'in_transit', '520h 38m'],
                  ['T924220781', 'OB', 'CEFV', 'in_transit', '498h 50m'],
                  ['T924456520', 'OB', 'GSWA', 'in_transit', '339h 14m'],
                ].map((r, i) => (
                  <tr key={i} className="overdue">
                    <td className="id">{r[0]}</td><td>{r[1]}</td><td>{r[2]}</td><td>{r[3]}</td><td className="right">{r[4]}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

      </div>
    </>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Dock Management
// ═══════════════════════════════════════════════════════════════════
const DOCKS = [
  { code: 'D01', state: 'alert',   chip: 'TRAILER READY',  chipTone: 'success', dir: 'Outbound', driver: 'No Driver', scac: 'HOSD', trailer: '31672', ref: 'T920207503', type: 'Drop', mdt: '01/16/2026 05:26', appt: '01/15/2026 03:00', mdtTimer: '46:12:33', dockTimer: '16:53:10', det: 'N/A', actions: ['yard','dock','load'] },
  { code: 'D02', state: 'alert',   chip: 'TRAILER READY',  chipTone: 'success', dir: 'Outbound', driver: 'No Driver', scac: 'HOSD', trailer: '32033', ref: 'T920000180', type: 'Drop', mdt: '01/20/2026 04:26', appt: '01/19/2026 03:00', mdtTimer: '141:12:33', dockTimer: '22:08:04', det: 'N/A', actions: ['yard','dock','load'], notes: '' },
  { code: 'D03', state: 'available', chip: 'AVAILABLE', chipTone: 'success' },
  { code: 'D04', state: 'available', chip: 'AVAILABLE', chipTone: 'success' },
  { code: 'D05', state: 'available', chip: 'AVAILABLE', chipTone: 'success' },
  { code: 'D06', state: 'alert',   chip: 'EMPTY', chipTone: 'steel', scac: 'INJM', trailer: '368', driver: 'No Driver', mdtTimer: 'N/A', dockTimer: '00:00:00', det: 'N/A', actions: ['yard','dock'] },
  { code: 'D07', state: '',        chip: 'EMPTY', chipTone: 'steel', scac: 'ZPKU', trailer: '6627RCI', driver: 'No Driver', mdtTimer: 'N/A', dockTimer: '286:04:24', det: 'N/A', actions: ['yard','dock'], dockTimerAlert: true },
  { code: 'D08', state: 'loading', chip: 'LOADING STARTED', chipTone: 'warn', dir: 'Outbound', driver: 'No Driver', scac: 'KUCD', trailer: '16638', ref: 'T920408566', type: 'Drop', mdt: '01/15/2026 03:15', appt: '01/14/2026 15:00', mdtTimer: '20:01:33', dockTimer: '04:00:17', det: 'N/A', actions: ['yard','dock','done'], notes: 'T920408566' },
];

const DockMgtView = () => (
  <>
    <div className="op-view-head">
      <div>
        <h1 className="op-view-title">Dock Management</h1>
        <p className="op-view-sub">Monitor and manage dock doors · 14 of 44 occupied · 30 available</p>
      </div>
      <div className="actions">
        <div className="op-toggle is-off"><span className="sw" /> Compact View</div>
        <div className="op-facility"><span className="name">Time: Max</span></div>
      </div>
    </div>

    <div className="op-wb-filters">
      <div style={{ display:'flex', gap: 12, alignItems:'center', flexWrap:'wrap' }}>
        <span style={{ color: 'var(--steel-dim)', fontSize: 12 }}>Filters:</span>
        <select className="op-select"><option>All Dock Types</option></select>
        <select className="op-select"><option>All Shipment Types</option></select>
        <select className="op-select"><option>Sort By: Zone Order</option></select>
        <button className="op-btn op-btn--ghost"><IMove size={14} /> Ascending</button>
      </div>
    </div>

    <div className="op-dock-grid">
      {DOCKS.map(d => (
        <div key={d.code} className={`op-dockcard ${d.state}`}>
          <div className="op-dockcard-head">
            <div className="op-dockcard-code"><span className="code">Door {d.code}</span></div>
            <span className={`chip chip--${d.chipTone}`}>{d.chip}</span>
          </div>

          {d.state !== 'available' && (
            <>
              <div className="op-timers">
                <div className={`op-timer ${d.mdtTimer === 'N/A' ? 'na' : ''}`}><div className="op-timer-label">MDT</div><div className="op-timer-value">{d.mdtTimer}</div></div>
                <div className={`op-timer ${(d.dockTimerAlert || d.dockTimer && d.dockTimer !== '00:00:00') ? 'alert' : (d.dockTimer === '00:00:00' ? 'na' : '')}`}><div className="op-timer-label">Dock Timer</div><div className="op-timer-value">{d.dockTimer}</div></div>
                <div className={`op-timer ${d.det === 'N/A' ? 'na' : ''}`}><div className="op-timer-label">Det. time</div><div className="op-timer-value">{d.det}</div></div>
              </div>

              {d.dir && <span className="chip chip--warn" style={{ alignSelf: 'flex-start' }}>{d.dir}</span>}

              <div className="op-dockcard-info">
                {d.driver && <div className="row"><span className="k">Driver:</span><span className="v">{d.driver}</span></div>}
                {d.scac && <div className="row"><span className="k">SCAC:</span><span className="v">{d.scac}</span></div>}
                {d.trailer && <div className="row"><span className="k">Trailer:</span><span className="v">{d.trailer}</span></div>}
                {d.ref && <div className="row"><span className="k">Ref #:</span><span className="v">{d.ref}</span></div>}
                {d.type && <div className="row"><span className="k">Type:</span><span className="v">{d.type}</span></div>}
                {d.mdt && <div className="row"><span className="k">MDT:</span><span className="v">{d.mdt}</span></div>}
                {d.appt && <div className="row"><span className="k">Appt:</span><span className="v">{d.appt}</span></div>}
              </div>

              <div className={`op-dockcard-actions ${d.actions && d.actions.length === 3 ? 'three' : ''}`}>
                {d.actions && d.actions.includes('yard') && <button className="op-dockact op-dockact--yard" onClick={() => window.openOpModal('move', { trailer: d.trailer, scac: d.scac, from: `Dock ${d.code}`, status: d.chip === 'EMPTY' ? 'EMPTY' : 'LOADED', suggestedDest: 'yard' })}>⇆ Move To Yard</button>}
                {d.actions && d.actions.includes('dock') && <button className="op-dockact op-dockact--dock" onClick={() => window.openOpModal('move', { trailer: d.trailer, scac: d.scac, from: `Dock ${d.code}`, status: d.chip === 'EMPTY' ? 'EMPTY' : 'LOADED', suggestedDest: 'dock' })}>⇆ Move To Dock</button>}
                {d.actions && d.actions.includes('load') && <button className="op-dockact op-dockact--load">→ Start Loading</button>}
                {d.actions && d.actions.includes('done') && <button className="op-dockact op-dockact--done">→ Complete Loading</button>}
              </div>
            </>
          )}

          {d.state === 'available' && (
            <div style={{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--steel-dim)', fontFamily: 'var(--font-mono)', fontSize: 12, letterSpacing: '0.06em' }}>
              READY
            </div>
          )}
        </div>
      ))}
    </div>
  </>
);

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Yard Spot Management
// ═══════════════════════════════════════════════════════════════════
const YardSpotView = () => {
  // Color: empty=yellow (has empty trailer parked), loaded=blue (has loaded trailer), avail=green
  const spots = [
    { n: 1, id: '3910', scac: 'GIMV', state: 'moving' },
    { n: 2, id: 'R48331', scac: 'NATW', state: 'empty' },
    { n: 3, id: '8502', scac: 'MEIJ', state: 'empty' },
    { n: 4, id: '9058JP', scac: 'TTFD', state: 'empty' },
    { n: 5, state: 'avail' },
    { n: 6, id: '43186', scac: 'SRLR', state: 'empty' },
    { n: 7, id: '340402', scac: 'WSXI', state: 'empty' },
    { n: 8, id: 'W91916', scac: 'HIRS', state: 'empty' },
    { n: 9, id: 'RFV222', scac: 'LSPI', state: 'loaded' },
    { n: 10, id: 'W91502', scac: 'HIRS', state: 'empty' },
    { n: 11, state: 'avail' },
    { n: 12, id: '7421', scac: 'SJRG', state: 'empty' },
    { n: 13, id: '5977', scac: 'GRTG', state: 'loaded' },
    { n: 14, id: '53446', scac: 'ZENS', state: 'empty' },
    { n: 15, state: 'avail' },
    { n: 16, state: 'avail' },
    { n: 17, state: 'avail' },
    { n: 18, id: 'SF23034', scac: 'MEIJ', state: 'loaded' },
    { n: 19, id: '7212', scac: 'WALM', state: 'empty' },
    { n: 20, state: 'avail' },
    { n: 21, id: '40392', scac: 'GSWA', state: 'loaded' },
    { n: 22, state: 'avail' },
    { n: 23, id: '88341', scac: 'KBTO', state: 'empty' },
    { n: 24, id: '11020', scac: 'CEFV', state: 'loaded' },
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Yard Spot Management</h1>
          <p className="op-view-sub">Parking Spots · 24 of 84 active · <span className="chip chip--warn" style={{ marginLeft: 6 }}>● Empty</span> <span className="chip chip--neon" style={{ marginLeft: 4 }}>● Loaded</span> <span className="chip chip--success" style={{ marginLeft: 4 }}>● Available</span></p>
        </div>
        <div className="actions">
          <button className="op-btn op-btn--ghost"><IRefresh size={14} /> Refresh data</button>
          <button className="op-btn op-btn--ghost"><ISave size={14} /> Save filters</button>
        </div>
      </div>

      <div className="op-wb-filters">
        <select className="op-select"><option>US PL Mecosta F…</option></select>
        <select className="op-select"><option>Parking Spot…</option></select>
        <select className="op-select"><option>All Spots</option></select>
        <label style={{ display: 'inline-flex', gap: 6, alignItems: 'center', color: 'var(--steel)', fontSize: 12 }}>
          <input type="checkbox" defaultChecked /> Show unallocated assets
        </label>
      </div>

      <div style={{ marginBottom: 14 }}>
        <div style={{ color: 'var(--neon)', fontSize: 14, fontWeight: 700, marginBottom: 6 }}>Parking Spot</div>
        <div style={{ color: 'var(--steel-dim)', fontSize: 11, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', textTransform: 'uppercase' }}>Yard Spots · zone A</div>
      </div>

      <div className="op-yard-grid">
        {spots.map(s => (
          <div key={s.n} className={`op-spot ${s.state}`}>
            <div className="op-spot-num">{s.n}</div>
            {s.state === 'avail'
              ? <div className="op-spot-avail">Available</div>
              : <>
                <div className="op-spot-id">{s.id}</div>
                <div className="op-spot-scac">{s.scac}</div>
                <div className="op-spot-actions">
                  {s.state === 'moving'
                    ? <div className="op-spot-act" style={{ background: 'rgba(140,80,220,0.18)', color: '#C08CFF', borderColor: 'rgba(140,80,220,0.45)' }}>⇆ Moving</div>
                    : <>
                      <div className="op-spot-act">→ To Yard</div>
                      <div className="op-spot-act">→ To Dock</div>
                    </>
                  }
                </div>
              </>
            }
          </div>
        ))}
      </div>
    </>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Whiteboard / Driver Board
// ═══════════════════════════════════════════════════════════════════
const WhiteboardView = () => {
  const rows = [
    ['Abdelghani Kenzi',   'T920272501', '301',    'TTFD', 'OB', 'Live', 'EMPTY',  '1/13/2026, 3:00:00 AM',  '1/13/2026, 3:09:29 PM',  '1/13/2026, 4:04:00 PM',  'Waiting'],
    ['Adam Lipps',         'T919900324', 'BT6026', 'CVBG', 'IB', 'Live', 'LOADED', '1/11/2026, 6:00:00 PM',  '1/13/2026, 2:15:20 PM',  '—',                        'Waiting'],
    ['Adrian Chacon',      'T920321224', '5509',   'RWXD', 'OB', 'Live', 'EMPTY',  '1/13/2026, 12:00:00 PM', '1/13/2026, 3:54:14 PM',  '1/13/2026, 9:21:00 PM',  'Waiting'],
    ['Charles Ross',       'T920248875', '301',    'RWXD', 'OB', 'Live', 'EMPTY',  '1/13/2026, 9:00:00 AM',  '1/13/2026, 3:54:20 PM',  '1/13/2026, 11:28:00 PM', 'Waiting'],
    ['Chris Hanel',        'T920321264', 'H02670', 'CVBG', 'OB', 'Live', 'EMPTY',  '1/13/2026, 5:00:00 PM',  '1/13/2026, 1:59:03 PM',  '1/13/2026, 6:51:00 PM',  'Waiting'],
    ['Christopher Johnson','T920126330', 'P08',    'CVBG', 'OB', 'Live', 'EMPTY',  '1/13/2026, 3:00:00 PM',  '1/13/2026, 4:15:53 PM',  '1/13/2026, 7:53:00 PM',  'Waiting'],
    ['Jose Hidalgo',       'T920239106', '—',      '—',    'OB', 'Drop','Unknown','1/12/2026, 6:00:00 AM',  '1/12/2026, 1:55:50 PM',  '1/12/2026, 6:27:00 PM',  'Waiting'],
    ['R. Dean',            'T920272467', 'W91939', 'RBTW', 'OB', 'Live', 'EMPTY',  '1/13/2026, 12:00:00 PM', '1/13/2026, 3:36:26 PM',  '1/13/2026, 5:50:00 PM',  'Waiting'],
    ['Robert Kirkland',    'T920316702', '010758', 'CVBG', 'OB', 'Live', 'EMPTY',  '1/13/2026, 12:00:00 PM', '1/13/2026, 4:11:15 PM',  '1/13/2026, 6:06:00 PM',  'Waiting'],
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Driver Board</h1>
          <p className="op-view-sub">White Board · 9 drivers · last refreshed 14:42:08 UTC</p>
        </div>
      </div>

      <div className="op-wb-filters">
        <select className="op-select"><option>Facility · US PL Mecosta Factory</option></select>
        <select className="op-select"><option>View · Unassigned Drivers</option></select>
        <select className="op-select"><option>Time Period · 48 hours</option></select>
        <button className="op-btn op-btn--ghost"><IRefresh size={14} /></button>
        <span className="chip chip--solid-neon">9 drivers</span>
      </div>

      <div style={{ background: 'rgba(17,19,24,0.95)', border: '1px solid rgba(0,180,255,0.10)', borderRadius: 14, overflow: 'hidden' }}>
        <table className="op-table" style={{ fontSize: 12 }}>
          <thead>
            <tr>
              <th>Driver Name ↑</th><th>Shipment</th><th>Trailer #</th><th>SCAC</th><th>Type</th><th>Shipment Type</th><th>Trailer Status</th><th>Appointment</th><th>Check-in</th><th>MDT</th><th className="right">Status</th>
            </tr>
          </thead>
          <tbody>
            {rows.map((r, i) => (
              <tr key={i}>
                <td className="white">{r[0]}</td>
                <td className="id">{r[1]}</td>
                <td>{r[2]}</td>
                <td>{r[3]}</td>
                <td><span className={`chip ${r[4] === 'OB' ? 'chip--neon' : 'chip--success'}`}>{r[4] === 'OB' ? 'Outbound' : 'Inbound'}</span></td>
                <td>{r[5]}</td>
                <td className="white">{r[6]}</td>
                <td>{r[7]}</td>
                <td>{r[8]}</td>
                <td>{r[9]}</td>
                <td className="right"><span className="chip chip--warn">{r[10]}</span></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Driver Comms
// ═══════════════════════════════════════════════════════════════════
const DriverCommsView = () => {
  const [activeId, setActiveId] = useState(0);
  const list = [
    { name: 'Ed Ed',        ts: '12:42 PM', state: 'Checkin', shipment: 'T227512575', type: 'Live',  dir: 'Outbound', trailer: 'VCV123 (LSPI)', checkin: '12:20 PM', loc: 'DockDoor: D02', unread: true },
    { name: 'Ed Ed',        ts: '12:42 PM', state: 'Checkin', shipment: 'T227512575', type: 'Live',  dir: 'Outbound', trailer: 'VCV123 (LSPI)', checkin: '12:20 PM', loc: 'DockDoor: D02', unread: true },
    { name: 'David Santos', ts: '12:31 PM', state: 'Checkin', shipment: 'T227513404', type: 'Live',  dir: 'Inbound',  trailer: 'BT6026 (CVBG)',  checkin: '11:48 AM', loc: 'GATE: G01' },
    { name: 'Robert K.',    ts: '11:14 AM', state: 'Idle',    shipment: 'T227510921', type: 'Drop',  dir: 'Outbound', trailer: '010758 (CVBG)',  checkin: '09:52 AM', loc: 'Yard Spot: 21' },
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Driver Comms</h1>
          <p className="op-view-sub">Communicate with drivers before, during, and after facility visits · 17 active chats</p>
        </div>
        <div className="actions">
          <select className="op-select"><option>Category · Active</option></select>
          <select className="op-select"><option>24 hours</option></select>
        </div>
      </div>

      <div className="op-comms">
        <div className="op-comms-list">
          <div className="op-comms-list-tabs">
            <div className="t active">All</div>
            <div className="t">Active chats</div>
            <div className="t">Available</div>
          </div>
          <div style={{ padding: '12px 14px', borderBottom: '1px solid rgba(0,180,255,0.08)' }}>
            <input className="op-input" style={{ width: '100%' }} placeholder="Search drivers, shipments…" />
          </div>
          <div className="op-comms-list-body">
            {list.map((d, i) => (
              <div key={i} className={`op-comms-row ${activeId === i ? 'is-active' : ''}`} onClick={() => setActiveId(i)}>
                <div className="head">
                  <span className="name">{d.name}</span>
                  <span className="ts">{d.ts}</span>
                </div>
                <div className="meta">
                  <span className="chip chip--success" style={{ marginRight: 6 }}>● {d.state}</span><br />
                  <span><span className="label">Shipment:</span> <span style={{ color: 'var(--neon)' }}>{d.shipment}</span></span><br />
                  <span><span className="label">Type:</span> {d.type} &nbsp;·&nbsp; <span className="label">Dir:</span> {d.dir}</span><br />
                  <span><span className="label">Trailer:</span> {d.trailer}</span><br />
                  <span><span className="label">Checked in:</span> {d.checkin}</span><br />
                  <span><span className="label">Location:</span> {d.loc}</span>
                </div>
              </div>
            ))}
          </div>
        </div>

        <div className="op-comms-thread">
          <div className="op-comms-thread-head">
            <div className="op-avatar" style={{ width: 36, height: 36, fontSize: 12 }}>EE</div>
            <span className="name">Ed Ed</span>
            <span className="chip chip--success">● Checkin</span>
            <span className="chip chip--steel">Phone: 313-520-8444</span>
            <span className="chip chip--neon">Trailer: VCV123 (LSPI)</span>
            <span className="chip chip--steel">Shipment: T227512575</span>
            <span className="chip chip--steel">Type: Live</span>
            <span className="chip chip--steel">Dir: Outbound</span>
            <span className="chip chip--steel">Checked In: 12:20 PM</span>
            <span className="chip chip--steel">Location: DockDoor: D02</span>
          </div>
          <div className="op-comms-thread-body">
            <div className="op-bubble us">
              <div className="meta">Kopp · Yesterday 3:59 PM</div>
              You have been assigned to dock D02. Please reply to this text to confirm once you're in the door.
            </div>
            <div className="op-bubble us">
              <div className="meta">Kopp · 12:32 PM</div>
              You have been assigned to dock D02. Please reply to this text to confirm once you're in the door.
            </div>
            <div className="op-bubble them">
              <div className="meta">Ed Ed · 12:42 PM</div>
              Here
            </div>
            <div className="op-bubble us">
              <div className="meta">Kopp · 12:42 PM</div>
              ok, getting you loaded now
            </div>
          </div>
          <div className="op-comms-thread-composer">
            <input placeholder="Type a message…" />
            <button className="op-btn op-btn--primary">Send</button>
          </div>
        </div>
      </div>
    </>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · Placeholder for unbuilt screens
// ═══════════════════════════════════════════════════════════════════
//  VIEW · Driver Management
const DriverMgtView = () => {
  const drivers = [
    { name: 'Albert Dozier',    ref: 'T920272316', trailer: '101',   dir: 'Outbound', kind: 'Live', appt: '01/14/2026 12:00', depart: '01/14/2026 20:53', checkin: '01/14/2026, 2:11:18 PM' },
    { name: 'Etwone Offord',    ref: 'T920141354', trailer: '2505',  dir: 'Outbound', kind: 'Live', appt: '01/14/2026 19:00', depart: '01/15/2026 21:24', checkin: '01/14/2026, 1:27:24 PM' },
    { name: 'Prince Gibson',    ref: 'T920197596', trailer: '24004', dir: 'Outbound', kind: 'Live', appt: '01/14/2026 21:00', depart: '01/15/2026 06:42', checkin: '—' },
    { name: 'Reuben Avalos',    ref: 'T920184502', trailer: '5722',  dir: 'Inbound',  kind: 'Drop', appt: '01/15/2026 02:00', depart: '01/15/2026 09:00', checkin: '—' },
    { name: 'Sergio Mendoza',   ref: 'T920196870', trailer: '8821',  dir: 'Outbound', kind: 'Live', appt: '01/15/2026 04:00', depart: '01/15/2026 12:30', checkin: '—' },
    { name: 'Thomas Wang',      ref: 'T920201299', trailer: '3061',  dir: 'Outbound', kind: 'Live', appt: '01/15/2026 06:30', depart: '01/15/2026 15:00', checkin: '—' },
  ];
  const spots = [
    { code: 'D03' }, { code: 'D04' }, { code: 'D05' }, { code: 'D12' },
    { code: 'D21' }, { code: 'D25' }, { code: 'D26' }, { code: 'D28' },
    { code: 'D32' }, { code: 'D48' }, { code: 'D61' },
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Drivers</h1>
          <p className="op-view-sub">Assign unassigned drivers to available dock or yard locations</p>
        </div>
        <div className="actions">
          <select className="op-select"><option>US PL Mecosta F…</option></select>
          <select className="op-select"><option>24 hours</option></select>
          <button className="op-btn op-btn--ghost"><IRefresh size={14} /></button>
        </div>
      </div>

      <div className="op-dm-layout">
        <div className="op-dm-panel">
          <div className="op-dm-panel-head">
            <h3>Unassigned Drivers</h3>
            <span className="chip chip--neon">{drivers.length}</span>
          </div>
          <div style={{ display: 'flex', gap: 8, padding: '0 12px 10px' }}>
            <input className="op-input" placeholder="Search drivers…" style={{ flex: 1 }} />
            <select className="op-select"><option>Default</option><option>Must Depart Time</option><option>Appt Time</option><option>Check-in Time</option></select>
          </div>
          <div className="op-dm-panel-body">
            {drivers.map((d, i) => (
              <div key={i} className="op-dm-card" onClick={() => window.openOpModal('assign-driver', d)}>
                <span className="chip chip--success live">● Live</span>
                <div className="name">{d.name}</div>
                <div className="chips">
                  <span className={`chip ${d.dir === 'Outbound' ? 'chip--neon' : 'chip--success'}`}>{d.dir}</span>
                  <span className="chip chip--steel">{d.kind}</span>
                </div>
                <div className="rows">
                  <div><span className="k">Ref #:</span> {d.ref}</div>
                  <div><span className="k">Trailer:</span> {d.trailer}</div>
                  <div><span className="k">Appt:</span> {d.appt}</div>
                  <div><span className="k">Must Depart:</span> {d.depart}</div>
                  <div><span className="k">Checked in:</span> {d.checkin}</div>
                </div>
              </div>
            ))}
          </div>
        </div>

        <div className="op-dm-panel">
          <div className="op-dm-panel-head">
            <h3>Available Spots</h3>
            <span className="chip chip--success">{spots.length}</span>
            <div style={{ marginLeft: 'auto', display: 'flex', gap: 8, alignItems: 'center' }}>
              <label style={{ display: 'inline-flex', gap: 6, alignItems: 'center', color: 'var(--steel)', fontSize: 12 }}>
                <input type="checkbox" /> Show unavailable
              </label>
              <select className="op-select"><option>Dock Doors …</option><option>Yard Spots Only</option><option>All</option></select>
            </div>
          </div>
          <div className="op-dm-zone-header">
            <span>default</span>
            <span>{spots.length} spots</span>
          </div>
          <div className="op-dm-panel-body">
            <div className="op-dm-spots-grid">
              {spots.map(s => (
                <div key={s.code} className="op-dm-spot-card" onClick={() => window.openOpModal('assign-driver', { startFromSpot: s.code })}>
                  <div className="op-dm-spot-code">{s.code}</div>
                  <div className="op-dm-spot-state"><span className="chip chip--success">Available</span></div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

//  VIEW · Trailers (grouped by location)
const TrailersView = () => {
  const [filter, setFilter] = useState('ALL');
  const groups = [
    { name: 'Dock Doors — Warehouse', count: 30, rows: [
      { trailer: '32230',   scac: 'HOSD', status: 'EMPTY',  ref: 'T925765302', time: 'Apr 3, 2026, 7:41 PM',  loc: 'Dock: D01' },
      { trailer: '269334',  scac: 'GSWA', status: 'LOADED', ref: '4521342677', time: 'Apr 1, 2026, 3:18 PM',  loc: 'Dock: D05' },
      { trailer: '383',     scac: 'INJM', status: 'EMPTY',  ref: 'No Shipment', time: 'Apr 1, 2026, 9:55 AM', loc: 'Dock: D06' },
      { trailer: '5353RCI', scac: 'ZPKU', status: 'EMPTY',  ref: 'No Shipment', time: 'Apr 2, 2026, 9:14 AM', loc: 'Dock: D07' },
      { trailer: '147014',  scac: 'GSWA', status: 'LOADED', ref: 'T925563989', time: 'Apr 4, 2026, 7:17 AM',  loc: 'Dock: D08', locked: true },
      { trailer: 'PRTZ171020', scac: 'GSWA', status: 'LOADED', ref: 'No Shipment', time: 'Apr 4, 2026, 4:41 PM', loc: 'Dock: D09' },
      { trailer: '140290',  scac: 'CEFV', status: 'LOADED', ref: 'T925134508', time: 'Apr 5, 2026, 1:02 AM',  loc: 'Dock: D10' },
    ]},
    { name: 'Yard Spots — Zone A', count: 24, rows: [
      { trailer: 'R48331',  scac: 'NATW', status: 'EMPTY',  ref: 'No Shipment', time: 'Apr 2, 2026, 11:14 AM', loc: 'Yard: 02' },
      { trailer: 'RFV222',  scac: 'LSPI', status: 'LOADED', ref: 'T227591598', time: 'Apr 1, 2026, 5:33 PM',  loc: 'Yard: 09' },
      { trailer: '498625',  scac: 'SHAF', status: 'EXITED', ref: 'No Shipment', time: 'Just now · via flowGATE', loc: 'Spot 17 → Gate G01' },
    ]},
  ];
  const filtered = filter === 'ALL' ? groups : groups.map(g => ({ ...g, rows: g.rows.filter(r => r.status === filter) })).filter(g => g.rows.length);
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Trailers</h1>
          <p className="op-view-sub">Dock + yard inventory · search by T# / Trailer # / SCAC / Status</p>
        </div>
      </div>

      <div className="op-wb-filters">
        <select className="op-select"><option>(39) US PL Mecosta Factory</option></select>
        <input className="op-input" placeholder="Search trailers, status, shipment…" style={{ minWidth: 280 }} />
        {['EMPTY','LOADED','OOS'].map(s => (
          <button key={s} className={`chip ${filter === s ? 'chip--solid-neon' : 'chip--steel'}`} style={{ cursor: 'pointer' }} onClick={() => setFilter(filter === s ? 'ALL' : s)}>{s}</button>
        ))}
        <button className="op-btn op-btn--ghost" onClick={() => setFilter('ALL')}><IRefresh size={14} /></button>
        <span style={{ marginLeft: 'auto', display:'flex', gap: 10, alignItems:'center' }}>
          <span className="chip chip--solid-neon">253 trailers</span>
          <button className="op-btn op-btn--primary" onClick={() => window.openOpModal('add')}>+ ADD TRAILER</button>
          <button className="op-btn op-btn--ghost">Generate Report</button>
        </span>
      </div>

      <div className="op-tr-table-wrap">
        {filtered.map((g, gi) => (
          <React.Fragment key={gi}>
            <div className="op-tr-group">
              <span>{g.name}</span>
              <span className="count">({g.count} trailers)</span>
            </div>
            <table className="op-table op-tr-table" style={{ tableLayout: 'fixed' }}>
              <thead>
                <tr>
                  <th style={{ width: '18%' }}>Trailer / SCAC</th>
                  <th style={{ width: '10%' }}>Status</th>
                  <th style={{ width: '15%' }}>Shipment Ref</th>
                  <th style={{ width: '17%' }}>Check-In Time</th>
                  <th style={{ width: '15%' }}>Current Location</th>
                  <th style={{ width: '25%' }} className="right">Actions</th>
                </tr>
              </thead>
              <tbody>
                {g.rows.map((r, i) => (
                  <tr key={i}>
                    <td>
                      <div className="trailer-id">{r.trailer}{r.locked && <span className="chip chip--warn" style={{ marginLeft: 8 }}>LOCKED</span>}</div>
                      <div className="scac">{r.scac}</div>
                    </td>
                    <td><span className={`status status-${r.status}`}>{r.status}</span></td>
                    <td className="id" style={{ fontFamily: 'var(--font-mono)' }}>{r.ref}</td>
                    <td>{r.time}</td>
                    <td className="white">{r.loc}</td>
                    <td className="right">
                      <div className="op-tr-actions">
                        <button className="op-tr-btn op-tr-btn--edit" disabled={r.locked} onClick={() => window.openOpModal('reset', { trailer: r.trailer, scac: r.scac, status: r.status, loc: r.loc, ref: r.ref })}>EDIT</button>
                        <button className="op-tr-btn op-tr-btn--move" disabled={r.locked} onClick={() => window.openOpModal('move', { trailer: r.trailer, scac: r.scac, from: r.loc, status: r.status, suggestedDest: 'yard' })}>MOVE</button>
                        {r.locked && <button className="op-tr-btn op-tr-btn--lock" onClick={() => alert(`Clear lock on ${r.trailer}? (demo)`)}>CLEAR LOCK</button>}
                      </div>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </React.Fragment>
        ))}
      </div>
    </>
  );
};

//  VIEW · Task App
const TaskAppView = () => {
  const [tab, setTab] = useState('available');
  const tasks = [
    { from: 'D09', to: 'Staging',  trailer: 'PTLZ260055', scac: 'GSWA', created: '10/29/25, 10:42 AM', type: 'MOVE_TRAILER' },
    { from: 'D11', to: 'D06',      trailer: 'PTLZ260055', scac: 'GSWA', created: '11/3/25, 12:44 PM',  type: 'MOVE_TRAILER' },
    { from: 'D14', to: 'Yard: 12', trailer: 'W91916',     scac: 'HIRS', created: '10/24/25, 3:40 PM',  type: 'MOVE_TRAILER' },
    { from: 'Gate',to: 'D03',      trailer: '32230',      scac: 'HOSD', created: '10/24/25, 4:15 PM',  type: 'MOVE_TRAILER' },
    { from: 'D02', to: 'Staging',  trailer: '8821',       scac: 'CVBG', created: '10/22/25, 11:08 AM', type: 'MOVE_TRAILER' },
  ];
  const mine = [
    { from: 'D08', to: 'Yard: 21', trailer: 'KUCD16638', scac: 'KUCD', created: '12:14 PM today', type: 'MOVE_TRAILER', state: 'IN PROGRESS' },
    { from: 'D11', to: 'Gate',     trailer: 'T-1389',    scac: 'WEDD', created: '11:42 AM today', type: 'SAFETY_CHECK', state: 'IN PROGRESS' },
  ];
  const list = tab === 'available' ? tasks : mine;
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Task App</h1>
          <p className="op-view-sub">Spotter task queue · take an open task or manage your in-progress ones</p>
        </div>
        <div className="actions">
          <span className="chip chip--warn">15 unassigned</span>
          <button className="op-btn op-btn--ghost" onClick={() => window.openOpModal('prioritize')}>Prioritize</button>
        </div>
      </div>

      <div className="op-task-head">
        <select className="op-select"><option>(39) US PL Mecosta Factory</option></select>
        <input className="op-input" placeholder="Search tasks (UUID or text)…" style={{ flex: 1, maxWidth: 480 }} />
        <button className="op-btn op-btn--ghost"><IRefresh size={14} /></button>
      </div>

      <div className="op-task-tabs">
        <div className={`op-task-tab ${tab === 'available' ? 'is-active' : ''}`} onClick={() => setTab('available')}>Available Tasks</div>
        <div className={`op-task-tab ${tab === 'mine' ? 'is-active' : ''}`} onClick={() => setTab('mine')}>My Tasks</div>
      </div>

      <div className="op-task-table-wrap">
        <div className="op-task-row header">
          <div>Type · From → To</div>
          <div>Status</div>
          <div>Created</div>
          <div style={{ textAlign: 'right' }}>Actions</div>
        </div>
        {list.map((t, i) => (
          <div key={i} className="op-task-row">
            <div className="op-task-type-block">
              <span className="chip chip--solid-neon" style={{ alignSelf: 'flex-start' }}>{t.type}</span>
              <div className="from-to">{t.from} <span style={{ color: 'var(--steel-dim)' }}>→</span> {t.to}</div>
              <div className="meta">{t.trailer} · {t.scac}</div>
            </div>
            <div>
              {t.state
                ? <span className="chip chip--neon">{t.state}</span>
                : <span className="chip chip--warn">UNASSIGNED</span>}
            </div>
            <div style={{ color: 'var(--steel)', fontFamily: 'var(--font-mono)', fontSize: 12 }}>{t.created}</div>
            <div>
              {tab === 'available'
                ? <button className="op-task-take"><IDriver size={14} /> TAKE</button>
                : <button className="op-btn op-btn--ghost" style={{ width: '100%', justifyContent: 'center' }} onClick={() => window.openOpModal('reset', { id: t.id, type: t.type, from: t.from, to: t.to, trailer: t.trailer, scac: t.scac, state: t.state })}>View detail</button>}
            </div>
          </div>
        ))}
      </div>
    </>
  );
};

//  VIEW · Shipments
const ShipmentsView = () => {
  const rows = [
    { t: 'T920272501', scac: 'TTFD', trailer: '301',    dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 3:00 AM',  loc: 'Dock: D14', state: 'In Yard' },
    { t: 'T919900324', scac: 'CVBG', trailer: 'BT6026', dir: 'IB', kind: 'Live', status: 'LOADED', appt: '01/11/2026, 6:00 PM',  loc: 'Yard: 09',  state: 'In Yard' },
    { t: 'T920321224', scac: 'RWXD', trailer: '5509',   dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 12:00 PM', loc: 'Gate',      state: 'Departed' },
    { t: 'T920248875', scac: 'RWXD', trailer: '301',    dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 9:00 AM',  loc: 'Dock: D02', state: 'Loading' },
    { t: 'T920321264', scac: 'CVBG', trailer: 'H02670', dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 5:00 PM',  loc: 'Yard: 21',  state: 'In Yard' },
    { t: 'T920126330', scac: 'CVBG', trailer: 'P08',    dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 3:00 PM',  loc: 'Dock: D08', state: 'Loading' },
    { t: 'T920239106', scac: '—',    trailer: '—',      dir: 'OB', kind: 'Drop', status: 'Unknown',appt: '01/12/2026, 6:00 AM',  loc: 'Pending',   state: 'Awaiting check-in' },
    { t: 'T920272467', scac: 'RBTW', trailer: 'W91939', dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 12:00 PM', loc: 'Dock: D11', state: 'Ready' },
    { t: 'T920316702', scac: 'CVBG', trailer: '010758', dir: 'OB', kind: 'Live', status: 'EMPTY',  appt: '01/13/2026, 12:00 PM', loc: 'Yard: 03',  state: 'In Yard' },
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Shipments</h1>
          <p className="op-view-sub">View shipment info · search by T# · click a row for detail + Reset Driver Check-In</p>
        </div>
        <div className="actions">
          <button className="op-btn op-btn--ghost">BOL Report · Export</button>
          <button className="op-btn op-btn--primary" onClick={() => window.openOpModal('add')}>+ Add Shipment</button>
        </div>
      </div>

      <div className="op-wb-filters">
        <select className="op-select"><option>Facility · US PL Mecosta Factory</option></select>
        <input className="op-input" placeholder="Search by T#…" style={{ minWidth: 280 }} />
        <select className="op-select"><option>All Directions</option><option>Outbound</option><option>Inbound</option></select>
        <select className="op-select"><option>All States</option><option>Awaiting check-in</option><option>In Yard</option><option>Loading</option><option>Ready</option><option>Departed</option></select>
        <button className="op-btn op-btn--ghost"><IRefresh size={14} /></button>
        <span style={{ marginLeft: 'auto' }} className="chip chip--solid-neon">{rows.length} shipments</span>
      </div>

      <div className="op-admin-card">
        <table className="op-admin-table">
          <thead>
            <tr>
              <th>T#</th><th>SCAC</th><th>Trailer</th><th>Dir</th><th>Type</th><th>Trailer Status</th><th>Appointment</th><th>Current Location</th><th>State</th><th className="right">Actions</th>
            </tr>
          </thead>
          <tbody>
            {rows.map((r, i) => (
              <tr key={i}>
                <td className="id">{r.t}</td>
                <td className="mono">{r.scac}</td>
                <td className="mono white">{r.trailer}</td>
                <td><span className={`chip ${r.dir === 'OB' ? 'chip--neon' : 'chip--success'}`}>{r.dir === 'OB' ? 'Outbound' : 'Inbound'}</span></td>
                <td>{r.kind}</td>
                <td>{r.status === 'EMPTY' ? <span className="chip chip--warn">EMPTY</span> : r.status === 'LOADED' ? <span className="chip chip--neon">LOADED</span> : <span className="chip chip--steel">{r.status}</span>}</td>
                <td className="mono">{r.appt}</td>
                <td className="white">{r.loc}</td>
                <td><span className="chip chip--steel">{r.state}</span></td>
                <td className="right">
                  <button className="op-tr-btn op-tr-btn--edit" style={{ marginRight: 6 }} onClick={() => window.openOpModal('reset', { t: r.t, scac: r.scac, trailer: r.trailer, dir: r.dir === 'OB' ? 'Outbound' : 'Inbound', kind: r.kind, status: r.status, appt: r.appt, loc: r.loc })}>View detail</button>
                  <button className="op-tr-btn op-tr-btn--lock" onClick={() => window.openOpModal('reset', { t: r.t, scac: r.scac, trailer: r.trailer, dir: r.dir === 'OB' ? 'Outbound' : 'Inbound', kind: r.kind, status: r.status, appt: r.appt, loc: r.loc })}>Reset Check-In</button>
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </>
  );
};

//  VIEW · Trailer History
const TrailerHistoryView = () => {
  const events = [
    { ts: '01/14/2026, 03:42:11 PM UTC', ev: 'Departed Gate',         actor: 'A. Stafford', loc: 'Gate G01',     ref: 'T920272501', det: 'Seal #44218 · BOL signed',     state: 'success' },
    { ts: '01/14/2026, 03:41:54 PM UTC', ev: 'BOL signed',             actor: 'A. Stafford', loc: 'Dock D11',     ref: 'T920272501', det: 'Crypto signature · immutable', state: 'success' },
    { ts: '01/14/2026, 03:38:14 PM UTC', ev: 'Loading complete',       actor: 'M. Okafor',   loc: 'Dock D11',     ref: 'T920272501', det: '4h 02m loading window',         state: 'success' },
    { ts: '01/14/2026, 11:36:48 AM UTC', ev: 'Spotter moved to dock',  actor: 'M. Okafor',   loc: 'Dock D11',     ref: 'T920272501', det: 'From Yard:09 → Dock:D11',       state: 'neon' },
    { ts: '01/14/2026, 11:34:21 AM UTC', ev: 'Spotter task dispatched',actor: 'agent (AI)',  loc: 'Yard 09',      ref: 'T920272501', det: 'Move queue #M-2217',            state: 'neon' },
    { ts: '01/14/2026, 09:31:55 AM UTC', ev: 'Dwell threshold breach', actor: 'system',      loc: 'Yard 09',      ref: 'T920272501', det: '2h dwell exceeded',             state: 'warn' },
    { ts: '01/14/2026, 07:30:11 AM UTC', ev: 'Driver checked in',      actor: 'R. Alvarez',  loc: 'Gate G01',     ref: 'T920272501', det: 'Wallet ✓ · BOL #09487',         state: 'success' },
    { ts: '01/13/2026, 11:28:00 PM UTC', ev: 'MDT set',                actor: 'system',      loc: 'Gate G01',     ref: 'T920272501', det: 'Must depart 01/15 03:00',       state: 'steel' },
  ];
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Trailer History</h1>
          <p className="op-view-sub">Detailed trailer history with timestamps · enter SCAC + trailer #, then run report</p>
        </div>
        <div className="actions">
          <button className="op-btn op-btn--ghost">Export CSV</button>
          <button className="op-btn op-btn--ghost">Chain of custody PDF</button>
        </div>
      </div>

      <div className="op-th-search">
        <div className="field" style={{ width: 200 }}>
          <span>SCAC</span>
          <select className="op-select"><option>RWXD</option><option>HOSD</option><option>CVBG</option><option>GSWA</option><option>HIRS</option></select>
        </div>
        <div className="field" style={{ width: 220 }}>
          <span>Trailer #</span>
          <input className="op-input" defaultValue="T920272501" />
        </div>
        <div className="field" style={{ width: 180 }}>
          <span>Date Range</span>
          <select className="op-select"><option>Last 7 days</option><option>Last 30 days</option><option>Custom…</option></select>
        </div>
        <div style={{ marginLeft: 'auto', display: 'flex', gap: 8 }}>
          <button className="op-btn op-btn--ghost">Clear</button>
          <button className="op-btn op-btn--primary">Run Report</button>
        </div>
      </div>

      {/* Summary header */}
      <div className="op-admin-card" style={{ marginBottom: 14, padding: '14px 18px', display: 'flex', gap: 24, alignItems: 'center', flexWrap: 'wrap' }}>
        <div>
          <div style={{ fontSize: 11, color: 'rgba(156,163,175,0.55)', textTransform: 'uppercase', letterSpacing: '0.12em', fontFamily: 'var(--font-mono)' }}>Trailer</div>
          <div style={{ color: '#fff', fontWeight: 700, fontSize: 16 }}>T920272501 · <span style={{ color: 'var(--steel)' }}>RWXD</span></div>
        </div>
        <div>
          <div style={{ fontSize: 11, color: 'rgba(156,163,175,0.55)', textTransform: 'uppercase', letterSpacing: '0.12em', fontFamily: 'var(--font-mono)' }}>Status</div>
          <span className="chip chip--success">Departed</span>
        </div>
        <div>
          <div style={{ fontSize: 11, color: 'rgba(156,163,175,0.55)', textTransform: 'uppercase', letterSpacing: '0.12em', fontFamily: 'var(--font-mono)' }}>Events</div>
          <div style={{ color: 'var(--neon)', fontWeight: 600, fontSize: 14, fontFamily: 'var(--font-mono)' }}>{events.length}</div>
        </div>
        <div>
          <div style={{ fontSize: 11, color: 'rgba(156,163,175,0.55)', textTransform: 'uppercase', letterSpacing: '0.12em', fontFamily: 'var(--font-mono)' }}>Total dwell</div>
          <div style={{ color: '#fff', fontWeight: 600, fontSize: 14, fontFamily: 'var(--font-mono)' }}>8h 11m</div>
        </div>
      </div>

      <div className="op-admin-card">
        <table className="op-admin-table">
          <thead>
            <tr><th>Timestamp</th><th>Event</th><th>Actor</th><th>Location</th><th>Detail</th></tr>
          </thead>
          <tbody>
            {events.map((e, i) => (
              <tr key={i}>
                <td className="id">{e.ts}</td>
                <td className="white">{e.ev}</td>
                <td className="mono">{e.actor}</td>
                <td>{e.loc}</td>
                <td>{e.det}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </>
  );
};

//  VIEW · Task History
const TaskHistoryView = () => {
  const rows = [
    { id: 'M-2218', type: 'MOVE_TRAILER', from: '17',  to: 'Gate · Departed', trailer: '498625', scac: 'SHAF', assignee: 'flowGATE · auto', created: 'Just now',           state: 'COMPLETE' },
    { id: '32226',   type: 'MOVE_TRAILER', from: 'D02', to: 'Yard: 12', trailer: 'PTLZ260055', scac: 'GSWA', assignee: 'M. Okafor',   created: '04/30/26, 11:42 AM', state: 'COMPLETE' },
    { id: '32861',   type: 'MOVE_TRAILER', from: 'Gate',to: 'D03',      trailer: '32230',      scac: 'HOSD', assignee: 'M. Okafor',   created: '04/30/26, 11:38 AM', state: 'COMPLETE' },
    { id: '53643',   type: 'SAFETY_CHECK', from: 'D11', to: 'D11',      trailer: 'BT6026',     scac: 'CVBG', assignee: 'J. Park',     created: '04/30/26, 11:14 AM', state: 'COMPLETE' },
    { id: '835018',  type: 'MOVE_TRAILER', from: 'D14', to: 'Yard: 21', trailer: 'W91916',     scac: 'HIRS', assignee: 'unassigned',  created: '04/30/26, 10:50 AM', state: 'CANCELLED' },
    { id: '006478',  type: 'MOVE_TRAILER', from: 'D08', to: 'Staging',  trailer: 'KUCD16638',  scac: 'KUCD', assignee: 'M. Okafor',   created: '04/30/26, 10:14 AM', state: 'IN_PROGRESS' },
    { id: '51014',   type: 'MOVE_TRAILER', from: 'D11', to: 'Gate',     trailer: 'T-1389',     scac: 'WEDD', assignee: 'J. Park',     created: '04/30/26, 09:42 AM', state: 'COMPLETE' },
    { id: '5633308', type: 'MOVE_TRAILER', from: 'Yard: 04', to: 'D12', trailer: '5977',       scac: 'GRTG', assignee: 'unassigned',  created: '04/30/26, 09:18 AM', state: 'OPEN' },
    { id: '11620',   type: 'MOVE_TRAILER', from: 'D09', to: 'Staging',  trailer: 'PTLZ260055', scac: 'GSWA', assignee: 'unassigned',  created: '04/30/26, 08:42 AM', state: 'OPEN' },
  ];
  const stateChip = (s) => {
    if (s === 'COMPLETE')    return <span className="chip chip--success">{s}</span>;
    if (s === 'IN_PROGRESS') return <span className="chip chip--neon">{s}</span>;
    if (s === 'OPEN')        return <span className="chip chip--warn">{s}</span>;
    if (s === 'CANCELLED')   return <span className="chip chip--ember">{s}</span>;
    return <span className="chip chip--steel">{s}</span>;
  };
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Task History</h1>
          <p className="op-view-sub">Review tasks by date · expand Filters to drill down</p>
        </div>
        <div className="actions">
          <button className="op-btn op-btn--ghost" onClick={() => window.openOpModal('task-new')}>+ Create Task</button>
          <button className="op-btn op-btn--ghost">Export CSV</button>
        </div>
      </div>

      <div className="op-th-filters">
        <label>From Location <select className="op-select"><option>Any</option><option>Gate</option><option>Dock D01…</option><option>Yard 01…</option></select></label>
        <label>To Location <select className="op-select"><option>Any</option><option>Gate</option><option>Staging</option><option>Dock D…</option></select></label>
        <label>Task Type <select className="op-select"><option>All</option><option>MOVE_TRAILER</option><option>SAFETY_CHECK</option><option>SEAL_CHECK</option></select></label>
        <label>Task Status <select className="op-select"><option>All</option><option>OPEN</option><option>IN_PROGRESS</option><option>COMPLETE</option><option>CANCELLED</option></select></label>
        <label>Assigned To <select className="op-select"><option>Any spotter</option><option>M. Okafor</option><option>J. Park</option><option>unassigned</option></select></label>
        <label>Movement Type <select className="op-select"><option>All</option><option>To Dock</option><option>To Yard</option><option>To Gate</option></select></label>
        <label>Trailer # <input className="op-input" placeholder="e.g. T920272501" /></label>
        <label>SCAC <input className="op-input" placeholder="e.g. HOSD" /></label>
        <div className="filter-actions">
          <button className="op-btn op-btn--ghost">Clear filters</button>
          <button className="op-btn op-btn--primary">Apply</button>
        </div>
      </div>

      <div className="op-admin-card">
        <table className="op-admin-table">
          <thead>
            <tr><th>Task ID</th><th>Type</th><th>From → To</th><th>Trailer / SCAC</th><th>Assignee</th><th>Created</th><th>State</th><th className="right">Actions</th></tr>
          </thead>
          <tbody>
            {rows.map(r => (
              <tr key={r.id}>
                <td className="id">{r.id}</td>
                <td><span className={`chip ${r.type === 'MOVE_TRAILER' ? 'chip--solid-neon' : 'chip--warn'}`}>{r.type}</span></td>
                <td className="white">{r.from} <span style={{ color: 'var(--steel-dim)' }}>→</span> {r.to}</td>
                <td className="mono">{r.trailer} <span style={{ color: 'var(--steel-dim)' }}>· {r.scac}</span></td>
                <td className="mono">{r.assignee}</td>
                <td className="mono">{r.created}</td>
                <td>{stateChip(r.state)}</td>
                <td className="right">
                  <button className="op-tr-btn op-tr-btn--edit" style={{ marginRight: 6 }}>VIEW</button>
                  {r.state === 'OPEN' && <button className="op-tr-btn op-tr-btn--lock">CANCEL</button>}
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </>
  );
};

// ─────────────────────────────────────────────────────────────────
//  Albers USA projection + US outline (for Facility Mgt network map)
// ─────────────────────────────────────────────────────────────────
function albersUSA(lng, lat) {
  const φ0 = 38 * Math.PI / 180;
  const φ1 = 29.5 * Math.PI / 180;
  const φ2 = 45.5 * Math.PI / 180;
  const λ0 = -96 * Math.PI / 180;
  const φ = lat * Math.PI / 180;
  const λ = lng * Math.PI / 180;
  const n = (Math.sin(φ1) + Math.sin(φ2)) / 2;
  const C = Math.cos(φ1) ** 2 + 2 * n * Math.sin(φ1);
  const ρ0 = Math.sqrt(C - 2 * n * Math.sin(φ0)) / n;
  const ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
  const θ = n * (λ - λ0);
  const x = 500 + ρ * Math.sin(θ) * 920;
  const y = 280 - (ρ0 - ρ * Math.cos(θ)) * 920;
  return [x, y];
}

// US continental-48 border traced by ~70 lat/lng anchor points
const US_BORDER = [
  // Canadian border west→east (49°N parallel, then Great Lakes detour)
  [-122.75, 49.00], [-117.03, 49.00], [-111.04, 49.00], [-104.05, 49.00], [-97.23, 49.00],
  [-95.16, 49.38], [-94.82, 49.34], [-94.65, 48.84], [-93.85, 48.63], [-92.93, 48.61],
  [-91.65, 48.13], [-90.20, 48.10], [-89.53, 48.01], [-89.49, 47.99], [-88.38, 48.30],
  [-86.96, 47.49], [-84.88, 46.90], [-84.62, 46.42], [-84.11, 46.51], [-83.83, 46.10],
  [-83.43, 45.81], [-83.10, 45.30], [-82.49, 45.35], [-82.41, 44.55], [-82.13, 43.59],
  [-82.45, 42.97], [-82.85, 42.36], [-82.89, 42.04], [-81.27, 42.21], [-79.76, 42.51],
  [-79.05, 42.85], [-78.95, 43.04], [-76.79, 43.62], [-76.43, 44.10], [-75.10, 45.00],
  [-74.00, 45.00], [-71.50, 45.02], [-70.71, 45.70], [-69.04, 47.00], [-67.95, 47.42],
  [-67.78, 45.70], [-67.00, 44.81],
  // Atlantic coast north→south
  [-67.30, 43.95], [-68.50, 43.45], [-69.50, 43.20], [-70.10, 42.80], [-70.65, 42.40],
  [-70.90, 41.70], [-71.85, 41.30], [-72.50, 41.20], [-73.00, 40.85], [-73.96, 40.65],
  [-74.20, 39.65], [-75.05, 38.90], [-75.55, 38.20], [-75.95, 37.30], [-76.00, 36.95],
  [-75.80, 36.50], [-75.50, 35.78], [-76.10, 35.10], [-77.05, 34.55], [-78.00, 33.95],
  [-78.95, 33.65], [-79.55, 32.95], [-80.20, 32.45], [-80.85, 32.04], [-81.21, 31.45],
  [-81.45, 30.72], [-81.30, 29.80], [-80.90, 28.60], [-80.40, 27.30], [-80.10, 25.85],
  [-80.50, 25.20], [-81.20, 24.65], [-81.75, 24.55], [-82.20, 26.30], [-82.65, 27.50],
  [-82.85, 28.20], [-83.40, 28.95], [-84.00, 29.60], [-84.85, 29.75], [-85.50, 29.70],
  [-86.20, 30.30], [-86.95, 30.40], [-87.75, 30.25], [-88.40, 30.30], [-89.20, 30.20],
  [-89.90, 29.60], [-90.60, 29.20], [-91.60, 29.50], [-92.80, 29.60], [-93.85, 29.75],
  [-94.80, 29.40], [-95.55, 28.85], [-96.65, 28.30], [-97.10, 27.50], [-97.20, 26.50],
  // Mexican border south→west
  [-97.40, 25.90], [-98.30, 26.30], [-99.10, 26.45], [-99.50, 27.50], [-100.65, 28.95],
  [-101.55, 29.80], [-102.85, 29.20], [-103.30, 28.95], [-104.55, 29.65], [-105.50, 30.65],
  [-106.50, 31.78], [-108.21, 31.33], [-108.21, 31.78], [-111.06, 31.33], [-114.82, 32.49],
  [-117.13, 32.53],
  // Pacific coast south→north
  [-117.30, 33.00], [-117.95, 33.60], [-118.40, 33.74], [-118.50, 34.05], [-119.25, 34.10],
  [-120.50, 34.45], [-120.65, 35.10], [-121.00, 35.65], [-121.95, 36.55], [-122.40, 37.20],
  [-122.50, 37.78], [-122.93, 38.45], [-123.40, 38.80], [-123.72, 39.20], [-123.85, 39.95],
  [-124.16, 40.42], [-124.40, 41.00], [-124.21, 41.74], [-124.45, 42.25], [-124.50, 43.05],
  [-124.10, 44.05], [-124.05, 44.95], [-124.10, 46.16], [-124.05, 46.55], [-123.20, 46.25],
  [-122.85, 46.55], [-123.90, 46.85], [-124.30, 47.50], [-124.65, 48.38], [-123.55, 48.30],
  [-123.00, 48.32], [-122.55, 48.46], [-122.75, 49.00],
];
const US_OUTLINE_PATH = (() => {
  let d = '';
  US_BORDER.forEach(([lng, lat], i) => {
    const [x, y] = albersUSA(lng, lat);
    d += (i === 0 ? 'M' : 'L') + x.toFixed(1) + ',' + y.toFixed(1) + ' ';
  });
  return d + 'Z';
})();

// 16 facilities — real lat/lng. Match the operator-app's PWN-## scheme.
const FACILITIES = [
  { code: 'PWN-04', name: 'Mecosta Factory',  city: 'Mecosta, MI',     state: 'MI', region: 'Midwest',   lng: -85.22, lat: 43.71, docks: 44, spots: 84, status: 'Active' },
  { code: 'PWN-12', name: 'Hollis Factory',   city: 'Hollis, ME',      state: 'ME', region: 'Northeast', lng: -70.62, lat: 43.61, docks: 32, spots: 60, status: 'Active' },
  { code: 'PWN-21', name: 'Allentown Factory',city: 'Allentown, PA',   state: 'PA', region: 'Northeast', lng: -75.49, lat: 40.60, docks: 38, spots: 72, status: 'Active' },
  { code: 'PWN-33', name: 'Madison DC',       city: 'Madison, GA',     state: 'GA', region: 'South',     lng: -83.47, lat: 33.60, docks: 28, spots: 48, status: 'Active' },
  { code: 'PWN-48', name: 'Sacramento DC',    city: 'Sacramento, CA',  state: 'CA', region: 'West',      lng: -121.49, lat: 38.58, docks: 22, spots: 40, status: 'Onboarding' },
  { code: 'PWN-51', name: 'Dallas DC',        city: 'Coppell, TX',     state: 'TX', region: 'South',     lng: -96.99, lat: 32.95, docks: 30, spots: 56, status: 'Active' },
  { code: 'PWN-67', name: 'Phoenix DC',       city: 'Phoenix, AZ',     state: 'AZ', region: 'West',      lng: -112.07, lat: 33.45, docks: 24, spots: 44, status: 'Active' },
  { code: 'PWN-72', name: 'Salt Lake DC',     city: 'West Jordan, UT', state: 'UT', region: 'West',      lng: -111.97, lat: 40.61, docks: 18, spots: 32, status: 'Paused' },
  { code: 'PWN-88', name: 'LAX Distribution', city: 'Los Angeles, CA', state: 'CA', region: 'West',      lng: -118.24, lat: 34.05, docks: 36, spots: 70, status: 'Active' },
  { code: 'PWN-91', name: 'Chicago Central',  city: 'Chicago, IL',     state: 'IL', region: 'Midwest',   lng: -87.65, lat: 41.85, docks: 40, spots: 76, status: 'Active' },
  { code: 'PWN-95', name: 'Atlanta SE',       city: 'Atlanta, GA',     state: 'GA', region: 'South',     lng: -84.39, lat: 33.75, docks: 34, spots: 64, status: 'Active' },
  { code: 'PWN-99', name: 'Houston Bay',      city: 'Houston, TX',     state: 'TX', region: 'South',     lng: -95.37, lat: 29.76, docks: 38, spots: 70, status: 'Active' },
  { code: 'PWN-103',name: 'Seattle Pacific',  city: 'Seattle, WA',     state: 'WA', region: 'West',      lng: -122.33, lat: 47.61, docks: 24, spots: 48, status: 'Active' },
  { code: 'PWN-108',name: 'Denver Central',   city: 'Denver, CO',      state: 'CO', region: 'West',      lng: -104.99, lat: 39.74, docks: 22, spots: 42, status: 'Active' },
  { code: 'PWN-114',name: 'Miami South',      city: 'Miami, FL',       state: 'FL', region: 'South',     lng: -80.19, lat: 25.76, docks: 26, spots: 50, status: 'Active' },
  { code: 'PWN-119',name: 'NY Metro',         city: 'Newark, NJ',      state: 'NJ', region: 'Northeast', lng: -74.17, lat: 40.74, docks: 32, spots: 62, status: 'Active' },
];

// Scenarios — epicenter + propagation radii. Stress decays with great-circle distance.
const NETWORK_SCENARIOS = [
  {
    id: 'current',
    name: 'Current',
    sub: 'Live network status',
    epicenter: null,
    intensity: 0,
    summary: { savings: '$4.2M', risk: 'Low', recovery: '—', delta: '+0.0%' },
  },
  {
    id: 'demand-up',
    name: 'Demand Shock +10%',
    sub: 'Peak season demand spike',
    epicenter: null,         // hits all sites with throughput >= median
    intensity: 0.8,
    summary: { savings: '$3.1M', risk: 'High', recovery: '14 days', delta: '+14.0%' },
  },
  {
    id: 'demand-down',
    name: 'Demand Shock −10%',
    sub: 'Soft demand contraction',
    epicenter: null,
    intensity: -0.4,
    summary: { savings: '$4.6M', risk: 'Low', recovery: '—', delta: '−8.8%' },
  },
  {
    id: 'ne-weather',
    name: 'NE Weather Event',
    sub: 'Northeast major storm',
    epicenter: [-74.0, 41.5],  // off the NY metro coast
    intensity: 1.0,
    radiusCrit: 600,  // km
    radiusWarn: 1400,
    summary: { savings: '$1.8M', risk: 'High', recovery: '6 days', delta: '+36.8%' },
  },
  {
    id: 'hurricane',
    name: 'Hurricane',
    sub: 'Gulf Coast major event',
    epicenter: [-91.5, 28.5],  // Gulf of Mexico off Louisiana
    intensity: 1.0,
    radiusCrit: 750,
    radiusWarn: 1800,
    summary: { savings: '$0.6M', risk: 'Critical', recovery: '21 days', delta: '+64.9%' },
  },
];

// great-circle distance, kilometers
function haversineKm([lng1, lat1], [lng2, lat2]) {
  const R = 6371;
  const dφ = (lat2 - lat1) * Math.PI / 180;
  const dλ = (lng2 - lng1) * Math.PI / 180;
  const a = Math.sin(dφ/2)**2 + Math.cos(lat1*Math.PI/180) * Math.cos(lat2*Math.PI/180) * Math.sin(dλ/2)**2;
  return 2 * R * Math.asin(Math.sqrt(a));
}

function statusForScenario(facility, scenarioId) {
  const sc = NETWORK_SCENARIOS.find(s => s.id === scenarioId);
  if (!sc) return 'op';
  if (sc.id === 'current') {
    // baseline state — 2 crit, 3 warn
    if (facility.code === 'PWN-88') return 'crit'; // LAX
    if (facility.code === 'PWN-95') return 'crit'; // Atlanta
    if (['PWN-103','PWN-99','PWN-91'].includes(facility.code)) return 'warn';
    return 'op';
  }
  if (sc.id === 'demand-up') {
    const big = facility.docks >= 32;
    const huge = facility.docks >= 38;
    if (huge) return 'crit';
    if (big) return 'warn';
    return 'op';
  }
  if (sc.id === 'demand-down') {
    // excess empty inventory hits trailer-pool-constrained sites
    if (['PWN-72','PWN-48'].includes(facility.code)) return 'warn';
    return 'op';
  }
  // geographic scenarios
  if (sc.epicenter) {
    const d = haversineKm(sc.epicenter, [facility.lng, facility.lat]);
    if (d < sc.radiusCrit) return 'crit';
    if (d < sc.radiusWarn) return 'warn';
    return 'op';
  }
  return 'op';
}

// Freight lanes — real supply chain edges between facilities.
// type: 'shuttle' (factory→factory or factory→DC) | 'distribution' (DC→regional)
const LANES = [
  // Factory shuttles (inter-factory + factory → big DCs)
  ['PWN-04', 'PWN-91', 'shuttle'],     // Mecosta → Chicago
  ['PWN-04', 'PWN-21', 'shuttle'],     // Mecosta → Allentown
  ['PWN-12', 'PWN-21', 'shuttle'],     // Hollis → Allentown
  ['PWN-12', 'PWN-119', 'shuttle'],    // Hollis → NY Metro
  ['PWN-21', 'PWN-119', 'shuttle'],    // Allentown → NY Metro
  // East/SE distribution
  ['PWN-21', 'PWN-95', 'distribution'],// Allentown → Atlanta
  ['PWN-95', 'PWN-33', 'distribution'],// Atlanta → Madison
  ['PWN-95', 'PWN-114', 'distribution'],// Atlanta → Miami
  ['PWN-119', 'PWN-21', 'distribution'],
  // Central distribution
  ['PWN-91', 'PWN-51', 'distribution'],// Chicago → Dallas
  ['PWN-51', 'PWN-99', 'distribution'],// Dallas → Houston
  ['PWN-51', 'PWN-67', 'distribution'],// Dallas → Phoenix
  // West coast distribution
  ['PWN-67', 'PWN-88', 'distribution'],// Phoenix → LAX
  ['PWN-88', 'PWN-48', 'distribution'],// LAX → Sacramento
  ['PWN-48', 'PWN-103', 'distribution'],// Sacramento → Seattle
  // Mountain/inland
  ['PWN-72', 'PWN-108', 'distribution'],// Salt Lake → Denver
  ['PWN-108', 'PWN-91', 'distribution'],// Denver → Chicago
  ['PWN-108', 'PWN-51', 'distribution'],// Denver → Dallas
];

function laneStatus(from, to, scenario) {
  const a = FACILITIES.find(f => f.code === from);
  const b = FACILITIES.find(f => f.code === to);
  if (!a || !b) return 'op';
  const sA = statusForScenario(a, scenario);
  const sB = statusForScenario(b, scenario);
  if (sA === 'crit' || sB === 'crit') return 'crit';
  if (sA === 'warn' || sB === 'warn') return 'warn';
  return 'op';
}

const NetworkMapView = ({ scenario, hovered, setHovered, onPick }) => {
  const sc = NETWORK_SCENARIOS.find(s => s.id === scenario);
  const epi = sc?.epicenter ? albersUSA(sc.epicenter[0], sc.epicenter[1]) : null;
  return (
    <svg viewBox="0 0 1000 560" preserveAspectRatio="xMidYMid meet" className="netmap-svg">
      <defs>
        <radialGradient id="epi-glow" cx="50%" cy="50%" r="50%">
          <stop offset="0%" stopColor="rgba(255,42,0,0.45)" />
          <stop offset="40%" stopColor="rgba(255,42,0,0.15)" />
          <stop offset="100%" stopColor="rgba(255,42,0,0)" />
        </radialGradient>
        <radialGradient id="warn-glow" cx="50%" cy="50%" r="50%">
          <stop offset="0%" stopColor="rgba(255,180,0,0.20)" />
          <stop offset="100%" stopColor="rgba(255,180,0,0)" />
        </radialGradient>
      </defs>

      {/* Epicenter stress zones */}
      {epi && sc.radiusWarn && (
        <circle cx={epi[0]} cy={epi[1]} r={sc.radiusWarn * 0.08} fill="url(#warn-glow)" />
      )}
      {epi && sc.radiusCrit && (
        <circle cx={epi[0]} cy={epi[1]} r={sc.radiusCrit * 0.08} fill="url(#epi-glow)" />
      )}

      {/* US outline */}
      <path d={US_OUTLINE_PATH} className="netmap-outline" />

      {/* Network edges — real freight lanes, colored by status */}
      {LANES.map(([from, to, type], i) => {
        const a = FACILITIES.find(f => f.code === from);
        const b = FACILITIES.find(f => f.code === to);
        if (!a || !b) return null;
        const [x1, y1] = albersUSA(a.lng, a.lat);
        const [x2, y2] = albersUSA(b.lng, b.lat);
        const st = laneStatus(from, to, scenario);
        return (
          <g key={`lane-${i}`} className={`netmap-lane ${st} ${type}`}>
            <line x1={x1} y1={y1} x2={x2} y2={y2} className="trunk" />
            {st === 'op' && <line x1={x1} y1={y1} x2={x2} y2={y2} className="flow" />}
          </g>
        );
      })}

      {/* Facilities */}
      {FACILITIES.map(f => {
        const [x, y] = albersUSA(f.lng, f.lat);
        const status = statusForScenario(f, scenario);
        const isHovered = hovered === f.code;
        return (
          <g key={f.code} className={`netmap-site ${status}`} transform={`translate(${x}, ${y})`}
            onMouseEnter={() => setHovered(f.code)} onMouseLeave={() => setHovered(null)}
            onClick={() => onPick?.(f.code)}>
            {status !== 'op' && <circle className="halo" r="5" />}
            <circle className="core" r={isHovered ? 7 : 5} />
            <circle r="14" fill="transparent" />
            <text className={`label ${isHovered ? 'on' : 'off'}`} y="-12" textAnchor="middle">{f.code}</text>
          </g>
        );
      })}

      {/* Epicenter marker */}
      {epi && (
        <g transform={`translate(${epi[0]}, ${epi[1]})`}>
          <circle r="6" fill="none" stroke="#FF2A00" strokeWidth="1.5" className="netmap-epi-ring" />
          <circle r="3" fill="#FF2A00" />
        </g>
      )}
    </svg>
  );
};

//  VIEW · Facility Management
const FacilityMgtView = () => {
  const [tab, setTab] = useState('map');
  const [scenario, setScenario] = useState('current');
  const [hovered, setHovered] = useState(null);
  const [drilled, setDrilled] = useState(null);

  const tally = useMemo(() => {
    const out = { op: 0, warn: 0, crit: 0 };
    FACILITIES.forEach(f => { out[statusForScenario(f, scenario)]++; });
    return out;
  }, [scenario]);

  const sc = NETWORK_SCENARIOS.find(s => s.id === scenario);
  const isLive = scenario === 'current';
  const statusChip = (s) =>
    s === 'Active'     ? <span className="chip chip--success">● Active</span> :
    s === 'Onboarding' ? <span className="chip chip--neon">● Onboarding</span> :
    s === 'Paused'     ? <span className="chip chip--warn">● Paused</span> :
                          <span className="chip chip--steel">{s}</span>;

  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">Facility Management <span style={{ color: 'var(--neon)', fontWeight: 500, fontSize: 14, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', marginLeft: 12 }}>· Yard Network System</span></h1>
          <p className="op-view-sub">{FACILITIES.length} facilities · {tally.crit} critical · stress-test scenarios show network-wide impact</p>
        </div>
        <div className="actions">
          <div className="op-task-tabs" style={{ margin: 0, border: 'none' }}>
            <div className={`op-task-tab ${tab === 'map' ? 'is-active' : ''}`} onClick={() => setTab('map')}>Network Map</div>
            <div className={`op-task-tab ${tab === 'table' ? 'is-active' : ''}`} onClick={() => setTab('table')}>Facilities</div>
          </div>
          <button className="op-btn op-btn--primary">+ Add Facility</button>
        </div>
      </div>

      {tab === 'map' ? (
        <div className="netmap-layout">
          <div className="netmap-pane">
            <div className="netmap-head">
              <span className={`netmap-state ${!isLive ? 'simulating' : ''}`}>
                <span className="dot" />{isLive ? 'Live' : 'Simulating'}
              </span>
              <span className="netmap-eyebrow">North America · regional facility deployment</span>
              <span style={{ marginLeft: 'auto', display: 'flex', gap: 10 }}>
                <span className="chip chip--success">● {tally.op} op</span>
                <span className="chip chip--warn">● {tally.warn} warn</span>
                <span className="chip chip--ember">● {tally.crit} crit</span>
              </span>
            </div>
            <div className="netmap-stage">
              <NetworkMapView scenario={scenario} hovered={hovered} setHovered={setHovered} onPick={setDrilled} />
              {hovered && (() => {
                const f = FACILITIES.find(x => x.code === hovered);
                const status = statusForScenario(f, scenario);
                const [x, y] = albersUSA(f.lng, f.lat);
                const xPct = (x / 1000) * 100;
                const yPct = (y / 560) * 100;
                return (
                  <div className="netmap-popover" style={{ left: `${xPct}%`, top: `${yPct}%` }}>
                    <div className="code">{f.code}</div>
                    <div className="name">{f.name}</div>
                    <div className="meta">{f.city} · {f.docks} docks · {f.spots} yard spots</div>
                    <div className={`status ${status}`}>
                      {status === 'op' && '● Operational'}
                      {status === 'warn' && '● Throughput strain detected'}
                      {status === 'crit' && '● Critical — service degradation'}
                    </div>
                  </div>
                );
              })()}
            </div>
          </div>

          {/* Right rail — scenario controls + impact summary */}
          <aside className="netmap-rail">
            <div className="netmap-rail-section">
              <div className="netmap-rail-heading">Simulation</div>
              <div className="netmap-sims">
                {NETWORK_SCENARIOS.map(s => (
                  <div key={s.id} className={`netmap-sim ${scenario === s.id ? 'active' : ''}`} onClick={() => setScenario(s.id)}>
                    <div className="name">{s.name}</div>
                    <div className="sub">{s.sub}</div>
                  </div>
                ))}
              </div>
            </div>

            <div className="netmap-rail-section">
              <div className="netmap-rail-heading">Network impact</div>
              <div className="netmap-stat-grid">
                <div className="netmap-stat">
                  <div className="lbl">Throughput delta</div>
                  <div className={`v ${sc.summary.delta.startsWith('+') ? 'up' : sc.summary.delta.startsWith('−') ? 'down' : ''}`}>{sc.summary.delta}</div>
                </div>
                <div className="netmap-stat">
                  <div className="lbl">Network savings</div>
                  <div className="v">{sc.summary.savings}<span className="src"> / day</span></div>
                </div>
                <div className="netmap-stat">
                  <div className="lbl">Operational risk</div>
                  <div className={`v ${sc.summary.risk === 'Critical' ? 'crit' : sc.summary.risk === 'High' ? 'warn' : 'op'}`}>{sc.summary.risk}</div>
                </div>
                <div className="netmap-stat">
                  <div className="lbl">Recovery ETA</div>
                  <div className="v">{sc.summary.recovery}</div>
                </div>
              </div>
            </div>

            <div className="netmap-rail-section netmap-thesis">
              <span className="q">"</span>
              The digital supply chain twin <strong>starts and ends in the yard.</strong>
              <span className="attr">Jake Koppinger · CEO</span>
            </div>
          </aside>
        </div>
      ) : (
        <>
          <div className="op-wb-filters">
            <input className="op-input" placeholder="Search facilities, codes, or cities…" style={{ minWidth: 320 }} />
            <select className="op-select"><option>All Statuses</option><option>Active</option><option>Onboarding</option><option>Paused</option></select>
            <select className="op-select"><option>All Regions</option><option>Northeast</option><option>Midwest</option><option>South</option><option>West</option></select>
            <span style={{ marginLeft: 'auto' }} className="chip chip--solid-neon">{FACILITIES.length} facilities</span>
          </div>
          <div className="op-admin-card">
            <table className="op-admin-table">
              <thead>
                <tr><th>Code</th><th>Facility</th><th>City</th><th>Region</th><th className="right">Docks</th><th className="right">Yard Spots</th><th>Status</th><th className="right">Actions</th></tr>
              </thead>
              <tbody>
                {FACILITIES.map(f => (
                  <tr key={f.code}>
                    <td className="id">{f.code}</td>
                    <td className="white">{f.name}</td>
                    <td>{f.city}</td>
                    <td className="mono">{f.region}</td>
                    <td className="right mono white">{f.docks}</td>
                    <td className="right mono white">{f.spots}</td>
                    <td>{statusChip(f.status)}</td>
                    <td className="right">
                      <button className="op-tr-btn op-tr-btn--edit" style={{ marginRight: 6 }}>EDIT</button>
                      <button className="op-tr-btn op-tr-btn--move">OPEN</button>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </>
      )}

      {drilled && (() => {
        const f = FACILITIES.find(x => x.code === drilled);
        if (!f) return null;
        const status = statusForScenario(f, scenario);
        return (
          <div className="op-modal-backdrop" onClick={(e) => { if (e.target === e.currentTarget) setDrilled(null); }}>
            <div className="op-modal op-modal--wide" style={{ width: 'min(820px, calc(100vw - 40px))' }}>
              <div className="op-modal-head">
                <h2>{f.code} · {f.name}</h2>
                <span className="sub">{f.city} · {f.region}</span>
                <span className="op-modal-close" onClick={() => setDrilled(null)}>✕</span>
              </div>
              <div className="op-modal-body">
                <div className="op-modal-pre" style={{ gridTemplateColumns: '120px 1fr 120px 1fr' }}>
                  <span className="k">Status:</span>
                  <span className="v">
                    {status === 'op' && <span className="chip chip--success">● Operational</span>}
                    {status === 'warn' && <span className="chip chip--warn">● Throughput strain</span>}
                    {status === 'crit' && <span className="chip chip--ember">● Critical</span>}
                  </span>
                  <span className="k">Throughput:</span>
                  <span className="v">{status === 'crit' ? '52% capacity' : status === 'warn' ? '78% capacity' : '94% capacity'}</span>
                  <span className="k">Docks:</span>
                  <span className="v">{f.docks} ({Math.round(f.docks * (status === 'crit' ? 0.95 : 0.70))} occupied)</span>
                  <span className="k">Yard spots:</span>
                  <span className="v">{f.spots} ({Math.round(f.spots * (status === 'crit' ? 0.88 : 0.55))} occupied)</span>
                  <span className="k">Active drivers:</span>
                  <span className="v">{status === 'crit' ? 47 : status === 'warn' ? 28 : 19} on site</span>
                  <span className="k">Pending tasks:</span>
                  <span className="v" style={{ color: status === 'crit' ? 'var(--ember)' : '#fff' }}>{status === 'crit' ? 38 : status === 'warn' ? 12 : 5} in spotter queue</span>
                </div>

                <div style={{ marginTop: 14, fontFamily: 'var(--font-mono)', fontSize: 10, textTransform: 'uppercase', letterSpacing: '0.18em', color: 'rgba(156,163,175,0.55)', marginBottom: 8 }}>Live feeds</div>
                <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>
                  {/* flowTWIN mini-tile */}
                  <div style={{ border: '1px solid rgba(0,180,255,0.16)', borderRadius: 10, overflow: 'hidden', background: 'rgba(0,0,0,0.40)' }}>
                    <div style={{ padding: '10px 12px', borderBottom: '1px solid rgba(0,180,255,0.10)', display: 'flex', alignItems: 'center', gap: 8 }}>
                      <IMetrics size={14} style={{ color: 'var(--neon)' }} />
                      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, color: '#fff', fontWeight: 600, letterSpacing: '0.12em', textTransform: 'uppercase', flex: 1 }}>flowTWIN</span>
                      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: '#00C878' }}>● LIVE</span>
                    </div>
                    <div style={{ height: 110, position: 'relative', background: 'linear-gradient(180deg, #1A2330 0%, #0A0F18 100%)', overflow: 'hidden' }}>
                      <div style={{ position: 'absolute', bottom: '20%', left: '8%', right: '8%', display: 'flex', gap: 4 }}>
                        {[1,2,3,4,5].map(i => (
                          <div key={i} style={{
                            flex: 1, height: 42,
                            background: 'linear-gradient(180deg, #C9C9C9 0%, #E8E8E8 60%, #B5B5B5 100%)',
                            borderRadius: 2,
                            boxShadow: '0 4px 8px rgba(0,0,0,0.4)',
                          }} />
                        ))}
                      </div>
                      <div style={{ position: 'absolute', top: 8, left: 10, fontFamily: 'var(--font-mono)', fontSize: 9, color: 'rgba(255,255,255,0.65)' }}>
                        ● FRAME 1,247 · 3.0 km/h
                      </div>
                    </div>
                    <div style={{ padding: '10px 12px' }}>
                      <button className="op-btn op-btn--ghost" style={{ width: '100%' }}>Open flowTWIN →</button>
                    </div>
                  </div>

                  {/* flowGATE mini-tile */}
                  <div style={{ border: '1px solid rgba(0,180,255,0.16)', borderRadius: 10, overflow: 'hidden', background: 'rgba(0,0,0,0.40)' }}>
                    <div style={{ padding: '10px 12px', borderBottom: '1px solid rgba(0,180,255,0.10)', display: 'flex', alignItems: 'center', gap: 8 }}>
                      <ICrosshair size={14} style={{ color: 'var(--neon)' }} />
                      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, color: '#fff', fontWeight: 600, letterSpacing: '0.12em', textTransform: 'uppercase', flex: 1 }}>flowGATE</span>
                      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: '#00C878' }}>● LIVE</span>
                    </div>
                    <div style={{ height: 110, position: 'relative', background: 'linear-gradient(180deg, #0F1419 0%, #1A2530 100%)', overflow: 'hidden' }}>
                      <div style={{ position: 'absolute', left: '20%', top: '25%', width: 70, height: 56, background: 'linear-gradient(180deg, #C9C9C9, #B5B5B5)', borderRadius: 2 }} />
                      <div style={{ position: 'absolute', right: '14%', top: '15%', width: 20, height: 70, background: 'linear-gradient(180deg, #E8E8E0, #C0C0B8)', borderRadius: 2 }} />
                      <div style={{ position: 'absolute', left: '15%', top: '22%', width: 130, height: 62, border: '1.5px solid var(--neon)', borderRadius: 4, boxShadow: '0 0 12px rgba(0,180,255,0.4)' }} />
                      <div style={{ position: 'absolute', bottom: 6, left: 10, fontFamily: 'var(--font-mono)', fontSize: 9, color: 'var(--neon)' }}>
                        SETTLED · trailer 498625
                      </div>
                    </div>
                    <div style={{ padding: '10px 12px' }}>
                      <button className="op-btn op-btn--ghost" style={{ width: '100%' }}>Open flowGATE →</button>
                    </div>
                  </div>
                </div>
              </div>
              <div className="op-modal-foot">
                <span className="left">Last sync · 14:42:08 UTC</span>
                <button className="op-btn op-btn--ghost" onClick={() => setDrilled(null)}>Close</button>
                <button className="op-btn op-btn--primary" onClick={() => { setDrilled(null); window.openOpFacility?.(f.code); }}>Open full facility →</button>
              </div>
            </div>
          </div>
        );
      })()}
    </>
  );
};

//  VIEW · User Management
const UserMgtView = () => {
  const initials = (n) => n.split(' ').map(p => p[0]).slice(0,2).join('');
  const users = [
    { name: 'Allison Stafford',  email: 'allison.stafford@primobrands.com', role: 'Ops Lead',          facility: 'PWN-04', lastLogin: '2 min ago',  status: 'Active' },
    { name: 'Michael Okafor',     email: 'michael.okafor@primobrands.com',    role: 'Spotter',           facility: 'PWN-04', lastLogin: '14 min ago', status: 'Active' },
    { name: 'Joon Park',          email: 'joon.park@primobrands.com',          role: 'Gate Guard',        facility: 'PWN-04', lastLogin: '22 min ago', status: 'Active' },
    { name: 'Rosa Alvarez',        email: 'rosa.alvarez@primobrands.com',       role: 'Dock Office Mgr',   facility: 'PWN-12', lastLogin: '1 hr ago',   status: 'Active' },
    { name: 'Devin Hall',         email: 'devin.hall@primobrands.com',         role: 'Network Admin',     facility: 'All',    lastLogin: 'Yesterday',  status: 'Active' },
    { name: 'Casey Larkin',       email: 'casey@freightroll.com',              role: 'FreightRoll Admin', facility: 'All',    lastLogin: '3 min ago',  status: 'Active' },
    { name: 'Witold Podolak',     email: 'witold.p@external.io',               role: 'Driver',            facility: 'PWN-04', lastLogin: '5 days ago', status: 'Suspended' },
    { name: 'Etwone Offord',      email: 'etwone.offord@external.io',          role: 'Driver',            facility: 'PWN-04', lastLogin: '2 hr ago',   status: 'Active' },
  ];
  const statusChip = (s) =>
    s === 'Active'   ? <span className="chip chip--success">● Active</span> :
    s === 'Suspended'? <span className="chip chip--ember">● Suspended</span> :
    s === 'Invited' ? <span className="chip chip--neon">● Invited</span> :
                       <span className="chip chip--steel">{s}</span>;
  const roleChip = (r) => {
    if (r.includes('Admin'))    return <span className="chip chip--solid-neon">{r}</span>;
    if (r === 'Ops Lead')       return <span className="chip chip--neon">{r}</span>;
    if (r === 'Driver')         return <span className="chip chip--steel">{r}</span>;
    return <span className="chip chip--success">{r}</span>;
  };
  return (
    <>
      <div className="op-view-head">
        <div>
          <h1 className="op-view-title">User Management</h1>
          <p className="op-view-sub">{users.length} users · manage roles, facility access, and login state</p>
        </div>
        <div className="actions">
          <button className="op-btn op-btn--ghost">Invite via email</button>
          <button className="op-btn op-btn--primary">+ Add User</button>
        </div>
      </div>

      <div className="op-wb-filters">
        <input className="op-input" placeholder="Search users, emails…" style={{ minWidth: 320 }} />
        <select className="op-select"><option>All Roles</option><option>Network Admin</option><option>FreightRoll Admin</option><option>Ops Lead</option><option>Dock Office Mgr</option><option>Spotter</option><option>Gate Guard</option><option>Driver</option></select>
        <select className="op-select"><option>All Facilities</option><option>PWN-04 · Mecosta</option><option>PWN-12 · Hollis</option><option>All</option></select>
        <select className="op-select"><option>All Statuses</option><option>Active</option><option>Invited</option><option>Suspended</option></select>
        <span style={{ marginLeft: 'auto' }} className="chip chip--solid-neon">{users.length} users</span>
      </div>

      <div className="op-admin-card">
        <table className="op-admin-table">
          <thead>
            <tr><th>User</th><th>Role</th><th>Facility</th><th>Last Login</th><th>Status</th><th className="right">Actions</th></tr>
          </thead>
          <tbody>
            {users.map(u => (
              <tr key={u.email}>
                <td>
                  <div className="op-um-cell">
                    <span className="op-um-avatar">{initials(u.name)}</span>
                    <span className="meta">
                      <span className="nm">{u.name}</span>
                      <span className="em">{u.email}</span>
                    </span>
                  </div>
                </td>
                <td>{roleChip(u.role)}</td>
                <td className="mono">{u.facility}</td>
                <td className="mono">{u.lastLogin}</td>
                <td>{statusChip(u.status)}</td>
                <td className="right">
                  <button className="op-tr-btn op-tr-btn--edit" style={{ marginRight: 6 }}>EDIT</button>
                  <button className="op-tr-btn op-tr-btn--lock">{u.status === 'Suspended' ? 'REACTIVATE' : 'SUSPEND'}</button>
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </>
  );
};

// ══════════════════════════════════════════════════════════════════
//  MODAL SYSTEM
// ══════════════════════════════════════════════════════════════════
const Modal = ({ title, sub, onClose, footer, wide = false, children }) => {
  useEffect(() => {
    const onKey = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onKey);
    document.body.style.overflow = 'hidden';
    return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; };
  }, [onClose]);
  return (
    <div className="op-modal-backdrop" onClick={(e) => { if (e.target === e.currentTarget) onClose(); }}>
      <div className={`op-modal ${wide ? 'op-modal--wide' : ''}`}>
        <div className="op-modal-head">
          <h2>{title}</h2>
          {sub && <span className="sub">{sub}</span>}
          <span className="op-modal-close" onClick={onClose}><IClose size={14} /></span>
        </div>
        <div className="op-modal-body">{children}</div>
        {footer && <div className="op-modal-foot">{footer}</div>}
      </div>
    </div>
  );
};

const DestinationTypes = [
  { key: 'dock',    label: 'Dock' },
  { key: 'yard',    label: 'Yard' },
  { key: 'facility',label: 'Facility' },
  { key: 'leave',   label: 'Leave Facility' },
];

// — Move Trailer modal ------------------------------------------------
const MoveTrailerModal = ({ ctx, onClose }) => {
  const [dest, setDest] = useState(ctx?.suggestedDest || 'yard');
  const [loc, setLoc] = useState('');
  const options = {
    dock:     ['D03', 'D04', 'D05', 'D12', 'D21', 'D25', 'D26', 'D28'],
    yard:     ['Yard: 02', 'Yard: 05', 'Yard: 11', 'Yard: 15', 'Yard: 20', 'Yard: 22'],
    facility: ['PWN-12 · Hollis', 'PWN-21 · Allentown', 'PWN-33 · Madison DC'],
    leave:    ['Gate G01 · Outbound'],
  };
  return (
    <Modal
      title="Move Trailer"
      sub={ctx ? `From ${ctx.from || '—'}` : null}
      onClose={onClose}
      footer={<>
        <span className="left">Only available destinations are shown</span>
        <button className="op-btn op-btn--ghost" onClick={onClose}>Cancel</button>
        <button className="op-btn op-btn--primary" onClick={onClose}>Confirm Move</button>
      </>}
    >
      {ctx && (
        <div className="op-modal-pre">
          <span className="k">Trailer:</span>     <span className="v">{ctx.trailer || '—'}</span>
          <span className="k">SCAC:</span>        <span className="v">{ctx.scac || '—'}</span>
          <span className="k">Status:</span>      <span className="v">{ctx.status || 'EMPTY'}</span>
          <span className="k">Current loc:</span> <span className="v">{ctx.from || '—'}</span>
        </div>
      )}
      <div className="op-field">
        <span className="lbl">Destination Type <span className="req">*</span></span>
        <div className="op-radio-row">
          {DestinationTypes.map(t => (
            <div key={t.key} className={`op-radio ${dest === t.key ? 'is-active' : ''}`} onClick={() => { setDest(t.key); setLoc(''); }}>
              {t.label}
            </div>
          ))}
        </div>
      </div>
      <div className="op-field">
        <span className="lbl">Destination Location <span className="req">*</span></span>
        <select className="op-select" value={loc} onChange={(e) => setLoc(e.target.value)}>
          <option value="">Select a {DestinationTypes.find(t => t.key === dest).label.toLowerCase()}…</option>
          {options[dest].map(o => <option key={o} value={o}>{o}</option>)}
        </select>
      </div>
      <div className="op-field">
        <span className="lbl">Notes (optional)</span>
        <input className="op-input" placeholder="Spotter handoff context…" />
      </div>
    </Modal>
  );
};

// — Add Trailer modal -------------------------------------------------
const AddTrailerModal = ({ onClose }) => {
  const [dest, setDest] = useState('yard');
  const [status, setStatus] = useState('EMPTY');
  const options = {
    dock:     ['D03', 'D04', 'D05', 'D12', 'D21', 'D25', 'D26', 'D28'],
    yard:     ['Yard: 02', 'Yard: 05', 'Yard: 11', 'Yard: 15'],
    facility: ['PWN-12 · Hollis', 'PWN-21 · Allentown'],
    leave:    ['Gate G01 · Outbound'],
  };
  return (
    <Modal
      title="Add Trailer"
      sub="Manual entry"
      onClose={onClose}
      footer={<>
        <button className="op-btn op-btn--ghost" onClick={onClose}>Cancel</button>
        <button className="op-btn op-btn--primary" onClick={onClose}>Add Trailer</button>
      </>}
    >
      <div className="op-field-row">
        <div className="op-field">
          <span className="lbl">Trailer # <span className="req">*</span></span>
          <input className="op-input" placeholder="e.g. 32230" />
        </div>
        <div className="op-field">
          <span className="lbl">SCAC <span className="req">*</span></span>
          <select className="op-select"><option value="">Select…</option><option>HOSD</option><option>CVBG</option><option>RWXD</option><option>GSWA</option><option>HIRS</option><option>MEIJ</option></select>
        </div>
      </div>
      <div className="op-field">
        <span className="lbl">Trailer Status <span className="req">*</span></span>
        <div className="op-radio-row">
          {['EMPTY','LOADED','OOS'].map(s => (
            <div key={s} className={`op-radio ${status === s ? 'is-active' : ''}`} onClick={() => setStatus(s)}>{s}</div>
          ))}
        </div>
      </div>
      <div className="op-field">
        <span className="lbl">Destination Type <span className="req">*</span></span>
        <div className="op-radio-row">
          {DestinationTypes.map(t => (
            <div key={t.key} className={`op-radio ${dest === t.key ? 'is-active' : ''}`} onClick={() => setDest(t.key)}>{t.label}</div>
          ))}
        </div>
      </div>
      <div className="op-field">
        <span className="lbl">Destination Location <span className="req">*</span></span>
        <select className="op-select">
          <option value="">Select a {DestinationTypes.find(t => t.key === dest).label.toLowerCase()}…</option>
          {options[dest].map(o => <option key={o}>{o}</option>)}
        </select>
      </div>
      <div className="op-field">
        <span className="lbl">Shipment Ref # (optional)</span>
        <input className="op-input" placeholder="e.g. T925765302" />
      </div>
    </Modal>
  );
};

// — Reset Driver Check-In modal --------------------------------------
const ResetCheckInModal = ({ ctx, onClose }) => {
  const ship = ctx || {
    t: 'T920272501', scac: 'TTFD', trailer: '301', dir: 'Outbound', kind: 'Live',
    status: 'EMPTY', driver: 'Abdelghani Kenzi', appt: '01/13/2026, 3:00 AM',
    checkin: '01/13/2026, 3:09:29 PM', mdt: '01/13/2026, 4:04:00 PM', loc: 'Dock: D14',
  };
  return (
    <Modal
      title="Shipment Detail"
      sub={ship.t}
      wide
      onClose={onClose}
      footer={<>
        <span className="left">All chain-of-custody events for this shipment will be preserved</span>
        <button className="op-btn op-btn--ghost" onClick={onClose}>Close</button>
        <button className="op-btn op-btn--warn" onClick={onClose} style={{ background: 'rgba(255,42,0,0.15)' }}>Reset Driver Check-In</button>
      </>}
    >
      <div className="op-detail-grid">
        <div><div className="k">Shipment</div><div className="v mono" style={{ color: 'var(--neon)' }}>{ship.t}</div></div>
        <div><div className="k">Status</div><div className="v"><span className="chip chip--neon">Checked In</span></div></div>
        <div><div className="k">Driver</div><div className="v">{ship.driver}</div></div>
        <div><div className="k">Direction</div><div className="v"><span className={`chip ${ship.dir === 'Outbound' ? 'chip--neon' : 'chip--success'}`}>{ship.dir}</span> &nbsp;<span className="chip chip--steel">{ship.kind}</span></div></div>
        <div><div className="k">SCAC · Trailer #</div><div className="v mono">{ship.scac} · {ship.trailer}</div></div>
        <div><div className="k">Trailer Status</div><div className="v"><span className={`chip ${ship.status === 'LOADED' ? 'chip--neon' : 'chip--warn'}`}>{ship.status}</span></div></div>
        <div><div className="k">Appointment</div><div className="v mono">{ship.appt}</div></div>
        <div><div className="k">Current Location</div><div className="v">{ship.loc}</div></div>
        <div><div className="k">Check-in Time</div><div className="v mono">{ship.checkin}</div></div>
        <div><div className="k">Must Depart Time</div><div className="v mono">{ship.mdt}</div></div>
      </div>
      <div className="op-warn-banner">
        <ICaution size={16} />
        <div>
          <strong>Resetting check-in clears driver assignment</strong>
          The driver will be returned to the unassigned queue. The trailer stays at <span style={{ color: '#fff' }}>{ship.loc}</span>. Use this when a driver no-shows or you need to reassign the dock.
        </div>
      </div>
    </Modal>
  );
};

// — Create Task modal ------------------------------------------------
const CreateTaskModal = ({ onClose }) => {
  const [type, setType] = useState('MOVE_TRAILER');
  return (
    <Modal
      title="Create Task"
      sub="Spotter queue"
      onClose={onClose}
      footer={<>
        <button className="op-btn op-btn--ghost" onClick={onClose}>Cancel</button>
        <button className="op-btn op-btn--primary" onClick={onClose}>Create Task</button>
      </>}
    >
      <div className="op-field">
        <span className="lbl">Task Type <span className="req">*</span></span>
        <div className="op-radio-row">
          {['MOVE_TRAILER','SAFETY_CHECK','SEAL_CHECK'].map(t => (
            <div key={t} className={`op-radio ${type === t ? 'is-active' : ''}`} onClick={() => setType(t)}>{t}</div>
          ))}
        </div>
      </div>
      <div className="op-field-row">
        <div className="op-field">
          <span className="lbl">From Location <span className="req">*</span></span>
          <select className="op-select"><option value="">Select…</option><option>Gate G01</option><option>Dock D01</option><option>Dock D02</option><option>Dock D08</option><option>Yard: 02</option><option>Yard: 11</option><option>Staging A</option></select>
        </div>
        <div className="op-field">
          <span className="lbl">To Location <span className="req">*</span></span>
          <select className="op-select"><option value="">Select…</option><option>Gate G01</option><option>Dock D03</option><option>Dock D04</option><option>Dock D05</option><option>Yard: 05</option><option>Yard: 15</option><option>Staging B</option></select>
        </div>
      </div>
      <div className="op-field-row">
        <div className="op-field">
          <span className="lbl">Trailer # <span className="req">*</span></span>
          <input className="op-input" placeholder="e.g. 32230" />
        </div>
        <div className="op-field">
          <span className="lbl">SCAC <span className="req">*</span></span>
          <select className="op-select"><option value="">Select…</option><option>HOSD</option><option>CVBG</option><option>RWXD</option><option>GSWA</option><option>HIRS</option></select>
        </div>
      </div>
      <div className="op-field-row">
        <div className="op-field">
          <span className="lbl">Assign To</span>
          <select className="op-select"><option>Unassigned (open queue)</option><option>M. Okafor</option><option>J. Park</option><option>R. Alvarez</option></select>
        </div>
        <div className="op-field">
          <span className="lbl">Priority</span>
          <select className="op-select"><option>Normal</option><option>High</option><option>Urgent</option></select>
        </div>
      </div>
      <div className="op-field">
        <span className="lbl">Notes (optional)</span>
        <input className="op-input" placeholder="Reefer fuel low · reefer needs check…" />
      </div>
    </Modal>
  );
};

// — Prioritize Tasks modal -------------------------------------------
const PrioritizeTasksModal = ({ onClose }) => {
  const [list, setList] = useState([
    { id: 'M-2218', nm: 'MOVE_TRAILER · D02 → Yard: 21', meta: 'KUCD16638 · KUCD' },
    { id: 'M-2219', nm: 'MOVE_TRAILER · STG-A12 → D04',  meta: 'T-1412' },
    { id: 'M-2220', nm: 'MOVE_TRAILER · GATE → STG-B07',  meta: 'T-1419' },
    { id: 'M-2221', nm: 'SAFETY_CHECK · D11',              meta: 'BT6026 · CVBG' },
    { id: 'M-2222', nm: 'MOVE_TRAILER · D14 → Yard: 12',   meta: 'W91916 · HIRS' },
    { id: 'M-2223', nm: 'MOVE_TRAILER · D09 → Staging',    meta: 'PTLZ260055 · GSWA' },
  ]);
  const move = (i, dir) => {
    const j = i + dir;
    if (j < 0 || j >= list.length) return;
    const next = [...list];
    [next[i], next[j]] = [next[j], next[i]];
    setList(next);
  };
  return (
    <Modal
      title="Prioritize Open Tasks"
      sub={`${list.length} tasks in queue`}
      onClose={onClose}
      footer={<>
        <span className="left">Drag to reorder, or use the arrows. Tasks will be served to spotters in this sequence.</span>
        <button className="op-btn op-btn--ghost" onClick={onClose}>Cancel</button>
        <button className="op-btn op-btn--primary" onClick={onClose}>Save Order</button>
      </>}
    >
      <div className="op-prio-list">
        {list.map((t, i) => (
          <div key={t.id} className="op-prio-row" draggable>
            <div className="num">{i + 1}</div>
            <div className="drag"><IDrag size={16} /></div>
            <div className="body">
              <div className="nm">{t.nm}</div>
              <div className="meta">{t.id} · {t.meta}</div>
            </div>
            <div className="op-prio-arrows">
              <button onClick={() => move(i, -1)} disabled={i === 0}><IUp size={11} /></button>
              <button onClick={() => move(i, +1)} disabled={i === list.length - 1}><IDown size={11} /></button>
            </div>
          </div>
        ))}
      </div>
    </Modal>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · flowTWIN — Machine Vision RTLS / Yard Scan
// ═══════════════════════════════════════════════════════════════════
const FlowTwinView = () => {
  const [driving, setDriving] = useState(true);
  const [frame, setFrame] = useState(429);
  const [hoveredSpot, setHoveredSpot] = useState(10);

  useEffect(() => {
    if (!driving) return;
    const t = setInterval(() => {
      setFrame(f => f + Math.floor(Math.random() * 3) + 1);
    }, 240);
    return () => clearInterval(t);
  }, [driving]);

  const spots = [
    { n: 1,  trailer: '197218',  brand: 'WALM', matched: true },
    { n: 2,  trailer: '33019',   brand: 'RGND', matched: true },
    { n: 3,  trailer: '6327234', brand: 'NELO', matched: true },
    { n: 4,  trailer: '4050L',   brand: 'SCDS', matched: true },
    { n: 5,  trailer: 'TA178437', brand: 'TRGE', matched: true },
    { n: 6,  trailer: '379944',  brand: 'HORW', matched: true },
    { n: 7,  trailer: '154275',  brand: 'WALM', matched: true },
    { n: 8,  trailer: '168485',  brand: 'WALM', matched: true },
    { n: 9,  trailer: '9510',    brand: 'NELO', matched: true },
    { n: 10, trailer: null,      brand: null,   matched: false },
    { n: 11, trailer: '2234',    brand: 'HRMN', matched: true },
    { n: 12, trailer: null,      brand: null,   matched: false },
    { n: 13, trailer: '57128',   brand: 'WALM', matched: true },
    { n: 14, trailer: '419932',  brand: 'GSWA', matched: true },
  ];

  const detected = [
    { trailer: '197218',  brand: 'Walmart',           matched: true,  sightings: 6, colors: ['Gray', 'Silver', 'Black'], lat: '40.57175', lng: '-75.62599' },
    { trailer: '33019',   brand: 'Reg. Transport',    matched: true,  sightings: 3, colors: ['Brown', 'Silver'],          lat: '40.57182', lng: '-75.62614' },
    { trailer: 'Unknown', brand: 'Walmart',           matched: false, sightings: 2, colors: ['Gray', 'Silver', 'Black'], lat: '40.57189', lng: '-75.62627' },
    { trailer: '6327234', brand: 'New Era Logistics', matched: true,  sightings: 5, colors: ['Dark Green', 'Silver'],     lat: '40.57194', lng: '-75.62631' },
    { trailer: 'Unknown', brand: 'Hoffman',           matched: false, sightings: 1, colors: ['Gray', 'Black'],            lat: '40.57203', lng: '-75.62644' },
    { trailer: '4050L',   brand: 'Schneider',         matched: true,  sightings: 4, colors: ['Brown', 'Silver'],          lat: '40.57211', lng: '-75.62658' },
  ];

  return (
    <>
      <div className="op-view-head" style={{ marginBottom: 14 }}>
        <div>
          <h1 className="op-view-title">flowTWIN <span style={{ color: 'var(--neon)', fontWeight: 500, fontSize: 14, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', marginLeft: 12 }}>· Machine Vision RTLS</span></h1>
          <p className="op-view-sub">Camera mounted on the <strong style={{ color: '#fff' }}>yard spotter vehicle</strong> — the truck that moves trailers inside the yard, never leaves · streams to vision engine · trailer locations auto-update as the spotter does its normal work</p>
        </div>
        <div className="actions">
          <span className="chip chip--neon">jake · N6ns4eY9T9Y</span>
          <span className="chip chip--success">PWN-21 · Allentown</span>
        </div>
      </div>

      <div className="tw-layout">
        {/* ─── Controls rail ─── */}
        <div className="tw-pane tw-controls">
          <div className="tw-pane-head">
            <ICrosshair size={14} className="ic" />
            <h3>Capture</h3>
          </div>
          <div className="tw-pane-body">
            <div className="tw-ctrl-section">
              <div className="tw-ctrl-label">Video</div>
              <div className="tw-ctrl-row">
                <span className="tw-chip-vid">IMG_2276.MP4</span>
              </div>
            </div>

            <div className="tw-ctrl-section">
              <div className="tw-ctrl-label">Frame range</div>
              <div className="tw-frame-range">
                <div>IN <span>[497]</span></div>
                <div>OUT <span>[540]</span></div>
              </div>
              <div className="tw-ctrl-label" style={{ marginTop: 8 }}>Every</div>
              <div className="tw-every">
                <input type="range" min="1" max="10" defaultValue="3" className="tw-slider" />
                <span><span style={{ color: 'var(--neon)' }}>3</span> frames</span>
              </div>
            </div>

            <button className={`tw-drive ${driving ? 'stop' : ''}`} onClick={() => setDriving(d => !d)}>
              {driving ? '■ Stop' : '▶ Drive'}
            </button>

            <div className="tw-ctrl-section" style={{ marginTop: 18 }}>
              <div className="tw-ctrl-label">Processing pipeline</div>
              <div className="tw-pipe">
                <div className="tw-pipe-card">
                  <div className="tw-pipe-thumb"><ICrosshair size={20} /></div>
                  <div className="tw-pipe-name">colors</div>
                  <div className="tw-pipe-model">object_color</div>
                </div>
                <div className="tw-pipe-card">
                  <div className="tw-pipe-thumb"><IConfirm size={20} /></div>
                  <div className="tw-pipe-name">detect</div>
                  <div className="tw-pipe-model">yolo11m</div>
                </div>
              </div>
            </div>

            <div className="tw-ctrl-section" style={{ marginTop: 14, padding: '10px 12px', background: 'rgba(0,200,120,0.06)', border: '1px solid rgba(0,200,120,0.30)', borderRadius: 8, fontFamily: 'var(--font-mono)', fontSize: 10, color: '#5BCFA5', lineHeight: 1.5 }}>
              <strong style={{ display: 'block', marginBottom: 4 }}>PASSIVE RTLS</strong>
              Driver does their normal work. We update the YMS as they pass each trailer.
            </div>
          </div>
        </div>

        {/* ─── Live camera frame (spotter POV) ─── */}
        <div className="tw-pane tw-camera">
          <div className="tw-pane-head">
            <ICrosshair size={14} className="ic" />
            <h3>Spotter Camera</h3>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: 'var(--steel-dim)' }}>position left · bearing 187°</span>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: driving ? '#00C878' : 'var(--steel-dim)', marginLeft: 'auto' }}>
              {driving ? `● FRAME ${frame}` : '○ STOPPED'}
            </span>
          </div>
          <div className="tw-cam-stage">
            <img className="tw-cam-img" src="../../assets/future-state-reference/yard-scan/spotter-cam-left.png" alt="spotter camera POV" />
            <span className="tw-cam-pane-label">position left · bearing 187°</span>

            <div className="tw-cam-frame-row">
              {driving && <span className="dot" />}
              <span>13:16:52 · pin: corrected · pair lag 73ms</span>
            </div>

            <div className="tw-cam-overlay">
              00:00 / 05:44 &nbsp;·&nbsp; <span className="kph">3.0 km/h</span>
            </div>
          </div>
        </div>

        {/* ─── Satellite map with movement track ─── */}
        <div className="tw-pane tw-satellite">
          <div className="tw-pane-head">
            <INexus size={14} className="ic" />
            <h3>Satellite · Movement Track</h3>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: 'var(--steel-dim)' }}>GPS + bearing · 4,359 frames</span>
          </div>
          <div className="tw-sat-stage tw-sat-stage--photo">
            <img className="tw-sat-img" src="../../assets/future-state-reference/yard-scan/spotter-satellite-pov.png" alt="satellite movement track" />
            <div className="tw-sat-coords">40.57359, -75.627799 · PWN-21</div>
            <div className="tw-sat-attrib">Maxar / Airbus 2026</div>
          </div>
        </div>

        {/* ─── Yard Spots list (right rail) ─── */}
        <div className="tw-pane tw-spots">
          <div className="tw-pane-head">
            <IYard size={14} className="ic" />
            <h3>Yard Spots</h3>
            <span className="tw-spots-stat">[41/62]</span>
          </div>
          <div className="tw-pane-body" style={{ padding: '6px 10px' }}>
            <select className="op-select" style={{ width: '100%', marginBottom: 8, fontSize: 11 }}>
              <option>All Zones (62 spots)</option>
            </select>
            <div className="tw-ctrl-label" style={{ padding: '4px 0 6px', fontSize: 9 }}>PARKING SPOT [41/62]</div>
            {spots.map(s => (
              <div
                key={s.n}
                className={`tw-spot-row ${!s.matched ? 'empty' : ''} ${s.n === hoveredSpot ? 'active' : ''}`}
                onMouseEnter={() => setHoveredSpot(s.n)}
              >
                <div className="check">{s.matched ? <ICheck size={11} /> : '○'}</div>
                <div className="trailer">{s.trailer || 'EMPTY'}</div>
                <div className="meta">
                  <span className="num">{s.n}</span>
                  {s.brand && <span className="scac">{s.brand}</span>}
                </div>
              </div>
            ))}
          </div>
        </div>

        {/* ─── DETECTED panel (bottom strip) ─── */}
        <div className="tw-pane tw-detected">
          <div className="tw-pane-head">
            <ICrosshair size={14} className="ic" />
            <h3>Detected</h3>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, color: 'var(--neon)' }}>[173]</span>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: 'var(--steel-dim)', marginLeft: 'auto' }}>
              raw model output · color extractor + yolo11m
            </span>
          </div>
          <div className="tw-pane-body">
            <div className="tw-det-grid">
              {detected.map((d, i) => (
                <div key={i} className={`tw-det-card ${d.matched ? 'matched' : ''}`}>
                  <div className="tw-det-head">
                    <span className="trailer">{d.trailer}</span>
                    <span className={`tw-det-chip ${d.matched ? 'matched' : 'unknown'}`}>{d.matched ? 'MATCHED' : 'UNKNOWN'}</span>
                    <span className="tw-det-count">{d.sightings} sightings</span>
                  </div>
                  <div className="brand">{d.brand}</div>
                  <div className="tw-det-colors">
                    {d.colors.map(c => <span key={c} className="tw-det-color">{c}</span>)}
                  </div>
                  <div className="tw-det-coord">{d.lat}, {d.lng}</div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

// ═══════════════════════════════════════════════════════════════════
//  VIEW · flowGATE — Machine Vision Gate Automation
// ═══════════════════════════════════════════════════════════════════
const GATE_PAYLOAD = {
  appearance: { color: 'white', make: 'Freightliner' },
  asset_type: 'truck',
  id: 3,
  identity: { carrier: 'CUSTOMIZED TRUCKING', unit_number: '10003', usdot: '4386382' },
  linkage: { best_frame_id: 2564, camera_role: 'outbound', current_pass_id: 57, location: 'Exit Gate' },
  sightings: [{ first_seen_at: '2026-05-28T02:05:35.209940Z', last_classified_in_pass: 57, last_seen_at: '2026-05-28T15:16:28.980205Z', pass_count: 9, viewed_in_current_pass: true }],
};
const GATE_FRAMES = [
  { t: '+4s', score: 33.7, dim: '73×41' },
  { t: '+5s', score: 30.6, dim: '86×39', best: true, vlm: true },
  { t: '+5s', score: 22.7, dim: '92×32', vlm: true },
  { t: '+7s', score: 20.2, dim: '75×31', vlm: true },
  { t: '+10s', score: 14.1, dim: '61×28' },
  { t: '+13s', score: 11.8, dim: '58×24' },
];

const FlowGateView = ({ setActive }) => {
  const [reading, setReading] = useState(false);
  const [showJson, setShowJson] = useState(false);
  const [synced, setSynced] = useState(false);
  const reread = () => { setReading(true); setTimeout(() => setReading(false), 1600); };

  return (
    <>
      <div className="op-view-head" style={{ marginBottom: 14 }}>
        <div>
          <h1 className="op-view-title">flowGATE <span style={{ color: 'var(--neon)', fontWeight: 500, fontSize: 14, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', marginLeft: 12 }}>· Carrier Accountability</span></h1>
          <p className="op-view-sub">Every gate pass now reads the <strong style={{ color: '#fff' }}>truck, the chassis, and the timestamp</strong> — so you know <strong style={{ color: '#fff' }}>who</strong> took <strong style={{ color: '#fff' }}>what</strong>, and <strong style={{ color: '#fff' }}>when</strong>. Not just where the chassis is — who's accountable for it.</p>
        </div>
        <div className="actions">
          <span className="chip chip--success">● Camera Live</span>
          <span className="chip chip--steel">IMG_0594.MOV · DONE</span>
        </div>
      </div>

      <div className="gt2-layout">
        <div className="gt2-main">
          <div className="gt2-detected-head">
            <ICrosshair size={13} style={{ color: 'var(--neon)' }} />
            <span>Detected · <strong>2 objects</strong> in 1 group</span>
            <span className="gt2-detected-meta">Pass #57 · outbound · 31 frames · 15:15:38</span>
          </div>

          <div className="gt2-objects">
            <div className="gt2-obj">
              <div className="gt2-obj-photo">
                <img src="../../assets/future-state-reference/gate-automation/exit-truck.png" alt="exit gate — truck" />
                <span className="gt2-badge truck">TRUCK</span>
              </div>
              <div className="gt2-obj-data">
                <div className="gt2-obj-title">Customized Trucking</div>
                <div className="gt2-obj-rows">
                  <div><span className="k">USDOT</span><span className="v neon">4386382</span></div>
                  <div><span className="k">Unit #</span><span className="v">10003</span></div>
                  <div><span className="k">Cab</span><span className="v">White · Freightliner</span></div>
                </div>
              </div>
            </div>
            <div className="gt2-obj">
              <div className="gt2-obj-photo">
                <img src="../../assets/future-state-reference/gate-automation/exit-chassis.png" alt="exit gate — chassis" />
                <span className="gt2-badge chassis">CHASSIS</span>
              </div>
              <div className="gt2-obj-data">
                <div className="gt2-obj-title">Chassis CMCZ150496</div>
                <div className="gt2-obj-rows">
                  <div><span className="k">Color</span><span className="v">Maroon</span></div>
                  <div><span className="k">Length</span><span className="v">53 ft <i>(vlm_visual)</i></span></div>
                  <div><span className="k">Marks</span><span className="v">white reflective tape · "MOUNT GEARET HERE"</span></div>
                </div>
              </div>
            </div>
          </div>

          <div className="gt2-www">
            <div className="gt2-www-item">
              <span className="k">WHO</span>
              <span className="v">Customized Trucking</span>
              <span className="s">USDOT 4386382 · unit 10003</span>
            </div>
            <div className="gt2-www-item">
              <span className="k">WHAT</span>
              <span className="v">Chassis CMCZ150496</span>
              <span className="s">53 ft · Maroon</span>
            </div>
            <div className="gt2-www-item">
              <span className="k">WHEN</span>
              <span className="v">15:15:38</span>
              <span className="s">2026-05-28 · conf 0.95</span>
            </div>
          </div>

          <div className="gt2-frames-head">
            Top YOLO-ranked frames · <strong>6 shown</strong> · 3 sent to VLM
          </div>
          <div className="gt2-frames">
            {GATE_FRAMES.map((f, i) => (
              <div key={i} className={`gt2-frame ${f.best ? 'best' : ''}`}>
                <span className="gt2-frame-score">{f.score}</span>
                {f.vlm && <span className="gt2-frame-vlm">VLM</span>}
                <span className="gt2-frame-meta">{f.dim} · {f.t}</span>
              </div>
            ))}
          </div>
        </div>

        <div className="gt2-rail">
          <div className="gt2-rail-head">
            <div>
              <div className="gt2-pass">Pass #57 <span className="chip chip--ember">outbound</span></div>
              <div className="gt2-pass-sub">Exit Gate · ex_KkkLzMv6DUw</div>
            </div>
            <button className={`gt2-reread ${reading ? 'is-reading' : ''}`} onClick={reread} disabled={reading}>
              {reading ? 'reading…' : 're-read (VLM)'}
            </button>
          </div>

          <div className="gt2-sync">
            <div className="gt2-sync-head">
              <span>YARD SYNC · OUT</span>
              <span className={`gt2-sync-flag ${synced ? 'ok' : ''}`}>{synced ? 'synced' : 'not in yard'}</span>
            </div>
            {synced ? (
              <div className="gt2-sync-body ok">CMCZ150496 reconciled · flagged to carrier audit for Customized Trucking.</div>
            ) : (
              <>
                <div className="gt2-sync-body">CMCZ150496 is exiting but <strong>isn't in the yard</strong> — no matching inbound or staged load.</div>
                <div className="gt2-sync-trailer">trailer # CMCZ150496</div>
                <button className="gt2-retry" onClick={() => setSynced(true)}>retry sync</button>
              </>
            )}
          </div>

          <div className="gt2-carrier">
            <div className="gt2-carrier-head"><INexus size={13} /> Carrier Watch <span className="s">Carol's flag</span></div>
            <div className="gt2-carrier-name">Customized Trucking <span className="dot">·</span> <span className="usdot">USDOT 4386382</span></div>
            <div className="gt2-carrier-stats">
              <div><div className="v">9</div><div className="k">chassis pulls · 7 days</div></div>
              <div className="ember"><div className="v">2</div><div className="k">left w/o matched load</div></div>
              <div><div className="v">31h</div><div className="k">avg dwell before use</div></div>
            </div>
            <div className="gt2-carrier-note">Flagged: chassis leaving the gate without a matched outbound load. Follow up before it hurts asset-utilization ratios.</div>
          </div>

          <button className="gt2-json-toggle" onClick={() => setShowJson(v => !v)}>
            {showJson ? '▾' : '▸'} raw asset payload <i>JSON</i>
          </button>
          {showJson && (
            <pre className="gt2-json">{JSON.stringify(GATE_PAYLOAD, null, 2)}</pre>
          )}
        </div>
      </div>
    </>
  );
};

// ═════════════════════════════════════════════════════════════════
//  VIEW · flowSIM — Digital-Twin Scenario Sandbox
// ═════════════════════════════════════════════════════════════════
const SIM_SCENARIOS = [
  { key: 'normal',   label: 'Normal Ops',      inbound: 120, punctuality: 82, weather: 1.0,  docks: 8, blurb: 'A typical Tuesday at Naperville — steady inbound, no disruptions.' },
  { key: 'surge',    label: 'Peak Surge',      inbound: 186, punctuality: 74, weather: 1.0,  docks: 8, blurb: 'Promo build week — +40% inbound as retail pulls holiday cookie volume.' },
  { key: 'noshow',   label: 'Carrier No-Show', inbound: 140, punctuality: 54, weather: 1.0,  docks: 8, blurb: 'Three inbound carriers miss windows and arrive bunched after 10:00.' },
  { key: 'dockdown', label: 'Dock Offline',    inbound: 132, punctuality: 80, weather: 1.0,  docks: 6, blurb: 'A leveler failure pulls 2 doors offline 10:00–14:00, right at peak.' },
  { key: 'storm',    label: 'Winter Storm',    inbound: 108, punctuality: 46, weather: 1.45, docks: 8, blurb: 'Lake-effect snow scatters arrivals and slows every yard move.' },
];
const SIM_HOURS = ['6a','7a','8a','9a','10a','11a','12p','1p','2p','3p','4p','5p'];

// ── v2 ROI model — mirrors yardflow.ai/roi + the sales deck (per-site $K/yr) ──
// Throughput value scales with margin/shipment; hard savings are margin-independent.
const ROI_ARCHETYPES = {
  yms:        { label: 'YMS site',       hard: 188, thru1k: 2363, cost: 15 },
  dropsNoYms: { label: 'Drops · no YMS', hard: 100, thru1k: 1474, cost: 10 },
  noDrops:    { label: 'No drops',       hard: 54,  thru1k: 473,  cost: 5  },
};
const ROI_LEGACY = { hard: 100, thru1k: 204 };
const ROI_OPDAYS = 250;            // operating days / yr
const ROI_IMPL_PER_SITE = 81.4;    // $K one-time implementation
function roiForSite(key, margin) {
  const a = ROI_ARCHETYPES[key];
  const mf = margin / 1000;
  const thru = a.thru1k * mf;           // $K/yr throughput value (margin-driven)
  const hard = a.hard;                  // $K/yr hard savings
  const total = thru + hard;            // $K/yr total value
  const sub = a.cost;                   // $K/yr subscription
  const hardReturn = hard / sub;        // × subscription returned by hard savings alone
  const annualLoads = a.thru1k;         // incremental loads / yr (≈ $K at $1k each)
  const sustainedUplift = a.thru1k / ROI_OPDAYS;  // avg extra loads / shift
  const paybackHardMo = Math.max(0.3, (ROI_IMPL_PER_SITE / hard) * 12);
  const paybackAllMo  = Math.max(0.2, (ROI_IMPL_PER_SITE / total) * 12);
  const legacy = key === 'yms' ? (ROI_LEGACY.hard + ROI_LEGACY.thru1k * mf) : 0;
  return { thru, hard, total, sub, hardReturn, annualLoads, sustainedUplift, paybackHardMo, paybackAllMo, legacy, mf };
}
const roiFmt = (k) => k >= 1000 ? '$' + (k / 1000).toFixed(2).replace(/\.?0+$/, '') + 'M' : '$' + Math.round(k) + 'K';

const SimSlider = ({ label, val, set, min, max, step, fmt }) => (
  <div className="sim-ctrl">
    <div className="sim-ctrl-top"><label>{label}</label><span className="sim-ctrl-val">{fmt ? fmt(val) : val}</span></div>
    <input type="range" className="sim-range" min={min} max={max} step={step || 1} value={val}
      onChange={e => set(Number(e.target.value))} />
  </div>
);

const FlowSimView = ({ setActive }) => {
  const [scenarioKey, setScenarioKey] = useState('surge');
  const sc = SIM_SCENARIOS.find(s => s.key === scenarioKey);
  const [inbound, setInbound] = useState(sc.inbound);
  const [spotters, setSpotters] = useState(3);
  const [docks, setDocks] = useState(sc.docks);
  const [punctuality, setPunctuality] = useState(sc.punctuality);
  const [weather, setWeather] = useState(sc.weather);
  const [margin, setMargin] = useState(1000);
  const [running, setRunning] = useState(false);
  const [progress, setProgress] = useState(1);
  const [ran, setRan] = useState(true);
  const rafRef = useRef(null);

  const pickScenario = (k) => {
    const s = SIM_SCENARIOS.find(x => x.key === k);
    setScenarioKey(k);
    setInbound(s.inbound); setPunctuality(s.punctuality); setDocks(s.docks); setWeather(s.weather);
    runSweep();
  };
  const runSweep = () => {
    cancelAnimationFrame(rafRef.current);
    setRunning(true); setRan(false); setProgress(0);
    const start = Date.now(), dur = 1400;
    const tick = () => {
      const p = Math.min(1, (Date.now() - start) / dur);
      setProgress(p);
      if (p < 1) rafRef.current = requestAnimationFrame(tick);
      else { setRunning(false); setRan(true); }
    };
    rafRef.current = requestAnimationFrame(tick);
  };
  useEffect(() => () => cancelAnimationFrame(rafRef.current), []);

  // ── Deterministic twin model ──
  const m = useMemo(() => {
    const volF  = inbound / 120;
    const punF  = (100 - punctuality) / 40;
    const dockF = (8 - docks) / 8;
    const spotF = (3 - spotters) / 3;
    const sev = Math.min(1.35, Math.max(0.12, 0.55 * (volF - 1) + 0.85 * punF + 0.7 * dockF + 0.5 * spotF + 0.7 * (weather - 1) + 0.30));

    const peakReact = Math.round(Math.min(118, 58 + sev * 46));
    const peakOrch  = Math.round(Math.min(88, 50 + sev * 15));
    const round = (n, step) => Math.round(n / step) * step;
    const detReact = round(sev * 3100, 50);
    const detOrch  = round(sev * 440, 20);
    const loadsBase = Math.round(inbound * 0.92);
    const loadsReact = Math.round(loadsBase * (1 - sev * 0.12));
    const loadsOrch  = Math.round(loadsBase * (1 + 0.05 + sev * 0.02));
    const milesReact = Math.round(38 + sev * 46);
    const milesOrch  = Math.round(25 + sev * 9);
    const overReact  = Math.max(0, Math.round((peakReact - 100) / 3));
    const onTimeReact = Math.round(Math.max(46, 96 - sev * 44));
    const onTimeOrch  = Math.round(Math.max(86, 99 - sev * 8));

    const curve = (peak, base, sigma) => Array.from({ length: 12 }, (_, t) => {
      const d = t - 5.2;
      return Math.round(base + (peak - base) * Math.exp(-(d * d) / (2 * sigma * sigma)));
    });
    return {
      sev, peakReact, peakOrch, detReact, detOrch, loadsReact, loadsOrch,
      milesReact, milesOrch, overReact, onTimeReact, onTimeOrch,
      reactCurve: curve(peakReact, 20, 2.1), orchCurve: curve(peakOrch, 24, 3.3),
    };
  }, [inbound, spotters, docks, punctuality, weather]);

  // ── Chart geometry ──
  const W = 720, H = 230, padL = 30, padR = 14, padT = 12, padB = 22, maxY = 120;
  const xFor = (i) => padL + (i / 11) * (W - padL - padR);
  const yFor = (v) => padT + (1 - v / maxY) * (H - padT - padB);
  const pts = (arr) => arr.map((v, i) => `${xFor(i).toFixed(1)},${yFor(v).toFixed(1)}`).join(' ');
  const area = (arr) => `${xFor(0)},${yFor(0)} ${pts(arr)} ${xFor(11)},${yFor(0)}`;
  const capY = yFor(100);

  const fmt$ = (n) => '$' + n.toLocaleString();

  // ── v2 ROI roll-up for this facility (Drops · no YMS archetype) ──
  const roi = useMemo(() => roiForSite('dropsNoYms', margin), [margin]);
  // Bridge: today's recovered loads → annualized throughput at this margin
  const recoveredToday = m.loadsOrch - m.loadsReact;
  const thruPct = Math.round((roi.thru / roi.total) * 100);

  return (
    <>
      <div className="op-view-head" style={{ marginBottom: 16 }}>
        <div>
          <h1 className="op-view-title">
            flowSIM
            <span style={{ color: 'var(--neon)', fontWeight: 500, fontSize: 14, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', marginLeft: 12 }}>· Digital-Twin Sandbox</span>
          </h1>
          <p className="op-view-sub">Stress-test the yard before it happens. Inject a disruption and the twin projects the shift <strong style={{ color: '#fff' }}>reactive ops vs. YardFlow-orchestrated</strong> — calibrated to this site's 14-day actuals.</p>
        </div>
        <div className="actions">
          <span className="chip chip--neon">MDZ · Naperville Bakery DC</span>
          <span className="chip chip--steel">Twin · 62 spots · 8 docks</span>
        </div>
      </div>

      <div className="sim-layout">
        {/* ─── Control panel ─── */}
        <div className="sim-panel">
          <div className="sim-sec-label">Scenario</div>
          <div className="sim-scenarios">
            {SIM_SCENARIOS.map(s => (
              <button key={s.key} className={`sim-scn ${scenarioKey === s.key ? 'is-on' : ''} ${s.key !== 'normal' ? 'risk' : ''}`} onClick={() => pickScenario(s.key)}>
                {s.label}
              </button>
            ))}
          </div>
          <div className="sim-blurb">{sc.blurb}</div>

          <div className="sim-sec-label" style={{ marginTop: 18 }}>Parameters</div>
          <SimSlider label="Inbound trucks / shift" val={inbound} set={setInbound} min={80} max={220} />
          <SimSlider label="Spotters on shift" val={spotters} set={setSpotters} min={1} max={6} />
          <SimSlider label="Docks online" val={docks} set={setDocks} min={4} max={10} />
          <SimSlider label="Carrier punctuality" val={punctuality} set={setPunctuality} min={40} max={98} fmt={v => v + '%'} />
          <SimSlider label="Weather drag" val={weather} set={setWeather} min={1} max={1.6} step={0.05} fmt={v => v <= 1.02 ? 'Clear' : v < 1.25 ? 'Rain' : 'Snow'} />
          <SimSlider label="Margin / shipment" val={margin} set={setMargin} min={400} max={3000} step={50} fmt={v => '$' + v.toLocaleString()} />

          <button className={`op-btn op-btn--primary sim-run ${running ? 'is-running' : ''}`} onClick={runSweep} disabled={running}>
            {running ? 'Running twin…' : 'Run Simulation →'}
          </button>
          {running && <div className="sim-progress"><span style={{ width: (progress * 100) + '%' }} /></div>}
        </div>

        {/* ─── Results ─── */}
        <div className="sim-results">
          <div className={`sim-verdict ${ran ? 'show' : ''}`}>
            <INexus size={18} />
            <span>flowSIM recovers <strong>{m.loadsOrch - m.loadsReact} loads</strong> and avoids <strong>{fmt$(m.detReact - m.detOrch)}</strong> in detention vs. reactive ops — peak yard fill held to <strong>{m.peakOrch}%</strong> instead of <strong className="ember">{m.peakReact}%</strong>.</span>
          </div>

          <div className="sim-cmps">
            {[
              { k: 'Loads shipped / shift', r: m.loadsReact, o: m.loadsOrch, d: `+${m.loadsOrch - m.loadsReact}`, up: true },
              { k: 'Peak yard fill', r: m.peakReact + '%', o: m.peakOrch + '%', d: `−${m.peakReact - m.peakOrch}pt`, up: false },
              { k: 'Detention exposure', r: fmt$(m.detReact), o: fmt$(m.detOrch), d: `−${fmt$(m.detReact - m.detOrch)}`, up: false },
              { k: 'On-time departures', r: m.onTimeReact + '%', o: m.onTimeOrch + '%', d: `+${m.onTimeOrch - m.onTimeReact}pt`, up: true },
              { k: 'Spotter miles', r: m.milesReact + ' mi', o: m.milesOrch + ' mi', d: `−${m.milesReact - m.milesOrch} mi`, up: false },
              { k: 'Overflow events', r: m.overReact, o: 0, d: m.overReact > 0 ? `−${m.overReact}` : 'none', up: false },
            ].map(c => (
              <div key={c.k} className={`sim-cmp ${ran ? 'show' : ''}`}>
                <div className="sim-cmp-k">{c.k}</div>
                <div className="sim-cmp-rows">
                  <div className="sim-cmp-row react"><span>Reactive</span><b>{c.r}</b></div>
                  <div className="sim-cmp-row orch"><span>flowSIM</span><b>{c.o}</b></div>
                </div>
                <div className={`sim-cmp-delta ${c.up ? 'up' : 'down'}`}>{c.d}</div>
              </div>
            ))}
          </div>

          <div className="sim-chart-card">
            <div className="sim-chart-head">
              <ISim size={14} className="ic" />
              <h3>Projected Yard Occupancy</h3>
              <span className="sim-chart-sub">% of 62 spots · 06:00–18:00</span>
              <span className="sim-chart-legend">
                <span><i className="sw react" />Reactive (today)</span>
                <span><i className="sw orch" />flowSIM orchestrated</span>
              </span>
            </div>
            <div className="sim-chart-body">
              <svg viewBox={`0 0 ${W} ${H}`} className={`sim-svg ${ran ? 'show' : ''}`} preserveAspectRatio="none">
                {/* overflow band */}
                <rect x={padL} y={padT} width={W - padL - padR} height={capY - padT} className="sim-overflow" />
                <text x={W - padR - 4} y={padT + 12} className="sim-overflow-lbl" textAnchor="end">OVERFLOW · trailers spill to drop lot</text>
                {/* gridlines */}
                {[0, 25, 50, 75, 100].map(g => (
                  <g key={g}>
                    <line x1={padL} y1={yFor(g)} x2={W - padR} y2={yFor(g)} className={g === 100 ? 'sim-cap' : 'sim-grid'} />
                    <text x={padL - 5} y={yFor(g) + 3} className="sim-axis-y" textAnchor="end">{g}</text>
                  </g>
                ))}
                <text x={W - padR - 4} y={capY - 5} className="sim-cap-lbl" textAnchor="end">capacity</text>
                {/* areas + lines */}
                <polygon points={area(m.reactCurve)} className="sim-fill react" />
                <polygon points={area(m.orchCurve)} className="sim-fill orch" />
                <polyline points={pts(m.reactCurve)} className="sim-line react" />
                <polyline points={pts(m.orchCurve)} className="sim-line orch" />
                {/* overflow markers on reactive */}
                {m.reactCurve.map((v, i) => v > 100 ? <circle key={i} cx={xFor(i)} cy={yFor(v)} r="3.2" className="sim-dot-over" /> : null)}
                {/* x labels */}
                {SIM_HOURS.map((h, i) => i % 2 === 0 ? <text key={h} x={xFor(i)} y={H - 6} className="sim-axis-x" textAnchor="middle">{h}</text> : null)}
              </svg>
            </div>
            <div className="sim-chart-foot">
              <span><i className="sim-sweep-dot" /> Twin calibrated to 14-day actuals · {sc.label} scenario · severity {(m.sev).toFixed(2)}</span>
              <span className="sim-foot-cta" onClick={() => setActive && setActive('appointments')}>Push winning plan to flowSCHEDULE →</span>
            </div>
          </div>

          {/* ─── Annual ROI roll-up (v2 model) ─── */}
          <div className={`sim-roi ${ran ? 'show' : ''}`}>
            <div className="sim-roi-head">
              <INexus size={14} className="ic" />
              <h3>Annual ROI · This Facility</h3>
              <span className="chip chip--neon">Drops · no YMS archetype</span>
              <span className="sim-roi-src">v2 model · mirrors yardflow.ai/roi</span>
            </div>
            <div className="sim-roi-body">
              <div className="sim-roi-hero">
                <div className="sim-roi-big">{roiFmt(roi.total)}<span>/yr value unlocked</span></div>
                <div className="sim-roi-bar">
                  <div className="seg thru" style={{ width: thruPct + '%' }}><span>Throughput {roiFmt(roi.thru)}</span></div>
                  <div className="seg hard" style={{ width: (100 - thruPct) + '%' }}><span>Hard {roiFmt(roi.hard)}</span></div>
                </div>
                <div className="sim-roi-bridge">
                  Throughput is the lever: at <strong>{fmt$(margin)}</strong>/shipment, a sustained <strong>+{roi.sustainedUplift.toFixed(1)} loads/shift</strong> avg is <strong>{roi.annualLoads.toLocaleString()} more loads/yr</strong>. Today's {sc.label} shift recovered <strong>{recoveredToday}</strong> — peak days run hotter than the average.
                </div>
              </div>
              <div className="sim-roi-stats">
                <div className="sim-roi-stat">
                  <div className="v">{roiFmt(roi.sub)}<i>/yr</i></div>
                  <div className="k">YardFlow subscription</div>
                </div>
                <div className="sim-roi-stat">
                  <div className="v">{roi.hardReturn.toFixed(0)}×</div>
                  <div className="k">Hard savings return on subscription</div>
                </div>
                <div className="sim-roi-stat">
                  <div className="v">{roi.paybackHardMo.toFixed(1)} mo</div>
                  <div className="k">Payback · hard savings only</div>
                </div>
                <div className="sim-roi-stat ember">
                  <div className="v">$0</div>
                  <div className="k">Legacy YMS captures here — it won't deploy to a no-YMS drop yard</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

// ═════════════════════════════════════════════════════════════════
//  VIEW · Appointments — flowSCHEDULE (orchestrated dock scheduling)
// ═════════════════════════════════════════════════════════════════
const SC_START = 360;            // 06:00 in minutes
const SC_END   = 960;            // 16:00
const SC_SPAN  = SC_END - SC_START;
const scX   = (t) => ((t - SC_START) / SC_SPAN) * 100;
const scW   = (d) => (d / SC_SPAN) * 100;
const scClamp = (t) => Math.max(SC_START, Math.min(SC_END, t));
const scFmt = (t) => {
  const h = Math.floor(t / 60), m = Math.round(t % 60);
  const ap = h >= 12 ? 'p' : 'a'; let hh = h % 12; if (hh === 0) hh = 12;
  return `${hh}:${String(m).padStart(2, '0')}${ap}`;
};

// Dock doors for the Mondelēz Naperville bakery DC demo
const SC_DOORS = [
  { id: 'D01', zone: 'IN'  },
  { id: 'D02', zone: 'IN'  },
  { id: 'D03', zone: 'IN'  },
  { id: 'D04', zone: 'OUT' },
  { id: 'D05', zone: 'OUT' },
  { id: 'D06', zone: 'OUT' },
  { id: 'D07', zone: 'FLEX' },
  { id: 'D08', zone: 'FLEX' },
];

// Each appt: orchestrated start (tO) is spread; carrier-requested start (tC)
// clusters into the 8–11a band the way first-come booking actually behaves.
const SC_APPTS_0 = [
  { id: 'a1',  door: 'D01', dir: 'IN',  carrier: 'Schneider',    scac: 'SNDR', load: 'Flour · bulk',         po: 'PO-44715', dur: 90, tO: 372, tC: 480 },
  { id: 'a2',  door: 'D05', dir: 'IN',  carrier: 'Werner',       scac: 'WERN', load: 'Cane sugar',           po: 'PO-44702', dur: 60, tO: 360, tC: 420 },
  { id: 'a3',  door: 'D02', dir: 'IN',  carrier: 'J.B. Hunt',    scac: 'JBHT', load: 'Cocoa + sweetener',    po: 'PO-44730', dur: 90, tO: 450, tC: 510 },
  { id: 'a4',  door: 'D04', dir: 'OUT', carrier: 'Knight',       scac: 'KNX',  load: 'Oreo · Chips Ahoy!',   po: 'SO-88142', dst: 'Walmart DC 6094', dur: 120, tO: 480, tC: 540 },
  { id: 'a5',  door: 'D03', dir: 'IN',  carrier: 'XPO',          scac: 'XPOL', load: 'Corrugate + film',     po: 'PO-44751', dur: 60, tO: 600, tC: 600 },
  { id: 'a6',  door: 'D05', dir: 'OUT', carrier: 'C.R. England', scac: 'CRST', load: 'Ritz · Wheat Thins',   po: 'SO-88150', dst: 'Target DC T-3812', dur: 90, tO: 630, tC: 510 },
  { id: 'a7',  door: 'D06', dir: 'OUT', carrier: 'Maverick',     scac: 'MAVL', load: 'belVita · Triscuit',   po: 'SO-88163', dst: 'Kroger DC K-22', dur: 90, tO: 720, tC: 555 },
  { id: 'a8',  door: 'D07', dir: 'OUT', carrier: 'Old Dominion', scac: 'ODFL', load: 'Honey Maid · Nutter Butter', po: 'SO-88170', dst: 'Costco DC 412', dur: 90, tO: 810, tC: 630 },
  { id: 'a9',  door: 'D02', dir: 'OUT', carrier: 'Schneider',    scac: 'SNDR', load: 'Sour Patch Kids',      po: 'SO-88181', dst: 'Albertsons DC', dur: 90, tO: 780, tC: 585 },
  { id: 'a10', door: 'D04', dir: 'OUT', carrier: 'J.B. Hunt',    scac: 'JBHT', load: 'Wheat Thins',          po: 'SO-88190', dst: 'Walmart DC 6094', dur: 90, tO: 870, tC: 660 },
];

const SC_REQUESTS_0 = [
  { id: 'r1', carrier: 'J.B. Hunt', scac: 'JBHT', dir: 'IN',  load: 'Flour · bulk', po: 'PO-44766',
    reqT: 660, reqDoorPref: 'any',
    rec: { door: 'D01', dur: 90, t: 558 },
    why: ['Lands before the 11:00a inbound peak', 'D01 silo line idle 9:00–10:30', 'SNDR unload crew already staged'],
    score: 96, thru: 1, det: 320,
    alts: [{ door: 'D03', t: 690, score: 71 }, { door: 'D01', t: 660, score: 58 }] },
  { id: 'r2', carrier: 'Knight', scac: 'KNX', dir: 'OUT', load: 'Oreo · 24 plt', po: 'SO-88210', dst: 'Walmart DC 6094',
    reqT: 600, reqDoorPref: 'D04',
    rec: { door: 'D07', dur: 120, t: 690 },
    why: ['Walmart DC receiving opens 14:00 — 13:30 dispatch hits the window', 'Avoids stacking on D04 behind the live Knight load', 'Finished-goods stage lane clear at 11:30'],
    score: 93, thru: 1, det: 480,
    alts: [{ door: 'D06', t: 660, score: 74 }, { door: 'D04', t: 600, score: 49 }] },
  { id: 'r3', carrier: 'Werner', scac: 'WERN', dir: 'IN', load: 'Packaging film', po: 'PO-44771',
    reqT: 540, reqDoorPref: 'any',
    rec: { door: 'D03', dur: 60, t: 540 },
    why: ['Film line changeover at 10:00 needs stock by 9:45', 'D03 inbound bay open 9:00–10:30', 'No yard move required — direct to staging'],
    score: 90, thru: 1, det: 220,
    alts: [{ door: 'D02', t: 600, score: 68 }, { door: 'D03', t: 720, score: 61 }] },
  { id: 'r4', carrier: 'Maverick', scac: 'MAVL', dir: 'OUT', load: 'belVita · 18 plt', po: 'SO-88224', dst: 'Kroger DC K-22',
    reqT: 690, reqDoorPref: 'any',
    rec: { door: 'D03', dur: 90, t: 870 },
    why: ['Kroger appointment is 16:30 — 14:30 dispatch is on time, not early', 'Keeps midday concurrency at 3 docks', 'Trailer pool: empty staged in Zone A spot 11'],
    score: 88, thru: 1, det: 360,
    alts: [{ door: 'D06', t: 690, score: 64 }, { door: 'D07', t: 810, score: 72 }] },
];

const SC_KPIS = {
  orchestrated: [
    { k: 'Dock utilization', v: '86%',     tone: 'neon',    sub: 'no idle gaps > 25 min' },
    { k: 'On-time to appt',  v: '94%',     tone: 'success', sub: 'carrier + receiver windows' },
    { k: 'Peak concurrency', v: '3 docks', tone: 'success', sub: 'within crew capacity (4)' },
    { k: 'Detention exposure', v: '$310',  tone: 'success', sub: 'today, projected' },
    { k: 'Throughput vs plan', v: '+12%',  tone: 'neon',    sub: 'loads shipped / shift' },
    { k: 'Yard congestion',  v: 'LOW',     tone: 'success', sub: 'spotter moves balanced' },
  ],
  carrier: [
    { k: 'Dock utilization', v: '71%',     tone: 'warn',  sub: 'gaps + double-books' },
    { k: 'On-time to appt',  v: '78%',     tone: 'ember', sub: '5 windows at risk' },
    { k: 'Peak concurrency', v: '6 docks', tone: 'ember', sub: 'crew capacity is 4' },
    { k: 'Detention exposure', v: '$2,940', tone: 'ember', sub: 'today, projected' },
    { k: 'Throughput vs plan', v: '−9%',   tone: 'ember', sub: 'loads shipped / shift' },
    { k: 'Yard congestion',  v: 'HIGH',    tone: 'ember', sub: 'gridlock 10:30–11:30' },
  ],
};

const ScheduleView = () => {
  const [mode, setMode] = useState('orchestrated');
  const [appts, setAppts] = useState(SC_APPTS_0);
  const [requests, setRequests] = useState(SC_REQUESTS_0);
  const [selReq, setSelReq] = useState('r1');
  const [hover, setHover] = useState(null);
  const [toast, setToast] = useState(null);
  const [protectedTotal, setProtectedTotal] = useState(0);
  const SC_MARGIN = 1000; // $/shipment · matches flowSIM + yardflow.ai/roi baseline
  const [secs, setSecs] = useState(10 * 3600 + 38 * 60 + 12); // 10:38:12 local

  useEffect(() => {
    const t = setInterval(() => setSecs(s => s + 1), 1000);
    return () => clearInterval(t);
  }, []);

  const nowMin = secs / 60;
  const clockStr = (() => {
    const h = Math.floor(secs / 3600), m = Math.floor((secs % 3600) / 60), s = secs % 60;
    const ap = h >= 12 ? 'PM' : 'AM'; let hh = h % 12; if (hh === 0) hh = 12;
    return `${hh}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')} ${ap}`;
  })();

  const startOf = (a) => (mode === 'carrier' ? a.tC : a.tO);

  // Concurrency per 30-min bucket → congestion bars + at-risk flags
  const buckets = useMemo(() => {
    const out = [];
    for (let t = SC_START; t < SC_END; t += 30) {
      const load = appts.filter(a => { const s = startOf(a); return s < t + 30 && s + a.dur > t; }).length;
      out.push({ t, load });
    }
    return out;
  }, [appts, mode]);
  const peakLoad = Math.max(1, ...buckets.map(b => b.load));

  const apptAtRisk = (a) => {
    if (mode !== 'carrier') return false;
    const s = startOf(a);
    return buckets.some(b => b.load >= 5 && s < b.t + 30 && s + a.dur > b.t);
  };
  const apptState = (a) => {
    const s = startOf(a), e = s + a.dur;
    if (apptAtRisk(a)) return 'risk';
    if (nowMin >= s && nowMin < e) return 'live';
    if (e <= nowMin) return 'done';
    return 'confirmed';
  };

  const kpis = SC_KPIS[mode];
  const selected = requests.find(r => r.id === selReq) || null;

  const confirmReq = (req) => {
    setAppts(a => [...a, {
      id: 'bk-' + req.id, door: req.rec.door, dir: req.dir, carrier: req.carrier, scac: req.scac,
      load: req.load, po: req.po, dst: req.dst, dur: req.rec.dur, tO: req.rec.t, tC: req.rec.t, justAdded: true,
    }]);
    setRequests(rs => {
      const remaining = rs.filter(x => x.id !== req.id);
      setSelReq(remaining[0]?.id || null);
      return remaining;
    });
    setToast(`Booked · ${req.scac} → ${req.rec.door} @ ${scFmt(req.rec.t)}`);
    setProtectedTotal(p => p + req.thru * SC_MARGIN + req.det);
    setTimeout(() => setToast(null), 3400);
  };

  const hourTicks = [];
  for (let t = SC_START; t <= SC_END; t += 60) hourTicks.push(t);

  return (
    <>
      <div className="op-view-head" style={{ marginBottom: 16 }}>
        <div>
          <h1 className="op-view-title">
            Appointments
            <span style={{ color: 'var(--neon)', fontWeight: 500, fontSize: 14, fontFamily: 'var(--font-mono)', letterSpacing: '0.10em', marginLeft: 12 }}>· flowSCHEDULE</span>
          </h1>
          <p className="op-view-sub">Dock appointments scored against <strong style={{ color: '#fff' }}>live yard state</strong> — capacity, labor, trailer pool, and receiver windows — not just an open calendar slot.</p>
        </div>
        <div className="actions">
          <span className="chip chip--neon">MDZ · Naperville Bakery DC</span>
          <span className="chip chip--steel">Tue · Jan 13</span>
          <span className="sc-clock"><span className="dot" /> {clockStr}</span>
        </div>
      </div>

      {/* ─── Booking-logic toggle (the wedge) ─── */}
      <div className="sc-modebar">
        <div className="sc-mode-left">
          <div className="sc-mode-label">Booking logic</div>
          <div className="sc-toggle">
            <button className={`sc-toggle-btn ${mode === 'carrier' ? 'is-on ember' : ''}`} onClick={() => setMode('carrier')}>Carrier-requested</button>
            <button className={`sc-toggle-btn ${mode === 'orchestrated' ? 'is-on' : ''}`} onClick={() => setMode('orchestrated')}>YardFlow-orchestrated</button>
          </div>
        </div>
        <div className={`sc-mode-note ${mode}`}>
          {mode === 'carrier'
            ? <><ICaution size={15} /><span><strong>6 trucks stacked 10:30–11:30a.</strong> Crew capacity is 4 docks — yard gridlocks, spotters fall behind, ~$2,630 detention &amp; 9% throughput lost. This is what an open booking calendar produces.</span></>
            : <><IConfirm size={15} /><span><strong>Same loads, same carriers — re-slotted against live yard state.</strong> Concurrency held to 3 docks, receiver windows still hit, +12% loads shipped this shift.</span></>}
        </div>
      </div>

      {/* ─── KPI strip ─── */}
      <div className="sc-kpis">
        {kpis.map(s => (
          <div key={s.k} className={`sc-kpi sc-kpi--${s.tone}`}>
            <div className="sc-kpi-v">{s.v}</div>
            <div className="sc-kpi-k">{s.k}</div>
            <div className="sc-kpi-sub">{s.sub}</div>
          </div>
        ))}
      </div>

      <div className="sc-main">
        {/* ─── Schedule board ─── */}
        <div className="sc-board">
          <div className="sc-board-head">
            <ICalendar size={14} className="ic" />
            <h3>Dock Schedule</h3>
            <span className="sc-board-sub">8 doors · 06:00–16:00 · {appts.length} appointments</span>
            <span className="sc-legend">
              <span><i className="sw sw-live" />At dock</span>
              <span><i className="sw sw-confirmed" />Confirmed</span>
              <span><i className="sw sw-risk" />At risk</span>
              <span><i className="sw sw-done" />Complete</span>
            </span>
          </div>

          {/* hour axis */}
          <div className="sc-axis">
            <div className="sc-axis-gutter" />
            <div className="sc-axis-track">
              {hourTicks.map(t => (
                <span key={t} className="sc-tick" style={{ left: scX(t) + '%' }}>{scFmt(t).replace(':00', '')}</span>
              ))}
              <div className="sc-now" style={{ left: scX(scClamp(nowMin)) + '%' }}><span className="sc-now-cap">NOW</span></div>
            </div>
          </div>

          {/* door rows */}
          <div className="sc-rows">
            {SC_DOORS.map(d => (
              <div key={d.id} className="sc-row">
                <div className="sc-row-gutter">
                  <span className="sc-door">{d.id}</span>
                  <span className={`sc-zone sc-zone--${d.zone.toLowerCase()}`}>{d.zone}</span>
                </div>
                <div className="sc-track">
                  {/* now line within each track */}
                  <div className="sc-track-now" style={{ left: scX(scClamp(nowMin)) + '%' }} />
                  {/* ghost recommendation preview */}
                  {selected && selected.rec.door === d.id && (
                    <div className="sc-appt sc-ghost" style={{ left: scX(selected.rec.t) + '%', width: scW(selected.rec.dur) + '%' }}>
                      <span className="sc-ghost-tag">flowAI slot</span>
                    </div>
                  )}
                  {appts.filter(a => a.door === d.id).map(a => {
                    const st = apptState(a);
                    const s = startOf(a);
                    return (
                      <div
                        key={a.id}
                        className={`sc-appt sc-appt--${st} ${a.dir === 'IN' ? 'in' : 'out'} ${a.justAdded ? 'pop' : ''}`}
                        style={{ left: scX(s) + '%', width: scW(a.dur) + '%' }}
                        onMouseEnter={() => setHover({ ...a, st, s })}
                        onMouseLeave={() => setHover(null)}
                      >
                        <span className="sc-appt-scac">{a.scac}</span>
                        <span className="sc-appt-load">{a.load}</span>
                        <span className="sc-appt-time">{scFmt(s)}–{scFmt(s + a.dur)}</span>
                      </div>
                    );
                  })}
                </div>
              </div>
            ))}
          </div>

          {/* congestion bars */}
          <div className="sc-cong">
            <div className="sc-row-gutter sc-cong-label">
              <span>Concurrent<br />docks</span>
            </div>
            <div className="sc-track sc-cong-track">
              <div className="sc-cong-cap" style={{ bottom: `calc(${(4 / (peakLoad)) * 100}% )` }}><span>crew cap · 4</span></div>
              {buckets.map(b => {
                const tone = b.load >= 5 ? 'ember' : b.load >= 3 ? 'warn' : 'neon';
                return (
                  <div key={b.t} className={`sc-cong-bar ${tone}`}
                    style={{ left: scX(b.t) + '%', width: scW(30) + '%', height: `${(b.load / peakLoad) * 100}%` }}
                    title={`${scFmt(b.t)} · ${b.load} docks`} />
                );
              })}
            </div>
          </div>
        </div>

        {/* ─── flowAI booking assistant ─── */}
        <div className="sc-rail">
          <div className="sc-rail-head">
            <INexus size={14} className="ic" />
            <h3>flowAI Booking</h3>
            <span className="chip chip--neon" style={{ marginLeft: 'auto' }}>{requests.length} pending</span>
          </div>

          <div className="sc-rail-intro">
            Carrier slot requests, scored against the live yard. Pick one to see the optimal slot and why.
          </div>

          <div className="sc-protected">
            <div className="sc-protected-k">Value protected today</div>
            <div className="sc-protected-v">${protectedTotal.toLocaleString()}</div>
            <div className="sc-protected-sub">throughput + detention · @ ${SC_MARGIN.toLocaleString()}/shipment</div>
          </div>

          <div className="sc-reqlist">
            {requests.map(r => (
              <div key={r.id} className={`sc-req ${selReq === r.id ? 'is-sel' : ''}`} onClick={() => setSelReq(r.id)}>
                <div className="sc-req-top">
                  <span className={`chip ${r.dir === 'IN' ? 'chip--success' : 'chip--neon'}`}>{r.dir}</span>
                  <span className="sc-req-carrier">{r.carrier}</span>
                  <span className="sc-req-scac">{r.scac}</span>
                </div>
                <div className="sc-req-load">{r.load}{r.dst ? ` → ${r.dst}` : ''}</div>
                <div className="sc-req-meta">
                  <span>asked <strong>{scFmt(r.reqT)}</strong></span>
                  <span className="sc-req-arrow">→</span>
                  <span className="sc-req-rec">flowAI <strong>{r.rec.door} {scFmt(r.rec.t)}</strong></span>
                </div>
              </div>
            ))}
            {requests.length === 0 && (
              <div className="sc-empty"><IConfirm size={22} /><span>All requests slotted. Yard stays fluid.</span></div>
            )}
          </div>

          {selected && (
            <div className="sc-rec">
              <div className="sc-rec-head">
                <span>Recommended slot</span>
                <span className="sc-rec-score">{selected.score}<i>/100</i></span>
              </div>
              <div className="sc-rec-slot">
                <span className="sc-rec-door">{selected.rec.door}</span>
                <span className="sc-rec-time">{scFmt(selected.rec.t)} – {scFmt(selected.rec.t + selected.rec.dur)}</span>
                {selected.reqT !== selected.rec.t && (
                  <span className="sc-rec-shift">moved from {scFmt(selected.reqT)}</span>
                )}
              </div>
              <ul className="sc-rec-why">
                {selected.why.map((w, i) => <li key={i}><ICheck size={12} />{w}</li>)}
              </ul>
              <div className="sc-rec-roi">
                <span className="sc-rec-roi-k">ROI impact vs. requested slot</span>
                <div className="sc-rec-roi-row">
                  <span className="thru">+${(selected.thru * SC_MARGIN).toLocaleString()}<i>throughput protected</i></span>
                  <span className="det">−${selected.det}<i>detention avoided</i></span>
                </div>
              </div>
              <div className="sc-rec-alts">
                {selected.alts.map((al, i) => (
                  <div key={i} className="sc-rec-alt">
                    <span>{al.door} · {scFmt(al.t)}</span>
                    <span className={`sc-alt-score ${al.score < 60 ? 'low' : ''}`}>{al.score}</span>
                  </div>
                ))}
              </div>
              <button className="op-btn op-btn--primary sc-rec-confirm" onClick={() => confirmReq(selected)}>
                Confirm flowAI slot →
              </button>
            </div>
          )}
        </div>
      </div>

      {hover && (
        <div className="sc-tip" style={{ left: `min(${scX(hover.s)}%, 60%)` }}>
          <div className="sc-tip-head"><span className={`chip ${hover.dir === 'IN' ? 'chip--success' : 'chip--neon'}`}>{hover.dir}</span>{hover.carrier} · {hover.scac}</div>
          <div className="sc-tip-load">{hover.load}</div>
          <div className="sc-tip-grid">
            <span>Door</span><strong>{hover.door}</strong>
            <span>Window</span><strong>{scFmt(hover.s)}–{scFmt(hover.s + hover.dur)}</strong>
            <span>Ref</span><strong>{hover.po}</strong>
            {hover.dst && <><span>Receiver</span><strong>{hover.dst}</strong></>}
            <span>State</span><strong style={{ textTransform: 'capitalize' }}>{hover.st === 'risk' ? 'At risk' : hover.st}</strong>
          </div>
        </div>
      )}

      {toast && <div className="sc-toast"><IConfirm size={16} />{toast}</div>}
    </>
  );
};

const Placeholder = ({ label }) => (
  <>
    <div className="op-view-head">
      <div>
        <h1 className="op-view-title">{label}</h1>
        <p className="op-view-sub">View wired in nav · screen recreation pending.</p>
      </div>
    </div>
    <div style={{ border: '1px dashed rgba(0,180,255,0.15)', borderRadius: 14, padding: 64, textAlign: 'center', color: 'var(--steel-dim)' }}>
      <div style={{ fontSize: 13 }}>Screen recreation in progress.</div>
    </div>
  </>
);

// ─── App shell ─────────────────────────────────────────────────────
const App = () => {
  const validKeys = [...NAV, ...NAV_FOOT].map(n => n.key);
  const hashKey = (typeof location !== 'undefined' ? (location.hash || '').replace('#', '') : '');
  const [active, setActive] = useState(validKeys.includes(hashKey) ? hashKey : 'dashboard');
  const [autoRefresh, setAutoRefresh] = useState(true);
  const [activeFacility, setActiveFacility] = useState('PWN-04');
  const [compact, setCompact] = useState(false);
  const [theme, setTheme] = useState(() => { try { return localStorage.getItem('yf-theme') || 'dark'; } catch (e) { return 'dark'; } });
  useEffect(() => {
    document.body.classList.toggle('theme-light', theme === 'light');
    try { localStorage.setItem('yf-theme', theme); } catch (e) {}
  }, [theme]);
  const [modal, setModal] = useState(null);

  useEffect(() => {
    window.openOpModal = (kind, ctx) => setModal({ kind, ctx });
    window.openOpFacility = (code) => {
      setActiveFacility(code);
      setActive('dashboard');
    };
    return () => { delete window.openOpModal; delete window.openOpFacility; };
  }, []);

  const closeModal = () => setModal(null);

  const activeLabel = useMemo(() => {
    return ([...NAV, ...NAV_FOOT].find(n => n.key === active)?.label) || 'Dashboard';
  }, [active]);

  return (
    <div className="op-app" data-screen-label={`01 ${activeLabel}`}>
      <Sidebar active={active} onChange={setActive} />
      <div className="op-main">
        <Topbar activeLabel={activeLabel} activeFacility={activeFacility} autoRefresh={autoRefresh} setAutoRefresh={setAutoRefresh} compact={compact} setCompact={setCompact} theme={theme} setTheme={setTheme} />
        <div className="op-content">
          {active === 'dashboard'    && <DashboardView setActive={setActive} />}
          {active === 'dock-mgt'     && <DockMgtView />}
          {active === 'yard-spot'    && <YardSpotView />}
          {active === 'whiteboard'   && <WhiteboardView />}
          {active === 'driver-comms' && <DriverCommsView />}
          {active === 'driver-mgt'   && <DriverMgtView />}
          {active === 'trailers'     && <TrailersView />}
          {active === 'task-app'     && <TaskAppView />}
          {active === 'shipments'    && <ShipmentsView />}
          {active === 'appointments' && <ScheduleView />}
          {active === 'trailer-hist' && <TrailerHistoryView />}
          {active === 'task-hist'    && <TaskHistoryView />}
          {active === 'facility-mgt' && <FacilityMgtView />}
          {active === 'user-mgt'     && <UserMgtView />}
          {active === 'flow-sim'     && <FlowSimView setActive={setActive} />}
          {active === 'flow-twin'    && <FlowTwinView />}
          {active === 'flow-gate'    && <FlowGateView setActive={setActive} />}
          {!['dashboard','dock-mgt','yard-spot','whiteboard','driver-comms','driver-mgt','trailers','task-app','shipments','appointments','trailer-hist','task-hist','facility-mgt','user-mgt','flow-sim','flow-twin','flow-gate'].includes(active) &&
            <Placeholder label={activeLabel} />}
        </div>
      </div>
      {modal?.kind === 'move'         && <MoveTrailerModal     ctx={modal.ctx} onClose={closeModal} />}
      {modal?.kind === 'add'          && <AddTrailerModal      onClose={closeModal} />}
      {modal?.kind === 'reset'        && <ResetCheckInModal    ctx={modal.ctx} onClose={closeModal} />}
      {modal?.kind === 'task-new'     && <CreateTaskModal      onClose={closeModal} />}
      {modal?.kind === 'prioritize'   && <PrioritizeTasksModal onClose={closeModal} />}
      {modal?.kind === 'assign-driver'&& <AssignDriverModal    ctx={modal.ctx} onClose={closeModal} />}
    </div>
  );
};

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
