/* ========================================================= OZON Tech Sorter — Product Demo UI ========================================================= */ :root { color-scheme: dark; --bg: #050910; --panel: rgba(10, 19, 31, 0.92); --panel-strong: #0c1725; --line: #1e3a54; --muted: #91a4b8; --text: #e5f2ff; --cyan: #38bdf8; --cyan-hover: #7dd3fc; --green: #4ade80; --orange: #f59e0b; --purple: #c084fc; --red: #fb3d4e; --section-max: 1200px; --radius: 16px; --tap: 44px; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } *, *::before, *::after { box-sizing: border-box; } html, body, #root { width: 100%; max-width: 100%; min-width: 0; overflow-x: hidden; } html { scroll-behavior: smooth; } body { margin: 0; min-height: 100vh; background: radial-gradient(circle at 18% 8%, rgba(56, 189, 248, 0.14), transparent 28%), radial-gradient(circle at 88% 18%, rgba(192, 132, 252, 0.1), transparent 24%), linear-gradient(160deg, #03060b 0%, #07111d 52%, #050910 100%); color: var(--text); font-size: 16px; line-height: 1.5; } img, svg, canvas, video { max-width: 100%; height: auto; } h1, h2, h3, p, ol, ul { margin: 0; } button, a { font: inherit; } button { min-height: var(--tap); border: 1px solid #2a4a66; border-radius: 12px; background: #0e1b2b; color: var(--text); cursor: pointer; font-weight: 700; transition: transform 160ms ease, border-color 160ms ease, background 160ms ease; } button:hover { border-color: var(--cyan); background: #11273b; transform: translateY(-1px); } button:focus-visible, .nav-link:focus-visible, .criteria-link:focus-visible { outline: 2px solid var(--cyan); outline-offset: 2px; } button:disabled { cursor: not-allowed; opacity: 0.45; transform: none; } .btn-primary, .btn-secondary { display: inline-flex; align-items: center; justify-content: center; min-height: var(--tap); padding: 0 22px; border-radius: 12px; font-size: 16px; font-weight: 700; text-decoration: none; text-align: center; } .btn-primary { border: none; background: linear-gradient(135deg, #38bdf8, #0ea5e9); color: #041018; } .btn-primary:hover { background: linear-gradient(135deg, #7dd3fc, #38bdf8); color: #041018; } .btn-secondary { background: #0e1b2b; color: var(--text); border: 1px solid #2a4a66; } .category-B { color: var(--green); } .category-C { color: var(--orange); } .category-D { color: var(--purple); } .fail-text { color: var(--red); } .pass-text { color: var(--green); } .warning-note { color: #facc15; font-weight: 700; } .error-note { color: var(--red); font-weight: 700; } .proof-item em { display: block; margin-top: 2px; color: var(--muted); font-size: 12px; font-style: normal; } .proof-limits { margin-top: 12px; color: var(--muted); font-size: 13px; } .eyebrow, .section-eyebrow { color: var(--cyan); font-size: 12px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; } /* ---------- Product page shell ---------- */ .product-page { display: flex; flex-direction: column; min-height: 100vh; width: 100%; max-width: 100%; overflow-x: hidden; } .product-main { flex: 1; width: min(100%, var(--section-max)); max-width: 100%; margin: 0 auto; padding: 0 clamp(16px, 3vw, 28px); min-width: 0; } .site-footer { width: 100%; padding: clamp(24px, 4vw, 40px) clamp(16px, 3vw, 28px); border-top: 1px solid var(--line); color: var(--muted); text-align: center; font-size: 14px; } /* ---------- Header ---------- */ .site-header { position: sticky; top: 0; z-index: 100; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; width: 100%; max-width: 100%; padding: 12px clamp(16px, 3vw, 28px); border-bottom: 1px solid var(--line); background: rgba(5, 9, 16, 0.88); backdrop-filter: blur(14px); } .header-logo { display: flex; align-items: center; gap: 12px; min-width: 0; } .logo-icon { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 10px; background: linear-gradient(135deg, #38bdf8, #818cf8); color: #041018; font-weight: 900; } .logo-text { display: flex; flex-direction: column; min-width: 0; } .logo-title { font-size: 15px; font-weight: 800; line-height: 1.1; } .logo-subtitle { color: var(--muted); font-size: 12px; } .header-nav { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; } .nav-link { min-height: var(--tap); padding: 0 14px; border: 1px solid transparent; border-radius: 999px; background: transparent; color: var(--text); font-size: 14px; font-weight: 700; } .nav-link:hover, .nav-reset:hover { border-color: var(--line); background: rgba(56, 189, 248, 0.08); color: var(--cyan); } .header-status-compact { display: inline-flex; align-items: center; gap: 8px; min-height: 36px; padding: 0 12px; border: 1px solid var(--line); border-radius: 999px; background: #091522; color: #c8d7e8; font-size: 13px; font-weight: 700; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); box-shadow: 0 0 10px var(--green); } .status-dot.paused { background: var(--orange); box-shadow: 0 0 10px var(--orange); } .status-dot.fault, .status-dot.emergency_stop { background: var(--red); box-shadow: 0 0 10px var(--red); } /* ---------- Hero ---------- */ .hero-section { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr); gap: clamp(24px, 4vw, 48px); align-items: center; padding: clamp(36px, 6vw, 72px) 0 clamp(40px, 6vw, 64px); } .hero-content, .hero-visual { min-width: 0; } .hero-eyebrow { margin-bottom: 14px; } .hero-title { margin-bottom: 18px; font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.08; letter-spacing: -0.03em; font-weight: 900; } .hero-subtitle { max-width: 38rem; margin-bottom: 24px; color: var(--muted); font-size: clamp(16px, 1.5vw, 18px); line-height: 1.55; } .hero-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 28px; } .hero-badge { padding: 8px 12px; border: 1px solid rgba(56, 189, 248, 0.24); border-radius: 999px; background: rgba(56, 189, 248, 0.1); color: #bfe9ff; font-size: 13px; font-weight: 700; } .hero-actions { display: flex; flex-wrap: wrap; gap: 12px; } .hero-chain { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; padding: clamp(18px, 3vw, 28px); border: 1px solid var(--line); border-radius: 24px; background: linear-gradient(160deg, rgba(56, 189, 248, 0.1), rgba(12, 23, 37, 0.92) 40%), var(--panel); box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28); } .chain-step { display: flex; flex-direction: column; align-items: center; gap: 10px; min-width: 0; text-align: center; } .chain-icon { display: grid; place-items: center; width: 48px; height: 48px; border: 1px solid rgba(56, 189, 248, 0.35); border-radius: 14px; background: #0d1b2a; color: var(--cyan); font-size: 16px; font-weight: 900; } .chain-step span { color: #c8d7e8; font-size: 13px; font-weight: 700; } .chain-arrow { display: none; } .hero-chain-caption { margin-top: 14px; color: var(--muted); font-size: 14px; text-align: center; } /* ---------- Shared sections ---------- */ .section-header { margin-bottom: clamp(20px, 3vw, 32px); } .section-header h2, .demo-header h2, .engineering-toggle h2 { margin: 8px 0 10px; font-size: clamp(1.5rem, 2.4vw, 2rem); font-weight: 800; letter-spacing: -0.02em; } .section-header p, .demo-lead, .engineering-lead { max-width: 42rem; color: var(--muted); font-size: 16px; line-height: 1.5; } /* ---------- Product demo ---------- */ .product-demo-section, .storyline-section, .scenario-cards-section, .criteria-cards-section, .engineering-details-section { padding: clamp(36px, 5vw, 64px) 0; border-top: 1px solid rgba(30, 58, 84, 0.8); } .demo-header { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 24px; } .demo-status { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 44px; padding: 10px 14px; border: 1px solid var(--line); border-radius: 999px; background: var(--panel); color: var(--muted); font-size: 14px; } .demo-status strong { color: var(--cyan); } .demo-layout { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 0.9fr); gap: 20px; align-items: start; } .demo-scene-column, .demo-result-column, .demo-scene-container, .demo-controls, .demo-result-summary { min-width: 0; } .demo-mobile-hint { display: none; margin-bottom: 12px; color: var(--muted); font-size: 15px; } .demo-scene-container { padding: clamp(12px, 2vw, 18px); border: 1px solid var(--line); border-radius: 20px; background: var(--panel); box-shadow: 0 18px 50px rgba(0, 0, 0, 0.22); } .demo-scene-3d { min-height: 420px; } .view-mode-toggle { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; } .digital-twin-wrap { display: flex; flex-direction: column; gap: 10px; width: 100%; min-width: 0; } .digital-twin-canvas { width: 100%; min-width: 0; height: min(52vh, 520px); min-height: 360px; border-radius: 14px; overflow: hidden; background: #050910; border: 1px solid #1e3a54; } .digital-twin-simplified .digital-twin-canvas { height: min(46vh, 420px); min-height: 300px; } .digital-twin-canvas canvas { display: block; width: 100% !important; height: 100% !important; } .digital-twin-hud { display: flex; flex-wrap: wrap; gap: 8px; } .twin-chip { display: inline-flex; align-items: center; min-height: 28px; padding: 4px 10px; border: 1px solid #284762; border-radius: 999px; background: #091522; color: #c8d7e8; font-size: 12px; font-weight: 700; } .muted-chip { color: var(--muted); } .three-fallback-note, .three-loading { margin: 0 0 12px; padding: 10px 12px; border: 1px solid rgba(56, 189, 248, 0.28); border-radius: 12px; background: rgba(56, 189, 248, 0.08); color: #bfe9ff; font-size: 14px; } .three-capability-check { display: grid; gap: 12px; } .three-capability-meta { display: flex; flex-wrap: wrap; gap: 10px; font-size: 13px; color: var(--muted); } .three-capability-meta strong { color: var(--text); width: 100%; } .three-capability-canvas { width: 100%; height: 220px; border-radius: 12px; overflow: hidden; border: 1px solid var(--line); background: #050910; } .demo-result-column { display: flex; flex-direction: column; gap: 14px; } .demo-result-summary { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .summary-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 12px; border: 1px solid #1a2f44; border-radius: 12px; background: #0d1b2a; } .summary-item span { color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; } .summary-item strong { font-size: 15px; word-break: break-word; } .demo-controls { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .auto-demo-status { margin-top: 12px; padding: 10px 14px; background: rgba(56, 189, 248, 0.1); border: 1px solid rgba(56, 189, 248, 0.3); border-radius: 8px; font-size: 14px; color: #e5f2ff; font-weight: 600; } .auto-demo-status strong { color: #38bdf8; text-transform: capitalize; } /* ---------- Proof card ---------- */ .proof-card { display: flex; flex-direction: column; gap: 16px; padding: 20px; border: 1px solid var(--line); border-radius: 20px; background: var(--panel); } .proof-card-stopped { border-color: rgba(251, 61, 78, 0.55); box-shadow: 0 0 24px rgba(251, 61, 78, 0.12); } .proof-card-empty { min-height: 220px; align-items: center; justify-content: center; text-align: center; } .proof-card-empty h3 { margin: 8px 0; font-size: 1.25rem; } .proof-card-empty p, .proof-reason p { color: var(--muted); } .proof-card-header { padding-bottom: 12px; border-bottom: 1px solid var(--line); } .proof-card-header h3 { margin-top: 4px; font-size: 1.25rem; } .proof-summary { display: flex; flex-direction: column; gap: 10px; padding: 16px; border: 2px solid var(--cyan); border-radius: 12px; background: rgba(56, 189, 248, 0.06); } .summary-row { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; } .summary-label { color: var(--cyan); font-size: 14px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; min-width: 88px; } .summary-row strong { font-size: 18px; font-weight: 800; } .summary-row em { flex: 1; min-width: 200px; color: var(--muted); font-size: 14px; font-style: normal; line-height: 1.4; } .proof-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .proof-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 12px; border: 1px solid #1a2f44; border-radius: 12px; background: #0d1b2a; } .proof-item-wide { grid-column: 1 / -1; } .proof-label { color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; } .proof-item strong { font-size: 16px; word-break: break-word; } .proof-details { display: flex; flex-direction: column; gap: 8px; padding: 12px; border: 1px solid #1a2f44; border-radius: 12px; background: #0d1b2a; font-size: 14px; } .detail-row { display: flex; justify-content: space-between; gap: 12px; } .detail-row span { color: var(--muted); } .proof-reason { padding: 14px 16px; border-left: 4px solid var(--cyan); border-radius: 0 12px 12px 0; background: rgba(56, 189, 248, 0.06); } .proof-reason strong { display: block; margin-bottom: 6px; } /* ---------- Storyline ---------- */ .storyline-stepper { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 12px; padding: 0; list-style: none; } .story-step { display: flex; flex-direction: column; gap: 12px; min-width: 0; padding: 16px; border: 1px solid var(--line); border-radius: 16px; background: var(--panel); } .step-indicator { display: grid; place-items: center; width: 36px; height: 36px; border: 2px solid #2a4a66; border-radius: 50%; background: #050910; } .step-number { font-size: 14px; font-weight: 800; } .step-content { display: flex; flex-direction: column; gap: 4px; min-width: 0; } .step-content strong { font-size: 15px; } .step-content span { color: var(--muted); font-size: 13px; line-height: 1.4; } .step-status-label { margin-top: 4px; font-size: 12px !important; font-weight: 800; letter-spacing: 0.04em; text-transform: uppercase; } .step-active { border-color: rgba(56, 189, 248, 0.7); background: rgba(56, 189, 248, 0.08); box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.18); } .step-active .step-indicator { border-color: var(--cyan); color: var(--cyan); } .step-active .step-status-label { color: var(--cyan) !important; } .step-done { border-color: rgba(74, 222, 128, 0.45); } .step-done .step-indicator { border-color: var(--green); background: rgba(74, 222, 128, 0.16); color: var(--green); } .step-done .step-status-label { color: var(--green) !important; } .step-pending { opacity: 0.72; } /* ---------- Scenario cards ---------- */ .scenario-grid, .criteria-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 16px; } .scenario-card, .criteria-card { display: flex; flex-direction: column; gap: 12px; min-width: 0; padding: 18px; border: 1px solid var(--line); border-radius: 16px; background: var(--panel); } .scenario-card:hover, .criteria-card:hover { border-color: rgba(56, 189, 248, 0.45); transform: translateY(-2px); transition: border-color 160ms ease, transform 160ms ease; } .scenario-card.active { border-color: var(--cyan); background: rgba(56, 189, 248, 0.06); box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.25); } .scenario-card-header, .criteria-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; } .scenario-card-header h3, .criteria-card-header h3 { font-size: 1.05rem; line-height: 1.25; } .scenario-desc, .criteria-evidence { color: var(--muted); font-size: 15px; line-height: 1.45; flex: 1; } .scenario-expected { display: flex; flex-direction: column; gap: 4px; padding: 12px; border-radius: 12px; background: #0d1b2a; border: 1px solid #1a2f44; font-size: 14px; } .scenario-expected span { color: #7f93a8; font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; } .result-badge, .status-badge { display: inline-flex; align-items: center; min-height: 28px; padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 800; white-space: nowrap; } .tone-b { background: rgba(74, 222, 128, 0.12); color: var(--green); } .tone-c { background: rgba(245, 158, 11, 0.12); color: var(--orange); } .tone-d { background: rgba(192, 132, 252, 0.12); color: var(--purple); } .tone-mixed { background: rgba(56, 189, 248, 0.12); color: var(--cyan); } .tone-fault { background: rgba(251, 61, 78, 0.12); color: #fda4af; } .status-covered, .status-badge.status-covered { background: rgba(74, 222, 128, 0.12); color: var(--green); } .status-demo, .status-badge.status-demo { background: rgba(192, 132, 252, 0.12); color: var(--purple); } .criteria-footer { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 12px; border-top: 1px solid var(--line); color: var(--muted); font-size: 14px; } .criteria-link { min-height: 36px; padding: 0 10px; border: 1px solid rgba(56, 189, 248, 0.28); border-radius: 999px; background: rgba(56, 189, 248, 0.08); color: var(--cyan); font-size: 13px; font-weight: 700; } /* ---------- C-priority explanation ---------- */ .c-priority-section { margin: clamp(40px, 6vw, 72px) 0; } .c-priority-card { display: flex; gap: 20px; align-items: center; padding: clamp(20px, 4vw, 32px); border: 2px solid var(--orange); border-radius: 20px; background: linear-gradient(135deg, rgba(245, 158, 11, 0.08) 0%, rgba(245, 158, 11, 0.02) 100%); } .c-priority-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 72px; height: 72px; border-radius: 16px; background: var(--orange); color: #041018; font-size: 36px; font-weight: 900; } .c-priority-content { display: flex; flex-direction: column; gap: 12px; flex: 1; } .c-priority-content h3 { font-size: 1.5rem; color: var(--text); } .c-priority-content p { color: var(--muted); font-size: 15px; line-height: 1.5; } .c-priority-content .btn-primary { align-self: flex-start; margin-top: 4px; } @media (max-width: 640px) { .c-priority-card { flex-direction: column; text-align: center; } .c-priority-content .btn-primary { align-self: stretch; width: 100%; } } /* ---------- Engineering details ---------- */ .engineering-toggle { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px; padding: clamp(18px, 3vw, 24px); border: 1px solid var(--line); border-radius: 18px; background: var(--panel); } .engineering-content { margin-top: 20px; } .engineering-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap: 16px; margin-top: 16px; } .eng-panel { min-width: 0; padding: 14px; border: 1px solid var(--line); border-radius: 16px; background: var(--panel); overflow: hidden; } .eng-panel-wide { grid-column: 1 / -1; } .eng-panel .panel { border: none; background: transparent; box-shadow: none; padding: 0; } /* ---------- Scene ---------- */ .scene-wrap { width: 100%; min-width: 0; } .scene-title-row, .scene-simple-header, .panel-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 12px; } .scene-simple-header { align-items: center; } .sorter-svg { display: block; width: 100%; max-width: 100%; height: auto; border-radius: 16px; background: #060d16; } .machine-state-chip, .status-pill, .scenario-label { display: inline-flex; align-items: center; gap: 8px; min-height: 34px; padding: 6px 12px; border: 1px solid #284762; border-radius: 999px; background: #091522; color: #c8d7e8; font-size: 12px; font-weight: 800; } .fault-chip { border-color: var(--red); color: #fecdd3; } .zone rect { fill: rgba(14, 27, 43, 0.82); stroke-width: 2; } .zone text, .device text, .gate text, .pusher text, .item-label, .scale-label { fill: #b8c8da; font-size: 14px; font-weight: 700; text-anchor: middle; } .zone-label-large { fill: #f4fbff !important; font-size: 34px !important; font-weight: 900 !important; } .zone-a rect { stroke: #38bdf8; } .zone-b rect { stroke: #4ade80; } .zone-c rect { stroke: #f59e0b; } .zone-d rect { stroke: #c084fc; } .zone-active rect { fill: rgba(56, 189, 248, 0.08); filter: drop-shadow(0 0 10px rgba(56, 189, 248, 0.25)); } .zone-b.zone-active rect { fill: rgba(74, 222, 128, 0.12); } .zone-c.zone-active rect { fill: rgba(245, 158, 11, 0.12); } .zone-d.zone-active rect { fill: rgba(192, 132, 252, 0.12); } .device rect, .device circle { fill: #0f2031; stroke: #31526d; stroke-width: 2; } .device line { stroke: #31526d; stroke-width: 2; stroke-dasharray: 6 5; } .device.active rect, .device.active circle { stroke: var(--cyan); filter: drop-shadow(0 0 10px rgba(56, 189, 248, 0.7)); } .device.active line { stroke: var(--cyan); } .gate line { stroke-width: 7; stroke-linecap: round; } .gate.open line { stroke: var(--green); transform: rotate(22deg); transform-origin: 680px 315px; } .gate.closed line { stroke: var(--red); } .pusher rect { fill: #101d2d; stroke: #395873; stroke-width: 2; } .pusher.extended rect { stroke: var(--orange); filter: drop-shadow(0 0 12px rgba(245, 158, 11, 0.55)); } .conveyor { fill: #101f30; stroke: #4b647d; stroke-width: 2; } .conveyor.stopped { fill: #2a1219; stroke: var(--red); filter: drop-shadow(0 0 12px rgba(251, 61, 78, 0.35)); } .belt-center { stroke: #7b8fa5; stroke-width: 2; stroke-dasharray: 18 12; } .roller-line { stroke: #243d55; stroke-width: 3; } .dimension-line line { stroke: #6c849d; stroke-width: 1.4; stroke-dasharray: 5 5; } .dimension-line circle { fill: #6c849d; } .dimension-line text, .legend-item text, .route-command text { fill: #d9e8f7; font-size: 12px; font-weight: 800; text-anchor: middle; } .scene-legend text { text-anchor: start; fill: #b8c8da; font-size: 11px; } .route-guide { fill: none; stroke-width: 3; stroke-dasharray: 10 9; opacity: 0.34; } .route-b { stroke: var(--green); } .route-c { stroke: var(--orange); } .route-d { stroke: var(--purple); } .route-active { opacity: 1; stroke-width: 4; } .route-command text { fill: #05101b; font-size: 13px; } .bbox rect { fill: none; stroke: var(--cyan); stroke-width: 2; stroke-dasharray: 6 5; filter: drop-shadow(0 0 8px rgba(56, 189, 248, 0.7)); } .bbox text { fill: var(--cyan); font-size: 12px; text-anchor: middle; font-weight: 800; } .fault-overlay rect { fill: rgba(54, 12, 22, 0.88); stroke: var(--red); stroke-width: 2; } .fault-overlay text { fill: #fecdd3; font-size: 16px; font-weight: 900; text-anchor: middle; } .left-label { text-anchor: start; } /* ---------- Engineering panels ---------- */ .panel { border: 1px solid var(--line); border-radius: 20px; background: var(--panel); } .compact-panel, .metrics-panel, .pid-panel, .event-panel, .scenario-panel, .timeline-panel, .criteria-panel { padding: 4px; } .kv-grid { display: grid; grid-template-columns: minmax(0, 120px) minmax(0, 1fr); gap: 9px 12px; font-size: 13px; } .kv-grid span, .muted { color: var(--muted); } .state-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; } .state { display: flex; align-items: center; gap: 7px; min-width: 0; padding: 7px 8px; border: 1px solid #243e57; border-radius: 9px; color: #95a7bc; font-size: 11px; font-weight: 800; } .state span { width: 7px; height: 7px; border-radius: 50%; background: #33485c; flex-shrink: 0; } .state.active { color: #f4fbff; border-color: var(--cyan); background: rgba(56, 189, 248, 0.11); } .state.active span { background: var(--cyan); box-shadow: 0 0 14px var(--cyan); } .sensor-stack { display: grid; gap: 8px; } .sensor-row { display: flex; justify-content: space-between; gap: 12px; padding: 10px; border: 1px solid #243e57; border-radius: 12px; background: #0b1725; } .sensor-row.active { border-color: var(--cyan); box-shadow: inset 0 0 0 1px rgba(56, 189, 248, 0.2); } .sensor-row strong, .sensor-row span, .sensor-meta span { display: block; font-size: 12px; } .sensor-row span, .sensor-meta span { color: var(--muted); } .sensor-meta { text-align: right; } .actuator-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 10px; } .actuator-grid div, .pid-bars div { padding: 9px; border: 1px solid #243e57; border-radius: 12px; background: #081422; } .actuator-grid span, .pid-bars span { display: block; color: var(--muted); font-size: 11px; } .actuator-grid strong, .pid-bars strong { font-size: 13px; } .metric-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .metric-card { min-height: 78px; min-width: 0; padding: 10px; border: 1px solid #243e57; border-radius: 14px; background: linear-gradient(180deg, #0b1725, #07111d); } .metric-card span, .metric-card em { display: block; color: var(--muted); font-size: 11px; font-style: normal; } .metric-card strong { display: block; margin: 5px 0; font-size: 20px; letter-spacing: -0.04em; } .pid-bars { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .speed-track { height: 10px; margin: 12px 0; overflow: hidden; border-radius: 999px; background: #102034; } .speed-track div { height: 100%; background: linear-gradient(90deg, var(--cyan), var(--green)); } .pid-sparkline { width: 100%; height: 72px; margin: 4px 0 10px; border: 1px solid #243e57; border-radius: 12px; background: #071423; } .pid-sparkline path { stroke: #223c55; stroke-width: 1; } .pid-sparkline polyline { fill: none; stroke: var(--cyan); stroke-width: 3; stroke-linejoin: round; stroke-linecap: round; } .timeline-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: 6px; margin-bottom: 10px; } .timeline-summary div { padding: 8px; border: 1px solid #243e57; border-radius: 10px; background: #081422; } .timeline-summary span, .timeline-summary strong { display: block; font-size: 11px; } .timeline-summary span { color: var(--muted); } .timeline-list { display: grid; gap: 6px; max-height: 260px; overflow: auto; } .timeline-row { display: grid; grid-template-columns: 14px minmax(0, 1fr) 60px 62px 58px; align-items: center; gap: 7px; padding: 7px 8px; border: 1px solid #203950; border-radius: 10px; color: #b8c8da; font-size: 11px; } .timeline-row em { color: var(--muted); font-style: normal; font-weight: 800; } .timeline-dot { width: 9px; height: 9px; border-radius: 50%; background: #31485f; } .timeline-row.done .timeline-dot { background: var(--green); } .timeline-row.active { border-color: var(--cyan); background: rgba(56, 189, 248, 0.09); } .timeline-row.active .timeline-dot { background: var(--cyan); box-shadow: 0 0 12px var(--cyan); } .timeline-row.skipped { opacity: 0.48; } .event-table { overflow: auto; max-height: 290px; max-width: 100%; border: 1px solid #243e57; border-radius: 14px; } .event-row { display: grid; grid-template-columns: 62px 84px 116px 88px 128px minmax(160px, 1fr) 68px; gap: 8px; min-width: 720px; padding: 8px 10px; border-bottom: 1px solid #172d42; color: #c8d7e8; font-size: 12px; } .event-head { position: sticky; top: 0; z-index: 1; background: #0d1b2b; color: var(--muted); font-weight: 800; text-transform: uppercase; } .event-row.warning { color: #facc15; } .event-row.error { color: #fb7185; } .event-row.success { color: #86efac; } .empty-log { padding: 16px; color: var(--muted); } .log-filters { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; } .log-filters button, .small-button { min-height: 32px; padding: 4px 8px; font-size: 11px; } .log-filters button.active { border-color: var(--cyan); background: rgba(56, 189, 248, 0.12); } .scenario-buttons { display: grid; gap: 8px; max-height: 320px; overflow: auto; } .scenario-buttons button { padding: 10px; text-align: left; } .scenario-buttons button strong, .scenario-buttons button span, .scenario-buttons button em { display: block; } .scenario-buttons button span, .scenario-buttons button em { margin-top: 4px; color: var(--muted); font-size: 12px; font-weight: 500; font-style: normal; } .scenario-buttons button.active { border-color: var(--cyan); background: rgba(56, 189, 248, 0.12); } .criteria-filters { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; } .criteria-filters button { min-height: 32px; padding: 4px 8px; font-size: 11px; } .criteria-filters button.active { border-color: var(--cyan); background: rgba(56, 189, 248, 0.12); } .criteria-list { display: grid; gap: 8px; max-height: 320px; overflow: auto; } .criterion-card { padding: 10px; border: 1px solid #243e57; border-radius: 13px; background: #081422; } .criterion-card.related { border-color: var(--green); background: rgba(74, 222, 128, 0.07); } .criterion-card div { display: flex; justify-content: space-between; gap: 8px; margin-bottom: 6px; } .criterion-card strong, .criterion-card p, .criterion-card em { display: block; font-size: 12px; } .criterion-card p { color: #c1d1e3; line-height: 1.35; } .criterion-card em { margin-top: 6px; color: var(--muted); font-style: normal; } .criterion-status { white-space: nowrap; color: var(--cyan); font-size: 10px; font-weight: 900; text-transform: uppercase; } .criteria-count { padding: 5px 9px; border: 1px solid #284762; border-radius: 999px; background: #071423; color: #b9cce0; font-size: 11px; font-weight: 750; } .status-covered { color: var(--green); } .status-partially-covered { color: var(--orange); } .status-demo-step-available { color: var(--purple); } .pseudo-cv-block { margin-top: 12px; padding: 10px; border: 1px solid #24445f; border-radius: 14px; background: #071423; } .pseudo-cv-block h3 { margin: 0 0 8px; color: var(--cyan); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; } .compact-kv { grid-template-columns: minmax(0, 116px) minmax(0, 1fr); } .rule-stack { display: grid; gap: 9px; } .rule-card { padding: 10px; border: 1px solid #243e57; border-radius: 13px; background: #081422; } .rule-card div { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; } .rule-card strong { font-size: 13px; } .rule-card p { color: var(--muted); font-size: 12px; line-height: 1.35; } .verdict, .decision-badge { display: inline-flex; align-items: center; min-height: 22px; padding: 3px 8px; border: 1px solid #334d66; border-radius: 999px; font-size: 10px; font-weight: 900; letter-spacing: 0.06em; } .verdict.pass { color: var(--green); border-color: var(--green); } .verdict.fail { color: var(--orange); border-color: var(--orange); } .verdict.pending, .verdict.skipped { color: var(--muted); } .decision-tree { display: grid; gap: 8px; padding-left: 20px; color: #b8c8da; font-size: 13px; } .decision-tree li { padding: 8px 10px; border: 1px solid #243e57; border-radius: 10px; background: #0b1725; } .decision-tree .pass { border-color: rgba(74, 222, 128, 0.65); } .decision-tree .fail { border-color: rgba(245, 158, 11, 0.7); } /* ---------- Responsive ---------- */ @media (max-width: 1199px) { .hero-section { grid-template-columns: 1fr; } .hero-chain { grid-template-columns: repeat(4, minmax(0, 1fr)); } .demo-layout { grid-template-columns: 1fr; } .storyline-stepper { grid-template-columns: repeat(3, minmax(0, 1fr)); } } @media (max-width: 899px) { .storyline-stepper { grid-template-columns: repeat(2, minmax(0, 1fr)); } .metric-grid, .state-list, .actuator-grid, .pid-bars { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 639px) { .site-header { align-items: stretch; } .header-nav { width: 100%; } .nav-link { flex: 1 1 calc(50% - 8px); } .header-status-compact { width: 100%; justify-content: center; } .hero-section { padding-top: 28px; } .hero-title { font-size: clamp(1.75rem, 8vw, 2.2rem); } .hero-actions, .demo-controls { grid-template-columns: 1fr; display: grid; } .hero-actions .btn-primary, .hero-actions .btn-secondary, .demo-controls .btn-primary, .demo-controls .btn-secondary { width: 100%; } .hero-chain { grid-template-columns: repeat(2, minmax(0, 1fr)); } .demo-mobile-hint { display: block; } .demo-result-summary, .proof-grid { grid-template-columns: 1fr; } .storyline-stepper, .scenario-grid, .criteria-grid, .engineering-grid { grid-template-columns: 1fr; } .engineering-toggle { flex-direction: column; align-items: stretch; } .engineering-toggle .btn-secondary { width: 100%; } .metric-grid, .state-list, .actuator-grid, .pid-bars, .timeline-summary { grid-template-columns: 1fr; } .timeline-row { grid-template-columns: 14px minmax(0, 1fr); } .timeline-row em:nth-child(n + 3) { display: none; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } button, .scenario-card, .criteria-card { transition: none; } } /* ========================================================= Main Page — Full-Screen 3D Demo ========================================================= */ .main-page { position: relative; width: 100vw; height: 100vh; overflow: hidden; background: var(--bg); } .main-demo-viewport { position: absolute; inset: 0; z-index: 1; } .main-demo-viewport .digital-twin-wrap { height: 100%; } .main-demo-viewport .digital-twin-canvas { height: 100% !important; min-height: 100% !important; border: none; border-radius: 0; } .main-demo-viewport .digital-twin-hud { display: none; } .main-demo-viewport .three-fallback-note { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 90%; } /* Main page HUD - top right, compact */ .main-hud { position: absolute; top: 12px; right: 12px; z-index: 10; display: flex; flex-direction: column; gap: 4px; min-width: 160px; max-width: 200px; padding: 10px 12px; border: 1px solid rgba(56, 189, 248, 0.2); border-radius: 12px; background: rgba(5, 9, 16, 0.8); backdrop-filter: blur(10px); } .hud-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; font-size: 11px; } .hud-row-small { justify-content: flex-end; } .hud-row-small .hud-value { font-size: 12px; color: var(--muted); } .hud-label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; } .hud-value { font-weight: 700; color: var(--text); } .hud-value.status-running { color: var(--green); } .hud-value.status-paused { color: var(--orange); } .hud-value.status-fault, .hud-value.status-emergency_stop { color: var(--red); } .hud-divider { height: 1px; margin: 4px 0; background: var(--line); } /* Progress dots */ .main-progress { position: absolute; bottom: 100px; left: 50%; transform: translateX(-50%); z-index: 10; display: flex; gap: 10px; padding: 10px 16px; border-radius: 999px; background: rgba(5, 9, 16, 0.75); backdrop-filter: blur(8px); } .progress-dot { width: 10px; height: 10px; border-radius: 50%; background: #334d66; transition: background 200ms ease, transform 200ms ease; } .progress-dot.active { background: var(--cyan); transform: scale(1.3); box-shadow: 0 0 12px var(--cyan); } .progress-dot.done { background: var(--green); } /* Play/Pause controls */ .main-controls { position: absolute; bottom: 28px; left: 50%; transform: translateX(-50%); z-index: 10; display: flex; gap: 12px; align-items: center; } .play-button { display: flex; align-items: center; gap: 10px; min-height: 56px; padding: 0 32px; border: none; border-radius: 999px; background: linear-gradient(135deg, #38bdf8, #0ea5e9); color: #041018; font-size: 18px; font-weight: 800; cursor: pointer; transition: transform 160ms ease, box-shadow 160ms ease; } .play-button:hover { transform: scale(1.05); box-shadow: 0 8px 32px rgba(56, 189, 248, 0.4); } .play-icon { font-size: 20px; } .play-text { font-size: 16px; } .stop-button { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border: 1px solid rgba(251, 61, 78, 0.5); border-radius: 50%; background: rgba(251, 61, 78, 0.15); color: #fda4af; font-size: 18px; cursor: pointer; } .stop-button:hover { background: rgba(251, 61, 78, 0.25); border-color: var(--red); } /* Details link */ .details-link { position: absolute; bottom: 16px; right: 16px; z-index: 10; padding: 10px 16px; border: 1px solid rgba(56, 189, 248, 0.3); border-radius: 999px; background: rgba(5, 9, 16, 0.75); backdrop-filter: blur(8px); color: var(--cyan); font-size: 14px; font-weight: 700; text-decoration: none; transition: background 160ms ease, border-color 160ms ease; } /* Auto Camera Toggle */ .auto-camera-toggle { position: absolute; bottom: 16px; left: 16px; z-index: 10; display: flex; align-items: center; gap: 6px; padding: 8px 12px; border: 1px solid rgba(148, 163, 184, 0.3); border-radius: 999px; background: rgba(5, 9, 16, 0.75); backdrop-filter: blur(8px); color: var(--muted); font-size: 11px; font-weight: 600; cursor: pointer; transition: background 160ms ease, border-color 160ms ease, color 160ms ease; } .auto-camera-toggle:hover { background: rgba(5, 9, 16, 0.9); border-color: rgba(56, 189, 248, 0.4); color: var(--cyan); } .auto-camera-toggle .toggle-icon { font-size: 14px; } .auto-camera-toggle .toggle-label { text-transform: uppercase; letter-spacing: 0.03em; } @media (max-width: 767px) { .auto-camera-toggle { bottom: 80px; left: 10px; padding: 6px 10px; font-size: 10px; } .auto-camera-toggle .toggle-icon { font-size: 12px; } } .details-link:hover { background: rgba(56, 189, 248, 0.1); border-color: var(--cyan); } /* Details page - back link */ .back-to-main { padding: 12px clamp(16px, 3vw, 28px); background: rgba(56, 189, 248, 0.06); border-bottom: 1px solid var(--line); } .back-link { color: var(--cyan); font-size: 14px; font-weight: 700; text-decoration: none; } .back-link:hover { text-decoration: underline; } /* Mobile responsive for main page */ @media (max-width: 639px) { .main-hud { top: 12px; right: 12px; left: 12px; max-width: none; flex-direction: row; flex-wrap: wrap; gap: 8px; padding: 10px 12px; } .hud-row { flex: 1 1 calc(50% - 8px); min-width: 80px; } .hud-divider { flex-basis: 100%; margin: 2px 0; } .main-progress { bottom: 90px; gap: 8px; padding: 8px 12px; } .progress-dot { width: 8px; height: 8px; } .main-controls { bottom: 20px; } .play-button { min-height: 48px; padding: 0 24px; font-size: 16px; } .play-icon { font-size: 18px; } .play-text { font-size: 14px; } .stop-button { width: 42px; height: 42px; } .details-link { bottom: 12px; right: 12px; padding: 8px 12px; font-size: 12px; } } /* Case progress bar */ .main-case-progress { position: absolute; bottom: 130px; left: 50%; transform: translateX(-50%); z-index: 10; width: 200px; height: 4px; border-radius: 999px; background: rgba(56, 189, 248, 0.2); overflow: hidden; } .case-progress-bar { height: 100%; background: linear-gradient(90deg, #38bdf8, #4ade80); border-radius: 999px; transition: width 100ms ease-out; } /* Warning in HUD */ .hud-warning { margin-top: 4px; padding-top: 6px; border-top: 1px solid rgba(250, 204, 21, 0.3); } .warning-text { color: #facc15 !important; font-size: 11px !important; line-height: 1.3; } /* Finished overlay */ .main-finished-overlay { position: absolute; inset: 0; z-index: 20; display: flex; align-items: center; justify-content: center; background: rgba(5, 9, 16, 0.85); backdrop-filter: blur(8px); } .finished-content { text-align: center; padding: 40px; } .finished-content h2 { margin: 0 0 12px; font-size: 2rem; color: var(--green); } .finished-content p { margin: 0 0 24px; color: var(--muted); font-size: 16px; } /* Continuous twin specific */ .continuous-twin { height: 100%; } .continuous-canvas { height: 100% !important; min-height: 100% !important; border: none !important; border-radius: 0 !important; } /* Main page fallback */ .main-fallback { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: var(--bg); } .fallback-content { text-align: center; padding: 40px; } .fallback-content h2 { margin: 0 0 12px; font-size: 1.5rem; } .fallback-content p { margin: 0 0 24px; color: var(--muted); } /* Status colors for continuous playback */ .hud-value.status-idle { color: var(--muted); } .hud-value.status-finished { color: var(--green); } /* ========================================================= CV Inspection Overlay ========================================================= */ .cv-overlay { position: absolute; top: 96px; left: 16px; z-index: 15; width: 220px; max-height: calc(100vh - 220px); overflow-y: auto; border: 1px solid rgba(37, 99, 235, 0.2); border-radius: 10px; background: rgba(255, 255, 255, 0.88); backdrop-filter: blur(10px); box-shadow: 0 2px 16px rgba(37, 99, 235, 0.12); font-family: 'SF Mono', 'Monaco', 'Consolas', monospace; font-size: 10px; } .cv-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; background: linear-gradient(135deg, #1e3a5f, #2563eb); color: #fff; font-size: 11px; font-weight: 700; letter-spacing: 0.05em; } .cv-icon { font-size: 14px; } .cv-title { flex: 1; } .cv-status { padding: 2px 8px; border-radius: 4px; background: rgba(255, 255, 255, 0.2); font-size: 10px; } .cv-status.detection { background: #22d3ee; color: #0c4a6e; } .cv-status.measurement { background: #38bdf8; color: #0c4a6e; } .cv-status.classification { background: #818cf8; color: #1e1b4b; } .cv-status.command_sent, .cv-status.routing { background: #4ade80; color: #14532d; } .cv-body { padding: 12px 14px; } .cv-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; font-size: 11px; } .cv-item-row { margin-bottom: 10px; } .cv-label { color: #64748b; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; } .cv-value { color: #1e293b; font-weight: 600; text-align: right; } .cv-shape { display: flex; align-items: center; gap: 6px; } .shape-icon { font-size: 14px; color: #2563eb; } .cv-dims { font-family: 'SF Mono', monospace; } .cv-value.pass { color: #16a34a; } .cv-value.fail { color: #dc2626; } .cv-value.warning { color: #d97706; } .cv-flag { font-size: 9px; opacity: 0.8; } .cv-divider { height: 1px; margin: 10px 0; background: linear-gradient(90deg, transparent, #cbd5e1, transparent); } .cv-result-row .cv-value, .cv-command-row .cv-value { font-size: 13px; font-weight: 800; } .cv-category { padding: 2px 10px; border-radius: 4px; background: rgba(0, 0, 0, 0.06); } .cv-priority { font-size: 9px; font-weight: 500; opacity: 0.7; } .cv-command { font-family: 'SF Mono', monospace; font-size: 11px !important; } .cv-warning { display: flex; align-items: flex-start; gap: 8px; margin-top: 10px; padding: 8px 10px; border-radius: 6px; background: rgba(251, 191, 36, 0.15); border: 1px solid rgba(251, 191, 36, 0.3); } .cv-warning .warning-icon { color: #d97706; font-size: 14px; } .cv-warning .warning-text { color: #92400e; font-size: 10px; line-height: 1.4; } .cv-footer { display: flex; justify-content: space-between; padding: 8px 14px; background: #f1f5f9; font-size: 10px; color: #64748b; } .cv-live { color: #dc2626; font-weight: 700; } .cv-fps { font-family: 'SF Mono', monospace; } /* Measurement section headers */ .cv-section-header { display: flex; align-items: center; gap: 6px; font-size: 9px; font-weight: 700; color: #475569; text-transform: uppercase; letter-spacing: 0.5px; margin: 8px 0 6px; } .cv-indicator { font-size: 6px; color: #94a3b8; transition: color 0.2s; } .cv-indicator.active { color: #22d3ee; } .cv-indicator.pulse { animation: pulse-indicator 0.5s ease-in-out infinite; } @keyframes pulse-indicator { 0%, 100% { color: #22d3ee; opacity: 1; } 50% { color: #0ea5e9; opacity: 0.6; } } /* Compact rows */ .cv-row.cv-compact { margin-bottom: 2px; font-size: 10px; } .cv-row.cv-compact .cv-label { font-size: 9px; } .cv-row.cv-compact .cv-value { font-size: 10px; } /* Mono values */ .cv-value.cv-mono { font-family: 'SF Mono', Consolas, monospace; font-size: 10px; } /* Result values */ .cv-value.cv-result { color: #0284c7; font-weight: 700; } /* Dimension details */ .cv-dims-detail { font-size: 9px; font-weight: 400; color: #64748b; } /* Blink animation */ .cv-blink { animation: blink 0.3s ease-in-out infinite; color: #22d3ee; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } /* Status variants */ .cv-status.active { background: #22d3ee; color: #0c4a6e; } .cv-status.idle { background: #94a3b8; color: #1e293b; } /* C-priority warning */ .cv-warning.cv-cpriority { background: rgba(249, 115, 22, 0.1); border-color: rgba(249, 115, 22, 0.3); } .cv-warning.cv-cpriority .warning-icon { color: #f97316; } .cv-warning.cv-cpriority .warning-text { color: #c2410c; } /* Mobile: compact bottom overlay */ @media (max-width: 767px) { .cv-overlay { position: fixed; bottom: 80px; left: 10px; right: 10px; width: auto; max-height: 200px; font-size: 9px; border-radius: 8px; } .cv-header { padding: 6px 10px; font-size: 10px; } .cv-body { padding: 8px 10px; } .cv-section-header { font-size: 8px; margin: 4px 0; } .cv-row { margin-bottom: 3px; } } /* Tablet: smaller overlay, positioned below HUD */ @media (min-width: 768px) and (max-width: 1023px) { .cv-overlay { width: 200px; right: 12px; bottom: 100px; max-height: calc(100vh - 300px); font-size: 9px; } .cv-header { padding: 8px 10px; font-size: 10px; } .cv-body { padding: 8px 10px; } .cv-section-header { font-size: 8px; } } /* Large screens: ensure no overlap with HUD */ @media (min-width: 1024px) { .cv-overlay { bottom: 100px; right: 20px; max-height: calc(100vh - 320px); } }