From 5dae2801df9865d6d8e5f8d1825bf6c31fa31cd2 Mon Sep 17 00:00:00 2001 From: Aayush Charde <121353160+AayushCharde@users.noreply.github.com> Date: Wed, 17 Jun 2026 14:32:15 +0530 Subject: [PATCH 1/2] feat(frontend): professional visual overhaul (v1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preview-driven redesign building on the Volt Green theme. - Markers: cluster bubbles when zoomed out (with counts), individual chargers colored by reliability, and a selected-charger highlight ring. - Map UI: Nominatim place search (open/free) to jump to a city; a reliability legend; refined control bar (search + filters) with elevation. - StationDetail: full redesign — photo header with name overlay, reliability status badge, graceful "Unknown" fields (location-only chargers look complete), connector chips, "Get directions" link, disabled "Report status" (Phase 2 hint), source + coordinates, slide-in transition, mobile sheet. - A dismissible welcome/intro card (first visit). - Design tokens: motion (ease/duration) + a status-badge style. - Pure, tested helpers: format.ts (power/coords/directions/source/name) and geocode.ts (Nominatim URL + parse + fetch). Verified: svelte-check 0, lint, 36 tests, build. Ships to a Vercel preview for review. --- frontend/src/app.css | 32 +++ frontend/src/lib/Legend.svelte | 52 +++++ frontend/src/lib/StationDetail.svelte | 170 +++++++++------ frontend/src/lib/format.ts | 36 ++++ frontend/src/lib/geocode.ts | 56 +++++ frontend/src/routes/+page.svelte | 266 +++++++++++++++++++----- frontend/tests/overhaul-helpers.test.ts | 71 +++++++ 7 files changed, 570 insertions(+), 113 deletions(-) create mode 100644 frontend/src/lib/Legend.svelte create mode 100644 frontend/src/lib/format.ts create mode 100644 frontend/src/lib/geocode.ts create mode 100644 frontend/tests/overhaul-helpers.test.ts diff --git a/frontend/src/app.css b/frontend/src/app.css index df7acd7..22d6aa7 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -35,6 +35,10 @@ --shadow-md: 0 4px 12px rgb(15 23 42 / 0.1); --shadow-lg: 0 12px 32px rgb(15 23 42 / 0.18); --space: 8px; + + /* motion */ + --ease: cubic-bezier(0.2, 0, 0, 1); + --dur: 180ms; } @media (prefers-color-scheme: dark) { @@ -174,6 +178,34 @@ a { flex: none; } +/* reliability status badge (used by the station detail panel) */ +.badge { + display: inline-flex; + align-items: center; + gap: 7px; + padding: 4px 11px; + border-radius: 999px; + font-size: 0.82rem; + font-weight: 600; + border: 1px solid color-mix(in srgb, currentColor 35%, transparent); + background: color-mix(in srgb, currentColor 12%, var(--surface)); +} +.badge .dot { + background: currentColor; +} +.badge-green { + color: var(--rel-green); +} +.badge-amber { + color: var(--rel-amber); +} +.badge-red { + color: var(--rel-red); +} +.badge-grey { + color: var(--rel-grey); +} + /* accessible focus ring everywhere */ :focus-visible { outline: 2px solid var(--accent); diff --git a/frontend/src/lib/Legend.svelte b/frontend/src/lib/Legend.svelte new file mode 100644 index 0000000..76c190d --- /dev/null +++ b/frontend/src/lib/Legend.svelte @@ -0,0 +1,52 @@ + + + + + diff --git a/frontend/src/lib/StationDetail.svelte b/frontend/src/lib/StationDetail.svelte index 3254dd7..121a813 100644 --- a/frontend/src/lib/StationDetail.svelte +++ b/frontend/src/lib/StationDetail.svelte @@ -1,6 +1,8 @@