trails/openspec/changes/visual-redesign/design.md
Ullrich Schäfer 36b9b6b382
Add visual redesign OpenSpec change with mockups and logo concepts
Design direction: D1 warmth + D3 lightness (warm off-whites, sage green,
Outfit + Geist Mono). Includes desktop + mobile HTML mockup, 5 logo
concepts, and 33 implementation tasks across 7 phases.

Logo decision: Waypoint Dot mark (3 connected dots) + wordmark combo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 19:28:08 +01:00

7.1 KiB

Context

The Planner was built function-first with default Tailwind styling. A design exploration ("D1 warmth + D3 lightness") produced desktop and mobile mockups. The reference HTML mockup is at mockup.html.

Goals / Non-Goals

Goals:

  • Implement the visual design from the mockup across all Planner components
  • Establish a design token system (CSS vars + Tailwind) for consistency
  • Make the Planner mobile-responsive with a bottom sheet sidebar
  • Style aspirational features (day breakdown, waypoint notes) as muted/coming-soon

Non-Goals:

  • Redesigning the Journal app (separate change)
  • Implementing multi-day splitting logic (just the visual containers)
  • Implementing waypoint notes logic (just the UI placeholders)
  • Dark mode (later)
  • Landing page redesign (separate)

Decisions

D1: Design tokens as CSS custom properties

:root {
  /* Surface */
  --bg:         #F5F2EB;   /* warm off-white, main background */
  --bg-subtle:  #EDEAE1;   /* card backgrounds */
  --bg-raised:  #FAF8F4;   /* topbar, sidebar, elevated surfaces */
  --map-tint:   #E4DFD2;   /* map background tone */

  /* Text */
  --text-hi:    #1A1916;   /* primary */
  --text-md:    #5C5847;   /* secondary labels */
  --text-lo:    #9A9484;   /* tertiary, placeholders */
  --text-inv:   #FAF8F4;   /* on dark surfaces */

  /* Accent: muted sage-forest green */
  --accent:     #4A6B40;
  --accent-dim: #6A8B5E;
  --accent-bg:  rgba(74,107,64,.08);
  --accent-border: rgba(74,107,64,.2);

  /* Overnight stop: warm amber-brown */
  --stop:       #8B6D3A;
  --stop-bg:    rgba(139,109,58,.1);
  --stop-border:rgba(139,109,58,.25);

  /* Danger / no-go */
  --nogo:       rgba(160,60,60,.12);
  --nogo-border:rgba(160,60,60,.3);

  /* UI chrome */
  --border:     #DDD9D0;
  --border-md:  #CAC6BC;
  --shadow-sm:  0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
  --shadow-md:  0 4px 12px rgba(0,0,0,.08), 0 1px 4px rgba(0,0,0,.05);

  /* Elevation gradient (route + chart) */
  --eg-lo:   #5A8F46;   /* green, low elevation */
  --eg-mid:  #C4A840;   /* amber, mid elevation */
  --eg-hi:   #C46040;   /* terracotta, high elevation */

  /* Typography */
  --font-body: 'Outfit', sans-serif;
  --font-mono: 'Geist Mono', monospace;
}

Extended into Tailwind via tailwind.config.ts theme extension so utility classes work: text-text-hi, bg-bg-raised, border-border, etc.

  • Body: Outfit (clean, geometric, friendly) — 14px base
  • Stats/distances: Geist Mono — used for km, elevation, coordinates
  • Logo: Two-part system:
    • Mark: "Waypoint Dot" — three connected dots with a curved route line (sage green, SVG). Used as favicon, app icon, and topbar mark.
    • Wordmark: "trails" (Outfit 700) + ".cool" (Outfit 300, muted). Used alongside the mark in the topbar, standalone for large displays.
    • See logo-concepts.html for all sizes (24px, 48px, 128px).
  • Loaded via Google Fonts or self-hosted for performance

D3: Topbar layout

┌─────────────────────────────────────────────────────────────┐
│ [∧ trails.cool] │ [🚴 Cycling (safe) ▾] │ [Y] You │ [A][S][M] +3 │ [+ Invite] ││ [Plain │ Elevation │ Surface] │ [↓ Export GPX] │
└─────────────────────────────────────────────────────────────┘
  • Waypoint Dot mark + "trails .cool" wordmark, separated by vertical divider
  • Profile selector with bike icon
  • Participant avatars with "You" label and Host badge
  • "+ Invite" button (copies session link)
  • Segmented toggle for color mode (replaces dropdown)
  • Export GPX right-aligned

D4: Sidebar layout

┌─────────────────────────┐
│ [WAYPOINTS] [NOTES]     │
├─────────────────────────┤
│ ACTIVE ROUTE            │
│ Berlin → Erfurt         │
│ via Dessau              │
│ 343 km  ↑868m  3 days  │
├─────────────────────────┤
│ DAY BREAKDOWN [SOON]    │
│ ┌─────────────────────┐ │
│ │ 01  Berlin→Dessau   │ │
│ │     ↑340m    120 km │ │
│ │  ● Berlin Alexplatz │ │
│ │  ○ Zossen           │ │
│ │  ○ Jüterbog         │ │
│ │  ● Dessau OVERNIGHT │ │
│ │    "Elbe crossing"  │ │
│ └─────────────────────┘ │
│ ▸ 02 Dessau→Halle 130km│
│ ▸ 03 Halle→Erfurt  93km│
└─────────────────────────┘
  • Route summary always visible at top
  • Day breakdown collapsible, with waypoints nested inside
  • Overnight stops marked with amber badge
  • Waypoint notes as italic text under waypoint name
  • Day 01 expanded by default, others collapsed

D5: Map marker styling

  • Waypoint markers: Dark olive circles (#4A6B40) with white number, not blue
  • Overnight stops: Amber-brown (#8B6D3A) circle with "NIGHT N" badge above
  • Waypoint notes: Small note icon on marker, hover/tap to read
  • Day labels: White pill on route line ("Day 1 · 120 km")
  • No-go areas: Use --nogo / --nogo-border tokens (muted red)
  • Ghost marker: Sage green circle matching accent

D6: Elevation chart redesign

  • Day dividers as dashed vertical lines with "Day 1", "Day 2" labels
  • Elevation gradient uses --eg-lo--eg-mid--eg-hi
  • Min/max elevation labels on Y axis
  • Km marker tooltip on hover (not just crosshair)
  • Stats right-aligned: "343.3 km distance ↑ 868 m ascent"

D7: Mobile bottom sheet

Replace hidden sidebar with a draggable bottom sheet:

  • Collapsed: Route summary + elevation mini-chart visible
  • Half-expanded: Tabs (Days/Waypoints/Notes) + scrollable content
  • Full-expanded: Full sidebar content
  • Swipe up/down to toggle states
  • Map takes full viewport, sheet overlays from bottom

D8: Implementation phases

  1. Design tokens + fonts: CSS vars, Tailwind config, font loading
  2. Topbar: New layout, segmented toggle, invite button, avatar styling
  3. Sidebar: Route summary, day breakdown placeholder, waypoint styling
  4. Map markers: New waypoint icons, overnight badges, ghost marker color
  5. Elevation chart: New gradient, day dividers, hover label
  6. Mobile: Bottom sheet component, responsive header
  7. Polish: Transitions, hover states, loading states, empty states

Risks / Trade-offs

  • Font loading: Two Google Fonts add ~40KB. Mitigate with display=swap and preconnect. Can self-host later.
  • Aspirational features shown as muted: Users might expect them to work. Mitigate with clear "SOON" badges.
  • Custom CSS vars + Tailwind: Slight complexity. But ensures consistency and makes future dark mode straightforward.
  • Bottom sheet on mobile: Complex to build well. Can use a library like vaul or build minimal version first.