Peter Meier
0ab2c58eb4
feat(header): icon nav redesign + migrate icons mdi→lucide
...
Deploy / verify (push) Successful in 1m26s
Deploy / deploy (push) Successful in 2m26s
- Header desktop nav: social icons grouped in a wald-tinted pill with
labels, active-state (aria-current + bold), opacity hover (no per-item bg)
- Mobile overlay: social links as icon+label rows with active-state
- Search button: lucide:search, icon-only
- Migrate all icons mdi→lucide app-wide (234 refs); brand/language logos
(google, whatsapp, mastodon, telegram, language-*) stay on mdi
- generate-icons: emit mdi + lucide subsets; add @iconify-json/lucide
- iconify-offline: register lucide collection
- scripts/icon-map|validate|apply: reusable migration tooling
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-24 10:44:56 +02:00
Peter Meier
d9519a867e
perf: LCP-Fix, Banner-Crops, SSR-Cache, Bulk-Windkarte
...
Deploy / verify (push) Successful in 1m3s
Deploy / deploy (push) Successful in 1m47s
- TopBanner: JS-Fade-Gate entfernt (opacity-0 bis Hydration schob LCP
von ~3s auf ~8.6s) — Bild malt jetzt progressiv über den LQIP
- buildBannerResponsive: Breakpoint-Varianten (1/1, 16/9, 24/9) mit
media-Attributen, quality 60; CMS braucht explizites h neben ar,
sonst kein Crop (Mobile bekam 1.92:1 unscharf hochskaliert)
- Layout-Preload: ein Link pro Breakpoint-Variante (WebP)
- Layout-Bootstrap-Batch + Logo-SVG-Fetch TTL-gecacht (liefen pro
SSR-Request); invalidateCollection versteht CSV-Key-Heads
- WindkarteBlock: 40 Einzel-Fetches -> 1 List-Request mit Filter
- app.html: preconnect cms.pm86.de, api.iconify.design, analytics
- u-url Microformat: echte canonicalUrl statt href="#" (SEO-Audit)
- Icon-Subset: 'cloud' ergänzt (kein Runtime-Fetch an iconify mehr)
- StrommixBlock: nutzloses transition-colors entfernt (CLS-Audit)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-12 09:50:01 +02:00
Peter Meier
41597f87b5
feat(windkarte): InfoAccordion, anlagen-Hinweis, Tooltip ohne Icons
...
Deploy / verify (push) Successful in 1m6s
Deploy / deploy (push) Successful in 1m18s
- Disclaimer aus CMS-Feld (hinweis_text) via InfoAccordion statt Hardcode
- info_text-Feld für Block-Fließtext ergänzt
- anlagen_geplant_hinweis-Feld in WindArea + Panel-Anzeige
- Tooltip-Icons entfernt (square-outline/wind-turbine/map-marker inline SVGs)
- Panel: square-outline → ruler-square für Fläche
- Iconify-Subset neu generiert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-11 12:35:29 +02:00
Peter Meier
6d1a084973
refactor: Stellingnahme-Generator UX-Überarbeitung Step 5
...
Deploy / verify (push) Successful in 1m4s
Deploy / deploy (push) Successful in 1m15s
- Sticky farb-hinterlegter Stepper (Sprung zwischen Schritten klarer)
- Step 5 reorganisiert: Setup oben, "═══ Ergebnis ═══" Trenner,
Schreibvorlage- und KI-Cards primär sichtbar, Feintuning
(Vorschau, Argument-Reihenfolge, Einleitung, Abschluss) in
ein collapsed "Brief im Detail anpassen"-Accordion zusammengelegt
- "Mit Platzhaltern füllen"-Button für Absender-Felder
- KI-Block: nummerierte 1-2-3-4-Anleitung, "In Zwischenablage
kopieren"-Button + .txt-Download, editierbare Inhalts-Regeln
- KI-Prompt nachgeschärft: konkrete Rechtsgrundlagen, klare Anti-
KI-Floskel-Liste, expliziter Hinweis "Entwurf-Banner entfernen",
Verbot von em/en-dashes als Satz-Trenner
- buildText post-processed em/en-dashes zu Kommas
- UI-Texte: em/en-dashes durch Kommas ersetzt
- "Anlagen geplant"-Disclaimer (Schätzung ~4-6 WEA/100ha) in
Stellingnahme-Card und WindAreaPanel ergänzt
- Reset setzt Step + Scroll zurück, History bleibt erhalten
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-07 11:02:48 +02:00
Peter Meier
ace3562111
feat: Social-Bild-Modal mit QR-Code für Kalender-Termine
...
Deploy / verify (push) Successful in 1m7s
Deploy / deploy (push) Successful in 1m39s
Single Button öffnet Vorschau-Modal mit beiden Formaten side-by-side.
Pro Format Download-Button. ESC + Click-outside schließen.
Endpoint generiert zusätzlich QR-Code (qrcode → PNG-Buffer), der
direkt auf den Termin im Kalender-Grid verweist
(/kalender/#event-<slug>). Pin-Icon, QR und Layout für OG (1200x630)
und Square (1080x1080).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 10:25:07 +02:00
Peter Meier
f0d9fecfb8
feat: Social-Media-Bild-Generator für Kalender-Termine
...
Neuer Endpoint /api/social/calendar/[slug] rendert Termin via satori +
resvg zu PNG. Formate: og (1200x630) und square (1080x1080).
Gebrandetes Layout mit Datum, Titel, Ort. Inter-Font lazy von gstatic,
10min In-Memory-Cache pro Slug+Format.
CalendarBlock: zwei Download-Buttons pro Termin (Bild quer / quadr.).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-06 09:28:00 +02:00
Peter Meier
894263e5c4
fix: OrganisationsMap erst bei Klick interaktiv, kein Page-Scroll-Hijack
...
Deploy / verify (push) Successful in 1m1s
Deploy / deploy (push) Successful in 1m25s
Initial Drag/Zoom deaktiviert. Overlay 'Karte aktivieren' freigibt
Interaktion. Marker-Klick aktiviert automatisch mit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 13:17:15 +02:00
Peter Meier
c9ba88ab80
feat: OrganisationsMapBlock — Karte der Bürgerinitiativen
...
Deploy / verify (push) Successful in 1m5s
Deploy / deploy (push) Successful in 1m13s
Neuer Block-Typ `organisations_map`: Leaflet-Karte mit CircleMarkern für alle
Organisationen die ein location.lat/lng haben. Klick auf Marker öffnet
Detail-Panel (Desktop: rechte Sidebar / Mobile: Bottom Sheet) mit Name,
Standort, Beschreibung und Website-Link.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 12:03:26 +02:00
Peter Meier
982a7a3b73
feat: QR-Code, vCard-Export, Org-Gruppenansicht im Adressbuch
...
Deploy / verify (push) Successful in 1m10s
Deploy / deploy (push) Successful in 1m45s
- vcard.ts: shared vCard-Generator (downloadVCard, downloadVCardAll, buildVCardString)
- QrModal.svelte + QrButton.svelte: wiederverwendbare QR-Komponenten mit PNG-Download
- AdressbuchBlock: Org-Gruppenansicht (Toggle), QR + vCard pro Kontakt,
Buchstaben-Trennzeilen, Such-Highlight, "Alle exportieren", Print-Styles
- ContactCard: vCard-Download-Button
- PostActions: QR-Button für Seiten-URL
- qrcode npm-Paket hinzugefügt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 11:15:57 +02:00
Peter Meier
9433705709
fix: Header-Adressbuch-Icon auf mdi:import-contacts
...
Deploy / verify (push) Successful in 56s
Deploy / deploy (push) Successful in 1m10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 10:21:35 +02:00
Peter Meier
3c4b847c23
feat: Adressbuch-Icon in Header-Navigation, WhatsApp/YouTube entfernt
...
Deploy / verify (push) Successful in 1m6s
Deploy / deploy (push) Successful in 1m8s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-04 10:14:31 +02:00
Peter Meier
d0dede92fe
perf(iconify): tree-shake MDI to used icons (-99.5% JSON, -71% client bundle)
...
The previous setup loaded the full @iconify-json/mdi collection (7000+
icons, 2.95 MB) just to render the ~30 icons we actually use, producing a
2.99 MB client chunk.
generate-icons.mjs scans src/ for static `icon="mdi:..."` references,
extracts a minimal IconifyJSON containing only those icons (plus an
EXTRA_ICONS list for dynamic CMS-driven names) from
@iconify-json/mdi/icons.json, and writes it to a generated subset file.
iconify-offline.ts now registers that subset instead of the full pack.
build/client: 5.6 MB -> 1.6 MB (-71%)
build/server: 5.3 MB -> 2.4 MB (-55%)
largest client chunk: 2.99 MB -> 127 KB (-96%)
iconify subset: 2.95 MB -> 15.5 KB (-99.5%)
Hooked into predev/prebuild so the subset stays fresh; missing icons
fall back to the iconify API at runtime.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-05-04 16:08:47 +02:00