Skip to content

Commit 1ba1fbf

Browse files
committed
docs(plans): 📝 add gap analysis plan for missing review items
Cross-reference both reviews against both existing plans. Identify 13 tasks not covered by either plan: - Localize hardcoded English in types.ts (CODEC_LABELS, RESOLUTION_PRESETS, MAP_STYLES) - Timeline histogram legend, timeline discoverability hint - Journey Creator expectation-setting copy - Camera mode visual preview icons, live slider preview - Metric/imperial unit toggle - Touch-friendly tooltip alternatives - Swipe gestures, iOS file picker tip, zoom control overlap - Google Guide desktop tab layout, additional locales Note: first plan C.2 (filename) and B.3 (handles) already done
1 parent 3799f12 commit 1ba1fbf

1 file changed

Lines changed: 273 additions & 0 deletions

File tree

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
# Implementation Plan: Review Gaps — Items Missing from Both Existing Plans
2+
3+
**Sources:** `.context/reviews/ux-review-non-technical-traveler.md`, `.context/reviews/mina-review-2026-02-22.md`
4+
**Cross-referenced:** `.context/plans/address-ux-review-non-technical-traveler.md`, `.context/plans/address-mina-review-2026-02-22.md`
5+
**Goal:** Capture all review critiques that slipped through the cracks — either listed in the triage tables as "Remains" with no corresponding task, or mentioned only in the review body text without appearing in either plan.
6+
7+
---
8+
9+
## Corrections: Tasks Already Done
10+
11+
Two tasks in the first review plan are listed as "❌ Remains" but are actually **already implemented**:
12+
13+
| First Plan Task | Status | Evidence |
14+
|----------------|--------|----------|
15+
| C.2 Friendly filename | ✅ Already done | `videoEncoder.ts` line 125-128: `"Travelback - ${sanitizedName}.mp4"` |
16+
| B.3 Timeline handles | ✅ Already done | `TimelineSelector.tsx` lines 223-279: `HANDLE_RADIUS = 14`, `Math.max(HANDLE_RADIUS * 2, 44)` = 44px min, `touch-action: none`, grip indicators |
17+
18+
These were completed during the UX overhaul (`9019e14`) but the plan was written afterwards without checking.
19+
20+
---
21+
22+
## Gap Items (13 tasks, 4 phases)
23+
24+
### Phase A — Localization Gaps (3 tasks)
25+
26+
#### A.1 Localize hardcoded English strings in `src/types.ts`
27+
28+
**Review source:** First review §9, lines 399-407
29+
**Why missing:** Both plans address i18n label changes via `src/lib/i18n.ts` keys, but neither addresses the constants defined directly in `src/types.ts` that bypass the i18n system entirely.
30+
31+
**Current state (verified):**
32+
- `CODEC_LABELS` (lines 70-74): `'H.264 (MP4)'`, `'H.265/HEVC (MP4)'`, `'AV1 (MP4)'` — plain English
33+
- `RESOLUTION_PRESETS[].label` (lines 83-91): `'YouTube / Landscape (1920×1080)'` etc. — English platform names + dimensions
34+
- `MAP_STYLES[].label` (lines 15-36): `'Voyager'`, `'Light'`, `'Dark'`, `'Liberty'`, `'Bright'` — English
35+
36+
**Approach:**
37+
- Replace string labels in types.ts with i18n keys, or make components look up labels via `t()` instead of reading `.label` directly
38+
- For CODEC_LABELS: codec names are arguably universal technical names — localize the wrapper text but keep codec identifiers: `'H.264 (MP4)'` stays as-is in both locales (the review acknowledges this)
39+
- For RESOLUTION_PRESETS: Localize the descriptive part. EN: `'YouTube / Landscape (1920×1080)'`, KO: `'YouTube / 가로 (1920×1080)'`
40+
- For MAP_STYLES: `'Light'``'밝은'`, `'Dark'``'어두운'`. Proper names (Voyager, Liberty, Bright) can stay
41+
- **Files:** `src/types.ts`, `src/lib/i18n.ts`, `src/components/ExportPanel.tsx`, `src/app/page.tsx`
42+
- **Effort:** S (30-45 min)
43+
44+
#### A.2 Add more language locales (Japanese, Chinese, Spanish)
45+
46+
**Review source:** First review §9, lines 389-392
47+
**Why missing:** First plan D.1 covers a language picker UI but not adding new locales.
48+
49+
**Approach:**
50+
- Add `ja`, `zh`, `es` locale objects to `src/lib/i18n.ts`
51+
- ~120 keys per locale — significant translation effort
52+
- Consider using a community translation workflow or AI-assisted initial draft + native review
53+
- Update `Locale` type and `detectLocale()` function to recognize `ja`, `zh*`, `es*` prefixes
54+
- Update language picker (first plan D.1) to include the new locales
55+
- **Files:** `src/lib/i18n.ts`
56+
- **Effort:** L (4-8 hr per locale for quality translations)
57+
- **Priority:** Low — high effort, deferred until core UX is polished
58+
59+
#### A.3 Metric/imperial unit toggle
60+
61+
**Review source:** Mina review §2.3, line 69
62+
**Why missing:** Not mentioned in either plan. Distance is always metric.
63+
64+
**Approach:**
65+
- Add a unit preference to localStorage: `travelback-units` = `'metric' | 'imperial'`
66+
- Default based on locale: `en-US` → imperial, everything else → metric
67+
- Update `formatDistance()` in `src/lib/interpolate.ts` to accept/check the unit preference
68+
- Conversions: km → mi (÷1.609), m → ft (×3.281)
69+
- Add i18n keys for unit labels
70+
- **Files:** `src/lib/interpolate.ts`, `src/lib/i18n.ts`, `src/components/Controls.tsx`, `src/components/ElevationProfile.tsx`
71+
- **Effort:** S (30-45 min)
72+
- **Priority:** Medium
73+
74+
---
75+
76+
### Phase B — Discoverability & Explanation (4 tasks)
77+
78+
#### B.1 Timeline histogram legend/explanation
79+
80+
**Review source:** First review §4, lines 184-188
81+
**Why missing:** Listed in the first plan's triage table (line 43) as "❌ Remains" but no task was created.
82+
83+
**Current state:** The histogram bars in TimelineSelector have no legend or tooltip. Users wonder "why are some tall and some short?"
84+
85+
**Approach:**
86+
- Add a one-line explanation below or above the histogram: "Bar height = recording density (taller = more GPS points recorded)"
87+
- Alternatively, show a small `` icon that reveals a tooltip on tap/hover
88+
- Keep it minimal — one sentence, `text-[9px]`, `color: var(--t4)`
89+
- New i18n keys: `timeline.histogramHint` → EN: `"Bar height shows recording density"` / KO: `"막대 높이는 기록 밀도를 나타냅니다"`
90+
- **Files:** `src/components/TimelineSelector.tsx`, `src/lib/i18n.ts`
91+
- **Effort:** XS (15 min)
92+
93+
#### B.2 Timeline selector discoverability
94+
95+
**Review source:** Mina review §2.3, line 68
96+
**Why missing:** Not in either plan. The timeline selector's purpose isn't immediately obvious.
97+
98+
**Approach:**
99+
- Add a brief instructional hint on first appearance: "Drag the handles to select a portion of your trip"
100+
- Show only once (persist via localStorage `travelback-timeline-hint-dismissed`)
101+
- Small text above the timeline, dismissible with ×
102+
- New i18n keys: `timeline.dragHint`
103+
- **Files:** `src/components/TimelineSelector.tsx`, `src/lib/i18n.ts`
104+
- **Effort:** XS (15 min)
105+
106+
#### B.3 Journey Creator expectation copy
107+
108+
**Review source:** First review §3, lines 133-136
109+
**Why missing:** Both plans cover geocoding search and Done confirmation, but not the conceptual mismatch.
110+
111+
The review says: "This feature is more useful for 'I want to plan a future route' than 'I want to relive my past trip' — but that disconnect isn't communicated."
112+
113+
**Approach:**
114+
- Add a subtitle to the Journey Creator mode: "Plan a new route or recreate one from memory"
115+
- Update the instruction text to set expectations: "Click on the map to trace your route. Best for planning new trips — to relive a past trip, upload your GPS file instead."
116+
- New i18n keys: `journey.subtitle`, update `journey.hint`
117+
- **Files:** `src/lib/i18n.ts`
118+
- **Effort:** XS (10 min)
119+
120+
#### B.4 Touch-friendly alternative to tooltip-only info
121+
122+
**Review source:** First review §4, lines 180-182
123+
**Why missing:** Plans renamed "Follow" to "Track" and added tooltip text, but the review's concern that "tooltips require hovering and won't appear on touch devices" is unaddressed.
124+
125+
**Approach:**
126+
- On touch devices (detected via `'ontouchstart' in window` or `pointer: coarse` media query), show the Track button's state as visible text rather than relying on tooltip
127+
- Option A: Always show a small label next to the icon: "Track: ON" / "Track: OFF"
128+
- Option B: Show a brief toast when toggled on touch: "Camera tracking enabled"
129+
- **Files:** `src/components/Controls.tsx`, `src/lib/i18n.ts`
130+
- **Effort:** XS (15 min)
131+
- **Priority:** Low-Medium
132+
133+
134+
---
135+
136+
### Phase C — Visual & Interactive Enhancements (3 tasks)
137+
138+
#### C.1 Camera mode visual preview icons/animations
139+
140+
**Review source:** First review §5, lines 238-239
141+
**Why missing:** Mina plan B.1 covers slider hints but not visual previews for camera modes themselves.
142+
143+
"When hovering or selecting a camera mode, show a small animation or icon demonstrating what 'Orbit' vs 'Flyover' vs 'Ground Follow' looks like."
144+
145+
**Approach:**
146+
- Create simple SVG icons (or small CSS animations) for each camera mode:
147+
- Overview: wide eye/globe icon
148+
- Flyover: bird flying forward
149+
- Orbit: circular arrow around a pin
150+
- Ground: street-level perspective lines
151+
- Closeup: magnifying glass on pin
152+
- Bird's Eye: tilted aerial view
153+
- Show the icon next to the camera mode name in the dropdown
154+
- The one-line descriptions (already added via i18n) serve as text explanation; icons add visual clarity
155+
- **Files:** `src/components/SceneEditor.tsx`, possibly new SVG assets
156+
- **Effort:** M (1-2 hr for 6 icons)
157+
- **Priority:** Low — nice-to-have, the text descriptions already help
158+
159+
#### C.2 Live preview when adjusting scene parameter sliders
160+
161+
**Review source:** First review §5, lines 240-241
162+
**Why missing:** Mina plan B.1 Option B mentions this but explicitly defers it.
163+
164+
"When adjusting a slider, the map should update in real-time to show the effect. Currently users must play the animation to see what changed."
165+
166+
**Approach:**
167+
- When a user drags a scene parameter slider (zoom, tilt, direction, orbit speed), immediately update the map camera to show the effect at that scene's midpoint
168+
- Requires passing a "preview mode" callback from page.tsx to SceneEditor that temporarily sets the map camera without starting animation
169+
- On slider release (or after a debounce), revert to the current playback position
170+
- Technical risk: rapid camera updates during slider drag may cause jank on slower devices
171+
- **Files:** `src/components/SceneEditor.tsx`, `src/app/page.tsx`, `src/components/MapView.tsx`
172+
- **Effort:** L (3-5 hr) — significant plumbing between SceneEditor ↔ Map
173+
- **Priority:** Low — high effort for moderate UX gain; the Mina plan's slider hints (B.1) are a better first step
174+
175+
#### C.3 Google Guide tab layout on desktop
176+
177+
**Review source:** Mina review §2.2, line 49
178+
**Why missing:** Not in either plan. Only layout issues for mobile were considered.
179+
180+
"The tab row wraps on narrow viewports which is fine, but on desktop it's a long horizontal row of 7 buttons."
181+
182+
**Approach:**
183+
- On desktop (≥768px), switch from a single horizontal row of 7 tabs to a 2-row grid (4+3) or a vertical sidebar layout
184+
- Option A: `grid grid-cols-4 sm:grid-cols-7` → becomes `grid-cols-4` on tablet/desktop with wrapping
185+
- Option B: On wide viewports, use a vertical tab list on the left with content on the right (sidebar pattern)
186+
- Option A is simpler and consistent with the mobile wrap behavior
187+
- **Files:** `src/components/GoogleGuide.tsx`
188+
- **Effort:** XS (15 min)
189+
- **Priority:** Low
190+
191+
---
192+
193+
### Phase D — Mobile Polish (3 tasks)
194+
195+
#### D.1 Swipe gestures on mobile
196+
197+
**Review source:** First review §7, lines 333-336
198+
**Why missing:** Listed in first plan triage (line 50) as "❌ Remains (low priority)" but no task was created.
199+
200+
"There are no swipe gestures for navigating between scenes, scrubbing the timeline, or switching panels."
201+
202+
**Approach:**
203+
- Add horizontal swipe on the playback progress area to scrub forward/backward
204+
- Add swipe-to-dismiss on side panels (Export, Camera/Scene editor)
205+
- Use pointer events with touch gesture detection (no external library needed)
206+
- Be careful not to conflict with map pan gestures — only enable swipe on specific UI elements
207+
- **Files:** `src/components/Controls.tsx`, `src/components/ExportPanel.tsx`, `src/components/SceneEditor.tsx`
208+
- **Effort:** M (1-2 hr)
209+
- **Priority:** Low
210+
211+
#### D.2 iOS file picker help tip
212+
213+
**Review source:** First review §7, lines 344-348
214+
**Why missing:** Not in either plan.
215+
216+
**Approach:**
217+
- Detect iOS via user agent and show a small hint below "Browse Files": "On iPhone, your downloaded files are in the Files app → Browse → Downloads"
218+
- Show only on iOS
219+
- New i18n key: `fileUpload.iosTip`
220+
- **Files:** `src/components/FileUpload.tsx`, `src/lib/i18n.ts`
221+
- **Effort:** XS (10 min)
222+
- **Priority:** Low-Medium
223+
224+
#### D.3 Map zoom control overlap on mobile
225+
226+
**Review source:** Mina review §2.1, line 38
227+
**Why missing:** Not in either plan. Minor cosmetic.
228+
229+
"The map zoom controls overlap with the upload card slightly but it's not blocking anything."
230+
231+
**Approach:**
232+
- Adjust MapLibre's zoom control position when upload card is visible, or hide controls on landing
233+
- **Files:** `src/components/MapView.tsx` or `src/styles/globals.css`
234+
- **Effort:** XS (10 min)
235+
- **Priority:** Low
236+
237+
---
238+
239+
## Implementation Order & Effort Estimates
240+
241+
| Phase | Task | Effort | Priority | Source |
242+
|-------|------|--------|----------|--------|
243+
| B | B.1 Histogram legend | XS (15 min) | Medium | First review §4 |
244+
| B | B.2 Timeline hint | XS (15 min) | Medium | Mina §2.3 |
245+
| B | B.3 Journey Creator copy | XS (10 min) | Medium | First review §3 |
246+
| B | B.4 Touch tooltip alternative | XS (15 min) | Low-Medium | First review §4 |
247+
| A | A.1 Localize types.ts strings | S (30-45 min) | Medium | First review §9 |
248+
| A | A.3 Metric/imperial toggle | S (30-45 min) | Medium | Mina §2.3 |
249+
| C | C.3 Guide tab layout | XS (15 min) | Low | Mina §2.2 |
250+
| D | D.2 iOS file picker tip | XS (10 min) | Low-Medium | First review §7 |
251+
| D | D.3 Zoom control overlap | XS (10 min) | Low | Mina §2.1 |
252+
| C | C.1 Camera mode icons | M (1-2 hr) | Low | First review §5 |
253+
| D | D.1 Swipe gestures | M (1-2 hr) | Low | First review §7 |
254+
| C | C.2 Live slider preview | L (3-5 hr) | Low | First review §5 |
255+
| A | A.2 Add more locales | L (4-8 hr/locale) | Low | First review §9 |
256+
257+
**Total estimated effort:** ~10-16 hours (excluding A.2 locale translations)
258+
259+
**Recommended order:** Quick text/config wins first (B.1–B.4, A.1, D.2, D.3, C.3), then medium features (A.3, C.1, D.1), then the two large items (C.2, A.2) last.
260+
261+
---
262+
263+
## Combined Overview: All Three Plans
264+
265+
| Plan | File | Tasks | Effort | Focus |
266+
|------|------|-------|--------|-------|
267+
| First review | `address-ux-review-non-technical-traveler.md` | 13 (11 remaining*) | ~10-16 hr | Landing, controls, export, advanced features |
268+
| Mina review | `address-mina-review-2026-02-22.md` | 7 | ~4-6 hr | Terminology, camera panel, mobile density |
269+
| This plan (gaps) | `address-review-gaps.md` | 13 | ~10-16 hr | Localization, discoverability, visual polish, mobile |
270+
271+
*First plan C.2 and B.3 are already done — 11 tasks remain.
272+
273+
**Grand total:** ~31 remaining tasks, ~24-38 hours estimated effort.

0 commit comments

Comments
 (0)