From 966140415dfb3bae8c99dcee687b2f2760c0e8c0 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Fri, 7 Nov 2025 13:57:24 +0000
Subject: [PATCH 01/12] Update sponsorship prices
---
src/routes/sponsorship/+page.svelte | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/routes/sponsorship/+page.svelte b/src/routes/sponsorship/+page.svelte
index 18ea41c..00ed975 100644
--- a/src/routes/sponsorship/+page.svelte
+++ b/src/routes/sponsorship/+page.svelte
@@ -3,9 +3,9 @@
import { pageTitle } from '../../stores.js';
let refreshmentPackages = [
- { title: 'Breakfast', price: 'TBC', claimed: false },
- { title: 'Morning break', price: 'TBC', claimed: false },
- { title: 'Afternoon break', price: 'TBC', claimed: false }
+ { title: 'Breakfast', price: '£250', claimed: false },
+ { title: 'Morning break', price: '£250', claimed: false },
+ { title: 'Afternoon break', price: '£250', claimed: false }
];
let extraOptions = [
@@ -44,7 +44,7 @@
Your logo on the opening & closing slides
We'll thank you on our social media
- TBC
+ £600
Exhibitor
@@ -54,7 +54,7 @@
Custom promotional posts from our social media accounts
Anything else we can do.. chat to us!
- TBC
+ £1700
From d623eafdb9639733c05ddb0fbd085604db90f555 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 13:42:05 +0000
Subject: [PATCH 02/12] Reenable sponsorship page on nav
---
src/lib/Navbar.svelte | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lib/Navbar.svelte b/src/lib/Navbar.svelte
index e26b0bd..9596f11 100644
--- a/src/lib/Navbar.svelte
+++ b/src/lib/Navbar.svelte
@@ -11,7 +11,7 @@
let navItems = [
{ text: 'Home', href: '/', hidden: false },
{ text: 'About', href: '/about', hidden: false },
- { text: 'Sponsorship', href: '/sponsorship', hidden: true },
+ { text: 'Sponsorship', href: '/sponsorship', hidden: false },
{ text: 'Event Venue', href: '/venue', hidden: true },
{ text: 'Room map', href: '/venue-layout', hidden: true },
{ text: 'New Speakers Workshop', href: '/new-speakers-workshop', hidden: true },
From 6514f18c83db4f75f5ce97ac08eab8c472e659ff Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 13:47:04 +0000
Subject: [PATCH 03/12] Small tweak to sponsorship sentence order
---
src/routes/sponsorship/+page.svelte | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/routes/sponsorship/+page.svelte b/src/routes/sponsorship/+page.svelte
index 00ed975..2214890 100644
--- a/src/routes/sponsorship/+page.svelte
+++ b/src/routes/sponsorship/+page.svelte
@@ -25,11 +25,14 @@
Sponsorship opportunities
+
+ Our event is entirely funded by sponsorship and would not be possible without our wonderful
+ sponsors.
+
We are looking for sponsors for DDD South West 2026. If you or your company would like to
become a sponsor please email us.
- We have various options available, or we can arrange a custom package for you. Our event is entirely
- funded by sponsorship and would not be possible without our wonderful sponsors.
+ We have various options available, or we can arrange a custom package for you.
From b6ff586f6c8b93d8471274973628c8b402968991 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 13:56:01 +0000
Subject: [PATCH 04/12] Update Timeline
---
src/routes/+page.svelte | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index df55ec4..0d26027 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -57,42 +57,41 @@
Timeline
-
Coming soon...
-
+ driven ❤️
From 563a9af8bb3d12eba5eafe44413609f776b533f0 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 14:00:02 +0000
Subject: [PATCH 05/12] Move Timeline to component
---
src/lib/Timeline.svelte | 74 ++++++++++++++++++++++++++++++++++++++++
src/routes/+page.svelte | 75 ++---------------------------------------
2 files changed, 76 insertions(+), 73 deletions(-)
create mode 100644 src/lib/Timeline.svelte
diff --git a/src/lib/Timeline.svelte b/src/lib/Timeline.svelte
new file mode 100644
index 0000000..4b9c19c
--- /dev/null
+++ b/src/lib/Timeline.svelte
@@ -0,0 +1,74 @@
+Timeline
+
+
+ circle
+ 31st January
+ Call for speakers opens
+
+
+ circle
+ 7th March
+ Call for speakers closes
+
+
+ circle
+ 14th March
+ Session voting opens
+
+
+ circle
+ 28th March
+ Session voting closes
+
+
+ circle
+ 18th April
+ Schedule announced and
ticket registration opens
+
+
+ circle
+ 16th May
+ Day of the event!
+
+
+We'll try our best to keep to these dates but please be patient - DDDSW is entirely volunteer
+ driven ❤️
+
+
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 0d26027..f6f7883 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -4,6 +4,7 @@
import Sponsors from '$lib/Sponsors.svelte';
import type { KeyPoint } from '../types/KeyPoint.type';
import { pageTitle } from '../stores.js';
+ import Timeline from '$lib/Timeline.svelte';
pageTitle.set('DDD South West');
@@ -56,78 +57,6 @@
-
Timeline
-
-
- circle
- 31st January
- Call for speakers opens
-
-
- circle
- 7th March
- Call for speakers closes
-
-
- circle
- 14th March
- Session voting opens
-
-
- circle
- 28th March
- Session voting closes
-
-
- circle
- 18th April
- Schedule announced and
ticket registration opens
-
-
- circle
- 16th May
- Day of the event!
-
-
-
We'll try our best to keep to these dates but please be patient - DDDSW is entirely volunteer
- driven ❤️
+
-
-
From 8b4c5d214812e0cb041ec2a3eaa7be39c9b7aecb Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 16:54:42 +0000
Subject: [PATCH 06/12] Add milestones
---
src/lib/milestones.ts | 68 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 src/lib/milestones.ts
diff --git a/src/lib/milestones.ts b/src/lib/milestones.ts
new file mode 100644
index 0000000..cc0f998
--- /dev/null
+++ b/src/lib/milestones.ts
@@ -0,0 +1,68 @@
+enum Status {
+ Done,
+ NotYet,
+ JustYouWait
+}
+
+export enum Milestone {
+ StartPlanning,
+ SetADate,
+ OpenCallForSpeakers,
+ CloseCallForSpeakers,
+ OpenSessionVoting,
+ CloseSessionVoting,
+ AnnounceScheduleAndOpenTicketRegistration,
+ SoldOut,
+ FoundMoreTickets,
+ TheActualEventDay,
+ ConkedOut
+}
+
+export class MilestoneDetails {
+ hasHappened: boolean;
+ formattedDate?: string;
+ targetDate?: Date;
+
+ constructor(status: Status.Done | Status.NotYet);
+ constructor(status: Status, date: string);
+ constructor(status: Status, date?: string) {
+ if (date) {
+ this.targetDate = new Date(date);
+
+ const formatter = new Intl.DateTimeFormat(undefined, { dateStyle: 'long' });
+ this.formattedDate = formatter.format(this.targetDate);
+ }
+ if (status === Status.JustYouWait) this.hasHappened = this.targetDate!.valueOf() < Date.now();
+ else this.hasHappened = status === Status.Done;
+ }
+
+ willBeHappeningSoon(): boolean {
+ if (!this.targetDate || this.hasHappened) return false;
+
+ const now = new Date();
+ const oneMonthFromNowTimestamp = now.setMonth(now.getMonth() + 1);
+
+ return this.targetDate.getTime() < oneMonthFromNowTimestamp;
+ }
+}
+
+export function get(doneThing: Milestone): MilestoneDetails | undefined {
+ return milestones.get(doneThing);
+}
+
+const milestones = new Map([
+ [Milestone.StartPlanning, new MilestoneDetails(Status.Done)],
+ [Milestone.SetADate, new MilestoneDetails(Status.Done)],
+ [Milestone.OpenCallForSpeakers, new MilestoneDetails(Status.NotYet, '2026-01-31')],
+ [Milestone.CloseCallForSpeakers, new MilestoneDetails(Status.JustYouWait, '2026-03-07')],
+ [Milestone.OpenSessionVoting, new MilestoneDetails(Status.NotYet, '2026-03-14')],
+ [Milestone.CloseSessionVoting, new MilestoneDetails(Status.JustYouWait, '2026-03-28')],
+ [
+ Milestone.AnnounceScheduleAndOpenTicketRegistration,
+ new MilestoneDetails(Status.NotYet, '2026-04-18')
+ ],
+ [Milestone.SoldOut, new MilestoneDetails(Status.NotYet)],
+ [Milestone.FoundMoreTickets, new MilestoneDetails(Status.NotYet)],
+ [Milestone.TheActualEventDay, new MilestoneDetails(Status.JustYouWait, '2026-05-16')],
+ [Milestone.ConkedOut, new MilestoneDetails(Status.JustYouWait, '2026-05-17')]
+]);
From 77496871d3507156b01cf48e2866a6f291de6b48 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 15:22:43 +0000
Subject: [PATCH 07/12] Control timeline through milestones
---
src/lib/Timeline.svelte | 64 ++++++++++++++++++++++-------------------
1 file changed, 34 insertions(+), 30 deletions(-)
diff --git a/src/lib/Timeline.svelte b/src/lib/Timeline.svelte
index 4b9c19c..bc285da 100644
--- a/src/lib/Timeline.svelte
+++ b/src/lib/Timeline.svelte
@@ -1,35 +1,39 @@
+
+
Timeline
-
- circle
- 31st January
- Call for speakers opens
-
-
- circle
- 7th March
- Call for speakers closes
-
-
- circle
- 14th March
- Session voting opens
-
-
- circle
- 28th March
- Session voting closes
-
-
- circle
- 18th April
- Schedule announced and
ticket registration opens
-
-
- circle
- 16th May
- Day of the event!
-
+ {#each timelineItems as item}
+
+
+ {#if item.milestone.hasHappened}
+ check_circle
+ {:else}
+ circle
+ {/if}
+
+ {item.milestone.formattedDate}
+ {item.description}
+
+ {/each}
We'll try our best to keep to these dates but please be patient - DDDSW is entirely volunteer
From 72e8dd953c05eb0657a0219cc188de3ff2311c2c Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 16:06:47 +0000
Subject: [PATCH 08/12] Trigger updates on milestones
---
src/lib/LatestUpdate.svelte | 94 ++++++++++++++-----------------------
1 file changed, 34 insertions(+), 60 deletions(-)
diff --git a/src/lib/LatestUpdate.svelte b/src/lib/LatestUpdate.svelte
index 76a90d8..72f0bd8 100644
--- a/src/lib/LatestUpdate.svelte
+++ b/src/lib/LatestUpdate.svelte
@@ -1,70 +1,44 @@
{#if currentUpdate}
@@ -72,7 +46,7 @@
Latest update
- {@html currentUpdate.content}
+ {@html currentUpdate}
From 7771e981af3c07a68bea79f9bd1d53779c87a717 Mon Sep 17 00:00:00 2001
From: Sara Gowen <9001998+dynamictulip@users.noreply.github.com>
Date: Sat, 8 Nov 2025 22:08:40 +0000
Subject: [PATCH 09/12] Pull latest update markup back into header
---
src/lib/Header.svelte | 7 ++-
src/lib/LatestUpdate.svelte | 88 -------------------------------------
src/lib/latestUpdate.ts | 52 ++++++++++++++++++++++
src/routes/+page.svelte | 38 ++++++++++++++--
4 files changed, 93 insertions(+), 92 deletions(-)
delete mode 100644 src/lib/LatestUpdate.svelte
create mode 100644 src/lib/latestUpdate.ts
diff --git a/src/lib/Header.svelte b/src/lib/Header.svelte
index b682c76..ed07ffc 100644
--- a/src/lib/Header.svelte
+++ b/src/lib/Header.svelte
@@ -2,6 +2,7 @@
import Navbar from '$lib/Navbar.svelte';
// import Carousel from '$lib/Carousel.svelte';
import { pageTitle, navExpanded } from '../stores.js';
+ import { currentUpdate } from './latestUpdate.js';
function toggleNav() {
if ($navExpanded === true) {
@@ -29,7 +30,11 @@
DDD South West 2026
-
Coming soon...
+ {#if currentUpdate}
+
+ {@html currentUpdate}
+
+ {/if}
diff --git a/src/lib/LatestUpdate.svelte b/src/lib/LatestUpdate.svelte
deleted file mode 100644
index 72f0bd8..0000000
--- a/src/lib/LatestUpdate.svelte
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-{#if currentUpdate}
-
-
-
Latest update
-
- {@html currentUpdate}
-
-
-
-{/if}
-
-
diff --git a/src/lib/latestUpdate.ts b/src/lib/latestUpdate.ts
new file mode 100644
index 0000000..ae6be9a
--- /dev/null
+++ b/src/lib/latestUpdate.ts
@@ -0,0 +1,52 @@
+import { Milestone, get } from '$lib/milestones';
+
+const linkedInIcon = `
+
+ DDD South West LinkedIn
+ `;
+
+const sessionizeUrl = 'https://sessionize.com/ddd-south-west-2026/';
+const votingUrl = 'https://buff.ly/4hzncRk';
+const ticketTailorUrl = '...';
+const pocketdddUrl = 'https://pocket2026.dddsouthwest.com';
+
+export let currentUpdate: string | undefined;
+
+if (get(Milestone.StartPlanning)?.hasHappened)
+ currentUpdate = `DDD South West 2026 planning has begun! More info coming soon 😎`;
+
+if (get(Milestone.SetADate)?.hasHappened)
+ currentUpdate = `DDD South West is coming... save the date! See you on the ${get(Milestone.TheActualEventDay)?.formattedDate}`;
+
+if (get(Milestone.OpenCallForSpeakers)?.willBeHappeningSoon())
+ currentUpdate = `Watch this space.... call for speakers is opening on ${get(Milestone.OpenCallForSpeakers)!.formattedDate}.`;
+
+if (get(Milestone.OpenCallForSpeakers)?.hasHappened)
+ currentUpdate = `Call for speakers is open until ${get(Milestone.CloseCallForSpeakers)!.formattedDate}.
+ We are a friendly developers conference and welcome papers from speakers both old and new.
+ So whether you have an established talk you'd like to bring to Bristol or an idea you'd like help developing,
+ submit your talk now.`;
+
+if (get(Milestone.CloseCallForSpeakers)?.hasHappened)
+ currentUpdate = `Call for speakers is now closed. Session voting will be opening soon, watch this space or follow us on ${linkedInIcon}`;
+
+if (get(Milestone.OpenSessionVoting)?.hasHappened)
+ currentUpdate = `Session voting is now open! Take a look and vote for your favourites here.
Voting will close on ${get(Milestone.CloseSessionVoting)!.formattedDate}.`;
+
+if (get(Milestone.CloseSessionVoting)?.hasHappened)
+ currentUpdate = `Session voting has closed, hold tight - ticket registration will be opening on ${get(Milestone.AnnounceScheduleAndOpenTicketRegistration)!.formattedDate}`;
+
+if (get(Milestone.AnnounceScheduleAndOpenTicketRegistration)?.hasHappened)
+ currentUpdate = `Speakers have been announced and the schedule is live! Check full schedule details here. Get your tickets from Ticket Tailor.`;
+
+if (get(Milestone.SoldOut)?.hasHappened)
+ currentUpdate = `The day is fast approaching, we're fully sold out but you can still join the waitlist on Ticket Tailor.`;
+
+if (get(Milestone.FoundMoreTickets)?.hasHappened)
+ currentUpdate = `Good news - some tickets have become available! Go to Ticket Tailor to grab one before they go.`;
+
+if (get(Milestone.TheActualEventDay)?.hasHappened)
+ currentUpdate = `Today is the day! See you at Engine Shed and be sure to use Pocket DDD to give feedback to our wonderful speakers`;
+
+if (get(Milestone.ConkedOut)?.hasHappened)
+ currentUpdate = `Thank you to everyone for another great DDD South West. See you in ${get(Milestone.ConkedOut)!.targetDate!.getFullYear() + 1} 😉`;
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index f6f7883..08f20e4 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,6 +1,5 @@