feat: server-computed locationDisplay on gallery and story views
Adds a formatted locationDisplay string to galleryView and storyView so
clients render one field instead of re-implementing dedup and formatting
logic per platform. Handles POI names ("Blue Bottle Coffee, Oakland,
California, US"), Nominatim city fallbacks ("New York, US"), county-in-
name leakage from older clients ("Kansas City, Missouri, US"), and legacy
hthree records without structured address (preserved as-is).
- lexicons: add locationDisplay to gallery and story view defs
- server/helpers/formatLocation.ts: canonical implementation
- test/formatLocation.test.ts: 11 vitest cases across real-world shapes
- server/hydrate: include locationDisplay in hydrated views
- app/lib/utils/formatLocation.ts: re-export so $lib consumers don't
reach into server/
- app/lib/utils/bsky-post.ts: use shared helper for cross-post line
- UI components: render locationDisplay ?? location.name ?? fallback
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>