Reference
Design system
Every ratio was computed with tools/a11y/contrast.py against all three grounds.
This page is noindex: it documents the template for whoever builds with it.
The outcome is a word, then a glyph, then a colour
Forty-one rows whose entire content is Selected / Declined / No reply / Withdrawn. Each
one is spelled out, preceded by its own glyph via a ::before on a
data-glyph attribute, and only then tinted. Three separate outcome tokens
exist rather than one accent, because on a page about outcomes “selected” must
not be the same colour as a heading — and none of the three is the accent.
The ledger is a list, not a table
A table invites you to compare columns. Nobody compares festivals; you read down the outcome column and count. An ordered list with a fixed grid does that, numbers itself (so deleting a row cannot strand a hand-typed index), and collapses to a readable stack on a phone instead of into a horizontal scroll box. Day 102 needed a table and this does not — the shape of the data decided it, not the house style.
Every number is summed
41 submissions, 6 selections, the fee total, the acceptance rate and both budget totals are
all computed from the two arrays in config.ts. The budget section shows two
different totals on purpose — with and without entry fees — and hard-coding
either of them is how a headline stops matching its own table three edits later.
The festivals are invented, deliberately
The shape of the record is the true part. Publishing a fabricated rejection record against forty-one named real festivals would be defamatory rather than honest, so every name is fictional and the page says so twice — once in the FAQ and once in the footer. Anyone cloning this template is inheriting that constraint along with the layout.
Two stills, not four
Two of the four films have a frame and the page says which and why. A four-up grid with two weak entries would have been the portfolio arguing against its own copy on the way past, which is the same reason day 101 has no gallery.
Type
Literata — display and body
Courier Prime — 41 · $1,590 · DECLINED
A reading serif, because this page is mostly prose and a long list. The ledger is Courier Prime, which is what submission paperwork has looked like for forty years. Neither face appears in days 1–102.
Tokens
-
--color-bg - #F9F6F2
- Warm bone paper
-
--color-bg-alt - #EDE7DF
- Banding
-
--color-surface - #FFFFFF
- Cards
-
--color-text - #1A1512
- 16.80 / 14.74 / 18.10:1 · AAA
-
--color-text-muted - #70665C
- 5.21 / 4.57 / 5.61:1 · AA
-
--color-border - #918273
- 3.45 / 3.03 / 3.72 — non-text only
-
--color-accent - #A52790
- Hue 310 — 5.92 / 5.19 / 6.38:1 · AA
-
--outcome-yes - #1F6B33
- Selected — 6.07 / 5.33 / 6.54:1
-
--outcome-no - #B24434
- Declined — 5.17 / 4.54 / 5.57:1
-
--outcome-nil - #70665C
- No reply — 5.21 / 4.57 / 5.61:1
-
--color-band - #1A1512
- Inverted band
-
--color-on-band - #F9F6F2
- 16.80:1 on band · AAA
-
--color-on-band-muted - #ACA195
- 7.14:1 on band · AAA
-
--color-accent-on-band - #E17FD1
- 7.03:1 on band · AAA
The border token clears 3:1 against all three grounds, which is what WCAG 1.4.11 asks of a non-text boundary. It is never used for text.