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 @@