Changelog
Projekt: Boot Gråsten – Hausboot-Buchungssystem
Stack: SvelteKit 2 · adapter-cloudflare · svelte-i18n · MS Graph Bookings (Mock)
[1.9.0] – 2026-04-23 · Gallery-Curation
Changed
gallery.json: weitere Items aufhidden: truegesetzt für optimierte Darstellungimg_0893und weitere Bilder deaktiviert (schlechte Qualität / Duplikate)- Wird statisch via Vite-Import gebundelt – jede Änderung erfordert Rebuild + Deploy
[1.8.0] – 2026-04-23 · CF Workers Cold-Start Fix
Fixed
- 500-Fehler beim ersten Seitenaufruf (CF Workers Cold-Start Race Condition):
register()mit lazy() => import('./locales/xx.json')erzeugte Race Condition auf CF Workers- Fix:
addMessages()mit statischen Imports – synchron, kein Promise, kein async Init - Betrifft:
src/lib/i18n/index.ts
Added
src/hooks.server.ts(neu): SSR Error-Handler- Loggt alle Server-Fehler strukturiert
- Gibt verständliche Fehlermeldung statt kryptischem CF 500-Error
Changed
src/hooks.client.ts: Kommentar aktualisiert (addMessagesstattregister)
[1.7.0] – 2026-04-23 · Mobile Responsive & Touch
Added
- Burger-Menü (≤680px): alle Nav-Links im ☰-Dropdown, „Buchen"-CTA bleibt immer sichtbar
- Burger-Animation: 3 Linien → X
slideDown-Animation beim Öffnen- Schließt bei Link-Klick + Tap außerhalb
- Sprachwechsel ebenfalls im Burger-Dropdown
- Touch-Swipe Hero-Slideshow: links/rechts wischen navigiert Slides (Threshold 40px)
- 44×44px Touch-Targets für Nav-Pfeile (Apple HIG konform)
- Hero:
min-height: 100dvh(Browser-Adressleiste-aware) - Buttons auf Mobile: volle Breite, gestapelt (
flex-direction: column) - Progress-Bars: 3px fix auf Mobile
[1.6.0] – 2026-04-23 · Alpha-Release-Vorbereitung (Cloudflare)
Changed
- Adapter:
adapter-node→adapter-cloudflare(svelte.config.js)
Cloudflare Pages CI/CD nutzt nun den nativen CF-Adapter für Edge Deployment. - Inter-Font self-hosted: Google Fonts CDN-Import entfernt
→@fontsource/inter(npm, v5.2.8) lokal gebundelt viasrc/app.css
→ Kein externer DNS-Request mehr → DSGVO-konform ohne Consent-Banner - Gallery API CF-kompatibel:
fs-Import entfernt
→GET /api/gallerynutzt statischen Vite-Import vongallery.json
→POST(Admin-Schreiben) dynamisch vianode:fsnur lokal, auf CF 501-Response
Added
src/app.css: Globale CSS-Datei mit Self-hosted Font-Imports + Box-Sizing-Reset- DSGVO-Status: Kein Tracking, keine Analytics, kein Cookie-Banner nötig
(localStorage nur für Sprach-Präferenz = technisch notwendig, kein Consent erforderlich)
[1.5.0] – 2026-04-23 · Umgebungsseite & Icon-System-Erweiterung
Added
/umgebung: Neue Seite „Gråsten & Umgebung" – Tourismus-Übersicht Südjütland- 9 thematische Sektionen: Schloss, Wälder/Förde, Gendarmenpfad, Sønderborg/Dybbøl, Feste, Museen/Science, Golf/Sport, Restaurants, CTA
- Externe Links mit
target="_blank"+<Icon name="external">auf jedem Link - Quellen: visitsonderjylland.de, graastenraadhus.dk, gendarmsti.dk, 1864.dk, u.v.m.
- Nav-Link „Umgebung" in
+layout.sveltezwischen Rundgang und Galerie eingefügt Icon.svelte+16 neue SVG-Icons:landmark,leaf,tree,crown,feather,map,shield,car,trophy,atom,factory,flag,bike,utensils,globe,external
Changed
- Alle Emoji-Platzhalter auf
/umgebungdurch<Icon>-Komponenten ersetzt
(konsistent mit Design-Standard der übrigen Seiten)
[1.4.1] – 2026-04-23 · Hero Toggle-Button (X / ℹ)
Added
- Toggle-Button auf Startseite Hero: blendet Content-Box ein/aus
- X-SVG (schließen) / ℹ-SVG (öffnen),
position: absolute top/right 1.25rem let contentVisible = true+class:hidden={!contentVisible}mit Svelte-Transition- CSS:
.toggle-content,.toggle-content.is-hidden,.hero-content.hidden
- X-SVG (schließen) / ℹ-SVG (öffnen),
Fixed
- Midweek-Fenster-Erkennung komplett überarbeitet (3 Iterationen):
- Alte Logik prüfte End-Wochentag der linken Buchung → Timezone-Anfällig, falsche Richtung
- Neue Logik: zwei explizite Fälle basierend auf Anker-Wochentagen:
- Fall 1 (
to.getDay() === 5): Lücke endet an Freitag → Midweek vor Wochenend-Buchung - Fall 2 (
from.getDay() === 1): Lücke beginnt an Montag (Sunday-Blocking) → kurze Midweek-Woche bis Sa
- Fall 1 (
- Samstag als Midweek-Start erlaubt wenn Sa keine gültige 7-Nacht-Woche starten kann
(z.B. Sa 16.05.: Woche würde bis Sa 23.05. → Überschneidung mit Fr 22.05.-Buchung) - Alle
new Date(dateStr)nutzenT12:00:00als Mittag-Ankerpunkt gegen Timezone-Rollover
Added
addDaysStr()Hilfsfunktion inBookingCalendar.svelte(Datum + N Tage, timezone-sicher)- Vollständige Doku in
booking/flow.md: Midweek-Logik mit Code, Praxisbeispiel Mai 2026, Business-Impact-Tabelle (bis +750€ Mehrumsatz pro Lücke)
[1.3.0] – 2026-04-22 · Kalender Farb-Codierung & Timezone-Fix
Added
- Farbcodierter selektierter Bereich im Kalender
Start/Ende und Bereich werden jetzt in der Farbe des Buchungstyps dargestellt:- 🌊 Wochenende (Fr) → Blau (
#1d4ed8/#bfdbfe) - ⛵ Woche (Sa) → Grün (
#15803d/#bbf7d0) - 🌅 Midweek (Lücke) → Amber (
#d97706/#fde68a)
- 🌊 Wochenende (Fr) → Blau (
- Info-Bar unter Kalender wechselt Farbe + Emoji je Buchungstyp
selectedTypeProp inBookingCalendar.svelte– übergibt aktiven Buchungstyp vom Parent
Fixed
- Kritischer Timezone-Bug:
toISOString()liefert UTC – in UTC+2 (CEST) wurden alle Tage
als Vortag interpretiert. Sa 06.06. erschien als So 07.06., belegte Range 06.06.–12.06. wurde
als 07.06.–13.06. angezeigt.
→toStr()nutzt jetztgetFullYear()/getMonth()/getDate()(lokale Zeit)
→addDays()undonMount-Datumsverarbeitung nutzenT12:00:00als Mittag-Ankerpunkt
[1.2.0] – 2026-04-22 · Woche verlängerbar + Midweek 2-Klick
Added
- Wochen-Verlängerungs-Stepper (neu): Bei Samstags-Buchung erscheint ein grüner
−/+-Stepper
→extraWeeks0–3 Zusatzwochen (je +7 Nächte)
→realCheckOutwird reaktiv umextraWeeks × 7Tage verlängert
→ Preisanzeige:7 × 150 € + N × 120 €(Aktionspreis ab 8. Nacht)
→ Max. 4 Wochen = 28 Nächte buchbar - Midweek-Buchungstyp (2-Klick-System):
- Kalender erkennt automatisch Lücken ≥ 2 Nächte zwischen Buchungen
- Amber-markierte Tage in Lücken sind als Midweek-Start anklickbar (1. Klick)
- Klick wählt Enddatum frei (mind. 2 Nächte, max. bis Lückenende)
- Hover-Vorschau zeigt Amber-Range während Auswahl
- Status-Banner erscheint nach 1. Klick mit Hinweis und ✕-Reset
Changed
BookingTypeerweitert um'midweek'TYPE_LABELSundbadgeLabelzeigen dynamisch verlängertes Wochenlabel
[1.1.0] – 2026-04-22 · Wochenend-Verlängerung & Preislogik
Added
- Wochenend-Verlängerungs-Stepper: Nach Fr-Auswahl erscheint blauer
−/+-Stepper
→extraDays0–6 Zusatznächte
→ Standard: So 20:00 Late Checkout (349 € Flat)
→ Mit Verlängerung: normale Nachtberechnung (nightlyBase()) nightlyBase(n)Funktion inbookingStore.ts:Nächte 1–7: je 150 € ab 8. Nacht: je 120 € (Aktionspreis)- Preiskonstanten klar getrennt:
PRICE_NIGHT_STD = 150,PRICE_NIGHT_ACTION = 120,PRICE_WEEKEND_FLAT = 349 - Kalender zeigt
realCheckOutvisuell bei extraDays-Änderung (reaktiv synchron) baseCheckOut(So nach Fr-Start) +extraDays=realCheckOut
Changed
- Preislogik
bookingStore.tskomplett überarbeitet:weekend+ extraDays=0 → 349 € Flatweekend+ extraDays>0 →nightlyBase(2 + extraDays)week→nightlyBase(nights)midweek→nightlyBase(nights)
[1.0.1] – 2026-04-22 · Console-Error-Fixes & i18n
Fixed
unknown prop 'params': SvelteKit übergibtdata/paramsals Props an alle Page-Komponenten
→export let data: App.PageData | undefined = undefinedin allen Seiten + Layout ergänzt:src/routes/+layout.sveltesrc/routes/booking/+page.sveltesrc/routes/checkout/+page.sveltesrc/routes/concierge/+page.svelte
- i18n locale-Fehler (
$_()aufgerufen vorinit()bei HMR):
→src/hooks.client.tserstellt:import '$lib/i18n'als frühster Client-Hook - Mock-Daten Wochentag-Bug:
apt-2026-06-05war Freitag (→ +7 Tage = Freitag, ungültig)
→ Korrigiert zuapt-2026-06-06-weekSa 06.06. → Sa 13.06.
→apt-2026-05-22endDateTime auf So 24.05. 20:00 (Code blockt Mo automatisch) - Sunday-Blocking: Wochenend-Checkout auf Sonntag blockierte So-Nacht nicht
→onMounterkennt Checkout auf Sonntag → verschiebt End-Range um +1 Tag auf Montag
[1.0.0] – 2026-04-22 · Initial Release
Added
- SvelteKit 2 Frontend mit adapter-node
- 3-Schritt Buchungsflow:
/booking→/concierge→/checkout BookingCalendar.svelte: 2-Monats-Ansicht, Fr/Sa-Starts, LegendebookingStore.ts: Zentraler Svelte Store,priceBreakdownreaktiv- MS Graph Bookings API-Abstraktion (
USE_MOCK = true) - Mock-Daten (
ms-graph-calendar.json) für lokalen Test - svelte-i18n: 4 Sprachen DE / EN / NL / DA
- 4-Sprachen Dropdown im Layout
- Preisübersicht-Sidebar mit Extras (Bettwäsche, Grill, Bollerwagen)
- Concierge-Seite mit REWE-Paket-Auswahl
- Checkout-Seite mit dynamischen Check-In/Out-Zeiten nach Buchungstyp
- MkDocs Dokumentationsstruktur
Architecture Decisions
- Mock-First:
USE_MOCK = true– kein echtes API für DEMO nötig - MS Graph Bookings: Keine eigene Datenbank – Microsoft hält Buchungsdaten
- Svelte Stores: Buchungsstatus über alle 3 Schritte persistent, kein URL-State
- Cloudflare Pages: Zero-Cost-Hosting, globale CDN, Workers für Server-Funktionen