:root{color-scheme:dark;--bg: #0b1220;--panel: rgba(15, 23, 42, .85);--border: #1e293b;--text: #e2e8f0;--text-muted: #94a3b8;--accent: #38bdf8;--accent-dim: #0ea5e9;--success: #4ade80;--warning: #fbbf24;--danger: #f87171;font-family:Segoe UI,system-ui,-apple-system,sans-serif;line-height:1.5}*{box-sizing:border-box}body{margin:0;min-height:100vh;background:radial-gradient(ellipse at top,#111827 0%,var(--bg) 55%);color:var(--text)}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button,input{font:inherit}button{cursor:pointer}.app-shell{min-height:100vh;display:flex;flex-direction:column}.app-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 24px;border-bottom:1px solid var(--border);background:#020617b3;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);position:sticky;top:0;z-index:10}.app-brand{display:flex;flex-direction:column;gap:2px}.app-brand small{color:var(--text-muted);font-size:11px;letter-spacing:.08em;text-transform:uppercase}.app-brand strong{font-size:18px}.app-main{flex:1;padding:24px;max-width:1400px;width:100%;margin:0 auto}.page-title{margin:0 0 8px;font-size:28px}.page-subtitle{margin:0 0 24px;color:var(--text-muted)}.card-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.card{border:1px solid var(--border);border-radius:12px;background:var(--panel);padding:16px;transition:border-color .15s ease}.card:hover{border-color:#334155}.card h3{margin:0 0 8px;font-size:18px}.card p{margin:4px 0;color:var(--text-muted);font-size:14px}.progress-bar{height:8px;border-radius:999px;background:#1e293b;overflow:hidden;margin-top:12px}.progress-bar>span{display:block;height:100%;background:linear-gradient(90deg,var(--accent-dim),var(--accent))}.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:12px;font-weight:600}.badge-pending{background:#94a3b826;color:#cbd5e1}.badge-progress{background:#38bdf826;color:#7dd3fc}.badge-done{background:#4ade8026;color:#86efac}.table{width:100%;border-collapse:collapse}.table th,.table td{text-align:left;padding:12px;border-bottom:1px solid var(--border)}.table th{color:var(--text-muted);font-size:12px;text-transform:uppercase;letter-spacing:.05em}.piece-layout{display:grid;gap:16px;grid-template-columns:320px 1fr 360px;min-height:calc(100vh - 140px)}@media(max-width:1100px){.piece-layout{grid-template-columns:1fr}}.panel{border:1px solid var(--border);border-radius:12px;background:var(--panel);padding:16px;min-height:0}.panel h2{margin:0 0 12px;font-size:16px}.viewer-canvas{width:100%;height:480px;border-radius:8px;background:#020617}.op-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 0;border-bottom:1px solid rgba(30,41,59,.6)}.op-row:last-child{border-bottom:none}.btn{border:1px solid var(--border);background:#0f172a;color:var(--text);border-radius:8px;padding:8px 12px}.btn:hover{border-color:#475569}.btn-primary{background:var(--accent-dim);border-color:var(--accent-dim);color:#082f49;font-weight:600}.btn-primary:hover{background:var(--accent)}.btn-done{background:#4ade8026;border-color:#4ade8066;color:#86efac}.hole-item{padding:8px;border-radius:8px;border:1px solid transparent;cursor:pointer}.hole-item:hover,.hole-item.selected{border-color:var(--accent);background:#38bdf814}.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:24px}.kpi{border:1px solid var(--border);border-radius:12px;padding:12px;background:var(--panel)}.kpi strong{display:block;font-size:24px}.kpi span{color:var(--text-muted);font-size:12px}.breadcrumb{display:flex;flex-wrap:wrap;gap:8px;color:var(--text-muted);font-size:14px;margin-bottom:16px}.breadcrumb a{color:var(--text-muted)}.alert-item{padding:10px 12px;border-radius:8px;border:1px solid var(--border);font-size:13px}.alert-error{border-color:var(--danger);background:#f871711a}.alert-warning{border-color:var(--warning);background:#fbbf241a}.alert-info{border-color:var(--accent);background:#38bdf814}.alert-success{border-color:var(--success);background:#4ade8014}.override-banner{margin-bottom:12px;padding:12px;border-radius:8px;border:1px solid var(--warning);background:#fbbf2414}.app-nav{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.profile-select{background:var(--panel);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:6px 10px}.realtime-pill{font-size:11px;font-weight:600;letter-spacing:.06em;padding:4px 10px;border-radius:999px;border:1px solid var(--border)}.realtime-pill.rt-connected{color:var(--success);border-color:var(--success)}.realtime-pill.rt-disconnected,.realtime-pill.rt-offline,.realtime-pill.rt-connecting{color:var(--text-muted)}.factory-floor .page-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:24px}.factory-floor .page-header h1{margin:4px 0 0}.factory-meta{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.dashboard-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.ws-list{list-style:none;padding:0;margin:0;display:grid;gap:8px}.ws-list li{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px;border:1px solid var(--border);border-radius:8px}.kpi{font-size:32px;font-weight:700;margin:0 0 8px;color:var(--accent)}.mobile-app{max-width:480px;margin:0 auto}.mobile-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.mobile-header h1{margin:0;font-size:20px}.mobile-scanner-tabs{display:flex;gap:8px;margin-bottom:12px}.mobile-scanner-tabs button{flex:1;padding:10px;border-radius:8px;border:1px solid var(--border);background:var(--panel);color:var(--text)}.mobile-scanner-tabs button.active{border-color:var(--accent);color:var(--accent)}.mobile-camera-wrap{border-radius:12px;overflow:hidden;border:1px solid var(--border);margin-bottom:12px}.mobile-camera{width:100%;display:block;background:#000;min-height:220px}.mobile-manual{display:flex;gap:8px}.mobile-manual input{flex:1;padding:10px;border-radius:8px;border:1px solid var(--border);background:var(--panel);color:var(--text)}.mobile-nav{display:flex;gap:16px;margin-top:20px;padding-top:16px;border-top:1px solid var(--border)}.mobile-piece header{margin-bottom:16px}.mobile-piece header strong{display:block;font-size:22px;letter-spacing:.04em}.mobile-wo-list{list-style:none;padding:0;margin:0;display:grid;gap:8px}.mobile-wo-list li{display:flex;justify-content:space-between;align-items:center;padding:12px;border:1px solid var(--border);border-radius:8px}.sync-pill{display:inline-block;font-size:11px;padding:2px 8px;border-radius:999px;margin-top:6px}.sync-in_sync{color:var(--success);border:1px solid var(--success)}.sync-out_of_sync,.sync-syncing{color:var(--warning);border:1px solid var(--warning)}.sync-conflict{color:var(--danger);border:1px solid var(--danger)}.hint{color:var(--text-muted);font-size:13px}.error-text{color:var(--danger)}.page-loading{color:var(--text-muted)}.industrial-page-header{margin-bottom:20px}.industrial-kpi-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;margin-bottom:20px}.industrial-kpi-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:12px;display:grid;gap:4px}.industrial-kpi-card span{color:var(--text-muted);font-size:12px}.industrial-two-col{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}.industrial-panel{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px}.industrial-panel h2,.industrial-panel h3{margin:0 0 12px;font-size:14px}.industrial-list{margin:0;padding-left:18px}.industrial-list.compact{font-size:13px;margin-bottom:12px}.industrial-table{width:100%;border-collapse:collapse;font-size:13px}.industrial-table th,.industrial-table td{border-bottom:1px solid var(--border);padding:8px;text-align:left}.industrial-form-row{display:flex;gap:8px;flex-wrap:wrap}.industrial-form-row input,.industrial-form-row select{flex:1;min-width:120px;padding:8px;border-radius:6px;border:1px solid var(--border);background:#0f172a;color:var(--text)}.industrial-inline-btn{margin-left:8px;font-size:11px}.industrial-error{color:var(--danger)}
