/* RideX - Modern Ride Booking App Styles */ /* Design System: Blue & White Theme with Plus Jakarta Sans */ :root { /* Primary Colors */ --primary: #0066FF; --primary-dark: #0052CC; --primary-light: #E6F0FF; --primary-gradient: linear-gradient(135deg, #0066FF 0%, #0052CC 100%); /* Secondary Colors */ --secondary: #00C853; --secondary-light: #E6F7ED; --accent: #FF6B00; --accent-light: #FFF0E6; /* Neutral Colors */ --white: #FFFFFF; --gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0; --gray-300: #CBD5E1; --gray-400: #94A3B8; --gray-500: #64748B; --gray-600: #475569; --gray-700: #334155; --gray-800: #1E293B; --gray-900: #0F172A; /* Semantic Colors */ --success: #00C853; --warning: #FFB800; --error: #FF3B30; --info: #0066FF; /* Typography */ --font-display: 'Plus Jakarta Sans', sans-serif; --font-body: 'Inter', sans-serif; /* Spacing */ --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 48px; /* Border Radius */ --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 24px; --radius-full: 9999px; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); /* Transitions */ --transition-fast: 150ms ease; --transition-normal: 300ms ease; --transition-slow: 500ms ease; } /* Reset & Base */ * { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: var(--font-body); background: var(--gray-100); color: var(--gray-800); line-height: 1.5; overflow-x: hidden; min-height: 100vh; } /* App Container */ #app { max-width: 480px; margin: 0 auto; min-height: 100vh; background: var(--white); position: relative; overflow: hidden; box-shadow: var(--shadow-xl); } /* Screen Management */ .screen { position: fixed; top: 0; left: 0; right: 0; bottom: 0; max-width: 480px; margin: 0 auto; background: var(--white); opacity: 0; visibility: hidden; transition: opacity var(--transition-normal), visibility var(--transition-normal); overflow-y: auto; overflow-x: hidden; z-index: 1; } .screen.active { opacity: 1; visibility: visible; z-index: 10; } /* Splash Screen */ #splash-screen { display: flex; align-items: center; justify-content: center; background: var(--primary-gradient); z-index: 100; } .splash-content { text-align: center; animation: fadeInUp 0.8s ease; } .logo-container { margin-bottom: var(--space-xl); } .logo-icon { width: 120px; height: 120px; margin: 0 auto var(--space-lg); animation: pulse 2s ease-in-out infinite; } .logo-icon svg { width: 100%; height: 100%; filter: drop-shadow(0 10px 30px rgba(0, 102, 255, 0.3)); } .logo-text { font-family: var(--font-display); font-size: 42px; font-weight: 800; color: var(--white); letter-spacing: -1px; margin-bottom: var(--space-sm); } .tagline { font-size: 16px; color: rgba(255, 255, 255, 0.8); font-weight: 500; } .splash-loader { width: 200px; height: 4px; background: rgba(255, 255, 255, 0.2); border-radius: var(--radius-full); margin: 0 auto; overflow: hidden; } .loader-bar { height: 100%; width: 0; background: var(--white); border-radius: var(--radius-full); animation: loading 2s ease-in-out infinite; } @keyframes loading { 0% { width: 0; margin-left: 0; } 50% { width: 100%; margin-left: 0; } 100% { width: 0; margin-left: 100%; } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Onboarding Screen */ #onboarding-screen { background: var(--white); } .onboarding-container { height: 100%; display: flex; flex-direction: column; padding: var(--space-lg); } .onboarding-slides { flex: 1; position: relative; overflow: hidden; } .slide { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; opacity: 0; transform: translateX(100%); transition: all var(--transition-normal); } .slide.active { opacity: 1; transform: translateX(0); } .slide-image { flex: 1; display: flex; align-items: center; justify-content: center; width: 100%; } .illustration { width: 280px; height: 280px; position: relative; } .illustration svg { width: 100%; height: 100%; } .bike-animation { animation: float 3s ease-in-out infinite; } .shield-animation { animation: pulse 2s ease-in-out infinite; } .wallet-animation { animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .slide-content { text-align: center; padding: var(--space-lg) 0; } .slide-content h2 { font-family: var(--font-display); font-size: 28px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-md); line-height: 1.2; } .slide-content p { font-size: 16px; color: var(--gray-500); line-height: 1.6; max-width: 300px; margin: 0 auto; } .onboarding-dots { display: flex; justify-content: center; gap: var(--space-sm); margin-bottom: var(--space-xl); } .dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--gray-300); transition: all var(--transition-fast); cursor: pointer; } .dot.active { width: 24px; background: var(--primary); } .onboarding-actions { display: flex; gap: var(--space-md); padding-bottom: var(--space-lg); } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-sm); padding: var(--space-md) var(--space-lg); border: none; border-radius: var(--radius-lg); font-family: var(--font-display); font-size: 16px; font-weight: 600; cursor: pointer; transition: all var(--transition-fast); text-decoration: none; } .btn-primary { background: var(--primary-gradient); color: var(--white); box-shadow: 0 4px 14px rgba(0, 102, 255, 0.4); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0, 102, 255, 0.5); } .btn-primary:active { transform: translateY(0); } .btn-outline { background: transparent; color: var(--primary); border: 2px solid var(--primary); } .btn-outline:hover { background: var(--primary-light); } .btn-skip { background: transparent; color: var(--gray-500); flex: 1; } .btn-next { flex: 2; } .btn-full { width: 100%; } .btn-sm { padding: var(--space-sm) var(--space-md); font-size: 14px; } .btn-icon { width: 20px; height: 20px; } .btn-back { position: absolute; top: var(--space-lg); left: var(--space-lg); width: 40px; height: 40px; border-radius: var(--radius-full); background: var(--gray-100); border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all var(--transition-fast); z-index: 10; } .btn-back:hover { background: var(--gray-200); } .btn-back svg { width: 20px; height: 20px; color: var(--gray-700); } .btn-edit { position: absolute; top: var(--space-lg); right: var(--space-lg); background: transparent; border: none; color: var(--primary); font-weight: 600; cursor: pointer; z-index: 10; } /* Login Screen */ .login-container { height: 100%; display: flex; flex-direction: column; padding: var(--space-xl); padding-top: 100px; } .login-header { text-align: center; margin-bottom: var(--space-2xl); } .logo-small { width: 64px; height: 64px; margin: 0 auto var(--space-lg); } .logo-small svg { width: 100%; height: 100%; } .login-header h2 { font-family: var(--font-display); font-size: 28px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-sm); } .login-header p { color: var(--gray-500); font-size: 16px; } .login-form { margin-bottom: var(--space-xl); } .input-group { display: flex; gap: var(--space-sm); margin-bottom: var(--space-lg); background: var(--gray-50); border-radius: var(--radius-lg); padding: var(--space-sm); border: 2px solid var(--gray-200); transition: border-color var(--transition-fast); } .input-group:focus-within { border-color: var(--primary); background: var(--white); } .country-code { display: flex; align-items: center; gap: var(--space-sm); padding: 0 var(--space-md); border-right: 1px solid var(--gray-200); font-weight: 600; color: var(--gray-700); } .flag-icon { width: 24px; height: 16px; border-radius: 2px; object-fit: cover; } .input-field { flex: 1; border: none; background: transparent; font-size: 18px; font-weight: 500; color: var(--gray-900); outline: none; padding: var(--space-sm); } .input-field::placeholder { color: var(--gray-400); } .login-footer { text-align: center; margin-top: auto; } .login-footer p { font-size: 14px; color: var(--gray-500); line-height: 1.6; } .login-footer a { color: var(--primary); text-decoration: none; font-weight: 600; } /* OTP Screen */ .otp-container { height: 100%; display: flex; flex-direction: column; padding: var(--space-xl); padding-top: 80px; position: relative; } .otp-header { text-align: center; margin-bottom: var(--space-2xl); } .otp-header h2 { font-family: var(--font-display); font-size: 28px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-md); } .otp-header p { color: var(--gray-500); font-size: 16px; } #otp-phone { color: var(--gray-900); font-weight: 600; } .otp-inputs { display: flex; justify-content: center; gap: var(--space-sm); margin-bottom: var(--space-xl); } .otp-digit { width: 48px; height: 56px; border: 2px solid var(--gray-200); border-radius: var(--radius-md); text-align: center; font-size: 24px; font-weight: 700; color: var(--gray-900); background: var(--gray-50); transition: all var(--transition-fast); } .otp-digit:focus { border-color: var(--primary); background: var(--white); outline: none; transform: scale(1.05); } .otp-timer { text-align: center; margin-bottom: var(--space-xl); } .otp-timer p { color: var(--gray-500); font-size: 14px; } #timer { color: var(--primary); font-weight: 600; } /* Role Selection Screen */ .role-container { height: 100%; display: flex; flex-direction: column; padding: var(--space-xl); padding-top: 60px; } .role-header { text-align: center; margin-bottom: var(--space-xl); } .role-header h2 { font-family: var(--font-display); font-size: 24px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-sm); } .role-header p { color: var(--gray-500); font-size: 16px; } .role-options { display: flex; flex-direction: column; gap: var(--space-md); } .role-card { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-lg); background: var(--gray-50); border-radius: var(--radius-lg); border: 2px solid transparent; cursor: pointer; transition: all var(--transition-fast); } .role-card:hover { border-color: var(--primary); background: var(--white); transform: translateX(5px); } .role-icon { width: 56px; height: 56px; flex-shrink: 0; } .role-icon svg { width: 100%; height: 100%; } .role-card h3 { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); margin-bottom: 2px; } .role-card p { font-size: 14px; color: var(--gray-500); } .role-arrow { margin-left: auto; color: var(--gray-400); } .role-arrow svg { width: 20px; height: 20px; } /* User Home Screen */ .home-container { height: 100%; display: flex; flex-direction: column; position: relative; } .home-header { position: absolute; top: 0; left: 0; right: 0; z-index: 20; padding: var(--space-md); padding-top: 50px; } .location-selector { display: flex; align-items: center; gap: var(--space-sm); background: var(--white); padding: var(--space-md); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); } .location-icon { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; background: var(--primary-light); border-radius: var(--radius-md); } .location-icon svg { width: 24px; height: 24px; } .location-text { flex: 1; display: flex; flex-direction: column; } .location-label { font-size: 12px; color: var(--gray-500); } .location-value { font-size: 14px; font-weight: 600; color: var(--gray-900); } .btn-profile { width: 40px; height: 40px; border-radius: var(--radius-full); border: none; padding: 0; overflow: hidden; cursor: pointer; } .profile-img { width: 100%; height: 100%; object-fit: cover; } .map-container { flex: 1; position: relative; background: var(--gray-100); } .map-placeholder { width: 100%; height: 100%; position: relative; overflow: hidden; } .map-pattern { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: linear-gradient(rgba(0, 102, 255, 0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 102, 255, 0.05) 1px, transparent 1px); background-size: 40px 40px; } .location-marker { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .marker-pulse { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 60px; height: 60px; background: rgba(0, 102, 255, 0.3); border-radius: 50%; animation: pulse-ring 2s ease-out infinite; } @keyframes pulse-ring { 0% { transform: translate(-50%, -50%) scale(0.5); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(2); opacity: 0; } } .marker-icon { width: 40px; height: 40px; position: relative; z-index: 1; } .marker-icon svg { width: 100%; height: 100%; filter: drop-shadow(0 4px 8px rgba(0, 102, 255, 0.4)); } .booking-panel { background: var(--white); border-radius: var(--radius-xl) var(--radius-xl) 0 0; padding: var(--space-lg); box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1); position: relative; z-index: 30; } .panel-handle { width: 40px; height: 4px; background: var(--gray-300); border-radius: var(--radius-full); margin: 0 auto var(--space-lg); } .service-types { display: flex; gap: var(--space-md); overflow-x: auto; padding-bottom: var(--space-md); margin-bottom: var(--space-md); scrollbar-width: none; } .service-types::-webkit-scrollbar { display: none; } .service-card { flex-shrink: 0; width: 80px; text-align: center; padding: var(--space-md); border-radius: var(--radius-lg); border: 2px solid var(--gray-200); cursor: pointer; transition: all var(--transition-fast); } .service-card.active { border-color: var(--primary); background: var(--primary-light); } .service-card:hover:not(.active) { border-color: var(--gray-300); } .service-icon { width: 40px; height: 40px; margin: 0 auto var(--space-sm); } .service-icon svg { width: 100%; height: 100%; } .service-name { display: block; font-size: 12px; font-weight: 600; color: var(--gray-700); margin-bottom: 2px; } .service-price { display: block; font-size: 14px; font-weight: 700; color: var(--gray-900); } .service-time { display: block; font-size: 11px; color: var(--gray-500); } .location-inputs { margin-bottom: var(--space-lg); } .location-input-row { display: flex; align-items: center; gap: var(--space-sm); } .location-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; } .pickup-dot { background: var(--primary); } .drop-dot { background: var(--secondary); } .location-input { flex: 1; border: none; font-size: 16px; color: var(--gray-900); background: transparent; outline: none; padding: var(--space-sm) 0; } .location-divider { width: 2px; height: 24px; background: var(--gray-200); margin-left: 5px; margin-top: -8px; margin-bottom: -8px; } .btn-current-location { width: 36px; height: 36px; border-radius: var(--radius-full); border: none; background: var(--gray-100); display: flex; align-items: center; justify-content: center; cursor: pointer; color: var(--primary); } .btn-current-location svg { width: 18px; height: 18px; } .fare-estimate { background: var(--gray-50); border-radius: var(--radius-lg); padding: var(--space-md); margin-bottom: var(--space-lg); } .fare-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-sm); } .fare-row:last-child { margin-bottom: 0; } .fare-label { font-size: 14px; color: var(--gray-500); } .fare-amount { font-size: 18px; font-weight: 700; color: var(--gray-900); } .fare-value { font-size: 14px; color: var(--gray-700); } .btn-book { font-size: 18px; padding: var(--space-md); } /* SOS Button */ .sos-button { position: fixed; bottom: 100px; right: var(--space-md); width: 56px; height: 56px; border-radius: var(--radius-full); background: var(--error); border: none; color: var(--white); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; cursor: pointer; box-shadow: 0 4px 14px rgba(255, 59, 48, 0.4); z-index: 40; animation: pulse-sos 2s ease-in-out infinite; } @keyframes pulse-sos { 0%, 100% { box-shadow: 0 4px 14px rgba(255, 59, 48, 0.4); } 50% { box-shadow: 0 4px 30px rgba(255, 59, 48, 0.6); } } .sos-button svg { width: 20px; height: 20px; } .sos-button span { font-size: 10px; font-weight: 700; } /* Bottom Navigation */ .bottom-nav { position: fixed; bottom: 0; left: 0; right: 0; max-width: 480px; margin: 0 auto; display: flex; justify-content: space-around; background: var(--white); padding: var(--space-sm) 0; border-top: 1px solid var(--gray-200); z-index: 50; } .nav-item { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: var(--space-sm) var(--space-md); cursor: pointer; color: var(--gray-400); transition: color var(--transition-fast); } .nav-item svg { width: 24px; height: 24px; } .nav-item span { font-size: 11px; font-weight: 500; } .nav-item.active { color: var(--primary); } /* Driver Home Screen */ .driver-container { height: 100%; display: flex; flex-direction: column; } .driver-header { position: absolute; top: 0; left: 0; right: 0; z-index: 20; display: flex; align-items: center; justify-content: space-between; padding: var(--space-md); padding-top: 50px; } .driver-status { flex: 1; } .status-toggle { display: inline-flex; align-items: center; gap: var(--space-sm); padding: var(--space-sm) var(--space-md); background: var(--white); border-radius: var(--radius-full); box-shadow: var(--shadow-md); cursor: pointer; } .status-indicator { width: 12px; height: 12px; border-radius: 50%; } .status-indicator.offline { background: var(--gray-400); } .status-indicator.online { background: var(--secondary); animation: pulse-status 2s ease-in-out infinite; } @keyframes pulse-status { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .status-text { font-size: 14px; font-weight: 600; color: var(--gray-700); } .driver-earnings-preview { text-align: center; margin-right: var(--space-md); } .earnings-label { display: block; font-size: 11px; color: var(--gray-500); } .earnings-amount { display: block; font-size: 18px; font-weight: 700; color: var(--gray-900); } .driver-map-container { flex: 1; position: relative; background: var(--gray-100); } .driver-location-marker .marker-icon svg { fill: var(--secondary); } .driver-panel { background: var(--white); border-radius: var(--radius-xl) var(--radius-xl) 0 0; padding: var(--space-lg); box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1); } .driver-stats { display: flex; justify-content: space-around; margin-bottom: var(--space-lg); padding-bottom: var(--space-lg); border-bottom: 1px solid var(--gray-200); } .driver-stats .stat-card { text-align: center; } .driver-stats .stat-value { display: block; font-size: 24px; font-weight: 700; color: var(--gray-900); } .driver-stats .stat-label { display: block; font-size: 12px; color: var(--gray-500); margin-top: 2px; } .requests-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-md); } .requests-header h3 { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); } .requests-count { background: var(--primary); color: var(--white); font-size: 12px; font-weight: 600; padding: 2px 8px; border-radius: var(--radius-full); } .empty-state { text-align: center; padding: var(--space-2xl) var(--space-lg); } .empty-icon { width: 80px; height: 80px; margin: 0 auto var(--space-lg); } .empty-icon svg { width: 100%; height: 100%; } .empty-state p { color: var(--gray-500); font-size: 14px; } /* Admin Dashboard */ .admin-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .admin-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-md) var(--space-lg); background: var(--white); border-bottom: 1px solid var(--gray-200); } .admin-logo { display: flex; align-items: center; gap: var(--space-sm); } .admin-logo svg { width: 32px; height: 32px; } .admin-logo span { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); } .admin-actions { display: flex; gap: var(--space-sm); } .btn-icon-only { width: 40px; height: 40px; border-radius: var(--radius-md); border: none; background: var(--gray-100); display: flex; align-items: center; justify-content: center; cursor: pointer; color: var(--gray-600); transition: all var(--transition-fast); } .btn-icon-only:hover { background: var(--gray-200); } .btn-icon-only svg { width: 20px; height: 20px; } .admin-content { flex: 1; display: flex; overflow: hidden; } .admin-sidebar { width: 200px; background: var(--white); border-right: 1px solid var(--gray-200); padding: var(--space-md); display: flex; flex-direction: column; gap: 4px; } .sidebar-item { display: flex; align-items: center; gap: var(--space-sm); padding: var(--space-sm) var(--space-md); border-radius: var(--radius-md); cursor: pointer; color: var(--gray-600); transition: all var(--transition-fast); } .sidebar-item svg { width: 20px; height: 20px; } .sidebar-item span { font-size: 14px; font-weight: 500; } .sidebar-item:hover { background: var(--gray-100); color: var(--gray-900); } .sidebar-item.active { background: var(--primary-light); color: var(--primary); } .admin-main { flex: 1; padding: var(--space-lg); overflow-y: auto; } .section-title { font-family: var(--font-display); font-size: 24px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-lg); } .stats-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-md); margin-bottom: var(--space-xl); } .stat-card-large { background: var(--white); border-radius: var(--radius-lg); padding: var(--space-lg); display: flex; align-items: center; gap: var(--space-md); box-shadow: var(--shadow-sm); } .stat-icon { width: 48px; height: 48px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; } .stat-icon svg { width: 24px; height: 24px; } .stat-icon.users-icon { background: var(--primary-light); color: var(--primary); } .stat-icon.drivers-icon { background: var(--secondary-light); color: var(--secondary); } .stat-icon.rides-icon { background: #FFF0E6; color: var(--accent); } .stat-icon.revenue-icon { background: #E6F7ED; color: var(--success); } .stat-info { flex: 1; } .stat-number { display: block; font-family: var(--font-display); font-size: 24px; font-weight: 700; color: var(--gray-900); } .stat-label { display: block; font-size: 12px; color: var(--gray-500); margin-top: 2px; } .stat-change { display: block; font-size: 11px; font-weight: 600; margin-top: 4px; } .stat-change.positive { color: var(--success); } .dashboard-charts { display: flex; flex-direction: column; gap: var(--space-lg); } .chart-card { background: var(--white); border-radius: var(--radius-lg); padding: var(--space-lg); box-shadow: var(--shadow-sm); } .chart-card h3 { font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--gray-900); margin-bottom: var(--space-md); } .chart-placeholder { height: 150px; display: flex; flex-direction: column; justify-content: flex-end; } .chart-bars { display: flex; align-items: flex-end; justify-content: space-around; height: 120px; gap: var(--space-sm); } .bar { flex: 1; background: var(--gray-200); border-radius: var(--radius-sm) var(--radius-sm) 0 0; transition: all var(--transition-fast); min-width: 30px; } .bar.active { background: var(--primary); } .chart-labels { display: flex; justify-content: space-around; margin-top: var(--space-sm); } .chart-labels span { font-size: 12px; color: var(--gray-500); } .activity-list { display: flex; flex-direction: column; gap: var(--space-md); } .activity-item { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-sm) 0; border-bottom: 1px solid var(--gray-100); } .activity-item:last-child { border-bottom: none; } .activity-icon { width: 40px; height: 40px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; } .activity-icon svg { width: 20px; height: 20px; } .activity-icon.ride-completed { background: var(--secondary-light); color: var(--secondary); } .activity-icon.new-driver { background: var(--primary-light); color: var(--primary); } .activity-icon.payment-received { background: #FFF0E6; color: var(--accent); } .activity-info { flex: 1; } .activity-title { display: block; font-size: 14px; font-weight: 600; color: var(--gray-900); } .activity-time { display: block; font-size: 12px; color: var(--gray-500); } .activity-amount { font-size: 14px; font-weight: 700; color: var(--gray-900); } /* Profile Screen */ .profile-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .profile-header { position: relative; display: flex; align-items: center; justify-content: center; padding: var(--space-lg); padding-top: 50px; background: var(--white); border-bottom: 1px solid var(--gray-200); } .profile-header h2 { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--gray-900); } .profile-content { flex: 1; padding: var(--space-lg); overflow-y: auto; } .profile-card { background: var(--white); border-radius: var(--radius-lg); padding: var(--space-xl); text-align: center; margin-bottom: var(--space-lg); box-shadow: var(--shadow-sm); } .profile-avatar { position: relative; width: 100px; height: 100px; margin: 0 auto var(--space-md); } .profile-avatar img { width: 100%; height: 100%; border-radius: var(--radius-full); object-fit: cover; } .btn-change-photo { position: absolute; bottom: 0; right: 0; width: 32px; height: 32px; border-radius: var(--radius-full); border: 2px solid var(--white); background: var(--primary); color: var(--white); display: flex; align-items: center; justify-content: center; cursor: pointer; } .btn-change-photo svg { width: 14px; height: 14px; } .profile-name { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-xs); } .profile-phone { font-size: 14px; color: var(--gray-500); margin-bottom: var(--space-sm); } .profile-rating { display: inline-flex; align-items: center; gap: 4px; background: var(--gray-100); padding: 4px 12px; border-radius: var(--radius-full); } .profile-rating svg { width: 16px; height: 16px; } .profile-rating span { font-size: 14px; font-weight: 600; color: var(--gray-700); } .profile-menu { background: var(--white); border-radius: var(--radius-lg); margin-bottom: var(--space-lg); overflow: hidden; box-shadow: var(--shadow-sm); } .menu-item { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-md) var(--space-lg); border-bottom: 1px solid var(--gray-100); cursor: pointer; transition: background var(--transition-fast); } .menu-item:last-child { border-bottom: none; } .menu-item:hover { background: var(--gray-50); } .menu-icon { width: 40px; height: 40px; border-radius: var(--radius-md); background: var(--gray-100); display: flex; align-items: center; justify-content: center; color: var(--gray-600); } .menu-icon svg { width: 20px; height: 20px; } .menu-label { flex: 1; font-size: 16px; font-weight: 500; color: var(--gray-800); } .menu-arrow { width: 20px; height: 20px; color: var(--gray-400); } /* Ride History Screen */ .history-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .history-header { position: relative; display: flex; align-items: center; justify-content: center; padding: var(--space-lg); padding-top: 50px; background: var(--white); border-bottom: 1px solid var(--gray-200); } .history-header h2 { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--gray-900); } .history-tabs { display: flex; gap: var(--space-sm); padding: var(--space-md); background: var(--white); border-bottom: 1px solid var(--gray-200); } .tab { flex: 1; text-align: center; padding: var(--space-sm) var(--space-md); border-radius: var(--radius-full); font-size: 14px; font-weight: 500; color: var(--gray-500); cursor: pointer; transition: all var(--transition-fast); } .tab.active { background: var(--primary); color: var(--white); } .history-list { flex: 1; padding: var(--space-md); overflow-y: auto; } .ride-card { background: var(--white); border-radius: var(--radius-lg); padding: var(--space-lg); margin-bottom: var(--space-md); box-shadow: var(--shadow-sm); } .ride-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-md); } .ride-type { display: flex; align-items: center; gap: var(--space-sm); } .ride-type svg { width: 24px; height: 24px; } .ride-type span { font-size: 14px; font-weight: 600; color: var(--gray-700); } .ride-status { font-size: 12px; font-weight: 600; padding: 4px 12px; border-radius: var(--radius-full); } .ride-status.completed { background: var(--secondary-light); color: var(--secondary); } .ride-status.cancelled { background: #FFEBEE; color: var(--error); } .ride-route { margin-bottom: var(--space-md); } .route-point { display: flex; align-items: center; gap: var(--space-sm); } .point-dot { width: 10px; height: 10px; border-radius: 50%; } .point-dot.pickup { background: var(--primary); } .point-dot.drop { background: var(--secondary); } .route-point span { font-size: 14px; color: var(--gray-700); } .route-line { width: 2px; height: 20px; background: var(--gray-200); margin-left: 4px; margin-top: -5px; margin-bottom: -5px; } .ride-footer { display: flex; justify-content: space-between; align-items: center; padding-top: var(--space-md); border-top: 1px solid var(--gray-100); } .ride-info { display: flex; flex-direction: column; gap: 2px; } .ride-info span { font-size: 12px; color: var(--gray-500); } .ride-fare { font-size: 18px; font-weight: 700; color: var(--gray-900); } /* Payments Screen */ .payments-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .payments-header { position: relative; display: flex; align-items: center; justify-content: center; padding: var(--space-lg); padding-top: 50px; background: var(--white); border-bottom: 1px solid var(--gray-200); } .payments-header h2 { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--gray-900); } .payments-content { flex: 1; padding: var(--space-lg); overflow-y: auto; } .payment-balance { background: var(--primary-gradient); border-radius: var(--radius-lg); padding: var(--space-xl); text-align: center; margin-bottom: var(--space-lg); color: var(--white); } .balance-label { display: block; font-size: 14px; opacity: 0.8; margin-bottom: var(--space-sm); } .balance-amount { display: block; font-family: var(--font-display); font-size: 36px; font-weight: 700; margin-bottom: var(--space-md); } .payment-methods { background: var(--white); border-radius: var(--radius-lg); padding: var(--space-lg); margin-bottom: var(--space-lg); box-shadow: var(--shadow-sm); } .payment-methods h3 { font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--gray-900); margin-bottom: var(--space-md); } .payment-card { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-md); border-radius: var(--radius-md); border: 2px solid transparent; cursor: pointer; transition: all var(--transition-fast); } .payment-card.active { border-color: var(--primary); background: var(--primary-light); } .payment-card:hover:not(.active) { background: var(--gray-50); } .card-icon { width: 48px; height: 48px; border-radius: var(--radius-md); overflow: hidden; } .card-icon svg { width: 100%; height: 100%; } .card-info { flex: 1; } .card-name { display: block; font-size: 14px; font-weight: 600; color: var(--gray-900); } .card-detail { display: block; font-size: 12px; color: var(--gray-500); } .card-check { width: 24px; height: 24px; } .card-check svg { width: 100%; height: 100%; } /* Booking Screen */ .booking-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .booking-header { position: relative; display: flex; align-items: center; padding: var(--space-lg); padding-top: 50px; background: var(--white); border-bottom: 1px solid var(--gray-200); } .booking-header h2 { flex: 1; text-align: center; font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); } .booking-map { flex: 1; position: relative; } .searching-animation { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .search-ring { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100px; height: 100px; border: 3px solid var(--primary); border-radius: 50%; opacity: 0; animation: search-pulse 2s ease-out infinite; } .search-ring:nth-child(2) { animation-delay: 0.5s; } .search-ring:nth-child(3) { animation-delay: 1s; } @keyframes search-pulse { 0% { transform: translate(-50%, -50%) scale(0.5); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(2); opacity: 0; } } .booking-panel { background: var(--white); border-radius: var(--radius-xl) var(--radius-xl) 0 0; padding: var(--space-xl); box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1); } .booking-status { text-align: center; margin-bottom: var(--space-xl); } .status-spinner { width: 48px; height: 48px; border: 4px solid var(--gray-200); border-top-color: var(--primary); border-radius: 50%; margin: 0 auto var(--space-md); animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .booking-status h3 { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-xs); } .booking-status p { font-size: 14px; color: var(--gray-500); } .booking-details { background: var(--gray-50); border-radius: var(--radius-lg); padding: var(--space-md); margin-bottom: var(--space-lg); } .detail-row { display: flex; justify-content: space-between; align-items: center; padding: var(--space-sm) 0; border-bottom: 1px solid var(--gray-200); } .detail-row:last-child { border-bottom: none; } .detail-label { font-size: 14px; color: var(--gray-500); } .detail-value { font-size: 14px; font-weight: 600; color: var(--gray-900); } /* Driver Registration */ .registration-container { height: 100%; display: flex; flex-direction: column; background: var(--gray-50); } .registration-header { position: relative; display: flex; flex-direction: column; align-items: center; padding: var(--space-lg); padding-top: 50px; background: var(--white); border-bottom: 1px solid var(--gray-200); } .registration-header h2 { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-md); } .registration-steps { display: flex; align-items: center; gap: var(--space-sm); } .step { width: 32px; height: 32px; border-radius: 50%; background: var(--gray-200); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: var(--gray-500); transition: all var(--transition-fast); } .step.active { background: var(--primary); color: var(--white); } .step-line { width: 40px; height: 2px; background: var(--gray-200); } .registration-content { flex: 1; padding: var(--space-lg); overflow-y: auto; } .step-content { display: none; } .step-content.active { display: block; } .step-content h3 { font-family: var(--font-display); font-size: 18px; font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-lg); } .form-group { margin-bottom: var(--space-lg); } .form-group label { display: block; font-size: 14px; font-weight: 600; color: var(--gray-700); margin-bottom: var(--space-sm); } .form-group .input-field { width: 100%; padding: var(--space-md); border: 2px solid var(--gray-200); border-radius: var(--radius-lg); font-size: 16px; background: var(--white); transition: border-color var(--transition-fast); } .form-group .input-field:focus { border-color: var(--primary); outline: none; } .vehicle-options { display: flex; gap: var(--space-md); } .vehicle-option { flex: 1; display: flex; flex-direction: column; align-items: center; gap: var(--space-sm); padding: var(--space-lg); border: 2px solid var(--gray-200); border-radius: var(--radius-lg); cursor: pointer; transition: all var(--transition-fast); } .vehicle-option.active { border-color: var(--primary); background: var(--primary-light); } .vehicle-option svg { width: 48px; height: 48px; } .vehicle-option span { font-size: 14px; font-weight: 600; color: var(--gray-700); } .document-upload { display: flex; flex-direction: column; gap: var(--space-md); } .upload-item { display: flex; align-items: center; gap: var(--space-md); padding: var(--space-md); background: var(--white); border-radius: var(--radius-lg); border: 2px dashed var(--gray-300); cursor: pointer; transition: all var(--transition-fast); } .upload-item:hover { border-color: var(--primary); background: var(--primary-light); } .upload-icon { width: 48px; height: 48px; border-radius: var(--radius-md); background: var(--gray-100); display: flex; align-items: center; justify-content: center; color: var(--gray-500); } .upload-icon svg { width: 24px; height: 24px; } .upload-label { flex: 1; font-size: 14px; font-weight: 500; color: var(--gray-700); } .upload-status { font-size: 12px; font-weight: 600; padding: 4px 12px; border-radius: var(--radius-full); } .upload-status.pending { background: var(--gray-100); color: var(--gray-500); } .registration-actions { display: flex; gap: var(--space-md); margin-top: var(--space-xl); } /* Responsive Design */ @media (max-width: 480px) { #app { max-width: 100%; } .screen { max-width: 100%; } .bottom-nav { max-width: 100%; } } /* Animations */ .fade-in { animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .slide-up { animation: slideUp 0.3s ease; } @keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* Scrollbar Styling */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--gray-100); } ::-webkit-scrollbar-thumb { background: var(--gray-300); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--gray-400); } /* Focus States for Accessibility */ *:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; } /* Selection */ ::selection { background: var(--primary-light); color: var(--primary); }