diff --git a/config.example.yaml b/config.example.yaml
index d9002f1..5e4bb55 100644
--- a/config.example.yaml
+++ b/config.example.yaml
@@ -12,9 +12,9 @@ site:
wedding:
date: "2026-11-07T16:00:00+02:00" # RFC3339, guest arrival time; drives countdown + photo upload gate
ceremony_time: "16:00 for 16:30" # display text
- rsvp_by: "2026-09-01T00:00:00+02:00" # RFC3339, RSVP deadline; drives the RSVP countdown
- venue_name: "Rivier Plaas"
- venue_address: "Langenhoven Rd, Sherman Park AH, Meyerton, 1961"
+ rsvp_by: "2026-10-17T00:00:00+02:00" # RFC3339, RSVP deadline; drives the RSVP countdown
+ venue_name: "Rivier Plaas Wedding Venue"
+ venue_address: "Langenhoven Street, Riversdale, Meyerton, 1961"
rsvp_phone: "076 925 1718"
storage:
diff --git a/ui/src/lib/config.ts b/ui/src/lib/config.ts
index 8ee2390..fe4e7ad 100644
--- a/ui/src/lib/config.ts
+++ b/ui/src/lib/config.ts
@@ -3,8 +3,8 @@
export const FALLBACK_SITE_URL = "https://zoeshaldon.warky.info";
export const FALLBACK_WEDDING_DATE = "2026-11-07T16:00:00+02:00";
export const FALLBACK_CEREMONY_TIME = "16:00 for 16:30";
-export const FALLBACK_RSVP_BY_DATE = "2026-09-01T00:00:00+02:00";
-export const FALLBACK_VENUE_NAME = "Rivier Plaas";
+export const FALLBACK_RSVP_BY_DATE = "2026-10-17T00:00:00+02:00";
+export const FALLBACK_VENUE_NAME = "Rivier Plaas Wedding Venue";
export const FALLBACK_VENUE_ADDRESS =
- "Langenhoven Rd, Sherman Park AH, Meyerton, 1961";
+ "Langenhoven Street, Riversdale, Meyerton, 1961";
export const FALLBACK_RSVP_PHONE = "076 925 1718";
diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte
index 162e57a..75334d6 100644
--- a/ui/src/routes/+layout.svelte
+++ b/ui/src/routes/+layout.svelte
@@ -3,16 +3,26 @@
import favicon from "$lib/assets/favicon.svg";
import { page } from "$app/state";
import Countdown from "$lib/components/Countdown.svelte";
- import { createWeddingInfo } from "$lib/wedding-info.svelte";
+ import { createWeddingInfo, formatFullDate } from "$lib/wedding-info.svelte";
let { children } = $props();
const wedding = createWeddingInfo();
+ const metaDescription = $derived(
+ `Zoé & Shaldon are getting married on ${formatFullDate(wedding.date)} at ${wedding.venueName}, ${wedding.venueAddress}. Find venue directions, dress code, the order of events, and RSVP here.`,
+ );
+ const shareDescription = $derived(
+ `${formatFullDate(wedding.date)} at ${wedding.venueName}, ${wedding.venueAddress}. Directions, dress code, the schedule, and RSVP.`,
+ );
+
const links = [
{ href: "/", label: "Home" },
{ href: "/rsvp", label: "RSVP" },
{ href: "/photos", label: "Photos" },
+ { href: "/venue", label: "Venue" },
+ { href: "/details", label: "Details" },
+ { href: "/wedding-party", label: "Wedding Party" },
];
let menuOpen = $state(false);
@@ -26,6 +36,19 @@
Zoé & Shaldon are getting married
+
+
+
+
+
+
+
+
+
+
+
+
+
{/if}
-
+
{@render children()}
diff --git a/ui/src/routes/+page.svelte b/ui/src/routes/+page.svelte
index 6ec9590..74c343d 100644
--- a/ui/src/routes/+page.svelte
+++ b/ui/src/routes/+page.svelte
@@ -13,8 +13,12 @@
+
+ "Every love story is beautiful, but ours is my favourite."
+
+
Zoé & Shaldon
@@ -34,7 +38,22 @@
{wedding.venueAddress}
-
+
+
+ Welcome to our wedding website! We are so excited to celebrate our
+ love with our favourite people. As our forever begins, we want to
+ thank you for your love and support.
+
+
+ Browse the menu above to find venue directions, dress code details,
+ and RSVP information.
+
+
+ We can't wait to see you on {formatFullDate(wedding.date)}, {wedding.ceremonyTime}!
+
+
+
+
+
+
+ With love, Zoé & Shaldon
+
diff --git a/ui/src/routes/details/+page.svelte b/ui/src/routes/details/+page.svelte
new file mode 100644
index 0000000..1c47523
--- /dev/null
+++ b/ui/src/routes/details/+page.svelte
@@ -0,0 +1,74 @@
+
+
+
+
+
Important Information
+
+ Please RSVP by {formatFullDate(wedding.rsvpByDate)}.
+
+
+
+
Dress Code: Formal
+
+ We ask that our guests dress in formal attire. Think elegant dresses
+ and sharp suits.
+
+
+
+
+
Food & Drinks
+
+ A delicious dinner will be served. Please note that a cash bar is
+ available for the evening. Card facilities will be available, but we
+ suggest bringing cash just in case.
+
+
+
+
+
Honeymoon Fund
+
+ Your presence on our special day is the greatest gift we could ask
+ for. However, if you would like to honour us with a gift, a
+ contribution toward our future home or honeymoon would be warmly
+ appreciated.
+
+
+
+
+
Order of Events
+
+ Zoé & Shaldon — Saturday, 7 November 2026
+
+
+ {#each events as event (event.time)}
+
+ {event.time}
+ {event.label}
+
+ {/each}
+
+
+
+
diff --git a/ui/src/routes/venue/+page.svelte b/ui/src/routes/venue/+page.svelte
new file mode 100644
index 0000000..e38b79f
--- /dev/null
+++ b/ui/src/routes/venue/+page.svelte
@@ -0,0 +1,57 @@
+
+
+
+
+
The Venue
+
+
+
{wedding.venueName}
+
{wedding.venueAddress}
+
+
+
+ Get directions
+
+
+
+
Parking
+
+ Secure parking is available on-site at the venue.
+
+
+
+
+
Accommodation
+
Plaaskombuis Meyerton
+
+
+
+
diff --git a/ui/src/routes/wedding-party/+page.svelte b/ui/src/routes/wedding-party/+page.svelte
new file mode 100644
index 0000000..2e90a19
--- /dev/null
+++ b/ui/src/routes/wedding-party/+page.svelte
@@ -0,0 +1,127 @@
+
+
+
+
+
The I-Do Crew
+
+ Meet the legendary lineup helping us make it down the aisle at Rivier
+ Plaas!
+
+
+
+
+
+
+
+
The Dog-bearers
+
Roxi & Chloe Muller
+
+
+
+
A Special Note of Thanks
+
+ To some very special people in our lives who have helped us make our
+ day magical:
+
+
+ {#each thanks as person (person.name)}
+
+ {person.name}
+ {person.role}
+
+ {/each}
+
+
+ If there is anyone we have forgotten about, please know that you are
+ all special to us!
+
+
+
+