STYLE.md ·
How Waypoint works. Every rule, written down.
Tour and experience operators, as a website. It has four pieces:
- Departures. The coming dates as a list, each with its seats left as a bar, and whether it's guaranteed to run, still needs a few more people, or is full. Pick one and it says, in a sentence, what happens if the date doesn't reach its minimum.
- A fare builder. Adults, children, concessions and under-4s, add-ons capped at the number of people who can take them, and every mandatory per-person charge (a park fee, a reef tax) as its own line, all in one total. It warns when you've added more people than the date has seats.
- A day plan. The day hour by hour, with numbered pins along a dashed route and the stops listed beside the times, an activity grade out of five, and tabs for multi-day trips.
- A fit check. Yes-or-no questions that turn into plain advice: how the tour adapts, what support you'll get, and what to tell the crew. It's never a test you can fail.
The type is Alegreya, Alegreya Sans and Anonymous Pro, on map paper with ink, one route violet and a sea-glass green for fills. A compass is the mark.
Inviting · organised · reassuring
Best for
- Tour operators of every kind: day tours, cruises, multi-day walks. It's written to the consumer law on single prices and cancellations, and the industry template to the Great Barrier Reef's charge and Queensland's snorkelling safety rules (see "Tours: what we build in").
- Anyone selling a place on a date:
- whale watching and boat cruises (Humpback Bay: adults, children and free under-4s, a whale promise)
- guided multi-day walks (Overland: places left, the single supplement, three days hour by hour, a fitness check)
- food and wine tours, cooking classes, workshops, retreats, adventure activities
- Audiences: travellers comparing the whole price, families working out who's free, and people who want to know whether a tour suits them before they pay.
Less suited to: a hotel (Turndown), a venue hired by the date (Garland), or a ticketed festival with seat maps.
Personality and voice
Inviting and organised, the guide who's done this a thousand times and still loves it.
- Headlines: "A day in the Barossa, planned." · "One price, everything in it." · "The day, hour by hour."
- Buttons: "Choose a date" · "See the day" · "Send the booking"
- Microcopy:
- "8 of 11 seats left · Needs 1 more to run"
- "Reef tax (Environmental Management Charge), 3 × $8.50, set by the Marine Park Authority"
- "You'll wear a red snorkel so the crew can spot you at a glance. This isn't a test you can fail."
- Words to avoid: "from $99*" with fees added at checkout, "only 2 left!" when it isn't true, "non-refundable" where the law says otherwise, and "suitable for all fitness levels" when day two has a 300 m climb.
Colour
| Token | Day out (light) | Night sky (dark) | Role |
|---|---|---|---|
--paper |
#f3f1ea |
#0f1319 |
Page |
--card |
#fffefb |
#171c24 |
Departures, the fare, the fit check |
--well |
#e9e6dc |
#12161d |
Alternate sections, date chips |
--line |
#d9d4c6 |
#2a313c |
Hairlines |
--ink / --ink-2 |
#1a2230 / #39414f |
#eef0f4 / #cfd4dc |
Text |
--muted |
#575e6a |
#9aa2ae |
Meta, seats left |
--route |
#3b3fa8 |
#aeb2ff |
The one accent: buttons, links, the chosen date, the route and pins |
--sea |
#8fd3c1 |
#8fd3c1 |
Fills only: seats bars, grade dots, contour lines, the fare panel; text on it is ink |
--sea-ink |
#1f6b5c |
#8fd3c1 |
Sea-glass as text |
--ok |
#24704a |
#79d0a0 |
Guaranteed departures |
--alert |
#b3261e |
#ff9a90 |
Full dates, invalid fields, too many travellers |
Measured contrast (WCAG).
- Day out:
- ink on paper 14.1:1
- muted on paper 5.3:1 (5.2:1 on well)
- route on paper 7.6:1 (6.8:1 on well and on its soft fill), white on route 8.5:1
- ink on sea 9.3:1; sea-ink text 5.6:1 (5.3:1 on its soft fill)
- ok 5.3:1, alert 5.8:1
- Night sky:
- ink 16.3:1
- muted 7.2:1 (6.6:1 on card)
- route 9.4:1, text on route 9.0:1, route on its soft fill 7.9:1
- sea 10.9:1, ok 10.1:1, alert 9.1:1
- Closing card: text 14.7:1, sea em 9.8:1, ink on its sea button 9.3:1.
- Example dials: ocean (Humpback Bay), forest (Overland) and reef teal (Reefline) all meet AA, light and dark, and so does each closing card.
Typography
- Display: Alegreya, 500–900 with italics. Headlines, dates, totals.
- Body: Alegreya Sans, 400–800. Reading, forms, buttons.
- Mono: Anonymous Pro, 400 and 700. Times, seats, prices in lists, labels.
| Token | Size | Use |
|---|---|---|
--fs-h1 |
clamp(46px, 6.4vw, 96px) | Page headline |
--fs-h2 |
clamp(34px, 4vw, 58px) | Section headline |
--fs-h3 |
22px | Card titles |
--fs-lead |
clamp(17.5px, 1.35vw, 20.5px) | Intro paragraphs |
--fs-body |
17.5px | Body (Alegreya Sans runs small) |
The signature move: the lit words turn italic and route violet, and a dashed route draws itself underneath them to a pin.
Layout
- Frame: a 1200px wrap with a
max(20px, 4vw)gutter. An ink top line with a sea-glass label; a sticky header with the compass; contour lines rising behind the hero (hidden on phones). - Hero: copy on the left; the departures on the right.
- Then: the fare beside the fit check; the day plan; what's included and what isn't; questions; and a night-blue closing card with contour rings and a pin that bobs on them.
Shape
- Soft:
--r-s6px,--r-m12px,--r-l20px. Cards sit on a soft shadow with a hairline. - Pins: drawn in CSS, a rounded teardrop with a hole, for the tag, the page heads, the day plan and the fit check's advice.
- The mark: a compass, a sea-glass face with a route-violet needle.
Motion language
- Departures: seats bars fill; the chosen date fills its chip.
- Fare: the total slides in when anything changes.
- Day plan: the route fills to the chosen pin.
- Elsewhere: the route draws under the headline, the closing card's pin bobs, sections reveal with a 14px rise over 650ms, and the phone menu drops in.
- Motion switch in the footer (
[data-motion-toggle],html.calm, remembered assite-motion, with the default fromprefers-reduced-motion). Calm stops the route, the bars, the fill and the bob. - Night sky switch (
[data-theme-toggle]), remembered assite-theme;theme-colorfollows.
Imagery and illustration
Your own photos from your own tours, with your guests' permission: the place, the guides, the group size as it really is. The template draws maps and pins so nothing is borrowed. No invented reviews, "as seen on" badges or stock photos of somewhere else.
Signature components
- Departures:
.departures[data-departures]containingscript[data-dep-data](cap,min,unit,time,show,pick, optionalgoandneedsentences, anddepsas rows of day offset, seats booked and an optional note),[data-dep-list],[data-dep-more]and[data-dep-msg]. Each date renders asbutton.dep.go|need|full. - Fare builder:
.fare[data-fare]withdata-for(the departures) anddata-unit, containing:.trav[data-price]rows (optionaldata-min,data-max), each with.tr-name,button[data-q]and anoutput.addon[data-price][data-cap]rows (peopleorpaying), the same shapescript[data-fare-charges]rows of label, amount, who pays (all,payingorbooking) and a note[data-fare-lines],[data-fare-total],[data-fare-per]and[data-fare-warn]
- Day plan:
.dayplan[data-dayplan]withbutton[data-show-day]tabs and.dp-day[data-day]panels, each with.grade(--gout of 5),.dp-lineholdingbutton.dp-pin(--xalong the line) and.dp-stops > li(.dp-at,h4,p,.dp-meta). - Fit check:
.fitcheck[data-fitcheck]containingscript[data-fit-data](adviceas key to title and text, and thestart,someandnonelines),fieldset.fit-q[data-q]with yes and no radios carryingdata-adds(comma-separated keys),[data-fit-head]and[data-fit-out]. - Supporting pieces:
.plan-pair,.incl(.checksand.nots),.card,.facts,.notice,.side-box,.faq,.close-card(--close-bg,--close-em).
Multi-page kit
- Phone menu:
.menu-btn[aria-controls]opens.site-menu. Escape, an outside click or choosing a link closes it, and Tab stays inside while it's open. - Current page:
aria-current="page", shown as a route-soft pill. - Inner pages:
.page-head(contour rings and a dropped pin),.crumbs, a.tagand a smaller.h1. - Fields:
.field,.fields,.field-wide,fieldset.field-set,.check,.form-card,[aria-invalid="true"];form[data-template]. - Tiles, segmented control, gate, slider, switch, tables:
.choices,.seg,[data-gate],input.range,.switch[role=switch],.table. - Events:
departure(date, left, guaranteed, label, time),fare(people, paying, total, over),stop(day, index),fit(flags, answered, total). - Helper:
Waypoint.refresh(root), andWaypoint.last, the latest detail of each event, for scripts that load afterwards.
Tours: what we build in
We checked these for Australian operators in October 2026:
- One total price. Under the Australian Consumer Law a price shown in parts needs a single total at least as prominent, so the fare puts every mandatory charge in the total and shows it as a line, never added at checkout.
- The reef tax. Visitors on tourism trips in the Great Barrier Reef Marine Park pay the Environmental Management Charge: $8.50 a person for a full day (three hours or more) and $4.25 for a part day, rising to $9.00 and $4.50 from 1 April 2027. Under-4s are exempt only when they travel free, which is exactly how the fare counts them.
- Snorkeller safety. Queensland's Safety in Recreational Water Activities Regulation 2024 and its code of practice require medical advice for every snorkeller, headcounts and a lookout, and ask operators to identify people who may be at risk (45 and over, medical conditions, weak swimmers, people who don't speak English well) so supervision can be planned around them: red snorkels, flotation, staying near the lookout or a guide. The fit check asks exactly that, and says it guides supervision rather than turning people away.
- When a tour doesn't run. Minimum numbers are shown on every date, and the copy says what happens if a date falls short or the weather turns: another date or a full refund. Consumer guarantees apply on top.
- No card surcharges. Surcharging on eftpos, Mastercard and Visa ended on 1 October 2026.
These notes are design guidance, not legal or safety advice.
Do and don't
- Do show seats left and the minimum to run on every date.
- Do put every mandatory charge in the total, as its own line.
- Do say how the tour adapts to people, before they ask.
- Don't invent scarcity, reviews or "as seen on" badges.
- Don't call a hard day "suitable for everyone".
- Don't put text on sea-glass in anything but ink.
Accessibility
- AA contrast throughout (measured above), a skip link and a 3px focus ring.
- Departures: each date is a button with its status in words; full dates are disabled and say so; the chosen date's consequences are announced.
- Fare: every plus and minus button names who it adds, each count and the total are announced, and the over-capacity warning is a status message.
- Day plan: pins are buttons named with their time and stop; the list carries the same content, so the line is never needed to understand the day.
- Fit check: each question is a fieldset with a legend and two labelled radios; the advice is announced as it changes.
- Forms: labelled fields, errors listed in an alert, linked to and marked on each field.
- Testing: responsive to 360px, and tested with motion on and off, in Day out and Night sky.
How to make it yours
| Dial | Range |
|---|---|
| Accent | Route violet (default), ocean (Humpback Bay), forest (Overland), reef teal (Reefline). Set --route, --route-2, --route-soft, --focus (plus --on-route at night), --close-bg and --close-em. |
| Departures | Your dates and bookings from your booking system, capacity and minimum to run. |
| Fare | Your traveller types and prices, add-ons, and the charges your area sets. |
| Day plan | Your stops, times, distances and grade. |
| Fit check | Your questions and what you'll do for each answer. |
| Not negotiable | Real seats left, every charge in the total, honest grades, the fit check's tone, no card surcharges, and the Motion switch. |



