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>
179 lines
7.1 KiB
Markdown
179 lines
7.1 KiB
Markdown
## 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
|
|
|
|
```css
|
|
: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.
|
|
|
|
### D2: Typography & Logo
|
|
|
|
- **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.
|