Daybreak Ceremonies

Guide · Industry demonstration · Celebrancy

How Daybreak Ceremonies was made

The concept in three sentences. Daybreak Ceremonies is a fictional Fremantle marriage celebrant serving the coast down to Margaret River — beach and winery ceremonies at the hour the light is best, plus legals-only for elopers on the visa clock. The page has one job: get a couple to check their date. The signature is the Ceremony Builder — a runsheet drawn as a gold festoon thread strung across a twilight sky, every ceremony element a glowing bead with its honest minutes beneath, re-stringing live as the package and add-ons change.

Palette — twilight indigo, one gold thread

The romantic dark of Wave 24, argued firmly apart from its utility dark sibling (trafficmanagement's asphalt night shift) and every prior dark in the collection. Everything is Bathers Beach at last light: the sky's deep band, the festoons, the final seam of sunset.

Twilight indigo#252842 — the ground; the sky's deep band before full dark.
Moonlight#E9E6DC — the body ink; signing-table linen catching the festoons. 11.5:1 on indigo.
Ceremony gold#D4A94E — line/mark only: the thread, the beads, price rules, the CTA. Never long body text.
Horizon rose#C77B8A — the last seam of sunset: links, focus rings, the disabled-toggle reasons. 4.54:1 on indigo — a mark, not an ink.
Dim moonlight#BFBCB2 — derived secondary ink for supporting copy, 7.6:1 on the panels (the W2/W5 ink/mark split).

Type

The typographic bravery moment is the legal band's oversized italic Cormorant pull — "One month before. That's the Marriage Act, not our policy." — the trade's defining legal fact set like a wedding invitation.

The signature — a runsheet as a festoon thread

The scene is pure SVG: a banded twilight sky (layered gradients), a rose horizon seam, a flat tide, a signing table with two chairs on the sand, and two festoon poles. The thread is a single cubic-bézier path; its draw-in is a JS-driven stroke-dashoffset animation (butt caps, opacity 0 until first paint — the W15 stray-dot rule). Beads are built per state with getPointAtLength, evenly strung between 6% and 94% of the path, each carrying its element name in Mulish and its minutes in Space Mono. Ceremony chips swap the bead set (legals-only strings five beads: welcome, the legal vows, signing, witnesses, done); the unity toggle splices a bead in after the rings; the rehearsal toggle lights a second, fainter dashed thread below, labelled "days before — off the ceremony's clock". Total minutes print on the sand, summed from the beads — never asserted independently of them. The rings bead renders as two interlocked ring outlines: a second-read detail.

Rest state (the 7-second thumbnail): the thread holds two-thirds strung (drawn fraction 0.66) — beads lit through the rings, the later beads waiting at a 0.45 opacity floor with the landing pulse never dropping below 0.45. First interaction completes the thread. Dual-speed redraw (W21): the entrance earns 1,400 ms; every subsequent re-string completes in 420 ms (measured 448–449 ms wall headless). Reduced motion renders the thread complete and still. State probe: window.__celebrant with a settled flag; QA gates on state, never wall-clock.

The pricing model — shape and derivation

Pure anchor arithmetic, no derived factors: price = package + Σ(active add-ons), and minutes = Σ(bead minutes). All figures below were measured from the running page against an independently reimplemented oracle in the harness.

Bead minutes per package (unity ritual splices +5 min after the rings)
ElementLegals-onlyClassicBespoke
processional23
welcome234
your story59
vows (legal vows for legals-only)447
rings34
the legal words22
signing / witnesses / done4 + 3 + 245
presentation23
Total152537

Measured worked examples (all matched the spec's cross-derived arithmetic, zero corrections): rest state classic + rehearsal + PA = $900 + $150 + $90 = $1,140 at ~25 min; toggling the unity ritual reads $1,220 at 30 min; legals-only reads $450 at 15 min with all three toggles disabled and their reasons on the page. Bespoke measures 37 minutes — inside the pinned ~35–40 band. The builder's cheapest output ($450) equals the services grid's "ceremonies from $450" floor. The one derivation this build added: bespoke's per-bead minutes (the spec pinned only the 35–40 total), distributed with the story and vows carrying the extra weight — that is where a written-from-scratch ceremony actually spends its minutes.

Honesty mechanics: for legals-only every add-on toggle disables with its reason visible (W18 — a control must never compute a dishonest figure or silently no-op); switching back restores the remembered add-ons. The rehearsal is priced but explicitly "off the ceremony's clock" — it never inflates the runsheet minutes. The certificate fee is hedged to WA's Registry of Births, Deaths and Marriages rather than guessed; the NOIM one-month rule is stated as the Marriage Act's, because it is.

Conversion decisions

Local SEO we'd implement for the real business

This demo page ships only WebPage schema naming itself a demonstration — fictional structured data in a real index is dishonest markup. The real build would ship LocalBusiness and review schema like this:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Daybreak Ceremonies",
  "description": "Marriage celebrant for Fremantle and the south-west",
  "telephone": "+61 8 XXXX XXXX",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Fremantle",
    "addressRegion": "WA",
    "addressCountry": "AU"
  },
  "areaServed": ["Fremantle","Rockingham","Mandurah","Bunbury",
                 "Busselton","Dunsborough","Yallingup","Margaret River"],
  "priceRange": "$450–$1,350",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "5.0",
    "reviewCount": "REAL COUNT FROM THE REVIEW FEED"
  },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "REAL COUPLE, WITH PERMISSION" },
    "reviewBody": "REAL REVIEW TEXT",
    "reviewRating": { "@type": "Rating", "ratingValue": "5" }
  }]
}
</script>

What would change for the real client

Iteration log

Pass 1 — Craft

Drove the whole page headless (47 checks): rest state measured $1,140 / 25 min / drawn 0.66 against an independently reimplemented oracle; +unity $1,220 / 30 min; legals-only $450 / 15 min with all three toggles disabled, reasons visible, and a dispatched click on a disabled toggle proven inert. Empty submit on a fresh load raised 6 validation signals; filled submit confirmed in the required lexicon. The screenshot review caught what the asserts couldn't: the "≈ N min" total collided with the last bead's label in the scene's top-right corner in every package (moved to the sand, bottom-right, with a "runsheet" eyebrow); the rose horizon glow read mauve rather than "one rose seam" (ellipse shrunk, glow opacity .55→.38); and the builder-head note clipped at 375 (now hidden under 520px). Also caught: reduced-motion left the thread at 0.66 — the spec demands complete; fixed and asserted.

Pass 2 — Depth

The rings bead now renders as two interlocked ring outlines — the second-read detail. Beads land with a scale pop on a crafted cubic-bezier(.22,.9,.36,1) so the re-string reads as choreography, not a repaint. The price total tweens to its new figure over 320 ms and was asserted to land exactly ($1,220 on the card, never a rounding straggler). The multi-fault path (W9): a rapid double-toggle of unity mid-animation settles back to exactly $1,140. Dual-speed redraw measured at 448 ms wall — under the ~600 ms cap.

Pass 3 — Hardening

375 masthead first (W18/W21): wordmark right edge 233px vs call button left edge 312px — no collision, 44px tap target — then the screenshot LOOK confirmed it. Full-page 375 capture clean, scrollWidth 375. Keyboard pass (W15): Enter on a focused chip drives the builder ($450 measured), Enter opens the FAQ. The icon-only phone link under 400px gained an aria-label. Chanel rule: removed the faint rose band-line ornament in the sky. The 7-second thumbnail settle holds drawn fraction 0.66, settled, signature sharing the 1200×750 viewport with the hero (scene top at 188px). Drive-then-diff liveness passed; reduced-motion renders the thread complete; zero console errors across every page and viewport.

← Back to Daybreak Ceremonies · Collection index