fix(ui): update wedding details and add new pages
* change RSVP deadline and venue details * add venue and wedding party pages with relevant information * enhance layout with additional meta descriptions and links
This commit is contained in:
+3
-3
@@ -12,9 +12,9 @@ site:
|
|||||||
wedding:
|
wedding:
|
||||||
date: "2026-11-07T16:00:00+02:00" # RFC3339, guest arrival time; drives countdown + photo upload gate
|
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
|
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
|
rsvp_by: "2026-10-17T00:00:00+02:00" # RFC3339, RSVP deadline; drives the RSVP countdown
|
||||||
venue_name: "Rivier Plaas"
|
venue_name: "Rivier Plaas Wedding Venue"
|
||||||
venue_address: "Langenhoven Rd, Sherman Park AH, Meyerton, 1961"
|
venue_address: "Langenhoven Street, Riversdale, Meyerton, 1961"
|
||||||
rsvp_phone: "076 925 1718"
|
rsvp_phone: "076 925 1718"
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
export const FALLBACK_SITE_URL = "https://zoeshaldon.warky.info";
|
export const FALLBACK_SITE_URL = "https://zoeshaldon.warky.info";
|
||||||
export const FALLBACK_WEDDING_DATE = "2026-11-07T16:00:00+02:00";
|
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_CEREMONY_TIME = "16:00 for 16:30";
|
||||||
export const FALLBACK_RSVP_BY_DATE = "2026-09-01T00:00:00+02:00";
|
export const FALLBACK_RSVP_BY_DATE = "2026-10-17T00:00:00+02:00";
|
||||||
export const FALLBACK_VENUE_NAME = "Rivier Plaas";
|
export const FALLBACK_VENUE_NAME = "Rivier Plaas Wedding Venue";
|
||||||
export const FALLBACK_VENUE_ADDRESS =
|
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";
|
export const FALLBACK_RSVP_PHONE = "076 925 1718";
|
||||||
|
|||||||
@@ -3,16 +3,26 @@
|
|||||||
import favicon from "$lib/assets/favicon.svg";
|
import favicon from "$lib/assets/favicon.svg";
|
||||||
import { page } from "$app/state";
|
import { page } from "$app/state";
|
||||||
import Countdown from "$lib/components/Countdown.svelte";
|
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();
|
let { children } = $props();
|
||||||
|
|
||||||
const wedding = createWeddingInfo();
|
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 = [
|
const links = [
|
||||||
{ href: "/", label: "Home" },
|
{ href: "/", label: "Home" },
|
||||||
{ href: "/rsvp", label: "RSVP" },
|
{ href: "/rsvp", label: "RSVP" },
|
||||||
{ href: "/photos", label: "Photos" },
|
{ href: "/photos", label: "Photos" },
|
||||||
|
{ href: "/venue", label: "Venue" },
|
||||||
|
{ href: "/details", label: "Details" },
|
||||||
|
{ href: "/wedding-party", label: "Wedding Party" },
|
||||||
];
|
];
|
||||||
|
|
||||||
let menuOpen = $state(false);
|
let menuOpen = $state(false);
|
||||||
@@ -26,6 +36,19 @@
|
|||||||
<svelte:head>
|
<svelte:head>
|
||||||
<title>Zoé & Shaldon are getting married</title>
|
<title>Zoé & Shaldon are getting married</title>
|
||||||
<link rel="icon" href={favicon} />
|
<link rel="icon" href={favicon} />
|
||||||
|
|
||||||
|
<meta name="description" content={metaDescription} />
|
||||||
|
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:title" content="Zoé & Shaldon are getting married" />
|
||||||
|
<meta property="og:description" content={shareDescription} />
|
||||||
|
<meta property="og:url" content={wedding.siteUrl} />
|
||||||
|
<meta property="og:image" content="{wedding.siteUrl}/photos/IMG_0528.JPG" />
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:title" content="Zoé & Shaldon are getting married" />
|
||||||
|
<meta name="twitter:description" content={shareDescription} />
|
||||||
|
<meta name="twitter:image" content="{wedding.siteUrl}/photos/IMG_0528.JPG" />
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -104,7 +127,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<main class="flex flex-1 flex-col">
|
<main
|
||||||
|
class="text-shadow-sm text-shadow-white/80 dark:text-shadow-black/70 flex flex-1 flex-col"
|
||||||
|
>
|
||||||
{@render children()}
|
{@render children()}
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,8 +13,12 @@
|
|||||||
<PhotoBackground />
|
<PhotoBackground />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="border-surface-50/70 relative z-10 flex max-w-xl flex-col items-center gap-6 border px-6 py-12 sm:px-14 sm:py-16"
|
class="border-surface-50/70 text-shadow-sm text-shadow-black/60 relative z-10 flex max-w-xl flex-col items-center gap-6 border px-6 py-12 sm:px-14 sm:py-16"
|
||||||
>
|
>
|
||||||
|
<p class="text-secondary-300 font-serif text-2xl italic">
|
||||||
|
"Every love story is beautiful, but ours is my favourite."
|
||||||
|
</p>
|
||||||
|
|
||||||
<h1 class="text-surface-50 font-malibu text-6xl sm:text-8xl">
|
<h1 class="text-surface-50 font-malibu text-6xl sm:text-8xl">
|
||||||
Zoé & Shaldon
|
Zoé & Shaldon
|
||||||
</h1>
|
</h1>
|
||||||
@@ -34,7 +38,22 @@
|
|||||||
<p class="text-surface-100 text-2xl">{wedding.venueAddress}</p>
|
<p class="text-surface-100 text-2xl">{wedding.venueAddress}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-6 flex flex-wrap items-center justify-center gap-4">
|
<div class="flex flex-col gap-4 text-center">
|
||||||
|
<p class="text-surface-100 text-xl">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p class="text-surface-100 text-xl">
|
||||||
|
Browse the menu above to find venue directions, dress code details,
|
||||||
|
and RSVP information.
|
||||||
|
</p>
|
||||||
|
<p class="text-surface-100 text-xl">
|
||||||
|
We can't wait to see you on {formatFullDate(wedding.date)}, {wedding.ceremonyTime}!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-2 flex flex-wrap items-center justify-center gap-4">
|
||||||
{#if !rsvpStatus.submitted}
|
{#if !rsvpStatus.submitted}
|
||||||
<a href="/rsvp" class="btn preset-filled-secondary-500 text-2xl">RSVP</a
|
<a href="/rsvp" class="btn preset-filled-secondary-500 text-2xl">RSVP</a
|
||||||
>
|
>
|
||||||
@@ -44,6 +63,12 @@
|
|||||||
<a href="/photos" class="btn preset-filled-primary-500 text-2xl"
|
<a href="/photos" class="btn preset-filled-primary-500 text-2xl"
|
||||||
>Share photos</a
|
>Share photos</a
|
||||||
>
|
>
|
||||||
|
<a href="/details" class="btn preset-tonal-secondary text-2xl">Details</a
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p class="text-surface-200 font-serif text-2xl">
|
||||||
|
With love,<br />Zoé & Shaldon
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { createWeddingInfo, formatFullDate } from "$lib/wedding-info.svelte";
|
||||||
|
|
||||||
|
const wedding = createWeddingInfo();
|
||||||
|
|
||||||
|
const events = [
|
||||||
|
{ time: "16:00", label: "Guest Arrival" },
|
||||||
|
{ time: "16:30", label: "Wedding Ceremony Begins" },
|
||||||
|
{ time: "17:00", label: "The New Mr. & Mrs. (Ceremony Concludes)" },
|
||||||
|
{ time: "17:15", label: "Canapés, Drinks & Family Photos" },
|
||||||
|
{ time: "18:15", label: "Reception Hall Doors Open" },
|
||||||
|
{ time: "18:30", label: "Grand Entrance & Welcoming" },
|
||||||
|
{ time: "19:00", label: "Speeches and Toasting" },
|
||||||
|
{ time: "19:30", label: "Dinner is Served" },
|
||||||
|
{ time: "20:30", label: "Cutting of the Cake & First Dance" },
|
||||||
|
{ time: "20:40", label: "Dance Floor Opens" },
|
||||||
|
{ time: "23:30", label: "Last Dance & Farewell" },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section class="flex flex-1 items-center justify-center px-4 py-16">
|
||||||
|
<div class="w-full max-w-md">
|
||||||
|
<h1 class="font-serif text-4xl">Important Information</h1>
|
||||||
|
<p class="text-secondary-600-400 mt-2 text-2xl">
|
||||||
|
Please <a href="/rsvp" class="underline hover:text-secondary-500">RSVP</a> by {formatFullDate(wedding.rsvpByDate)}.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="mt-6 flex flex-col gap-1">
|
||||||
|
<h2 class="font-serif text-3xl">Dress Code: Formal</h2>
|
||||||
|
<p class="text-surface-600-400 text-2xl">
|
||||||
|
We ask that our guests dress in formal attire. Think elegant dresses
|
||||||
|
and sharp suits.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Food & Drinks</h2>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Honeymoon Fund</h2>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Order of Events</h2>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
Zoé & Shaldon — Saturday, 7 November 2026
|
||||||
|
</p>
|
||||||
|
<ul class="mt-4 flex flex-col gap-2">
|
||||||
|
{#each events as event (event.time)}
|
||||||
|
<li
|
||||||
|
class="border-surface-300 dark:border-surface-700 flex items-baseline gap-4 border-b py-2"
|
||||||
|
>
|
||||||
|
<span class="text-secondary-600-400 w-16 shrink-0 text-2xl"
|
||||||
|
>{event.time}</span
|
||||||
|
>
|
||||||
|
<span class="text-2xl">{event.label}</span>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { createWeddingInfo } from "$lib/wedding-info.svelte";
|
||||||
|
|
||||||
|
const wedding = createWeddingInfo();
|
||||||
|
|
||||||
|
const directionsUrl = $derived(
|
||||||
|
`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(
|
||||||
|
`${wedding.venueName}, ${wedding.venueAddress}`,
|
||||||
|
)}`,
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section class="flex flex-1 items-center justify-center px-4 py-16">
|
||||||
|
<div class="w-full max-w-md">
|
||||||
|
<h1 class="font-serif text-4xl">The Venue</h1>
|
||||||
|
|
||||||
|
<div class="mt-6 flex flex-col gap-1">
|
||||||
|
<p class="text-2xl">{wedding.venueName}</p>
|
||||||
|
<p class="text-surface-600-400 text-2xl">{wedding.venueAddress}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={directionsUrl}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="btn preset-filled-secondary-500 mt-4 text-2xl"
|
||||||
|
>
|
||||||
|
Get directions
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Parking</h2>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
Secure parking is available on-site at the venue.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Accommodation</h2>
|
||||||
|
<p class="mt-2 text-2xl">Plaaskombuis Meyerton</p>
|
||||||
|
<div class="text-surface-600-400 mt-1 flex flex-col text-2xl">
|
||||||
|
<a href="tel:0163644144" class="hover:text-secondary-400">016 364 4144</a>
|
||||||
|
<a href="mailto:marisel@plaaskombuis.co.za" class="hover:text-secondary-400"
|
||||||
|
>marisel@plaaskombuis.co.za</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="https://www.plaaskombuis.co.za"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="hover:text-secondary-400"
|
||||||
|
>
|
||||||
|
www.plaaskombuis.co.za
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
const bride = [
|
||||||
|
{
|
||||||
|
role: "Maid of Honour",
|
||||||
|
name: "Mart-Marie Neethling",
|
||||||
|
note: "Keeper of the bride's sanity and secrets.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Bridesmaid",
|
||||||
|
name: "Bronwin Williams",
|
||||||
|
note: "Childhood friend and the leader of the ultimate hype squad.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Bridesmaid",
|
||||||
|
name: "Noel Du Toit",
|
||||||
|
note: '"The life of every party" — Cousin.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Flower Girl",
|
||||||
|
name: "Echo",
|
||||||
|
note: "The cutest little Flower Girl ever seen.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const groom = [
|
||||||
|
{
|
||||||
|
role: "Best Man",
|
||||||
|
name: "Justin Pieterse",
|
||||||
|
note: "Tasked with keeping the speech short and the groom sane. (Not that the groom has ever been sane.)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Groomsman",
|
||||||
|
name: "Harold Harding",
|
||||||
|
note: "Childhood friend, and always has the groom's back.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Groomsman",
|
||||||
|
name: "Dehan Kruger",
|
||||||
|
note: "Chilled, laid back, and the life of every party!",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: "Groomsman",
|
||||||
|
name: "Karabo Makhubo",
|
||||||
|
note: "Sharp dresser, always with a joke to share.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const thanks = [
|
||||||
|
{ name: "Gayle Muller-Lombard", role: "Mother of the Bride" },
|
||||||
|
{ name: "Jan Lombard", role: "Stepdad of the Bride" },
|
||||||
|
{ name: "Vera Muller", role: "Grandmother of the Bride" },
|
||||||
|
{ name: "Christian Els", role: "Cousin of the Bride" },
|
||||||
|
{ name: "Divan Swart", role: "Father of the Bride" },
|
||||||
|
{ name: "Louis Pietser", role: "Father of the Groom" },
|
||||||
|
{ name: "Dezelle Ras", role: "Friend" },
|
||||||
|
{ name: "Cindy Bierman", role: "Friend" },
|
||||||
|
{ name: "Ronel Gous", role: "Ronel Events and Designs & Friend" },
|
||||||
|
{ name: "Monica", role: "Rivier Plaas Wedding Venue" },
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section class="flex flex-1 items-center justify-center px-4 py-16">
|
||||||
|
<div class="w-full max-w-md">
|
||||||
|
<h1 class="font-serif text-4xl">The I-Do Crew</h1>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
Meet the legendary lineup helping us make it down the aisle at Rivier
|
||||||
|
Plaas!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Behind the Bride</h2>
|
||||||
|
<ul class="mt-4 flex flex-col gap-4">
|
||||||
|
{#each bride as person (person.name)}
|
||||||
|
<li>
|
||||||
|
<p class="text-2xl">
|
||||||
|
<span class="font-medium">{person.role}:</span>
|
||||||
|
{person.name}
|
||||||
|
</p>
|
||||||
|
<p class="text-surface-600-400 text-xl">{person.note}</p>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">Behind the Groom</h2>
|
||||||
|
<ul class="mt-4 flex flex-col gap-4">
|
||||||
|
{#each groom as person (person.name)}
|
||||||
|
<li>
|
||||||
|
<p class="text-2xl">
|
||||||
|
<span class="font-medium">{person.role}:</span>
|
||||||
|
{person.name}
|
||||||
|
</p>
|
||||||
|
<p class="text-surface-600-400 text-xl">{person.note}</p>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">The Dog-bearers</h2>
|
||||||
|
<p class="mt-2 text-2xl">Roxi & Chloe Muller</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="border-surface-300 dark:border-surface-700 mt-10 border-t pt-6">
|
||||||
|
<h2 class="font-serif text-3xl">A Special Note of Thanks</h2>
|
||||||
|
<p class="text-surface-600-400 mt-2 text-2xl">
|
||||||
|
To some very special people in our lives who have helped us make our
|
||||||
|
day magical:
|
||||||
|
</p>
|
||||||
|
<ul class="mt-4 flex flex-col gap-2">
|
||||||
|
{#each thanks as person (person.name)}
|
||||||
|
<li
|
||||||
|
class="border-surface-300 dark:border-surface-700 flex items-center justify-between border-b py-2"
|
||||||
|
>
|
||||||
|
<span class="text-2xl">{person.name}</span>
|
||||||
|
<span class="text-surface-600-400 text-lg">{person.role}</span>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
<p class="text-surface-600-400 mt-6 text-xl">
|
||||||
|
If there is anyone we have forgotten about, please know that you are
|
||||||
|
all special to us!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
Reference in New Issue
Block a user