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 @@