Spaces:
Running
Running
| /* ============================================= | |
| UrbanFlow β initial.css (Mobile-First) | |
| Same design system, fully touch-friendly | |
| ============================================= */ | |
| :root { | |
| --cocoa: #8b5e3c; | |
| --cocoa-l: #c89a6c; | |
| --cocoa-xl: #d4b08a; | |
| --t1: #f0ece6; | |
| --t2: #a89f97; | |
| --border: #2a2a2a; | |
| } | |
| *, *::before, *::after { box-sizing: border-box; } | |
| html { | |
| scrollbar-width: none; | |
| } | |
| html::-webkit-scrollbar { | |
| display: none; | |
| } | |
| body { | |
| overflow-x: hidden; | |
| width: 100%; | |
| font-family: 'Montserrat', sans-serif; | |
| background-color: #000000; | |
| color: var(--t1); | |
| margin: 0; | |
| -webkit-tap-highlight-color: transparent; | |
| scrollbar-width: none; /* Firefox */ | |
| } | |
| body::-webkit-scrollbar { | |
| display: none; /* Chrome, Safari, Edge */ | |
| } | |
| /* ---- Fade animation ---- */ | |
| .fade-in { | |
| animation: fadeIn 0.4s ease-in-out forwards; | |
| } | |
| @keyframes fadeIn { | |
| from { opacity: 0; transform: translateY(10px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| /* ---- Feature List Animation ---- */ | |
| @keyframes fadeSlideIn { | |
| from { opacity: 0; transform: translateX(-8px); } | |
| to { opacity: 1; transform: translateX(0); } | |
| } | |
| .hero-text-section ul li { | |
| opacity: 0; | |
| animation: fadeSlideIn 0.4s ease-out forwards; | |
| } | |
| .hero-text-section ul li:nth-child(1) { animation-delay: 0.1s; } | |
| .hero-text-section ul li:nth-child(2) { animation-delay: 0.2s; } | |
| .hero-text-section ul li:nth-child(3) { animation-delay: 0.3s; } | |
| .hero-text-section ul li:nth-child(4) { animation-delay: 0.4s; } | |
| .hero-text-section ul li:nth-child(5) { animation-delay: 0.5s; } | |
| /* ---- Card ---- */ | |
| .traffic-dynamics-card { | |
| background-color: #0a0a0a ; | |
| border: none ; | |
| position: relative; | |
| transition: box-shadow 0.3s ease; | |
| z-index: 0; | |
| } | |
| /* Shimmer border β only on the 2px ring, not inside the card */ | |
| .traffic-dynamics-card::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| border-radius: inherit; | |
| padding: 2px; | |
| background: linear-gradient( | |
| 90deg, | |
| var(--cocoa) 0%, | |
| var(--cocoa-l) 30%, | |
| rgba(255,255,255,0.7) 50%, | |
| var(--cocoa-l) 70%, | |
| var(--cocoa) 100% | |
| ); | |
| background-size: 200% 100%; | |
| animation: borderShimmer 2.4s linear infinite; | |
| -webkit-mask: | |
| linear-gradient(#fff 0 0) content-box, | |
| linear-gradient(#fff 0 0); | |
| -webkit-mask-composite: xor; | |
| mask-composite: exclude; | |
| pointer-events: none; | |
| } | |
| @keyframes borderShimmer { | |
| 0% { background-position: 200% 0; } | |
| 100% { background-position: -200% 0; } | |
| } | |
| .traffic-dynamics-card:hover::before { | |
| animation-duration: 1.2s; | |
| } | |
| .traffic-dynamics-card:hover { | |
| box-shadow: 0 0 32px 0 rgba(200,154,108,0.18); | |
| } | |
| /* ---- Dropzone ---- */ | |
| #dropzone { | |
| transition: all 0.2s ease; | |
| border-color: #2a2a2a; | |
| /* finger-friendly minimum height */ | |
| min-height: 160px; | |
| } | |
| #dropzone:hover, | |
| #dropzone:active, | |
| #dropzone.dz-active { | |
| border-color: var(--cocoa-l) ; | |
| background-color: #0d0d0d ; | |
| } | |
| /* ---- Core badge ---- */ | |
| .core-badge { | |
| background-color: var(--cocoa) ; | |
| color: var(--t1) ; | |
| } | |
| /* ---- Onboarding ---- */ | |
| .onboard-overlay { | |
| position: fixed; inset: 0; z-index: 9999; | |
| background: rgba(0,0,0,0.92); | |
| display: flex; align-items: center; justify-content: center; | |
| padding: 16px; | |
| } | |
| .onboard-card { | |
| background: #0a0a0a; | |
| border: 1px solid #2a2a2a; | |
| border-radius: 16px; | |
| max-width: 440px; | |
| width: 100%; | |
| padding: 32px 24px; | |
| text-align: center; | |
| } | |
| .onboard-step { display: none; } | |
| .onboard-step.active { display: block; } | |
| .onboard-dots { | |
| display: flex; gap: 6px; | |
| justify-content: center; | |
| margin-top: 20px; | |
| } | |
| .onboard-dot { | |
| width: 8px; height: 8px; | |
| border-radius: 50%; | |
| background: #333; | |
| transition: background 0.2s; | |
| } | |
| .onboard-dot.active { background: var(--cocoa-l); } | |
| /* Onboarding buttons β large touch targets */ | |
| .onboard-card .flex.gap-3 button { | |
| min-height: 44px; | |
| padding: 10px 20px; | |
| font-size: 11px; | |
| } | |
| /* Onboarding Icon Pulse */ | |
| @keyframes iconPulse { | |
| 0% { transform: scale(1); } | |
| 50% { transform: scale(1.12); } | |
| 100% { transform: scale(1); } | |
| } | |
| .pulse-once { | |
| animation: iconPulse 0.35s ease; | |
| } | |
| /* ---- Canvas container β touch hint ---- */ | |
| #drawing-canvas { | |
| touch-action: none; /* prevents scroll while drawing */ | |
| } | |
| /* ---- Upload progress ---- */ | |
| #upload-progress-container { | |
| padding: 0 4px; | |
| } | |
| #upload-bar { | |
| transition: width 0.3s ease-out; | |
| position: relative; | |
| } | |
| /* Shimmer overlay */ | |
| #upload-bar::after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; right: 0; bottom: 0; left: 0; | |
| background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); | |
| transform: translateX(-100%); | |
| animation: shimmer 1.5s infinite; | |
| } | |
| @keyframes shimmer { | |
| 100% { transform: translateX(100%); } | |
| } | |
| /* ============================================= | |
| DESKTOP (β₯1024px) β original layout | |
| ============================================= */ | |
| @media (min-width: 1024px) { | |
| header { margin-top: 4rem; } | |
| main { | |
| display: grid ; | |
| grid-template-columns: repeat(12, 1fr) ; | |
| gap: 5rem ; | |
| padding: 2rem 2.5rem ; | |
| align-items: center; | |
| min-height: 70vh ; | |
| } | |
| /* Stable card on desktop */ | |
| main > div:last-child { | |
| height: 520px ; | |
| overflow: hidden ; | |
| margin-bottom: 0 ; | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: center; | |
| } | |
| /* Steps scroll internally */ | |
| #step-modules, #step-upload, #step-draw { | |
| overflow-y: auto ; | |
| height: auto ; | |
| max-height: 100% ; | |
| padding-right: 8px; | |
| } | |
| /* Clamped font size to avoid overflow */ | |
| .hero-title { font-size: clamp(3rem, 4.5vw, 4.5rem) ; line-height: 1.1 ; } | |
| #dropzone { min-height: 200px; } | |
| } | |
| /* ============================================= | |
| TABLET (640px β 1023px) | |
| ============================================= */ | |
| @media (min-width: 640px) and (max-width: 1023px) { | |
| header { margin-top: 2rem; } | |
| header img { height: 8rem ; } | |
| main { | |
| display: flex ; | |
| flex-direction: column ; | |
| padding: 1.5rem ; | |
| gap: 2rem ; | |
| } | |
| .hero-title { font-size: 2.8rem ; } | |
| /* Hero text section β centered on tablet */ | |
| main > div:first-child { | |
| text-align: center; | |
| padding-bottom: 0 ; | |
| } | |
| main > div:first-child ul { | |
| display: inline-block; | |
| text-align: left; | |
| } | |
| /* Step card β full width */ | |
| main > div:last-child { | |
| max-width: 100% ; | |
| width: 100% ; | |
| } | |
| #dropzone { min-height: 180px; } | |
| } | |
| /* ============================================= | |
| MOBILE (< 640px) β redesigned mobile layout | |
| ============================================= */ | |
| @media (max-width: 639px) { | |
| /* ---- Body: single-column scroll ---- */ | |
| body { | |
| overflow-y: auto ; | |
| overflow-x: hidden ; | |
| } | |
| /* ---- Header β compact logo ---- */ | |
| header { | |
| margin-top: 2rem ; | |
| margin-bottom: 0 ; | |
| padding: 0 20px; | |
| } | |
| header img { | |
| height: 7rem ; | |
| } | |
| /* ---- Main β stacked column ---- */ | |
| main { | |
| display: flex ; | |
| flex-direction: column ; | |
| padding: 20px 16px 8px ; | |
| gap: 20px ; | |
| max-width: 100% ; | |
| } | |
| /* ---- Hero text: SHOW on mobile (compact) ---- */ | |
| .hero-text-section { | |
| display: flex ; | |
| flex-direction: column; | |
| align-items: center; | |
| text-align: center; | |
| padding-bottom: 0 ; | |
| order: 1; | |
| } | |
| /* Mobile hero title styling */ | |
| .hero-title { | |
| font-size: 2.8rem ; | |
| line-height: 1.15 ; | |
| margin-top: 10px ; | |
| text-align: center ; | |
| } | |
| /* DEMO badge + tagline row */ | |
| .hero-text-section > p:first-of-type { | |
| font-size: 11.5px ; | |
| letter-spacing: 0.18em ; | |
| margin-bottom: 14px ; | |
| justify-content: center; | |
| } | |
| /* Feature bullets */ | |
| .hero-text-section ul { | |
| display: flex ; | |
| flex-direction: column ; | |
| gap: 4px ; | |
| width: 100%; | |
| text-align: left; | |
| } | |
| .hero-text-section ul li { | |
| display: flex ; | |
| align-items: flex-start ; | |
| font-size: 14px ; | |
| font-weight: 500 ; | |
| line-height: 1.6 ; | |
| padding: 5px 0; | |
| color: #a89f97 ; | |
| } | |
| .hero-text-section ul li i { | |
| font-size: 14px ; | |
| margin-right: 10px ; | |
| margin-top: 2px; | |
| flex-shrink: 0; | |
| } | |
| /* ---- Step card: full width, right below bullets ---- */ | |
| .step-card-section { | |
| max-width: 100% ; | |
| width: 100% ; | |
| min-height: unset ; | |
| height: auto ; | |
| margin: 0 ; | |
| order: 2; | |
| } | |
| /* The fixed-height container that holds all steps */ | |
| main > div:last-child { | |
| height: auto ; | |
| min-height: unset ; | |
| } | |
| /* ---- Step headings ---- */ | |
| #step-modules h2, | |
| #step-upload h2, | |
| #step-draw h2 { | |
| font-size: 1.4rem ; | |
| margin-bottom: 6px ; | |
| } | |
| #step-modules p, | |
| #step-upload p { | |
| font-size: 11px ; | |
| margin-bottom: 20px ; | |
| } | |
| /* ---- Traffic Dynamics card ---- */ | |
| .traffic-dynamics-card { | |
| padding: 24px 20px ; | |
| border-radius: 1.5rem ; | |
| } | |
| /* ---- Dropzone β warm glow tap target ---- */ | |
| #dropzone { | |
| padding: 2rem 1.25rem ; | |
| min-height: 150px; | |
| border-radius: 1.25rem ; | |
| border-color: #2a2a2a ; | |
| } | |
| #dropzone span:first-of-type { | |
| font-size: 0.95rem ; | |
| } | |
| /* ---- Canvas wrapper ---- */ | |
| .relative.w-full.aspect-video { | |
| aspect-ratio: 4/3 ; | |
| border-radius: 1rem ; | |
| max-height: 40vh; /* Keeps continue button above fold */ | |
| } | |
| /* ---- Proceed button β full width ---- */ | |
| #btn-proceed { | |
| width: 100% ; | |
| padding: 14px ; | |
| font-size: 0.9rem ; | |
| border-radius: 999px ; | |
| } | |
| /* ---- Reset / Back buttons ---- */ | |
| button[onclick="resetCanvas()"], | |
| button[onclick="showStep('modules')"] { | |
| font-size: 11px ; | |
| padding: 10px 0 ; | |
| min-height: 40px; | |
| } | |
| /* ---- Footer β padding only on mobile, layout handled by Tailwind ---- */ | |
| footer { | |
| padding: 14px 20px 24px ; | |
| } | |
| /* ---- Onboarding card ---- */ | |
| .onboard-card { | |
| padding: 28px 20px ; | |
| border-radius: 18px ; | |
| } | |
| .onboard-card h3 { | |
| font-size: 1rem ; | |
| } | |
| .onboard-card p { | |
| font-size: 11px ; | |
| } | |
| } | |
| /* ============================================= | |
| TOUCH: remove drag-related cursor on mobile | |
| ============================================= */ | |
| @media (hover: none) and (pointer: coarse) { | |
| #dropzone { | |
| cursor: pointer; | |
| } | |
| #dropzone:hover { | |
| /* no hover state on touch β only active */ | |
| border-color: #2a2a2a ; | |
| background-color: transparent ; | |
| } | |
| #dropzone:active, | |
| #dropzone.dz-active { | |
| border-color: var(--cocoa-l) ; | |
| background-color: #0d0d0d ; | |
| } | |
| /* Bigger touch targets for all buttons */ | |
| button { | |
| min-height: 44px; | |
| } | |
| /* Canvas cursor for drawing */ | |
| #drawing-canvas { | |
| cursor: crosshair; | |
| } | |
| } | |