/* R&R Vehicle Analytics - Main Stylesheet */ :root { --primary-color: #2563eb; --primary-dark: #1d4ed8; --secondary-color: #64748b; --success-color: #22c55e; --warning-color: #f59e0b; --danger-color: #ef4444; --background-color: #f1f5f9; --card-background: #ffffff; --text-primary: #1e293b; --text-secondary: #64748b; --border-color: #e2e8f0; --shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: var(--background-color); color: var(--text-primary); line-height: 1.6; } /* Navbar - Dark Theme */ .navbar { background-color: #1e293b; box-shadow: var(--shadow); padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; position: sticky; top: 0; z-index: 100; } .nav-brand { font-size: 1.25rem; font-weight: 700; color: #ffffff; display: flex; align-items: center; gap: 0.5rem; } .nav-brand svg { color: #00a8ff; } .nav-info { display: flex; align-items: center; gap: 1.5rem; color: #94a3b8; font-size: 0.875rem; } .nav-info .location, .nav-info .time { display: flex; align-items: center; gap: 0.5rem; } .nav-links { display: flex; gap: 1.5rem; } .nav-links a { text-decoration: none; color: #94a3b8; font-weight: 500; padding: 0.5rem 1rem; border-radius: 0.5rem; transition: all 0.2s ease; } .nav-links a:hover { color: #ffffff; background-color: rgba(255, 255, 255, 0.1); } .nav-links a.active { color: #ffffff; background-color: rgba(255, 255, 255, 0.1); } .settings-btn { background: none; border: none; color: #94a3b8; cursor: pointer; padding: 0.5rem; border-radius: 0.5rem; transition: all 0.2s ease; } .settings-btn:hover { color: #ffffff; background-color: rgba(255, 255, 255, 0.1); } /* Main Container */ .container { max-width: 100%; margin: 0 auto; padding: 2rem; } /* Page Header */ .page-header { margin-bottom: 2rem; } .page-header h1 { font-size: 1.875rem; font-weight: 700; color: var(--text-primary); margin-bottom: 0.5rem; } .page-header p { color: var(--text-secondary); } /* Cards */ .card { background-color: var(--card-background); border-radius: 0.75rem; box-shadow: var(--shadow); padding: 1.5rem; margin-bottom: 1.5rem; } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border-color); } .card-title { font-size: 1.125rem; font-weight: 600; color: var(--text-primary); } /* KPI Cards */ .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; } .kpi-card { background-color: var(--card-background); border-radius: 0.75rem; box-shadow: var(--shadow); padding: 1.5rem; display: flex; align-items: center; gap: 1rem; } .kpi-icon { width: 3.5rem; height: 3.5rem; border-radius: 0.75rem; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; } .kpi-icon.blue { background-color: #dbeafe; color: var(--primary-color); } .kpi-icon.green { background-color: #dcfce7; color: var(--success-color); } .kpi-icon.orange { background-color: #fef3c7; color: var(--warning-color); } .kpi-icon.red { background-color: #fee2e2; color: var(--danger-color); } .kpi-content { flex: 1; } .kpi-label { font-size: 0.875rem; color: var(--text-secondary); margin-bottom: 0.25rem; } .kpi-value { font-size: 1.75rem; font-weight: 700; color: var(--text-primary); } .kpi-value.positive { color: var(--success-color); } .kpi-value.negative { color: var(--danger-color); } /* Grid Layouts */ .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.5rem; } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem; } @media (max-width: 1024px) { .grid-2, .grid-3 { grid-template-columns: 1fr; } } /* Charts Container */ .chart-container { position: relative; height: 300px; width: 100%; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.75rem 1.5rem; font-size: 1rem; font-weight: 500; border-radius: 0.5rem; border: none; cursor: pointer; transition: all 0.2s ease; } .btn-primary { background-color: var(--primary-color); color: white; } .btn-primary:hover { background-color: var(--primary-dark); } .btn-secondary { background-color: var(--secondary-color); color: white; } .btn-secondary:hover { background-color: #475569; } .btn-success { background-color: var(--success-color); color: white; } .btn-success:hover { background-color: #16a34a; } .btn-danger { background-color: var(--danger-color); color: white; } .btn-danger:hover { background-color: #dc2626; } .btn-outline { background-color: transparent; border: 2px solid var(--border-color); color: var(--text-primary); } .btn-outline:hover { border-color: var(--primary-color); color: var(--primary-color); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } /* Forms */ .form-label { display: block; font-weight: 500; margin-bottom: 0.5rem; color: var(--text-primary); } .form-input, .form-select { width: 100%; padding: 0.75rem 1rem; font-size: 1rem; border: 1px solid var(--border-color); border-radius: 0.5rem; background-color: var(--card-background); transition: border-color 0.2s ease; } .form-input:focus, .form-select:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } /* Progress Bar */ .progress-bar { width: 100%; height: 0.5rem; background-color: var(--border-color); border-radius: 9999px; overflow: hidden; } .progress-bar-fill { height: 100%; background-color: var(--primary-color); border-radius: 9999px; transition: width 0.3s ease; } /* Status Badges */ .badge { display: inline-flex; align-items: center; padding: 0.25rem 0.75rem; font-size: 0.75rem; font-weight: 600; border-radius: 9999px; text-transform: uppercase; } .badge-in { background-color: #dcfce7; color: #166534; } .badge-out { background-color: #fee2e2; color: #991b1b; } .badge-processing { background-color: #fef3c7; color: #92400e; } /* Alerts */ .alert { padding: 1rem 1.5rem; border-radius: 0.5rem; margin-bottom: 1rem; } .alert-info { background-color: #dbeafe; color: #1e40af; border: 1px solid #93c5fd; } .alert-success { background-color: #dcfce7; color: #166534; border: 1px solid #86efac; } .alert-warning { background-color: #fef3c7; color: #92400e; border: 1px solid #fcd34d; } .alert-error { background-color: #fee2e2; color: #991b1b; border: 1px solid #fca5a5; } /* Setup Steps */ .setup-steps { display: flex; justify-content: center; margin-bottom: 2rem; } .step { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; color: var(--text-secondary); } .step-number { width: 2rem; height: 2rem; border-radius: 50%; background-color: var(--border-color); display: flex; align-items: center; justify-content: center; font-weight: 600; } .step.active .step-number { background-color: var(--primary-color); color: white; } .step.completed .step-number { background-color: var(--success-color); color: white; } .step-connector { width: 3rem; height: 2px; background-color: var(--border-color); } .step.completed + .step-connector { background-color: var(--success-color); } /* Event Log */ .event-log-container { max-height: 400px; overflow-y: auto; /* border: 1px solid var(--border-color); border-radius: 0.5rem; */ } .event-table { width: 100%; border-collapse: collapse; /*table-layout: fixed; This ensures equal distribution */ } .event-table th { font-weight: 600; color: var(--text-secondary); font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; } .event-table th, .event-table td { padding: 0.75rem 1rem; text-align: left; overflow: hidden; text-overflow: ellipsis; border-bottom: 1px solid var(--border-color); } .event-table tbody tr:hover { background-color: var(--background-color); } .event-table thead th { position: sticky; top: 0; background-color: var(--card-background); z-index: 1; } .event-item { display: flex; align-items: center; gap: 1rem; padding: 0.75rem 0; border-bottom: 1px solid var(--border-color); } .event-item:last-child { border-bottom: none; } .event-time { font-size: 0.875rem; color: var(--text-secondary); min-width: 80px; } .event-vehicle { font-weight: 500; } /* Loading Spinner */ .spinner { width: 2rem; height: 2rem; border: 3px solid var(--border-color); border-top-color: var(--primary-color); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Spin class for inline icons */ .spin { animation: spin 1s linear infinite; } /* Utility Classes */ .text-center { text-align: center; } .text-right { text-align: right; } .mt-1 { margin-top: 0.5rem; } .mt-2 { margin-top: 1rem; } .mt-3 { margin-top: 1.5rem; } .mt-4 { margin-top: 2rem; } .mb-1 { margin-bottom: 0.5rem; } .mb-2 { margin-bottom: 1rem; } .mb-3 { margin-bottom: 1.5rem; } .mb-4 { margin-bottom: 2rem; } .hidden { display: none !important; } /* ======================================== DASHBOARD SPECIFIC STYLES ======================================== */ /* Dashboard Top Section */ .dashboard-top { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1.5rem; margin-bottom: 1.5rem; } /* Camera Cards */ .camera-card { background-color: var(--card-background); border-radius: 0.75rem; box-shadow: var(--shadow); overflow: hidden; } .camera-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; border-bottom: 1px solid var(--border-color); } .camera-title { font-weight: 600; font-size: 0.875rem; display: flex; align-items: center; gap: 0.5rem; } .live-indicator { display: flex; align-items: center; gap: 0.375rem; font-size: 0.75rem; color: var(--danger-color); font-weight: 600; } .live-dot { width: 8px; height: 8px; background-color: var(--danger-color); border-radius: 50%; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .camera-feed { background-color: #1e293b; height: 180px; display: flex; align-items: center; justify-content: center; } .camera-placeholder { color: #64748b; text-align: center; } .camera-placeholder svg { margin-bottom: 0.5rem; } .camera-placeholder span { display: block; font-size: 0.875rem; } /* Center KPIs */ .kpi-center { background-color: var(--card-background); border-radius: 0.75rem; box-shadow: var(--shadow); padding: 1.5rem 2rem; display: flex; flex-direction: column; align-items: center; justify-content: center; min-width: 280px; } .kpi-main { text-align: center; margin-bottom: 1.5rem; } .kpi-label-small { font-size: 0.75rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.25rem; } .kpi-value-large { font-size: 2.5rem; font-weight: 700; color: #00a8ff; line-height: 1.2; } .kpi-sublabel { font-size: 0.75rem; color: var(--text-secondary); } .kpi-row { display: flex; align-items: center; gap: 1.5rem; margin-bottom: 1rem; } .kpi-item { text-align: center; } .kpi-number { font-size: 1.75rem; font-weight: 700; } .kpi-number.blue { color: #00a8ff; } .kpi-number.red { color: var(--danger-color); } .kpi-divider { width: 1px; height: 40px; background-color: var(--border-color); } .kpi-net { font-size: 0.9rem; color: var(--text-primary); } /* Dashboard Middle Section */ .dashboard-middle { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-bottom: 1.5rem; } /* Card Title with Icon */ .card-title { display: flex; align-items: center; gap: 0.5rem; } .card-title svg { color: var(--text-secondary); } /* Time Filter Buttons */ .time-filter { display: flex; gap: 0.25rem; } .time-btn { padding: 0.375rem 1rem; border: none; background-color: transparent; color: var(--text-secondary); font-size: 0.875rem; cursor: pointer; border-radius: 9999px; transition: all 0.2s ease; } .time-btn:hover { background-color: var(--background-color); } .time-btn.active { background-color: #00a8ff; color: white; } /* Chart Legend */ .chart-legend { display: flex; justify-content: center; gap: 2rem; padding-top: 1rem; } .legend-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: var(--text-secondary); } .legend-color { width: 12px; height: 12px; border-radius: 2px; } .legend-color.blue { background-color: #3b82f6; } .legend-color.red { background-color: #ef4444; } /* Large Chart */ .chart-large { height: 350px; } /* Vehicle Type Badges */ .badge-sedan { background-color: #fff5ce; color: #655202; } .badge-suv { background-color: #fae0ba; color: #623b00; } .badge-pickup { background-color: #fcd1fc; color: #371637; } .badge-van { background-color: #d0e6fc; color: #0d2741; } .badge-motorcycle { background-color: #fdd8ea; color: #4c1f35; } .badge-bus { background-color: #fdcfcf; color: #542b2b; } .badge-truck { background-color: #ead5ff; color: #3b2254; } /* No Session Overlay */ .no-session-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 50; } .no-session-content { background-color: var(--card-background); padding: 3rem; border-radius: 1rem; text-align: center; max-width: 400px; } .no-session-content svg { color: var(--text-secondary); margin-bottom: 1rem; } .no-session-content h2 { margin-bottom: 0.5rem; } .no-session-content p { color: var(--text-secondary); margin-bottom: 1.5rem; } /* ======================================== SETUP PAGE SPECIFIC STYLES ======================================== */ /* Setup Layout */ .setup-layout { display: grid; grid-template-columns: 300px 1fr; gap: 0; min-height: calc(100vh - 60px); margin: -2rem; } /* Setup Sidebar */ .setup-sidebar { background-color: var(--card-background); border-right: 1px solid var(--border-color); padding: 1.5rem; } .back-link { display: flex; align-items: center; gap: 0.5rem; color: var(--text-primary); text-decoration: none; font-weight: 500; margin-bottom: 2rem; padding: 0.5rem; border-radius: 0.5rem; transition: all 0.2s ease; } .back-link:hover { background-color: var(--background-color); } .sidebar-section { margin-bottom: 2rem; } .sidebar-title { display: flex; align-items: center; gap: 0.5rem; font-size: 1rem; font-weight: 600; color: var(--text-primary); margin-bottom: 1rem; } .sidebar-title svg { color: var(--text-secondary); } .sidebar-divider { border: none; border-top: 1px solid var(--border-color); margin: 1rem 0; } .btn-full { width: 100%; margin-bottom: 0.5rem; } .file-name-display { font-size: 0.875rem; color: var(--text-secondary); margin-top: 0.5rem; word-break: break-all; } /* Setup Main Content */ .setup-main { padding: 2rem; background-color: var(--background-color); } /* Alert with Icon */ .alert { display: flex; align-items: flex-start; gap: 0.75rem; } .alert svg { flex-shrink: 0; margin-top: 0.125rem; } /* Preview Section */ .preview-section { margin-top: 1.5rem; } .preview-title { font-size: 1rem; font-weight: 600; margin-bottom: 1rem; } .canvas-wrapper { display: flex; justify-content: center; } .canvas-container { position: relative; background-color: #1e293b; border-radius: 0.5rem; overflow: hidden; min-width: 672px; min-height: 448px; } .canvas-container canvas { display: block; position: relative; z-index: 10; } .canvas-placeholder { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; color: #64748b; z-index: 5; } .canvas-placeholder.hidden { display: none !important; } .canvas-placeholder svg { margin-bottom: 0.5rem; } .canvas-placeholder p { font-size: 0.875rem; } .canvas-info { font-size: 0.75rem; color: #475569; margin-top: 0.5rem; } /* Line Position Display */ .line-position { margin-top: 1rem; font-size: 0.875rem; color: var(--text-secondary); } .position-value { background-color: var(--card-background); padding: 0.25rem 0.75rem; border-radius: 0.25rem; margin-left: 0.5rem; font-family: monospace; } /* Processing Section */ .processing-section { margin-top: 2rem; text-align: center; } .processing-section h3 { margin-bottom: 1rem; } .progress-text { margin-top: 0.5rem; color: var(--text-secondary); } /* Text utilities */ .text-secondary { color: var(--text-secondary); } /* ======================================== RESPONSIVE STYLES ======================================== */ @media (max-width: 1200px) { .dashboard-top { grid-template-columns: 1fr; } .dashboard-middle { grid-template-columns: 1fr; } .kpi-center { order: -1; } } @media (max-width: 768px) { .navbar { flex-direction: column; gap: 1rem; } .nav-info { flex-direction: column; gap: 0.5rem; } .container { padding: 1rem; } .kpi-grid { grid-template-columns: 1fr; } .setup-layout { grid-template-columns: 1fr; } .setup-sidebar { border-right: none; border-bottom: 1px solid var(--border-color); } .canvas-container { min-width: 100%; } } /* ======================================== PROCESSING BANNER & NOTIFICATIONS ======================================== */ /* Processing Banner */ .processing-banner { background: linear-gradient(90deg, #3b82f6 0%, #1d4ed8 100%); color: white; padding: 0.75rem 1.5rem; margin-bottom: 1.5rem; border-radius: 0.5rem; box-shadow: var(--shadow); } .processing-content { display: flex; align-items: center; gap: 1rem; } .spinner-small { width: 1.25rem; height: 1.25rem; border: 2px solid rgba(255, 255, 255, 0.3); border-top-color: white; border-radius: 50%; animation: spin 1s linear infinite; } #processing-text { font-weight: 500; min-width: 180px; } .progress-bar-inline { flex: 1; height: 6px; background-color: rgba(255, 255, 255, 0.3); border-radius: 3px; overflow: hidden; } .progress-bar-fill-inline { height: 100%; background-color: white; border-radius: 3px; transition: width 0.3s ease; } /* Event count badge */ .event-count { font-size: 0.75rem; color: var(--text-secondary); background-color: var(--background-color); padding: 0.25rem 0.75rem; border-radius: 9999px; } /* New event animation */ .new-event { animation: highlightRow 1s ease; } @keyframes highlightRow { 0% { background-color: rgba(34, 197, 94, 0.3); } 100% { background-color: transparent; } } /* Notifications */ .notification { position: fixed; top: 80px; right: 20px; min-width: 300px; padding: 1rem 1.5rem; border-radius: 0.5rem; box-shadow: var(--shadow-md); z-index: 1000; animation: slideIn 0.3s ease; } .notification-success { background-color: #dcfce7; border: 1px solid #86efac; color: #166534; } .notification-error { background-color: #fee2e2; border: 1px solid #fca5a5; color: #991b1b; } .notification-info { background-color: #dbeafe; border: 1px solid #93c5fd; color: #1e40af; } .notification strong { display: block; margin-bottom: 0.25rem; } .notification p { margin: 0; font-size: 0.875rem; } .notification.fade-out { animation: fadeOut 0.3s ease forwards; } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes fadeOut { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } /* --- MODAL --- */ .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; display: flex; align-items: center; justify-content: center; } .modal.hidden { display: none; } .modal-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(2px); } .modal-content { position: relative; background-color: var(--card-background); border-radius: 0.75rem; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); max-width: 450px; width: 90%; animation: modalSlideIn 0.2s ease-out; } @keyframes modalSlideIn { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .modal-header { padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--border-color); } .modal-header h3 { display: flex; align-items: center; gap: 0.5rem; margin: 0; font-size: 1.125rem; color: var(--text-primary); } .modal-body { padding: 1.5rem; } .modal-body p { margin: 0; color: var(--text-secondary); line-height: 1.6; } .modal-actions { padding: 1rem 1.5rem 1.5rem; display: flex; flex-direction: column; gap: 0.75rem; } .modal-actions .btn { display: flex; flex-direction: column; align-items: center; gap: 0.25rem; padding: 1rem; } .modal-actions .btn small { font-size: 0.75rem; opacity: 0.8; font-weight: normal; } .modal-actions .btn-primary small { color: rgba(255, 255, 255, 0.8); } .modal-actions .btn-outline small { color: var(--text-secondary); } .workbench-container { display: flex; /* width: 100vw; */ height: calc(100vh - 70px); /* Subtract Navbar height approx */ overflow: hidden; background-color: var(--background-color); } /* --- SIDEBAR --- */ .workbench-sidebar { width: 320px; background-color: var(--card-background); border-right: 1px solid var(--border-color); display: flex; flex-direction: column; padding: 1.5rem; overflow-y: auto; flex-shrink: 0; z-index: 20; } .sidebar-header { margin-bottom: 1.5rem; color: var(--text-primary); } .sidebar-header h2 { font-size: 1.25rem; display: flex; align-items: center; gap: 0.5rem; } .sidebar-divider { border: 0; border-top: 1px solid var(--border-color); margin: 1.5rem 0; } .config-group { margin-bottom: 1.25rem; } /* Camera Tabs */ .camera-tabs { display: flex; background-color: var(--background-color); padding: 0.25rem; border-radius: 0.5rem; margin-bottom: 1rem; } .tab-btn { flex: 1; border: none; background: transparent; padding: 0.5rem; border-radius: 0.375rem; color: var(--text-secondary); font-weight: 500; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; gap: 0.5rem; } .tab-btn:hover { color: var(--text-primary); } .tab-btn.active { background-color: #ffffff; color: var(--primary-color); box-shadow: 0 1px 2px rgba(0,0,0,0.1); } /* Source Type Toggle */ .source-toggle { display: flex; background-color: var(--background-color); padding: 0.25rem; border-radius: 0.5rem; margin-bottom: 0.75rem; } .toggle-btn { flex: 1; border: none; background: transparent; padding: 0.5rem 0.75rem; border-radius: 0.375rem; color: var(--text-secondary); font-weight: 500; font-size: 0.875rem; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; gap: 0.375rem; } .toggle-btn:hover { color: var(--text-primary); } .toggle-btn.active { background-color: #ffffff; color: var(--primary-color); box-shadow: 0 1px 2px rgba(0,0,0,0.1); } /* Config Card */ .source-config-card { background-color: #f8fafc; border: 1px solid var(--border-color); border-radius: 0.5rem; padding: 1rem; } .status-indicator { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; font-weight: 600; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--secondary-color); } .status-dot.ready { background-color: var(--success-color); } .status-dot.error { background-color: var(--danger-color); } .status-dot.warning { background-color: var(--warning-color); } .status-dot.processing { background-color: var(--primary-color); animation: pulse 1.5s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .instruction-list { list-style: none; margin: 0; padding: 0; } .instruction-list li { font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 0.25rem; padding-left: 0.5rem; border-left: 2px solid var(--border-color); } .file-name { font-size: 0.8rem; color: var(--text-secondary); } .sidebar-footer { margin-top: auto; padding-top: 1.5rem; } /* --- MAIN STAGE --- */ .workbench-main { flex: 1; display: flex; flex-direction: column; overflow-y: auto; padding: 1.5rem; gap: 1.5rem; } .video-stage-panel { background-color: var(--card-background); border-radius: 0.75rem; box-shadow: var(--shadow); padding: 1rem; display: flex; /* max-width: max-content; */ flex-direction: column; } .stage-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding: 0 0.5rem; } .stage-title { display: flex; align-items: center; gap: 1rem; } .stage-title h3 { font-size: 1.125rem; font-weight: 600; margin: 0; } .video-wrapper { position: relative; width: 100%; background-color: #0f172a; overflow: hidden; min-height: auto; display: flex; align-items: center; justify-content: center; } /* Stage Elements (Legacy single canvas - keeping for compatibility) */ #setup-canvas, #live-feed { max-width: 100%; max-height: 70vh; display: block; } #setup-canvas { cursor: crosshair; } /* Hide canvas by default until image is loaded */ #entry-canvas, #exit-canvas { display: none; } .stage-placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; color: #64748b; gap: 1rem; } /* --- DUAL CAMERA GRID --- */ .dual-camera-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .camera-preview-card { background: var(--card-background); border-radius: 0.5rem; overflow: hidden; border: 2px solid var(--border-color); transition: border-color 0.2s ease; } .camera-preview-card.active { border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } .camera-preview-card .camera-header { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 1rem; background: #f8fafc; border-bottom: 1px solid var(--border-color); } .camera-preview-card .camera-header .badge { display: flex; align-items: center; gap: 0.35rem; } .camera-preview-card .camera-header .badge svg { width: 14px; height: 14px; } .badge-entry { background-color: #dcfce7; color: #166534; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; } .badge-exit { background-color: #fee2e2; color: #991b1b; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; } .camera-status { font-size: 0.75rem; color: var(--text-secondary); font-weight: 500; } .camera-status.ready { color: var(--success-color); } .camera-status.processing { color: var(--warning-color); } .camera-status.completed { color: var(--primary-color); } .camera-status.live { color: var(--danger-color); font-weight: 600; animation: pulse 1.5s ease-in-out infinite; } .camera-preview-card .video-wrapper { min-height: 280px; aspect-ratio: 3/2; } .camera-preview-card .stage-placeholder { height: 100%; padding: 2rem; } .camera-preview-card .stage-placeholder p { font-size: 0.875rem; text-align: center; } /* Dual camera canvas styles */ #entry-canvas, #exit-canvas, #entry-live-feed, #exit-live-feed { max-width: 100%; max-height: 100%; /* display:block; */ } #entry-canvas, #exit-canvas { cursor: crosshair; } /* Dual Progress Styles */ .dual-progress { display: flex; flex-direction: column; gap: 0.75rem; } .progress-item { display: flex; flex-direction: column; gap: 0.25rem; } .progress-label { font-size: 0.75rem; color: var(--text-secondary); font-weight: 500; } /* Responsive dual camera grid */ @media (max-width: 768px) { .dual-camera-grid { grid-template-columns: 1fr; } .camera-preview-card .video-wrapper { min-height: 200px; } } /* --- ANALYTICS PANEL --- */ .analytics-panel { /* Uses existing grid styles, just ensuring spacing */ padding-bottom: 2rem; } .panel-title { font-size: 1.25rem; font-weight: 700; margin-bottom: 1rem; color: var(--text-primary); } /* Responsive adjustments */ @media (max-width: 1024px) { .workbench-container { flex-direction: column; height: auto; overflow: visible; } .workbench-sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--border-color); max-height: 500px; /* Optional cap */ } .video-wrapper { min-height: 300px; } }