STYLE.md ·
How Crate works. Every rule, written down.
Removalists and home services, as a website. It has four pieces:
- An inventory. Rooms of furniture with plus and minus buttons. As you add things, it works out the volume, the truck and the crew, and how long the job should take, including stairs and the drive between homes.
- An hourly-or-fixed price. Both prices worked out from the inventory, side by side, with the cheaper one marked. Every line is shown: the crew rate, the minimum, travel from the depot as a flat fee, the Saturday rate, and what's included.
- Arrival windows. The next fortnight as days, with each day's morning, midday and afternoon windows, the booked ones shown as booked. Picking a Saturday adds the weekend rate to the price.
- A cover chooser. Slide to what your things are worth, then compare what the business's own care covers against transit insurance, in plain words, with the cost of each.
The type is Rubik, Noto Sans and Ubuntu Mono, on warm paper with ink, one brick red and a cardboard kraft for fills. A taped carton is the mark.
Sturdy · upfront · practical
Best for
- Removalists, local and interstate. It's written to the state consumer guidance on removalists (see "Removalists: what we build in").
- Anyone who prices a job by what's in the house:
- house cleaners (Spark: rooms and extras become the team, the time and the price)
- self storage (Stackd: an inventory picks the unit size, with storage cover)
- rubbish removal, furniture delivery, piano movers, office relocations
- Audiences: people moving house who've been burnt before, anyone comparing quotes line by line, and renters who need a date and a window they can plan around.
Less suited to: a trade that quotes after a site visit only (Signal), a storage facility selling by the square metre alone, or a courier.
Personality and voice
Sturdy and plain, the crew leader who tells you the clock rules before the job starts.
- Headlines: "Moving, priced in full." · "Hourly or fixed, you choose." · "When the clock starts and stops."
- Buttons: "Price my move" · "Get a written quote" · "Send for a written quote"
- Microcopy:
- "4-tonne truck, 2 movers. About 2 h 45 min to 3 h 30 min, including 25 minutes' drive"
- "Travel from our depot, a flat fee (not on the clock) $120"
- "We'll arrive between 7–9 am on Saturday 24 Oct, and text you 30 minutes before."
- Words to avoid: "fully insured" when only the truck is, "from $99 an hour" with no minimum or travel charge, "door to door" when the clock starts at the depot, and "book now, limited spots!" pressure.
Colour
| Token | Daylight (light) | After hours (dark) | Role |
|---|---|---|---|
--paper |
#f7f2ea |
#12110f |
Page |
--card |
#ffffff |
#1c1a17 |
Inventory, price, windows, cover |
--well |
#efe7da |
#171512 |
Alternate sections |
--line |
#e0d5c4 |
#322d27 |
Hairlines |
--ink / --ink-2 |
#1c1a17 / #3f3a33 |
#f1ece4 / #d4cdc2 |
Text |
--muted |
#625b52 |
#aaa196 |
Meta, item volumes |
--brick |
#a62d1b |
#ff9b85 |
The one accent: buttons, links, the cheaper price, the chosen window and cover |
--kraft |
#d9b27c |
#e2bd88 |
Fills only: the packing tape under the lit words, the volume bar, the truck, cartons; text on it is ink |
--kraft-ink |
#7d5420 |
#e2bd88 |
Kraft as text |
--ok |
#2a6b3c |
#7fd39a |
Things that are included |
--alert |
#a62d1b |
#ff9b85 |
Invalid fields |
Measured contrast (WCAG).
- Daylight:
- ink on paper 15.6:1
- muted on paper 6.0:1 (5.5:1 on well)
- brick on paper 6.3:1 (5.7:1 on well, 5.6:1 on its soft fill), white on brick 7.0:1
- ink on kraft 8.8:1; kraft text 6.0:1 (5.4:1 on its soft fill)
- brick on the packing tape 4.2:1 (headline size only, where AA asks 3:1)
- ok 5.8:1
- After hours:
- ink 16.1:1
- muted 7.4:1 (6.8:1 on card)
- brick 9.2:1, text on brick 8.9:1, brick on its soft fill 7.9:1
- kraft text 10.7:1, ok 10.5:1
- the tape fades to 30% so the lit words keep 4.6:1 on it
- Closing card: ink-white 14.5:1, kraft em 9.7:1.
- Example dials: teal (Spark), blue (Stackd) and eucalypt green (Cartwheel) all meet AA, light and dark, and so does each closing card.
Typography
- Display: Rubik, 500–900. Headlines, prices, truck names.
- Body: Noto Sans, 400–700. Reading, forms, buttons.
- Mono: Ubuntu Mono, 400 and 700. Volumes, rates, quantities, labels.
| Token | Size | Use |
|---|---|---|
--fs-h1 |
clamp(44px, 6vw, 90px) | Page headline |
--fs-h2 |
clamp(32px, 3.8vw, 56px) | Section headline |
--fs-h3 |
21px | Card titles |
--fs-lead |
clamp(17.5px, 1.35vw, 20.5px) | Intro paragraphs |
--fs-body |
16.5px | Body |
The signature move: the lit words go brick red and a strip of kraft packing tape is pulled across under them.
Layout
- Frame: a 1200px wrap with a
max(20px, 4vw)gutter. An ink top line with a kraft label; a sticky header with the carton mark; a tall kraft box leaning behind the hero (hidden on phones). - Hero: copy on the left; the inventory on the right.
- Then: the price beside the arrival windows; when the clock starts and stops; the cover chooser beside the plain-words notices; straight answers; and a dark closing card with a stack of cartons that wobbles.
Shape
- Sturdy:
--r-s8px,--r-m12px,--r-l18px. Cards sit on a soft shadow with a hairline. - The truck: drawn in CSS, a kraft box body that grows with the truck size, a brick cab and two wheels. Storage uses a roller-door unit instead (
.truck-pic.unit). - The mark: a carton with a strip of tape.
Motion language
- Inventory: the volume bar fills and the truck body stretches as you add things.
- Price: the cheaper option is outlined in brick.
- Elsewhere: the tape is pulled across under the headline, the closing card's top carton wobbles, 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 tape, the bar, the truck and the wobble. - After hours switch (
[data-theme-toggle]), remembered assite-theme;theme-colorfollows.
Imagery and illustration
Your own crew and trucks, at work, in uniform. The template draws trucks and cartons so nothing is borrowed. No invented reviews, "5-star" badges or before-and-after photos you didn't take.
Signature components
- Inventory:
.inventory[data-inventory]withdata-trucks(JSON rows of capacity, name and crew),data-crew-word,data-noun,data-vol-unit,data-passes(2 for load and unload, 1 for cleaning), and optionaldata-truck-line,data-sub(with{truck},{crew},{word},{vol},{cap},{pct}) anddata-empty, containing:button[data-show-room]and.inv-room[data-room]panels.itemwithdata-volanddata-mins, each withbutton[data-q="1"],button[data-q="-1"]and anoutput- optional
input[data-drive]with[data-drive-out], andinput[data-stairs](data-stairs-factoron the inventory, 1.25 by default) [data-vol-out],.vol .bar i,.truck-pic,[data-truck-name]and[data-truck-sub]
- Price:
.pricing[data-pricing]withdata-for(the inventory),data-slots(the windows),data-rates(JSON of crew size to hourly rate),data-min,data-callout,data-weekend-extra,data-included, and optionaldata-crew-lineanddata-callout-label, containinginput[data-weekend],[data-opt-hourly] [data-hourly],[data-opt-fixed] [data-fixed],[data-verdict]and[data-pr-lines]. Fixed is the top of the hourly range plus 5%, rounded up to $10. - Arrival windows:
.slots[data-slots]withscript[data-slots-data](days,closedweekdays,windowsas label and note,bookedAheadas day offset and window),[data-days],[data-wins]and[data-slot-msg]. - Cover:
.cover[data-cover]withinput[data-declared]and[data-declared-out], radios withdata-rate(a percentage) anddata-min, ordata-flat(anddata-zerofor its label at $0), each withdata-says(with{cost}and{value}), and[data-cover-out]. - Supporting pieces:
.plan-pair,.card,.facts(--ncolumns, or.stack),.notice,.side-box,.checks,.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 brick-soft pill. - Inner pages:
.page-head(a taped carton in the corner),.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:
inventory(vol, crew, truck, low, high, items),pricing(hourlyLow, hourlyHigh, fixed),slot(date, dow, window),cover(declared, cost). - Helper:
Crate.refresh(root).
Removalists: what we build in
We checked these against the NSW, Queensland and WA consumer guidance on removalists in October 2026:
- A written, itemised quote. NSW Fair Trading says to get a written quote that's itemised so every charge can be explained, and WA's Consumer Protection asks for the terms and either an hourly rate or a fixed price. The price explainer shows both, with every line, and the forms ask for a written quote rather than booking on the spot.
- When the clock starts and stops. Queensland suggests asking where the journey's cost starts and ends. The template answers it on the page: from your door to the last item in place, with depot travel as a flat fee and breaks not charged.
- Insurance in plain words. Removalists aren't required to insure your goods and most insure only their vehicles, so the cover chooser says what the business's own care covers, what it doesn't, and what transit insurance costs, and the copy suggests checking your home and contents policy and asking for a certificate of currency. A quote never says the business accepts no responsibility; WA says it will act on such clauses.
- Nothing upfront. WA says not to pay upfront and Queensland calls upfront payments risky, so the templates take no deposit and payment is due when the job's done, never part-way through.
- Storage and delays. Storage charges and the cost of holding goods if moving day slips are stated before you book.
- No card surcharges. Surcharging on eftpos, Mastercard and Visa ended on 1 October 2026.
These notes are design guidance, not legal or insurance advice.
Do and don't
- Do show the minimum, the travel charge and what's included next to every rate.
- Do say when the clock starts and stops.
- Do say plainly that most removalists insure only their trucks.
- Don't ask for payment upfront or part-way through.
- Don't say "fully insured" or use invented reviews.
- Don't put text on kraft in anything but ink.
Accessibility
- AA contrast throughout (measured above), a skip link and a 3px focus ring.
- Inventory: every plus and minus button names its item, each count is announced, rooms are a segmented control, and the volume, truck and time are announced politely.
- Price: both prices and the verdict are announced; the lines are a list.
- Arrival windows: days and windows are buttons with full spoken dates, closed days and booked windows are disabled and say so, and focus stays on what you chose.
- Cover: a labelled slider and a radio group; the explanation is announced.
- 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 Daylight and After hours.
How to make it yours
| Dial | Range |
|---|---|
| Accent | Brick (default), teal (Spark), blue (Stackd), eucalypt green (Cartwheel). Set --brick, --brick-2, --brick-soft, --focus (plus --on-brick at night), --close-bg and --close-em. |
| Inventory | Your rooms and items, with your own volumes and handling minutes. |
| Trucks | Your fleet: capacity, name and crew for each truck (or your teams, or your unit sizes). |
| Price | Your rates by crew size, minimum hours, depot fee and Saturday rate. |
| Windows | Your arrival windows, closed days and booked slots. |
| Cover | Your insurer's rates and what your own care covers. |
| Not negotiable | Every charge shown, the clock rules, plain words on insurance, nothing upfront, no card surcharges, and the Motion switch. |



