Spaces:
Sleeping
Sleeping
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| NATIVE MOBILE β PWA-grade native app experience | |
| Safe areas, touch states, standalone mode, iOS/Android parity, | |
| bottom sheets, collapsing headers, system UI integration | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* βββ SAFE AREA TOKENS βββ */ | |
| :root { | |
| --sat: env(safe-area-inset-top, 0px); | |
| --sar: env(safe-area-inset-right, 0px); | |
| --sab: env(safe-area-inset-bottom, 0px); | |
| --sal: env(safe-area-inset-left, 0px); | |
| --nav-height: 48px; | |
| --tab-height: 56px; | |
| --input-bar-height: 60px; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| GLOBAL NATIVE BEHAVIORS | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Prevent pull-to-refresh / overscroll bounce on the body (we handle it ourselves) */ | |
| html { | |
| overscroll-behavior-y: none; | |
| } | |
| body { | |
| -webkit-tap-highlight-color: transparent; | |
| -webkit-touch-callout: none; | |
| -webkit-text-size-adjust: 100%; | |
| text-size-adjust: 100%; | |
| overscroll-behavior-y: contain; | |
| } | |
| /* Prevent text selection on interactive elements */ | |
| button, .action-card, .sos-card, .filter-chip, .lang-chip, | |
| .nav-link, .mobile-nav button, .helpline-item, .chat-welcome-chip, | |
| .place-head, .fb-type, .auth-lang-chip, .msg-play, .msg-map-btn, | |
| .chat-sidebar-item, .loc-option, .rp-option { | |
| -webkit-user-select: none; | |
| user-select: none; | |
| } | |
| /* Allow text selection on content areas */ | |
| .msg-bubble, .place-detail p, .info-banner, .mpc-meta, | |
| .map-place-card p, .profile-info-row .val, .auth-field input, | |
| .chat-input, textarea { | |
| -webkit-user-select: text; | |
| user-select: text; | |
| } | |
| /* Disable double-tap zoom on interactive elements */ | |
| button, a, .action-card, .sos-card, .filter-chip, .helpline-item, | |
| .nav-link, .mobile-nav button { | |
| touch-action: manipulation; | |
| } | |
| /* Smooth font rendering */ | |
| body { | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| MOBILE (<= 768px) β NATIVE APP LAYOUT | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 768px) { | |
| /* βββ APP SHELL βββ */ | |
| html, body { | |
| height: 100%; | |
| overflow: hidden; | |
| position: fixed; | |
| width: 100%; | |
| } | |
| .app { | |
| height: 100%; | |
| overflow: hidden; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| /* βββ NAVBAR (native status-bar aware) βββ */ | |
| .navbar { | |
| padding-top: var(--sat); | |
| height: calc(var(--nav-height) + var(--sat)); | |
| flex-shrink: 0; | |
| position: relative; | |
| z-index: 100; | |
| /* Translucent blur like iOS navbar */ | |
| -webkit-backdrop-filter: saturate(180%) blur(20px); | |
| backdrop-filter: saturate(180%) blur(20px); | |
| } | |
| /* βββ BOTTOM TAB BAR (native tab bar) βββ */ | |
| .mobile-nav { | |
| height: calc(var(--tab-height) + var(--sab)) ; | |
| padding-bottom: max(var(--sab), 6px) ; | |
| padding-top: 4px ; | |
| flex-shrink: 0; | |
| z-index: 200; | |
| /* iOS-style frosted glass */ | |
| background: rgba(255, 255, 255, 0.92) ; | |
| -webkit-backdrop-filter: saturate(180%) blur(20px); | |
| backdrop-filter: saturate(180%) blur(20px); | |
| border-top: 0.5px solid rgba(0, 0, 0, 0.08) ; | |
| box-shadow: none ; | |
| /* Remove hide-on-scroll β always visible like native */ | |
| transform: none ; | |
| transition: none ; | |
| } | |
| .mobile-nav.hidden { | |
| transform: none ; | |
| } | |
| .mobile-nav button { | |
| flex: 1; | |
| min-width: 0; | |
| gap: 2px ; | |
| font-size: 9px ; | |
| font-weight: 500 ; | |
| padding: 2px 0 ; | |
| transition: color 0.15s ease, transform 0.15s ease ; | |
| position: relative; | |
| } | |
| .mobile-nav button i { | |
| font-size: 22px ; | |
| transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1); | |
| } | |
| .mobile-nav button.active i { | |
| transform: scale(1.1); | |
| } | |
| /* Active indicator β iOS style pill */ | |
| .mobile-nav button.active::after { | |
| width: 20px ; | |
| height: 3px ; | |
| border-radius: 1.5px ; | |
| top: -2px ; | |
| background: var(--saffron) ; | |
| transition: width 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); | |
| } | |
| /* Tap state for tab buttons */ | |
| .mobile-nav button:active { | |
| transform: scale(0.85) ; | |
| transition-duration: 0.08s ; | |
| } | |
| /* βββ PAGES (full-viewport, scrollable) βββ */ | |
| .page { | |
| position: absolute; | |
| top: calc(var(--nav-height) + var(--sat)); | |
| left: 0; | |
| right: 0; | |
| bottom: calc(var(--tab-height) + var(--sab)); | |
| overflow: hidden; | |
| display: none ; | |
| } | |
| .page.active { | |
| display: flex ; | |
| flex-direction: column; | |
| overflow-y: auto; | |
| -webkit-overflow-scrolling: touch; | |
| overscroll-behavior-y: contain; | |
| /* Remove the old padding-bottom approach */ | |
| padding-bottom: 0 ; | |
| } | |
| /* βββ HOME PAGE βββ */ | |
| #page-home.active { | |
| scroll-snap-type: y proximity; | |
| } | |
| #page-home .hero { | |
| scroll-snap-align: start; | |
| } | |
| #page-home .section { | |
| scroll-snap-align: start; | |
| } | |
| /* βββ CHAT PAGE (special layout) βββ */ | |
| #page-assistant { | |
| top: calc(var(--nav-height) + var(--sat)) ; | |
| bottom: calc(var(--tab-height) + var(--sab)) ; | |
| height: auto ; | |
| overflow: hidden ; | |
| } | |
| #page-assistant .chat-page { | |
| height: 100% ; | |
| display: flex; | |
| flex-direction: column; | |
| overflow: hidden; | |
| } | |
| #page-assistant .chat-header { | |
| flex-shrink: 0; | |
| position: relative ; | |
| } | |
| #page-assistant .lang-dropdown { | |
| flex-shrink: 0; | |
| } | |
| #page-assistant .chat-messages { | |
| flex: 1; | |
| overflow-y: auto; | |
| -webkit-overflow-scrolling: touch; | |
| overscroll-behavior-y: contain; | |
| padding-bottom: calc(var(--input-bar-height) + 16px) ; | |
| scroll-padding-bottom: calc(var(--input-bar-height) + 16px); | |
| } | |
| #page-assistant .chat-input-bar { | |
| position: absolute ; | |
| bottom: 0 ; | |
| left: 0; | |
| right: 0; | |
| z-index: 10; | |
| padding: 8px 10px calc(8px) ; | |
| /* Frosted glass */ | |
| background: rgba(255, 255, 255, 0.95) ; | |
| -webkit-backdrop-filter: saturate(180%) blur(16px); | |
| backdrop-filter: saturate(180%) blur(16px); | |
| border-top: 0.5px solid rgba(0, 0, 0, 0.06); | |
| } | |
| /* βββ MAP PAGE (full viewport) βββ */ | |
| #page-map { | |
| bottom: calc(var(--tab-height) + var(--sab)) ; | |
| overflow: hidden ; | |
| } | |
| #page-map .map-page { | |
| height: 100% ; | |
| } | |
| #mapContainer { | |
| height: 100% ; | |
| width: 100% ; | |
| } | |
| .map-place-card { | |
| bottom: 12px ; | |
| left: 8px ; | |
| right: 8px ; | |
| border-radius: 20px ; | |
| padding: 16px ; | |
| box-shadow: 0 -4px 30px rgba(0, 0, 0, 0.15), 0 4px 12px rgba(0, 0, 0, 0.08) ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| NATIVE TOUCH FEEDBACK | |
| Every interactive element gets instant feedback | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Universal active state */ | |
| .action-card:active, | |
| .sos-card:active, | |
| .place-card:active, | |
| .filter-chip:active, | |
| .lang-chip:active, | |
| .chat-welcome-chip:active, | |
| .helpline-item:active, | |
| .auth-lang-chip:active, | |
| .fb-type:active, | |
| .loc-option:active, | |
| .rp-option:active, | |
| .chat-sidebar-item:active { | |
| transform: scale(0.96) ; | |
| transition: transform 0.08s ease ; | |
| opacity: 0.85; | |
| } | |
| /* Button active states (slightly different) */ | |
| .hero-cta:active, | |
| .auth-btn:active, | |
| .sos-call-btn:active, | |
| .route-go-btn:active, | |
| .profile-btn:active, | |
| .mpc-btn:active, | |
| .chat-sidebar-new:active, | |
| .loc-picker-done:active, | |
| .loc-picker-gps:active { | |
| transform: scale(0.95) ; | |
| transition: transform 0.08s ease ; | |
| filter: brightness(0.92); | |
| } | |
| .btn-mic:active:not(.recording) { | |
| transform: scale(0.88) ; | |
| transition: transform 0.08s ease ; | |
| } | |
| .btn-send:active { | |
| transform: scale(0.85) ; | |
| transition: transform 0.08s ease ; | |
| } | |
| /* Map buttons */ | |
| .map-btn:active { | |
| transform: scale(0.88) ; | |
| transition: transform 0.08s ease ; | |
| } | |
| /* Message actions */ | |
| .msg-play:active, | |
| .msg-map-btn:active { | |
| transform: scale(0.92) ; | |
| opacity: 0.7; | |
| transition: all 0.08s ease ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| PULL-TO-REFRESH INDICATOR | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .pull-indicator { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| height: 0; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| overflow: hidden; | |
| z-index: 50; | |
| pointer-events: none; | |
| transition: height 0.3s cubic-bezier(0.16, 1, 0.3, 1); | |
| } | |
| .pull-indicator.active { | |
| height: 60px; | |
| } | |
| .pull-spinner { | |
| width: 28px; | |
| height: 28px; | |
| border: 2.5px solid rgba(232, 101, 43, 0.2); | |
| border-top-color: var(--saffron); | |
| border-radius: 50%; | |
| opacity: 0; | |
| transform: scale(0.5) rotate(0deg); | |
| transition: opacity 0.2s, transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); | |
| } | |
| .pull-indicator.pulling .pull-spinner { | |
| opacity: 1; | |
| transform: scale(1) rotate(0deg); | |
| } | |
| .pull-indicator.refreshing .pull-spinner { | |
| opacity: 1; | |
| transform: scale(1); | |
| animation: pullSpin 0.6s linear infinite; | |
| } | |
| @keyframes pullSpin { | |
| to { transform: rotate(360deg); } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| BOTTOM SHEET (native-style drag-to-dismiss) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .loc-picker-overlay.open, | |
| #feedbackOverlay.open { | |
| align-items: flex-end ; | |
| } | |
| .loc-picker-sheet { | |
| max-height: 90vh ; | |
| border-radius: 20px 20px 0 0 ; | |
| padding-bottom: calc(20px + var(--sab)) ; | |
| /* Spring animation */ | |
| animation: nativeSheetUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| /* Sheet handle */ | |
| position: relative; | |
| } | |
| .loc-picker-sheet::before { | |
| content: ''; | |
| display: block; | |
| width: 36px; | |
| height: 4px; | |
| border-radius: 2px; | |
| background: rgba(0, 0, 0, 0.15); | |
| margin: 0 auto 12px; | |
| flex-shrink: 0; | |
| } | |
| @keyframes nativeSheetUp { | |
| from { | |
| transform: translateY(100%); | |
| opacity: 0.8; | |
| } | |
| to { | |
| transform: translateY(0); | |
| opacity: 1; | |
| } | |
| } | |
| /* Chat sidebar β native slide */ | |
| .chat-sidebar { | |
| width: 85vw ; | |
| max-width: 340px ; | |
| border-radius: 0 20px 20px 0 ; | |
| padding-top: var(--sat); | |
| padding-bottom: var(--sab); | |
| box-shadow: 8px 0 40px rgba(0, 0, 0, 0.2) ; | |
| } | |
| .chat-sidebar.open { | |
| animation: nativeSidebarIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| } | |
| @keyframes nativeSidebarIn { | |
| from { transform: translateX(-100%); } | |
| to { transform: translateX(0); } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ROUTE PANEL β BOTTOM SHEET STYLE ON MOBILE | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .route-panel { | |
| position: absolute ; | |
| bottom: 0 ; | |
| left: 0 ; | |
| right: 0 ; | |
| top: auto ; | |
| width: 100% ; | |
| max-width: 100% ; | |
| max-height: 65vh ; | |
| border-radius: 20px 20px 0 0 ; | |
| padding: 16px 16px calc(16px + var(--sab)) ; | |
| box-shadow: 0 -8px 30px rgba(0, 0, 0, 0.15) ; | |
| animation: nativeSheetUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| z-index: 1002 ; | |
| } | |
| .route-panel::before { | |
| content: ''; | |
| display: block; | |
| width: 36px; | |
| height: 4px; | |
| border-radius: 2px; | |
| background: rgba(0, 0, 0, 0.12); | |
| margin: 0 auto 10px; | |
| } | |
| /* Route picker as bottom sheet */ | |
| .route-picker { | |
| position: absolute ; | |
| bottom: 0 ; | |
| left: 0 ; | |
| right: 0 ; | |
| top: auto ; | |
| width: 100% ; | |
| max-width: 100% ; | |
| max-height: 70vh ; | |
| border-radius: 20px 20px 0 0 ; | |
| box-shadow: 0 -8px 30px rgba(0, 0, 0, 0.2) ; | |
| animation: nativeSheetUp 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| z-index: 1003 ; | |
| } | |
| .route-picker::before { | |
| content: ''; | |
| display: block; | |
| width: 36px; | |
| height: 4px; | |
| border-radius: 2px; | |
| background: rgba(0, 0, 0, 0.12); | |
| margin: 8px auto 4px; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| NATIVE SCROLLBARS (hide on mobile like native apps) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| ::-webkit-scrollbar { | |
| display: none; | |
| } | |
| * { | |
| scrollbar-width: none; | |
| -ms-overflow-style: none; | |
| } | |
| /* Show subtle scroll indicator on chat */ | |
| .chat-messages::-webkit-scrollbar { | |
| display: block; | |
| width: 2px; | |
| } | |
| .chat-messages::-webkit-scrollbar-thumb { | |
| background: rgba(0, 0, 0, 0.08); | |
| border-radius: 1px; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| KEYBOARD AVOIDANCE | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* When keyboard is open (detected by JS adding class) */ | |
| body.keyboard-open .mobile-nav { | |
| display: none ; | |
| } | |
| body.keyboard-open #page-assistant { | |
| bottom: 0 ; | |
| } | |
| body.keyboard-open .chat-input-bar { | |
| padding-bottom: 8px ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| NATIVE-LIKE TRANSITIONS BETWEEN PAGES | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Override aurora page transitions for more native feel */ | |
| .page.page-entering { | |
| animation: nativePageIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| } | |
| .page.page-leaving { | |
| animation: nativePageOut 0.25s ease forwards ; | |
| } | |
| @keyframes nativePageIn { | |
| from { | |
| opacity: 0; | |
| transform: scale(0.97); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: scale(1); | |
| } | |
| } | |
| @keyframes nativePageOut { | |
| from { | |
| opacity: 1; | |
| transform: scale(1); | |
| } | |
| to { | |
| opacity: 0; | |
| transform: scale(0.97); | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| NATIVE INPUT STYLING | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| input, textarea, select { | |
| font-size: 16px ; /* Prevents iOS zoom on focus */ | |
| border-radius: 12px; | |
| appearance: none; | |
| -webkit-appearance: none; | |
| } | |
| .chat-input { | |
| font-size: 16px ; | |
| border-radius: 22px ; | |
| padding: 10px 16px ; | |
| } | |
| /* Focus ring β thinner on mobile */ | |
| :focus-visible { | |
| outline-width: 1.5px ; | |
| outline-offset: 1px ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| EXPLORE PAGE β NATIVE CARD LAYOUT | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .place-card { | |
| border-radius: 16px ; | |
| margin-bottom: 10px ; | |
| /* Card shadow β more subtle like native */ | |
| box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 0.5px rgba(0, 0, 0, 0.04) ; | |
| } | |
| .place-card-img-wrap { | |
| border-radius: 16px 16px 0 0 ; | |
| height: 140px ; | |
| } | |
| /* Filter bar β scroll snap */ | |
| .filter-bar { | |
| scroll-snap-type: x mandatory; | |
| scroll-padding: 0 14px; | |
| padding-left: 14px ; | |
| gap: 6px ; | |
| /* Hide scrollbar */ | |
| -ms-overflow-style: none; | |
| scrollbar-width: none; | |
| } | |
| .filter-bar::-webkit-scrollbar { display: none; } | |
| .filter-chip { | |
| scroll-snap-align: start; | |
| flex-shrink: 0; | |
| border-radius: 20px ; | |
| padding: 7px 16px ; | |
| font-size: 12px ; | |
| font-weight: 600 ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| EMERGENCY PAGE β NATIVE URGENCY FEEL | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .sos-grid { | |
| grid-template-columns: repeat(2, 1fr) ; | |
| gap: 10px ; | |
| padding: 14px ; | |
| } | |
| .sos-card { | |
| border-radius: 16px ; | |
| padding: 18px 12px ; | |
| box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06) ; | |
| } | |
| .sos-call-btn { | |
| border-radius: 16px ; | |
| font-size: 16px ; | |
| padding: 16px 32px ; | |
| /* Pulsing urgency glow */ | |
| animation: sosCallPulse 2s ease-in-out infinite; | |
| } | |
| @keyframes sosCallPulse { | |
| 0%, 100% { box-shadow: 0 4px 16px rgba(220, 38, 38, 0.3); } | |
| 50% { box-shadow: 0 4px 32px rgba(220, 38, 38, 0.5); } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| AUTH PAGES β NATIVE FORM FEEL | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .auth-page { | |
| padding: 16px ; | |
| align-items: flex-end ; | |
| } | |
| .auth-card { | |
| border-radius: 20px 20px 0 0 ; | |
| max-width: 100% ; | |
| width: 100% ; | |
| padding: 28px 20px calc(28px + var(--sab)) ; | |
| box-shadow: 0 -8px 30px rgba(0, 0, 0, 0.15) ; | |
| animation: nativeSheetUp 0.45s cubic-bezier(0.16, 1, 0.3, 1) forwards ; | |
| } | |
| .auth-field input, .auth-field select { | |
| padding: 14px 16px ; | |
| border-radius: 14px ; | |
| } | |
| .auth-btn { | |
| padding: 16px ; | |
| border-radius: 14px ; | |
| font-size: 16px ; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| PROFILE PAGE β NATIVE SETTINGS STYLE | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .profile-header { | |
| border-radius: 0 0 24px 24px ; | |
| } | |
| .profile-info-card { | |
| border-radius: 14px ; | |
| overflow: hidden; | |
| } | |
| .profile-info-row { | |
| padding: 14px 16px ; | |
| min-height: 44px; /* iOS minimum tap target */ | |
| } | |
| .profile-btn { | |
| min-height: 48px ; | |
| border-radius: 14px ; | |
| font-size: 15px ; | |
| } | |
| .profile-stat { | |
| border-radius: 14px ; | |
| } | |
| /* Language chips β larger touch targets */ | |
| .auth-lang-row { | |
| gap: 8px ; | |
| } | |
| .auth-lang-chip { | |
| padding: 8px 16px ; | |
| font-size: 13px ; | |
| min-height: 36px; | |
| display: flex; | |
| align-items: center; | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| TOAST β NATIVE STYLE | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| #toast { | |
| top: calc(var(--sat) + 56px) ; | |
| border-radius: 14px ; | |
| padding: 14px 20px ; | |
| font-size: 14px ; | |
| box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(0, 0, 0, 0.1) ; | |
| max-width: calc(100vw - 32px) ; | |
| /* Frosted glass */ | |
| background: rgba(26, 26, 46, 0.92) ; | |
| -webkit-backdrop-filter: saturate(180%) blur(20px); | |
| backdrop-filter: saturate(180%) blur(20px); | |
| } | |
| } /* end @media (max-width: 768px) */ | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| EXTRA SMALL PHONES (< 380px) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 380px) { | |
| :root { | |
| --nav-height: 44px; | |
| --tab-height: 50px; | |
| } | |
| .mobile-nav button i { | |
| font-size: 20px ; | |
| } | |
| .mobile-nav button { | |
| font-size: 8px ; | |
| } | |
| .actions-grid { | |
| grid-template-columns: repeat(2, 1fr) ; | |
| } | |
| .sos-grid { | |
| grid-template-columns: repeat(2, 1fr) ; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| TALL PHONES (narrow aspect ratio like iPhone X+) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 768px) and (min-height: 700px) { | |
| .hero { | |
| min-height: 360px ; | |
| } | |
| .chat-welcome { | |
| padding-top: 60px ; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| LANDSCAPE PHONES | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-height: 500px) and (max-width: 900px) { | |
| .mobile-nav { | |
| height: calc(40px + var(--sab)) ; | |
| } | |
| .mobile-nav button span { | |
| display: none ; | |
| } | |
| .mobile-nav button i { | |
| font-size: 20px ; | |
| } | |
| .hero { | |
| min-height: 240px ; | |
| padding: 20px 16px 40px ; | |
| } | |
| .hero h1 { | |
| font-size: 22px ; | |
| } | |
| .hero p { | |
| display: none ; | |
| } | |
| .auth-card { | |
| max-height: 80vh; | |
| overflow-y: auto; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| PWA STANDALONE MODE | |
| Behavior adjustments when installed as app | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (display-mode: standalone) { | |
| /* Extra top padding for status bar (no browser chrome) */ | |
| .navbar { | |
| padding-top: max(var(--sat), 12px) ; | |
| height: calc(var(--nav-height) + max(var(--sat), 12px)) ; | |
| } | |
| /* Hide "Install" prompts if any */ | |
| .pwa-install-prompt { | |
| display: none ; | |
| } | |
| } | |
| /* iOS standalone mode */ | |
| @media (display-mode: standalone) and (-webkit-min-device-pixel-ratio: 2) { | |
| /* iOS rubber-band background color */ | |
| html { | |
| background: linear-gradient(135deg, var(--maroon), var(--saffron-dark)); | |
| } | |
| /* Prevent iOS rubber-band on fixed elements */ | |
| .page.active { | |
| overscroll-behavior-y: contain; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| DARK MODE (system-detected) β NATIVE APP COLORS | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (prefers-color-scheme: dark) and (max-width: 768px) { | |
| /* Native dark mode β opt-in by uncommenting | |
| :root { | |
| --cream: #0d0d1a; | |
| --cream-dark: #151528; | |
| --ink: #e8e8f0; | |
| --ink-light: #a0a0b8; | |
| --ink-muted: #6a6a82; | |
| --white: #1c1c2e; | |
| --glass: rgba(255, 255, 255, 0.05); | |
| --glass-border: rgba(255, 255, 255, 0.08); | |
| --shadow-soft: 0 4px 30px rgba(0, 0, 0, 0.3); | |
| } | |
| body { background: var(--cream); } | |
| .navbar { | |
| background: linear-gradient(135deg, #1a0a10, #3a1a10) !important; | |
| } | |
| .mobile-nav { | |
| background: rgba(13, 13, 26, 0.95) !important; | |
| border-top-color: rgba(255, 255, 255, 0.06) !important; | |
| } | |
| .chat-header, .chat-input-bar { | |
| background: rgba(13, 13, 26, 0.95) !important; | |
| } | |
| .msg-bot .msg-bubble { | |
| background: #1c1c2e !important; | |
| border-color: rgba(255, 255, 255, 0.06) !important; | |
| color: var(--ink) !important; | |
| } | |
| .action-card, .place-card, .sos-card, .helpline-item, | |
| .profile-info-card, .profile-stat { | |
| background: #1c1c2e !important; | |
| border-color: rgba(255, 255, 255, 0.06) !important; | |
| } | |
| .auth-card, .route-panel, .route-picker, .map-place-card, | |
| .loc-picker-sheet, .chat-sidebar, .map-btn, .map-search { | |
| background: #1c1c2e !important; | |
| color: var(--ink) !important; | |
| } | |
| input, textarea, select { | |
| background: #151528 !important; | |
| color: var(--ink) !important; | |
| border-color: rgba(255, 255, 255, 0.08) !important; | |
| } | |
| #toast { | |
| background: rgba(30, 30, 50, 0.95) !important; | |
| } | |
| */ | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| MINIMUM TAP TARGET SIZES (WCAG / Material Guidelines) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 768px) { | |
| /* Ensure all interactive elements meet 44x44 minimum */ | |
| .nav-link, | |
| .chat-sidebar-toggle, | |
| .lang-picker-btn, | |
| .route-panel-close, | |
| .route-swap, | |
| .route-gps-btn, | |
| .mpc-close, | |
| .helpline-call, | |
| .fb-type { | |
| min-width: 44px; | |
| min-height: 44px; | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .filter-chip, | |
| .lang-chip, | |
| .map-filter-chip, | |
| .auth-lang-chip { | |
| min-height: 36px; | |
| } | |
| .helpline-item { | |
| min-height: 56px; | |
| } | |
| .chat-sidebar-item { | |
| min-height: 48px; | |
| } | |
| /* Larger touch target for close buttons */ | |
| .mpc-close { | |
| width: 36px ; | |
| height: 36px ; | |
| font-size: 22px ; | |
| display: flex ; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: 50% ; | |
| background: rgba(0, 0, 0, 0.05) ; | |
| top: 12px ; | |
| right: 12px ; | |
| } | |
| .route-panel-close { | |
| width: 36px ; | |
| height: 36px ; | |
| border-radius: 50% ; | |
| background: rgba(0, 0, 0, 0.05) ; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| SCROLL SNAP FOR HORIZONTAL LISTS | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 768px) { | |
| .lang-dropdown.open { | |
| overflow-x: auto; | |
| flex-wrap: nowrap ; | |
| scroll-snap-type: x mandatory; | |
| -webkit-overflow-scrolling: touch; | |
| padding: 10px 14px ; | |
| gap: 6px ; | |
| scrollbar-width: none; | |
| } | |
| .lang-dropdown.open::-webkit-scrollbar { display: none; } | |
| .lang-chip { | |
| scroll-snap-align: start; | |
| flex-shrink: 0 ; | |
| } | |
| /* Map filters scroll snap */ | |
| .map-filters.open { | |
| scroll-snap-type: x mandatory; | |
| flex-wrap: nowrap ; | |
| overflow-x: auto; | |
| -webkit-overflow-scrolling: touch; | |
| scrollbar-width: none; | |
| } | |
| .map-filters.open::-webkit-scrollbar { display: none; } | |
| .map-filter-chip { | |
| scroll-snap-align: start; | |
| flex-shrink: 0 ; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| REDUCED MOTION β RESPECT SYSTEM PREFERENCE | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .pull-spinner, | |
| .sos-call-btn { | |
| animation: none ; | |
| } | |
| .page.page-entering, | |
| .page.page-leaving { | |
| animation: none ; | |
| opacity: 1 ; | |
| transform: none ; | |
| } | |
| .loc-picker-sheet, | |
| .auth-card, | |
| .route-panel, | |
| .route-picker, | |
| .chat-sidebar { | |
| animation: none ; | |
| transform: none ; | |
| } | |
| } | |