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