STYLE.md ·
How Contact works. Every rule, written down.
The photographer as a website: a contact sheet of film strips whose frames develop from negative to positive, open in a loupe and get circled with a yellow china marker; a coverage planner where a bracket slides and stretches along the day's timeline to show what's in and what's missed; and a calendar that answers "is my date free?". Gilda Display, Karla and Overpass Mono on proof-paper white with ink black, and no colour but the marker.
Quiet · honest · exact
Best for
- Wedding, elopement and portrait photographers: whole rolls instead of a highlight reel, hours planned against the day's moments, packages, dates, and plain words on who owns the photos (see "Photographers: what we build in")
- Anyone who sells time against someone's day or project, with a body of work to look through: wedding bands and DJs (Night Owls, the night's moments), architects (Formwork, project stages in months), videographers, celebrants, event stylists, hire companies
- Audiences: people comparing a few suppliers closely, who want to see real sequences, know what they're paying for and whether their date is free
Less suited to: bright retail (Polish, Pebble); clinical services (Remedy, Lucent); anything that needs a lot of colour.
Personality and voice
Quiet and honest, like a good photographer at the first coffee: here's a whole roll, here's what six hours gets you and what it misses, and the photos are yours.
- Headlines: "Your day, as it was." · "How many hours, which moments." · "Is your date free?" · "Yours to keep, in writing."
- Buttons: "Check your date" · "Circle it" · "Send the enquiry" · "Portfolio"
- Microcopy: "Tap a frame for the loupe; circle the keepers." · "Missed: speeches, first dance." · "Free dates can be held for a week."
Colour
| Token | Proof (light) | Darkroom (dark) | Role |
|---|---|---|---|
--paper |
#f5f4f0 |
#0e0b0a |
Proof paper; the darkroom |
--card |
#ffffff |
#181311 |
Cards, the planner, calendar days |
--well |
#ebe9e3 |
#130f0e |
Alternate sections |
--line |
#d8d5cc |
#33291f |
Hairlines |
--ink / --ink-2 |
#141414 / #3a3a38 |
#efe7df / #d2c7bc |
Text, buttons, booked days |
--muted |
#5d5c58 |
#a89d93 |
Labels |
--marker |
#f5c400 |
#ffcf33 |
The only colour: circles, the swiped promise, the coverage bracket; always under ink text, never text itself in Proof |
--safelight |
#c2301f |
#ff6a4d |
The darkroom glow on the closing card (decoration) |
--film, --edge |
#1b1916, #e9b35c |
same | The strip and its edge print |
--tone-1…6 |
six greys, warm | same | The prints |
Measured contrast (WCAG): ink on paper 16.7:1 · muted on paper 6.1:1 (on well 5.5:1) · ink on the marker 11.2:1 · paper on ink 16.7:1. Darkroom: ink 16.0:1 · muted 7.4:1 (on card 6.9:1) · ink on the marker 12.5:1 · safelight 6.9:1. Example markers: stage pink (Night Owls) and timber (Formwork) carry ink text at 7:1 or better; eucalyptus mint (Silver Gum) 11.5:1.
Typography
- Display: Gilda Display 400: a calm, high-contrast serif for headlines, names and prices.
- Body: Karla 400–700: plain and warm.
- Labels, frame numbers, times: Overpass Mono 400–700, in caps with wide tracking; buttons too.
| Token | Size | Use |
|---|---|---|
--fs-h1 |
clamp(46px, 6.6vw, 104px) | Page headline |
--fs-h2 |
clamp(34px, 4.4vw, 64px) | Section headline |
--fs-h3 |
22px | Card titles |
--fs-lead |
clamp(17.5px, 1.35vw, 20.5px) | Intro paragraphs |
--fs-body |
17px | Body |
--fs-label |
11.5px Overpass Mono, caps | Eyebrows after a film frame, with the number on the marker (GL·01) |
The signature move: the promise at the end of a headline is swiped with the marker, slightly askew, like a note on a contact sheet. In Darkroom it becomes marker-yellow text with a thin underline.
Layout
- 1240px wrap, gutter
max(20px, 4vw). An ink top line with a marker label; a sticky header ruled in ink with mono caps links. - Hero: copy left, the contact sheet right. Then the coverage planner, packages, the calendar, a dark "your photos" band, visit facts and FAQ, and a darkroom closing card under a safelight glow.
Shape
- Sharp:
--r-s2px,--r-m4px,--r-l6px. Thin ink rules and outlines; no rounded pills except the segmented control. - Strips are black film with sprocket holes and edge print; frames are 3:2; the marker circle is a slightly lopsided ellipse with a tick.
- The brand mark is one frame of film with a marker dot.
Motion language
- Developing: when the sheet comes into view the frames turn from negative to positive (1.6s), one after another (90ms apart).
- The loupe opens over a dimmed page (360ms); the marker circle draws itself around a circled frame with a small bounce.
- The coverage bracket slides and stretches (420ms) as you change the hours and the start; the moments inside turn to ink.
- The promise is swiped with the marker as the hero loads (1s). The closing card's safelight breathes.
- Reveals: 16px rise and fade, 700ms. The phone menu drops in.
- Motion switch in the footer (
[data-motion-toggle],html.calm, remembered assite-motion, default fromprefers-reduced-motion). Calm shows the prints developed, the swipe drawn and the bracket jumping straight to place. - Darkroom switch (
[data-theme-toggle]), remembered assite-theme;theme-colorfollows.
Imagery and illustration
The frames are drawn stand-ins printed in six tones; a photographer swaps in their own work as images inside each frame (3:2, any colour, the sheet keeps them in order). Whole sequences beat a highlight reel. Only show people who've said yes, and say so.
Signature components
.sheet[data-sheet]›.sheet-head([data-sheet-count]) +.strip[data-edge][style="--n:4"]›button.frame[data-title][data-note][data-no][aria-pressed]›svg.scene(or your image) +.no;.sheet-foot.dialog.loupe(made for you if absent) ›[data-loupe-view],[data-loupe-no],[data-loupe-title],[data-loupe-note],[data-loupe-circle],[data-loupe-prev],[data-loupe-next],[data-loupe-close]..coverage[data-coverage][data-from][data-to][data-unit][data-tick][data-hours-word]›.seg[data-cov-hours] > button[data-h][data-price],input.range[data-cov-start]([data-cov-start-out]),.timeline > .ev[data-t] > span > b+.bracket,.cov-out([data-cov-window],[data-cov-len],[data-cov-price],[data-cov-in],[data-cov-miss])..calendar[data-calendar][data-booked][data-held]›.cal-check(input[data-cal-in],output[data-cal-out][data-empty]),.cal-months,.cal-key..pkg(.feature),.card,.facts(.stack,.own),.notice,.section.ink,.topline,.faq,.licence,.close-card(--close-em),.grid-4.
Multi-page kit
- Phone menu:
.menu-btn[aria-controls]opens.site-menu(links withdata-no); Escape, outside click and links close it; Tab stays inside while open. - Current page:
aria-current="page"(a marker underline). - Inner pages:
.page-head,.crumbs, a.tagand a smaller.h1. - Fields:
.field,.fields,.field-wide,fieldset.field-set,.check,.form-card,[aria-invalid="true"];form[data-template]. - Tiles:
.choices›label.choice > input + span > b + small. Segmented control:.seg(filters work on[data-tags], including whole sheets). - Gate:
[data-gate]withbutton[data-show="panel-id"]. - Slider, switch, tables, layout:
input.range,.switch[role=switch],.table/.table.stack,.r,.grid-2.lean. - Events and helpers:
circle(detail.title, on, count),coverage(detail.start, hours, price, covered, missed);Contact.status(calendar, date)returns free, held, booked or past;Contact.refresh(root).
Photographers: what we build in
- Who owns the photos, in plain words. Under the Copyright Act 1968 (Cth) s 35(5), photos commissioned for a private or domestic purpose, which includes weddings and family portraits, belong to the person who commissioned them unless the parties agree otherwise. Many contracts quietly agree otherwise; Silver Gum says it doesn't, and the site says which, before anyone books.
- Portfolio use by permission: an optional tick box on the enquiry, and a line that everyone shown said yes.
- Coverage that shows what's missed, not just what's included, and a price per package with GST.
- Dates: free, on hold and booked, with the nearest free dates when yours isn't.
These notes are design guidance, not legal advice; commercial and business photography follows different rules.
Do and don't
- Do show whole rolls, in order, not just the best frame.
- Do say what the hours miss.
- Do say who owns the photos.
- Don't use the marker for text in Proof; it sits under ink.
- Don't show anyone who hasn't agreed to be shown.
- Don't fake reviews or "as seen in" logos.
Accessibility
AA contrast throughout (measured above); the marker always carries ink text. Skip link and a 3px focus ring. Every frame is a button named with its number and title; circling is a pressed state the loupe toggles and announces in the count. The loupe is a native modal dialog: focus moves in, arrow keys step, Escape closes and focus returns to the frame. The coverage planner's results are announced politely in words; on phones the timeline becomes a list with covered moments marked. Calendar days are buttons named with the full date and their state; the date check answers in words. Forms label every field, mark errors with aria-invalid and say what's missing in an alert. Responsive to 360px; tested with motion on and off, in Proof and Darkroom.
How to make it yours
| Dial | Range |
|---|---|
| Marker | China-marker yellow (default), stage pink (Night Owls), timber (Formwork), eucalyptus mint (Silver Gum); set --marker (and the Darkroom value) and --close-em. Keep it light enough for ink text |
| The sheet | Your own frames, four to a strip (two on phones), with titles and notes |
| The planner | Hours or months (data-unit, data-tick), your packages with prices, your day's moments |
| The calendar | Your booked and held dates from your diary |
| Not negotiable | Gilda Display with the marker swipe, the contact sheet that develops, the loupe and circling, coverage that shows what's missed, the date check, plain words on copyright, and the Motion switch |



