feat(places): surface geocoding privacy notices in autocomplete UI

The mana-geocoding wrapper now returns `notice: 'fallback_used' |
'sensitive_local_unavailable'` alongside results so the UI can show
the user *why* a query had unusual behavior. This commit wires that
all the way through the Places module's address-autocomplete inputs.

Geocoding client (lib/geocoding/index.ts):
- Add `GeocodingNotice` and `SearchOutcome` types
- Add `searchAddressDetailed` and `reverseGeocodeDetailed` — same
  semantics as the existing functions but return the wrapper's
  provider/notice metadata. Existing `searchAddress`/`reverseGeocode`
  stay backward-compatible (they call the detailed variants under
  the hood and discard the metadata).
- Extend GeocodingResult with optional `provider` field.

Places ListView (the only current consumer that exposes typed
addresses to users):
- Both autocomplete inputs (tracking-edit + main address-search)
  now use searchAddressDetailed and surface notices inline.
- 'sensitive_local_unavailable' renders an amber explainer block in
  the dropdown — title + body — so the user knows why their medical
  query returned 0 hits without leaking the search to a public API.
- 'fallback_used' renders a small "≈ ungefähr" footer badge so users
  understand the result came from public OSM (less precise but
  still valid).
- The dropdown opens when EITHER results exist OR a notice is
  present — sensitive blocked queries with empty results still
  surface their explainer.

i18n: new `places.geocoding_notice.*` sub-namespace in all 5 locales
(de/en/es/fr/it) — 4 strings each. All validators green.

Other consumers (places DetailView, events, photos, contacts) keep
the existing searchAddress/reverseGeocode calls — they don't need
the privacy notices today and would just add noise. They can adopt
the detailed variant if/when the use case warrants it.
This commit is contained in:
Till JS 2026-04-28 16:24:15 +02:00
parent f20a411fd8
commit b1fa55dbca
8 changed files with 218 additions and 25 deletions

View file

@ -10,8 +10,8 @@
"apps/mana/apps/web/src/lib/components/dashboard/widgets/CardsProgressWidget.svelte": 4,
"apps/mana/apps/web/src/lib/components/dashboard/widgets/MusicLibraryWidget.svelte": 1,
"apps/mana/apps/web/src/lib/components/DetailViewShell.svelte": 1,
"apps/mana/apps/web/src/lib/components/feedback/FeedbackQuickModal.svelte": 7,
"apps/mana/apps/web/src/lib/components/feedback/GlobalFeedbackPill.svelte": 1,
"apps/mana/apps/web/src/lib/components/feedback/FeedbackForm.svelte": 5,
"apps/mana/apps/web/src/lib/components/feedback/FeedbackQuickModal.svelte": 2,
"apps/mana/apps/web/src/lib/components/KeyboardShortcutsModal.svelte": 1,
"apps/mana/apps/web/src/lib/components/landing/LandingEditor.svelte": 16,
"apps/mana/apps/web/src/lib/components/layout/SpaceCreateDialog.svelte": 4,
@ -85,11 +85,6 @@
"apps/mana/apps/web/src/lib/modules/comic/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/comic/views/CharactersView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/comic/views/ListView.svelte": 2,
"apps/mana/apps/web/src/lib/modules/community/components/ItemCard.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/DetailView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/community/views/MyWishesView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/community/views/RoadmapView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/companion/components/CompanionChat.svelte": 1,
"apps/mana/apps/web/src/lib/modules/companion/components/RitualRunner.svelte": 5,
"apps/mana/apps/web/src/lib/modules/companion/ListView.svelte": 1,
@ -106,6 +101,11 @@
"apps/mana/apps/web/src/lib/modules/core/widgets/RecentContactsWidget.svelte": 2,
"apps/mana/apps/web/src/lib/modules/core/widgets/TasksTodayWidget.svelte": 1,
"apps/mana/apps/web/src/lib/modules/core/widgets/UpcomingEventsWidget.svelte": 1,
"apps/mana/apps/web/src/lib/modules/feedback/components/ItemCard.svelte": 1,
"apps/mana/apps/web/src/lib/modules/feedback/views/DetailView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/feedback/views/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/feedback/views/MyWishesView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/feedback/views/RoadmapView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/goals/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/guides/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/habits/components/HabitDetail.svelte": 5,
@ -286,11 +286,11 @@
"apps/mana/apps/web/src/routes/+error.svelte": 1,
"apps/mana/apps/web/src/routes/auth/callback/+page.svelte": 3,
"apps/mana/apps/web/src/routes/auth/reset-password/+page.svelte": 1,
"apps/mana/apps/web/src/routes/community/+layout.svelte": 5,
"apps/mana/apps/web/src/routes/community/+page.svelte": 1,
"apps/mana/apps/web/src/routes/community/admin/+page.svelte": 6,
"apps/mana/apps/web/src/routes/community/eule/[hash]/+page.svelte": 1,
"apps/mana/apps/web/src/routes/community/roadmap/+page.svelte": 1,
"apps/mana/apps/web/src/routes/feedback/+layout.svelte": 5,
"apps/mana/apps/web/src/routes/feedback/+page.svelte": 1,
"apps/mana/apps/web/src/routes/feedback/admin/+page.svelte": 6,
"apps/mana/apps/web/src/routes/feedback/eule/[hash]/+page.svelte": 1,
"apps/mana/apps/web/src/routes/feedback/roadmap/+page.svelte": 1,
"apps/mana/apps/web/src/routes/g/[code]/+page.svelte": 6,
"apps/mana/apps/web/src/routes/rsvp/[token]/+page.svelte": 1,
"apps/mana/apps/web/src/routes/share/[token]/+layout.svelte": 1,