Reference · v3
Not one single thing
A monochrome system built on tension: the hand-drawn and irregular against the technical and exact. Black and white do the structural work, photography carries the colour, and one deep vermilion is the only pigment the graphic system permits.
Every value on this page is read out of the files that implement it when the page is built. The swatches are the stylesheet's own custom properties, the hashes are computed from the shipping bytes, and the counts come from the asset directory. A specimen here cannot drift from the system it describes.
Before you change anything
The short version, for anyone (or anything) implementing against this system. Everything below this section is the long version.
The mark
- Copy the supplied file. Never redraw, trace, regenerate, stretch, crop or colour-filter it.
- Never substitute typography or a generated lookalike.
- Pick the variant that contrasts with the actual background.
- Check the hash before trusting a copy.
Canonical paths
src/assets/brand/fa-sunmark/— the mark, both variantssrc/styles/global.css— every token, the only stylesheetsrc/assets/elements/— the element librarypublic/icons/— the collage cutouts and their indexfinnastle-lab/fa-design-system— the cross-tool source
Standing rules
- Two registers. Never merge them.
- Emphasis is an underline, never a colour swap.
- Vermilion is a guest. One compositional accent per view; interaction states are not that accent.
- Age is a dial, not a default.
- Motion passes the reduced-motion gate or it does not ship.
I
Identity foundations
Two registers
This is the first rule because everything else bends around it. The work goes out under two registers and they are kept apart: art runs a chapter-variable visual language, and business goes out monochrome as Astle Creative. Merging them is the one thing the system forbids outright.
It is enforced in code rather than by discipline. BaseLayout
stamps data-register on the root element, and the stylesheet
answers:
:root[data-register="studio"] {
--accent: var(--ink);
--accent-press: var(--graphite);
}
One line covers light and dark, because --ink is itself
theme-dependent and resolves at use. The vermilion is an art-register
device and never appears on a business page.
The two panels below carry the real declarations. The second mirrors the
root rule onto itself, because :root[data-register] only
ever matches the root element; on the site it is set once, on
<html>, and the whole page inherits it.
Palette
Monochrome first, with a whisper of warmth so the neutrals never read as default grey. Each swatch below paints itself with the token named on it, so what you see is what the site holds. Hex values are parsed from the stylesheet at build time.
--ink #0f0f0e / #eeece6 Type, marks, rules --graphite #6f6b63 / #a29d94 Secondary, captions, metadata --paper #faf9f6 / #121211 The base surface --card #ffffff / #171716 Inset content --line #e6e3db / #2c2b27 Hairlines and dividers --line-strong #d3cfc5 / #3a3934 Section rules --accent #d9360f / #e5451a The one guest. Art register only. --accent-press #a82908 / #f0673d The guest, pressed Light value, then dark. Flip the theme with the control in the masthead and every swatch follows, because none of them carries a colour of its own.
Three voices in tension
A three-way argument, and the tension is the point. Never blend them. Against all three sits a fourth, wordless voice: the hand-drawn marks.
A fearless search for answers
Italic, always. Headlines and the Fearless / Answers duality.
'Instrument Serif', Georgia, 'Times New Roman', serif
A fearless search for answers
Monospace rigour. Running text, labels, technical voice.
'Cousine', ui-monospace, 'SF Mono', Menlo, Consolas, monospace
A fearless search for answers
Labels, metadata, navigation. No display size: the serif has that.
'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif
Scale and measure
| Display, h1 | clamp(2.6rem, 7vw, 4.4rem) | Instrument Serif italic |
|---|---|---|
| Section, h2 | clamp(1.7rem, 4vw, 2.4rem) | Instrument Serif italic |
| Label, h3 | 0.82rem | Inter, uppercase, graphite |
| Body | 0.98rem | Cousine, line-height 1.65 |
| Measure | 40rem | Every reading column on the site |
| Content width | 62rem | --maxw, main and footer |
| Shell width | 78rem | .frame, wide enough to hold collage stamps |
Grid densities
Four, each an auto-fill track with a minimum. Read from the stylesheet:
.gallery → 220px.work-grid → 240px.chapter-thumbs → 96px.icon-grid → 120px
Theme
Light is the default and lives on the bare :root. Dark
arrives two ways: a prefers-color-scheme block guarded
against an explicit light choice, and a [data-theme="dark"]
block so the masthead control wins in both directions. The choice
persists in localStorage under fa-theme, read by
an inline script before first paint so the page never flashes the wrong
ground.
Checked at build: the two dark blocks hold identical values.
The palette is maintained twice by hand, which is a standing risk rather
than a feature. This page compares the two blocks on every build so a
drift surfaces here instead of on the site.
II
Marks
The FA sunmark
The primary identity mark. Hand-brushed, uneven, stamp-like. Reach for this before any other mark when a single symbol has to stand for Finn or for Astle Creative.
It ships as a supplied vector pair and must be copied, never recreated. The hashes below are computed from the bytes in this repository at build time, so they can be checked against any other copy.
| File | Artwork | Use on | viewBox | SHA-256 |
|---|---|---|---|---|
fa-sunmark-dark.svg | Black mark | Light backgrounds | 0 0 458 319 | f370477fea88f421ea58445779e70903672581082a012205ea148df745b11278 |
fa-sunmark-light.svg | White mark | Dark backgrounds | 0 0 458 319 | 6eb3d8b95ff3239e1b7f11ec9b9f847fa4a1cb39b694086f10ad82b1ed8ae233 |
"Dark" and "light" name the mark colour, not the page theme. Both grounds
are genuinely transparent: the only full-bleed rect in either file sits
inside a clipPath and renders nothing.
How this site renders it
At chrome sizes the site ships one black-ink source and recolours it:
--mark-inv is 0 in light and 1 in dark, and
.mark applies brightness(0) invert(var(--mark-inv)).
One file covers both themes and runs through the WebP pipeline, which
does not process SVG.
Three sizes, one source, recoloured by filter. Below roughly 16px the irregular edges stop reading and the mark becomes a smudge; that is the floor.
Above chrome size, and anywhere the mark sits over photography, the filter cannot be trusted against an arbitrary ground. There, swap to the variant that contrasts, the way the favicons do. The favicons are the only place on the site that currently consumes the white variant.
Secondary marks
aria-hidden.
The collage cutouts
The cutouts are the library of artistic elements. This system defines how to use them and does not restate what is in it: they have their own index and their own page. Elements are decorative unless they carry meaning, they sit on a checkerboard in the gallery so transparency stays legible, and they are never recoloured to match a page.
III
Image language
Age is a dial, not a default.
The identity has halftone, engraving, photocopy and worn print in it, and none of that means everything should look old. Contemporary paper, card, plastic and clean digital surfaces are equally valid. An imperfection is a decision with a reason: it shows a process, dates a source, or gives the eye something true to hold. Applied by habit, it is costume.
The library names its materials
125 elements, grouped by the prefix that says what each one is made of rather than what it depicts. 99 of them were renamed from subject and joke names to these. The taxonomy is the rule: reach for a material, not a motif.
-
mark-39 Hand-drawn and scanned marks -
photo-22 Photographs -
clipping-15 Cut and collaged fragments -
print-15 Printed matter, scanned -
texture-9 Surfaces and grounds -
comic-8 Halftone and comic reproduction -
engraving-8 Engraved and line illustration -
digital-7 Made on screen -
badge-1 Fabric and applique -
sticker-1 Adhesive and label stock
The range, in real assets
engraving- Engraved line illustration, scanned. Old stock, used as line art rather than as an antique.
comic- Halftone reproduction. The dot is the subject; the printing process is visible on purpose.
clipping- Cut and collaged. Contemporary paper and plaid, not aged.
digital- Made on screen, and not disguised as anything else.
photo- A straight photograph. Clean, current, no treatment applied.
print- Printed matter, scanned. The FA monogram as it exists on paper.Six of 125, chosen to show the spread. Halftone and engraving sit in the same library as a clean photograph and a flat digital render, and nothing forces a vintage pass over the top.
Cropping and placement
Work cards crop to a uniform 4/3. Natural heights were tried and
abandoned: a grid of mixed aspect ratios reads as a mistake rather than a
decision. Because a fixed crop will cut the wrong part of some images,
each chapter carries its own focal point in
src/lib/work-chapters.ts, so the crop is authored rather
than centred by default.
Collage stamps are the deliberate exception to the content column. They
sit outside it and bleed into the shell, which is why
.frame runs to 78rem with overflow-x: clip
rather than letting them cause a horizontal scroll.
Provenance
Four kinds, kept distinct. The caption carries the difference.
- Authentic
- A photograph or scan of a thing that existed. Caption says what and when if it matters.
- Manipulated
- A photograph altered beyond crop and levels. The caption says so.
- Assembled
- Collage and hand-made composition. Credited as artwork, not as a photograph.
- Generated
- Made by a model. Labelled, every time, without exception.
When not to use an image at all
The certificates piece lists eight courses. The badges were set in type rather than shown as a picture of the issuer's artwork, because the badges are in four colours that are not ours, and because a picture of a list is how the copy and the heading came to disagree in the first place. Type cannot drift from itself. A screenshot can.
Alt text
Describe what is in the picture, not what it is for. A decorative mark
takes an empty alt and aria-hidden. A mark
carrying identity takes real alt text. Never restate a caption the screen
reader has just read.
IV
Digital design language
Page archetypes
Six, and no page invents a seventh without a reason.
Links and emphasis
Links inherit their colour and carry a 1px underline at a 0.15em offset. The guest appears on hover, as the underline colour, and nowhere else. Emphasis inside the mono body is an underline at 1.5px, never a weight change and never a colour swap: a monospace bold reads as a different typeface, which breaks the voice.
Here is a link, and here is emphasis, in the body voice.
Interaction states
Every interactive thing needs a visible keyboard state. The ring is 2px of ink at a 2px offset, and it is not optional.
Technical and filmic detail
Hairlines, measurement marks, metadata lines and film tags earn a place when they carry navigation, provenance or real technical information. They become decoration the moment they carry none, and the system has already paid for that once: a dashed film-strip spine was documented as "the recurring structural rule" for two months without ever being built. The test is whether removing the detail loses the reader anything.
V
Motion and atmosphere
This is a short section and it should be. Counted from the stylesheet at build time: 2 transitions on the whole site, both on the work card, and a global reduced-motion block that is present.
Work-card hover: a 0.25s opacity and transform cue, and a 0.4s image scale, both behind @media (hover: hover). The reduced-motion block resets both.
Nothing beyond the above.
An atmospheric homepage panel and an extended-footer wordmark. Scoped only, with a release gate. No branch, no prototype, nothing in the repository.
The GPU sky examples cited in that scope. Referenced once, never prototyped here, and not part of this system by default.
The gate
Before any motion moves from scoped to approved it needs all six:
- A stated design purpose. Not "it felt flat".
- Reduced-motion behaviour that is a real alternative, not a freeze.
- A performance budget, measured on a phone.
- Responsive behaviour down to 320px.
- Keyboard and screen-reader behaviour, and no new focus traps.
- A fallback that renders before JavaScript and survives without it.
Motion should demonstrate technical proficiency without costing anyone usability. The reduced-motion block at the foot of the stylesheet is the floor, and it is already global.
VI
Retired
Dropped rules are recorded rather than deleted, so nobody reinstates one by reading an old file. A documented mark with no asset is how the next person ends up drawing their own.
| Was | Value | Why it went | Retired |
|---|---|---|---|
--frame: #c9d0c0 | Declared as web chrome on 30 August and consumed by no rule on the site in the two months since. | 2026-10-25 | |
#dd5b1e | Too light, too bright. Replaced by vermilion sampled from the felt-tip sun burst and deepened for ink. | V2 | |
--ink-3: #a59f95 | Two greys have carried the site since launch. Never implemented. | 2026-10-25 | |
Display 48 / Title 24 | Gave Inter a display role that belongs to the serif. Never implemented. | 2026-10-25 | |
Outline, white fill, shadow ledge | Documented as a secondary mark with a specified treatment. No asset has ever existed. | 2026-10-25 | |
Dashed film-strip spine | Called "the recurring structural rule" and implemented nowhere. | 2026-10-25 |