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 auf hidden: true gesetzt für optimierte Darstellung
  • img_0893 und 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 (addMessages statt register)

[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-nodeadapter-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 via src/app.css
    → Kein externer DNS-Request mehr → DSGVO-konform ohne Consent-Banner
  • Gallery API CF-kompatibel: fs-Import entfernt
    GET /api/gallery nutzt statischen Vite-Import von gallery.json
    POST (Admin-Schreiben) dynamisch via node:fs nur 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.svelte zwischen 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 /umgebung durch <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

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
  • 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) nutzen T12:00:00 als Mittag-Ankerpunkt gegen Timezone-Rollover

Added

  • addDaysStr() Hilfsfunktion in BookingCalendar.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)
  • Info-Bar unter Kalender wechselt Farbe + Emoji je Buchungstyp
  • selectedType Prop in BookingCalendar.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 jetzt getFullYear()/getMonth()/getDate() (lokale Zeit)
    addDays() und onMount-Datumsverarbeitung nutzen T12:00:00 als 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
    extraWeeks 0–3 Zusatzwochen (je +7 Nächte)
    realCheckOut wird reaktiv um extraWeeks × 7 Tage 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)
      1. 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

  • BookingType erweitert um 'midweek'
  • TYPE_LABELS und badgeLabel zeigen 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
    extraDays 0–6 Zusatznächte
    → Standard: So 20:00 Late Checkout (349 € Flat)
    → Mit Verlängerung: normale Nachtberechnung (nightlyBase())
  • nightlyBase(n) Funktion in bookingStore.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 realCheckOut visuell bei extraDays-Änderung (reaktiv synchron)
  • baseCheckOut (So nach Fr-Start) + extraDays = realCheckOut

Changed

  • Preislogik bookingStore.ts komplett überarbeitet:
    • weekend + extraDays=0 → 349 € Flat
    • weekend + extraDays>0 → nightlyBase(2 + extraDays)
    • weeknightlyBase(nights)
    • midweeknightlyBase(nights)

[1.0.1] – 2026-04-22 · Console-Error-Fixes & i18n

Fixed

  • unknown prop 'params': SvelteKit übergibt data/params als Props an alle Page-Komponenten
    export let data: App.PageData | undefined = undefined in allen Seiten + Layout ergänzt:
    • src/routes/+layout.svelte
    • src/routes/booking/+page.svelte
    • src/routes/checkout/+page.svelte
    • src/routes/concierge/+page.svelte
  • i18n locale-Fehler ($_() aufgerufen vor init() bei HMR):
    src/hooks.client.ts erstellt: import '$lib/i18n' als frühster Client-Hook
  • Mock-Daten Wochentag-Bug: apt-2026-06-05 war Freitag (→ +7 Tage = Freitag, ungültig)
    → Korrigiert zu apt-2026-06-06-week Sa 06.06. → Sa 13.06.
    apt-2026-05-22 endDateTime auf So 24.05. 20:00 (Code blockt Mo automatisch)
  • Sunday-Blocking: Wochenend-Checkout auf Sonntag blockierte So-Nacht nicht
    onMount erkennt 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, Legende
  • bookingStore.ts: Zentraler Svelte Store, priceBreakdown reaktiv
  • 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