/* ============================================= UrbanFlow — vehicles.css (Mobile-First) Desktop layout preserved exactly. Mobile: bottom nav, touch targets, stacked cards. ============================================= */ :root { --cocoa: #8b5e3c; --cocoa-l: #c89a6c; --cocoa-xl: #d4b08a; --mob-nav-h: 68px; /* bottom nav height on mobile */ } *, *::before, *::after { box-sizing: border-box; } .hidden { display: none !important; } html { overflow: hidden; height: 100%; } body { font-family: 'Montserrat', sans-serif; background-color: #000000; color: #f0ece6; -webkit-tap-highlight-color: transparent; overscroll-behavior: none; } .mono-font { font-family: 'JetBrains Mono', monospace; } /* ---- Scrollbar: hide globally on mobile, keep #class-breakdown visible ---- */ @media (max-width: 1023px) { * { scrollbar-width: none; -ms-overflow-style: none; } *::-webkit-scrollbar { display: none; } /* Vehicle Classification section keeps its scrollbar on mobile */ #class-breakdown { scrollbar-width: thin !important; -ms-overflow-style: auto !important; } #class-breakdown::-webkit-scrollbar { display: block !important; width: 4px !important; } #class-breakdown::-webkit-scrollbar-track { background: #000000 !important; } #class-breakdown::-webkit-scrollbar-thumb { background: #222222 !important; border-radius: 4px !important; } #class-breakdown::-webkit-scrollbar-thumb:hover { background: #333333 !important; } } /* ---- Notification Glow ---- */ @keyframes glow-green { 0% { color: #f0ece6; filter: drop-shadow(0 0 0px #4ade80); } 50% { color: #4ade80; filter: drop-shadow(0 0 8px #4ade80); } 100% { color: #f0ece6; filter: drop-shadow(0 0 0px #4ade80); } } .notify-glow i { animation: glow-green 1.5s infinite ease-in-out !important; } /* ---- Info tooltip ---- */ .info-wrap { position: relative; display: inline-flex; align-items: center; margin-left: 6px; } .info-btn { display: inline-flex; align-items: center; justify-content: center; width: 18px; /* slightly larger for touch */ height: 18px; border-radius: 50%; background: #444444 !important; color: #ffffff !important; font-size: 8px; cursor: pointer; transition: all 0.2s ease; } .info-btn:hover, .info-btn:active { background: #666666 !important; } .info-tip { display: none; position: fixed; z-index: 9999; background: #0a0a0a; color: #aaaaaa; font-size: 10px; font-weight: 500; line-height: 1.4; padding: 8px 12px; border-radius: 6px; max-width: 240px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.8); border: 1px solid #222222; pointer-events: none; text-transform: none; letter-spacing: normal; } /* ---- Mobile Top Bar ---- */ .mobile-top-bar { display: none; } @media (max-width: 1023px) { .mobile-top-bar { display: flex; align-items: center; justify-content: center; position: fixed; top: 0; left: 0; right: 0; height: 58px; background: #000000; border-bottom: 1px solid #1a1a1a; z-index: 35; flex-shrink: 0; } #legal-menu { animation: menuFadeIn 0.2s ease-out forwards; transform-origin: top right; } @keyframes menuFadeIn { from { opacity: 0; transform: translateY(-10px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } } /* ---- Sidebar nav states ---- */ .nav-item-active { background-color: #111111 !important; color: var(--cocoa-xl) !important; border-left: 2px solid var(--cocoa-l) !important; } .nav-item-inactive { color: #555555 !important; } .nav-item-inactive:hover { color: #f0ece6 !important; background-color: #050505 !important; } /* ---- Card overrides ---- */ .bg-white { background-color: #0a0a0a !important; } .border-slate-200, .border-slate-100, .border-slate-50, .border-neutral-800, .border-neutral-900 { border-color: #2a2a2a !important; } .bg-slate-50\/50, .bg-slate-50, .bg-slate-900, .bg-neutral-900 { background-color: #0c0c0c !important; } .text-slate-900, .text-slate-800, .text-slate-700, .text-neutral-900 { color: #ffffff !important; } .text-slate-600, .text-slate-500, .text-slate-400, .text-neutral-500, .text-neutral-400 { color: #888888 !important; } .shadow-sm { box-shadow: none !important; } /* ---- Toggle control ---- */ .toggle-track { width: 36px; /* slightly wider for touch */ height: 20px; border-radius: 999px; background: #1a1a1a; border: 1px solid #333; position: relative; cursor: pointer; flex-shrink: 0; transition: background 0.2s ease; } .toggle-track.active { background: #c89a6c !important; border-color: #c89a6c !important; } .toggle-thumb { width: 16px; height: 16px; border-radius: 50%; background: #555555; position: absolute; top: 2px; left: 2px; transition: all 0.2s ease; } .toggle-track.active .toggle-thumb { transform: translateX(16px); background: #ffffff; /* pure white for contrast on gold track */ } /* ---- Custom select ---- */ .custom-select { appearance: none; background-color: #111111; border: 1px solid #222222; border-radius: 6px; padding: 4px 24px 4px 10px; font-size: 11px; font-weight: 600; color: #ffffff; outline: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%23666666'%3E%3Cpath fill-rule='evenodd' d='M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 8px center; background-size: 12px; } /* ---- Stepper ---- */ .s-stepper { display: inline-flex; border: 1px solid #222222; border-radius: 6px; background: #111111; overflow: hidden; flex-shrink: 0; } .s-stepper button { padding: 8px 12px; /* larger touch target than original 4px 8px */ color: #666666; font-size: 14px; min-width: 36px; min-height: 36px; display: flex; align-items: center; justify-content: center; } .s-stepper button:hover, .s-stepper button:active { background: #1a1a1a; color: #ffffff; } .s-stepper .s-val { min-width: 44px; text-align: center; font-family: 'JetBrains Mono', monospace; font-size: 12px; font-weight: 700; color: #ffffff; padding: 4px 0; border-left: 1px solid #222222; border-right: 1px solid #222222; display: flex; align-items: center; justify-content: center; } /* ---- Settings row ---- */ .s-row { display: flex; align-items: center; justify-content: space-between; padding: 14px 0; /* slightly more vertical padding */ border-bottom: 1px solid #1a1a1a; gap: 12px; } .s-row:last-child { border-bottom: none; } .s-row>div:first-child { flex: 1; min-width: 0; } /* ---- Progress bar ---- */ #proc-bar { background-color: var(--cocoa-l) !important; } #proc-label { color: #ffffff !important; } /* ---- Disabled rows ---- */ .s-row.disabled { opacity: 0.65 !important; } .s-row.disabled .s-stepper, .s-row.disabled .custom-select, .s-row.disabled .toggle-track, .s-row.disabled .chip-container, .s-row.disabled .uf-select-wrap, .s-row.disabled .uf-select-trigger { pointer-events: none !important; opacity: 0.5 !important; } /* Force-collapse the dropdown panel when row is locked */ .s-row.disabled .uf-select-dropdown { display: none !important; } .s-row.disabled .info-wrap { pointer-events: auto !important; opacity: 1 !important; } #btn-start-processing { font-family: 'Montserrat', sans-serif !important; } /* ---- Chips ---- */ .chip-container { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; padding-top: 12px; border-top: 1px solid #1a1a1a; transition: all 0.3s ease; } .chip { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; /* larger than original 6px 14px */ border-radius: 9999px; font-size: 10px; font-weight: 700; cursor: pointer; transition: all 0.2s ease; user-select: none; border: 1px solid #333333; background: rgba(255, 255, 255, 0.03); color: #888888; min-height: 36px; } .chip.active { background: var(--cocoa-l); color: #000000; border-color: var(--cocoa-l); } .chip.frozen { background: rgba(255, 255, 255, 0.4); color: #000000; border-color: transparent; cursor: default !important; pointer-events: none; } .chip:hover { border-color: #666666; } .chip.active:hover { background: var(--cocoa-xl); } .chip i { font-size: 9px; } .hidden-chip-container { display: none !important; margin: 0 !important; padding: 0 !important; height: 0 !important; } /* ---- Toast ---- */ #toast-container { position: fixed; bottom: calc(var(--mob-nav-h) + 12px); /* above bottom nav on mobile */ left: 50%; transform: translateX(-50%); z-index: 10000; display: flex; flex-direction: column; align-items: center; gap: 8px; pointer-events: none; width: 90%; max-width: 360px; } .toast { background: #111; border: 1px solid #2a2a2a; color: #f0ece6; font-size: 11px; font-weight: 600; padding: 12px 18px; border-radius: 10px; display: flex; align-items: center; gap: 8px; pointer-events: auto; animation: toastIn 0.3s ease-out; width: 100%; } .toast.toast-out { animation: toastOut 0.3s ease-in forwards; } .toast-success { border-color: #166534; } .toast-success i { color: #22c55e; } .toast-error { border-color: #7f1d1d; } .toast-error i { color: #ef4444; } .toast-info i { color: var(--cocoa-l); } @keyframes toastIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes toastOut { from { opacity: 1; } to { opacity: 0; transform: translateY(20px); } } /* ---- Stats empty overlay ---- */ .stats-empty-overlay { position: absolute; inset: 0; z-index: 50; display: flex; flex-direction: column; align-items: center; justify-content: center; background: rgba(10, 10, 10, 0.85); backdrop-filter: blur(8px); border-radius: 12px; } /* ---- Feedback form ---- */ .fb-textarea { background: #111; border: 1px solid #2a2a2a; border-radius: 8px; color: #f0ece6; font-size: 12px; padding: 12px; width: 100%; min-height: 120px; resize: vertical; font-family: 'Inter', sans-serif; } .fb-textarea:focus { outline: none; border-color: var(--cocoa-l); } .fb-select { background: #111; border: 1px solid #2a2a2a; border-radius: 8px; color: #f0ece6; font-size: 11px; padding: 10px 12px; /* taller for touch */ width: 100%; font-family: 'Inter', sans-serif; min-height: 44px; } .fb-select:focus { outline: none; border-color: var(--cocoa-l); } .fb-stars { display: flex; gap: 8px; } .fb-star { font-size: 28px; /* larger for mobile tapping */ color: #333; cursor: pointer; transition: color 0.15s; min-width: 36px; min-height: 36px; display: flex; align-items: center; justify-content: center; } .fb-star.active, .fb-star:hover { color: var(--cocoa-l); } .fb-chip { background: #050505; border: 1px solid #222; border-radius: 8px; color: #666; font-size: 10px; font-weight: 700; padding: 14px 12px; /* taller for touch */ cursor: pointer; transition: all 0.2s ease; text-align: center; text-transform: uppercase; min-height: 44px; display: flex; align-items: center; justify-content: center; } .fb-chip:hover { border-color: #444; color: #999; } .fb-chip.active { border-color: var(--cocoa-l); background: #111; color: #fff; box-shadow: 0 0 15px rgba(200, 154, 108, 0.15); } .fb-emoji-btn { background: #111; border: 1px solid #2a2a2a; border-radius: 8px; color: #555; flex: 1; text-align: center; padding: 12px 4px; /* taller */ cursor: pointer; transition: all 0.2s ease; min-height: 64px; display: flex; flex-direction: column; align-items: center; justify-content: center; } .fb-emoji-btn:hover { border-color: #444; color: #888; } .fb-emoji-btn.active { border-color: var(--cocoa-l); background: #1a1a1a; color: var(--cocoa-l); box-shadow: 0 0 15px rgba(200, 154, 108, 0.15); } /* ============================================= DESKTOP (≥1024px) — original layout intact ============================================= */ @media (min-width: 1024px) { /* Sidebar visible */ aside.w-60 { display: flex !important; } /* Top mobile nav hidden */ .mobile-nav { display: none !important; } /* Bottom mobile nav hidden */ .mobile-bottom-nav { display: none !important; } /* Main — no bottom padding needed */ main { padding-bottom: 1rem !important; } /* Toast — desktop position: bottom-right */ #toast-container { bottom: 20px; left: unset; right: 20px; transform: none; width: auto; align-items: flex-end; } /* Settings — 2 column grid */ #tab-settings .grid { grid-template-columns: repeat(2, 1fr) !important; } /* Run details — multi-column grids preserved */ #run-results-content { grid-template-columns: repeat(3, 1fr) !important; } .grid-cols-2 { grid-template-columns: repeat(2, 1fr) !important; } .grid-cols-3 { grid-template-columns: repeat(3, 1fr) !important; } /* Reports grid */ #reports-grid, #reports-pending { grid-template-columns: repeat(2, 1fr) !important; } /* About grid */ #tab-about .grid.grid-cols-3 { grid-template-columns: repeat(3, 1fr) !important; } /* Post-process cards */ #post-process-cards { grid-template-columns: repeat(2, 1fr) !important; } /* Insights panel */ #insights-panel .grid { grid-template-columns: repeat(2, 1fr) !important; } } /* ============================================= MOBILE (< 1024px) — full mobile overhaul ============================================= */ @media (max-width: 1023px) { /* --- Hide desktop sidebar --- */ aside.w-60 { display: none !important; } /* --- Hide old top mobile nav bar --- */ .mobile-nav { display: none !important; } /* --- Body layout --- */ body { height: 100dvh; /* dynamic viewport height — accounts for mobile browser chrome */ overflow: hidden; } /* --- Main content — room for top and bottom nav --- */ main { padding: 70px 12px calc(var(--mob-nav-h) + 8px) 12px !important; gap: 12px !important; display: flex !important; flex-direction: column !important; height: 100dvh !important; } /* --- Tab Scrolling Fixes — force flex-1 to push progress bar down --- */ #tab-about, #tab-overview, #tab-run-details, #tab-reports, #tab-settings, #tab-help, #tab-feedback { flex: 1 !important; min-height: 0 !important; padding-bottom: 20px !important; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; overflow-y: auto !important; } /* --- About tab specific spacing --- */ #tab-about .space-y-8 { gap: 16px !important; } #tab-about .pt-8 { padding-top: 16px !important; } #tab-overview:not(.hidden) { display: flex !important; flex-direction: column !important; overflow-y: auto !important; overflow-x: hidden !important; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; padding-bottom: calc(var(--mob-nav-h) + 24px) !important; gap: 16px !important; } #tab-overview>div:not(#stats-empty-state) { grid-column: span 1 !important; min-height: 280px; flex-shrink: 0; } .stats-empty-overlay { position: fixed !important; top: 58px; /* below mobile top bar */ left: 0; right: 0; bottom: var(--mob-nav-h); height: auto !important; z-index: 100; background: rgba(0, 0, 0, 0.98); display: flex; flex-direction: column; align-items: center; justify-content: center; } /* CRITICAL: hide overlay when its parent tab is hidden */ #tab-overview.hidden .stats-empty-overlay { display: none !important; } /* Hide charts when curtain is up to prevent scroll jank */ #tab-overview.curtain-active { overflow: hidden !important; } /* --- Settings tab — tighter layout --- */ #tab-settings>div[class*="grid"] { display: flex !important; flex-direction: column !important; gap: 12px !important; } #tab-settings { overflow-x: hidden !important; } /* Collapse chip panel completely when not shown — removes gap */ #chip-selector.hidden-chip-container { display: none !important; margin: 0 !important; padding: 0 !important; height: 0 !important; } /* When visible, give it breathing room */ #chip-selector:not(.hidden-chip-container) { display: flex !important; flex-wrap: wrap !important; gap: 8px !important; margin-top: 12px !important; padding: 0 !important; } /* Ensure all s-row items are uniform flex rows */ .s-row { display: flex !important; align-items: center !important; justify-content: space-between !important; padding: 14px 0 !important; border-bottom: 1px solid #1a1a1a !important; gap: 12px !important; } .s-row:last-child { border-bottom: none !important; } /* Never let mobile flex override Tailwind .hidden utility */ .s-row.hidden { display: none !important; } /* The annotated video row overrides — it is flex-col on desktop; force flex-row on mobile */ .s-row[data-param="annotated"] { flex-direction: column !important; align-items: stretch !important; } .s-row[data-param="annotated"]>.flex { width: 100% !important; } .s-stepper { width: 140px !important; /* Compact fixed width */ scale: 0.9; transform-origin: right; display: inline-flex !important; } .toggle-track { width: 36px !important; scale: 0.9; transform-origin: right; } @media (max-width: 480px) { .s-row { flex-direction: row !important; align-items: center !important; justify-content: space-between !important; /* align toggles on right for discipline */ gap: 12px !important; padding: 10px 16px !important; width: 100% !important; box-sizing: border-box !important; } .s-row[data-param="annotated"] { flex-direction: column !important; align-items: stretch !important; padding: 12px 16px !important; /* matches normal s-row padding */ } .s-row:not([data-param="annotated"]) { padding: 12px 16px !important; } #tab-run-details .p-8 { padding: 20px !important; } #run-results-content { grid-template-columns: 1fr !important; gap: 16px !important; } #panel-video .flex, #panel-perf .flex, #panel-model .flex, #panel-infer .flex { padding-bottom: 8px !important; } .s-row .info-wrap { display: inline-flex !important; vertical-align: middle; } .s-row>div:first-child { width: auto !important; max-width: 75% !important; flex: 1 !important; } .toggle-track { width: 36px !important; min-width: 36px !important; height: 20px !important; flex-shrink: 0 !important; display: block !important; position: relative !important; } #run-results-card .text-[10px] { font-size: 9px !important; letter-spacing: 0.05em !important; } .s-row>.s-stepper { width: 130px !important; flex-shrink: 0 !important; display: inline-flex !important; flex-direction: row !important; } .chip-container { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 6px !important; margin-top: 12px !important; padding: 10px !important; background: rgba(255, 255, 255, 0.03); border-radius: 8px; border: 1px solid #1a1a1a; width: 100% !important; box-sizing: border-box !important; } .chip { padding: 6px !important; font-size: 9px !important; min-height: 32px !important; border-radius: 6px !important; justify-content: center !important; width: 100% !important; white-space: nowrap !important; } .s-stepper { width: 130px !important; min-width: 130px !important; display: inline-flex !important; flex-direction: row !important; align-items: center !important; justify-content: space-between !important; transform-origin: right !important; } .toggle-track { transform-origin: right !important; } } /* --- Progress bar wrapper — remove extra margin to fix huge gap --- */ #progress-bar-wrapper { width: 100% !important; max-width: 100% !important; box-sizing: border-box !important; margin-top: auto !important; margin-bottom: 4px !important; padding: 8px 12px !important; flex-direction: column !important; align-items: flex-start !important; gap: 6px !important; position: relative; z-index: 10; } #progress-bar-wrapper>div:first-child { width: 100% !important; flex: 1 !important; min-width: 0 !important; margin-right: 0 !important; } #progress-bar-wrapper>div:last-child { width: 100% !important; justify-content: space-between !important; font-size: 10px !important; } /* --- All other grids collapse to single column --- */ .grid-cols-3, .grid-cols-2, .lg\:grid-cols-2, .xl\:grid-cols-3 { grid-template-columns: 1fr !important; } /* --- Run details tab --- */ #run-results-content { grid-template-columns: 1fr !important; } #tab-run-details .grid-cols-2, #tab-run-details .grid-cols-3 { grid-template-columns: 1fr !important; } /* --- Reports grid --- */ #reports-grid, #reports-pending { grid-template-columns: 1fr !important; } /* --- About tab grid --- */ #tab-about .grid.grid-cols-3 { grid-template-columns: 1fr !important; } /* --- Post-process cards --- */ #post-process-cards { grid-template-columns: 1fr !important; } /* --- Insights panel --- */ #insights-panel .grid { grid-template-columns: 1fr !important; } /* --- Feedback tab --- */ #tab-feedback .grid { grid-template-columns: 1fr !important; } /* --- About tab cards --- */ #tab-about .bg-black.border.rounded-xl { padding: 20px !important; } /* --- Stepper — ensure full tap area --- */ .s-stepper button { padding: 10px 14px; min-width: 40px; min-height: 40px; } /* --- s-row label text — allow wrap --- */ .s-row>div:first-child .text-xs { font-size: 11px; } /* --- Help accordion buttons --- */ #tab-help button.w-full { min-height: 52px; padding: 14px 16px !important; } /* --- Feedback priority chips grid --- */ #fb-priorities { grid-template-columns: 1fr !important; } /* --- Keyboard shortcut modal --- */ #appModal-shortcutsModal>div { max-width: 95% !important; padding: 20px !important; } /* --- Privacy / Terms modals --- */ [id^="appModal-"]>div { max-width: 95% !important; max-height: 80dvh !important; overflow-y: auto !important; } #tab-overview>div:last-child { min-height: 300px !important; padding-bottom: 4px !important; margin-bottom: 0 !important; } /* --- Vehicle Classification Internal Scroll --- */ #tab-overview>div:nth-child(4) { max-height: 380px !important; display: flex !important; flex-direction: column !important; } #tab-overview>div:nth-child(4) #class-breakdown { flex: 1 !important; overflow-y: auto !important; min-height: 0 !important; } } /* ============================================= BOTTOM NAVIGATION BAR — mobile only ============================================= */ .mobile-bottom-nav { display: none; /* hidden by default, shown on mobile */ position: fixed; bottom: 0; left: 0; right: 0; height: 68px; background: #000000; border-top: 1px solid #1a1a1a; z-index: 40; align-items: stretch; } .mob-nav-item { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; cursor: pointer; color: #444444; font-size: 0; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; transition: color 0.15s ease; border: none; background: none; padding: 8px 2px; -webkit-tap-highlight-color: transparent; } .mob-nav-item i { font-size: 22px; transition: color 0.15s ease; } .mob-nav-item.active { color: var(--cocoa-l); } .mob-nav-item.active i { color: var(--cocoa-l); } .mob-nav-item:active { color: var(--cocoa-xl); } /* Show bottom nav only on mobile */ @media (max-width: 1023px) { .mobile-bottom-nav { display: flex !important; } } /* ============================================= MEDIUM TABLET (640px–1023px) adjustments ============================================= */ @media (min-width: 640px) and (max-width: 1023px) { /* 2-column grids on tablet where it fits */ #tab-overview>div { min-height: 280px; } #reports-grid, #reports-pending { grid-template-columns: repeat(2, 1fr) !important; } #fb-priorities { grid-template-columns: repeat(2, 1fr) !important; } #tab-about .grid.grid-cols-3 { grid-template-columns: repeat(2, 1fr) !important; } } /* ============================================= TOUCH DEVICES — remove hover jank ============================================= */ @media (hover: none) and (pointer: coarse) { .nav-item-inactive:hover { color: #555555 !important; background-color: transparent !important; } .chip:hover { border-color: #333333; } .chip.active:hover { background: var(--cocoa-l); } .s-stepper button:hover { background: transparent; color: #666666; } /* Make all interactive elements minimum 44px tall */ button, .fb-emoji-btn, .mob-nav-item { min-height: 44px; } } /* ============================================================ Custom Select Dropdown (uf-select) Replaces native