4.2 KiB
4.2 KiB
MapCN auf Kontaktseite integrieren (statt Google-Maps-Link)
Ziel
Die Platzhalter-Box auf der Kontaktseite (/kontakt) soll durch eine echte, interaktive Karte mit mapcn ersetzt werden. Die Karte zeigt den Praxisstandort inklusive Marker und optionalem Popup.
Ist-Zustand
src/pages/kontakt.astroenthält aktuell nur einen statischen Map-Placeholder mit Link zu Google Maps.- React ist im Projekt bereits aktiviert (
@astrojs/reactinastro.config.mjs). - Shadcn-Struktur ist vorhanden (
components.json,src/components/ui/button.tsx). - Es gibt noch keine Kartenkomponenten im Projekt.
Empfohlener Ansatz
mapcn per shadcn-Registry hinzufügen und eine kleine, dedizierte React-Komponente für die Kontaktkarte bauen. Diese wird als Astro-Client-Island (client:visible) in kontakt.astro eingebunden.
Warum dieser Ansatz:
- Sauber gekapselte Kartenlogik (statt JSX direkt in
.astro). - Gute Performance (Hydration erst bei Sichtbarkeit).
- Einfache Wiederverwendung für Footer/Standortseiten später.
Umsetzungsplan
1) MapCN-Komponente ins Projekt holen
Änderungen: Abhängig von shadcn-Generator-Ausgabe
- Command (im Implementierungsschritt):
bunx shadcn@latest add @mapcn/map(alternativnpx shadcn@latest add @mapcn/map)
- Erwartete Ergebnisse:
- Neue Datei
src/components/ui/map.tsx(oder äquivalent) - Neue Dependency
maplibre-glinpackage.json - Falls vom Generator benötigt: ergänzende CSS-Regeln/Imports (z. B. MapLibre-CSS)
- Neue Datei
Prüfpunkte:
- Map-Komponente ist importierbar aus
@/components/ui/map - Keine TypeScript- oder Build-Fehler nach dem Add
2) Reusable Praxis-Map als React-Komponente erstellen
Neue Datei: src/components/maps/PracticeMap.tsx
Inhalt:
- Import aus
@/components/ui/map:MapMapControls(optional, aber sinnvoll)MapMarker,MarkerContent,MarkerLabel(für Standortpin)
- Container mit fester Höhe und Rounded Corners passend zur bestehenden Kontaktseite
- Initiales Viewport-Center auf Praxisadresse
- Empfohlene Koordinaten (OSM/Nominatim):
lon 12.3849586,lat 50.8203324
- Empfohlene Koordinaten (OSM/Nominatim):
- Zoom ca.
14–15 - Markerlabel z. B. „Zahnarztpraxis Dr. Tittel“
- Optional: kleines Popup mit Adresse
Hinweis:
- Falls die generierte
Map-Komponentechildrenvoll unterstützt, Marker/Controls direkt als Children. - Falls nicht, Minimalvariante nur mit
Map center/zoomund Controls weglassen.
3) Kontaktseite umbauen
Datei: src/pages/kontakt.astro
Geplante Änderungen:
- Import der neuen Komponente
PracticeMap. - Bestehenden Placeholder-Block (Zeilenbereich um „Map placeholder“) entfernen/ersetzen.
- Neue Einbindung:
<PracticeMap client:visible />
- Karte visuell im selben Card-Stil belassen:
rounded-2xl border border-border overflow-hidden
Optionaler UX-Zusatz unter der Karte:
- Externer OpenStreetMap-/Google-Maps-Link als Fallback/Navigation beibehalten.
4) (Optional, aber empfohlen) Standortdaten zentralisieren
Datei: src/data/site.ts
siteConfigumlocationerweitern, z. B.:latitudelongitude
PracticeMapnutzt diese Werte statt hardcodierter Koordinaten.
Vorteil:
- Keine doppelten Daten, spätere Änderungen an einer Stelle.
5) Validierung
Nach der Implementierung ausführen:
bun run typecheckbun run build
Manuelle Sichtprüfung:
/kontaktlädt ohne Console-Errors- Karte rendert korrekt auf Desktop und Mobile
- Marker steht an plausibler Position (Bodelschwinghstraße 1, 08451 Crimmitschau)
- Seite bleibt performant (Hydration nur beim Scrollen in Sichtbereich)
Risiken / Stolpersteine
maplibre-glbenötigt ggf. CSS-Import; ohne den wirkt die Karte/Controls fehlerhaft.- In Astro muss React-Komponente mit
client:*eingebunden werden, sonst keine Interaktivität. - Falls CSP/Cookie-Hinweise im Projekt strikt sind, muss Text „Karte wird nach Cookie-Einwilligung geladen“ angepasst/entfernt werden, da diese Map nicht dem bisherigen Google-Maps-Flow entspricht.
Definition of Done
- Kontaktseite zeigt eine funktionierende
mapcn-Karte statt Placeholder. - Marker auf Praxisstandort vorhanden.
- Projekt baut und typcheckt fehlerfrei.
- Styling integriert sich in bestehendes Design ohne Layout-Bruch.