Skip to content

A finished finish

The finishes track builds quarry one layer at a time. Here it is complete: all four slot families declared, every full-bleed layer twinned for export, and nothing in it naming a color.

quarry, entire

Try this. Read it in pairs: every --fin-* has a --fin-*-opaque twin with the same geometry and a different ending. Change a value in the first of a pair to see it; the second is the export face and never renders here.

All four families are declared, including the ones it does not use. The mark carries both of its slots — --fin-mark: none for the gradient, --fin-mark-text: "" for the glyph — and --fin-edge is none. A finish is a set of custom properties, and an undeclared one inherits, so an empty value is how you say deliberately nothing.

--fin-frame is the one that is not none. It composes into a box-shadow list rather than a background list, and none is legal there only as the sole value — write it and the whole declaration goes invalid, taking the tone rail with it. Its empty value is 0 0 transparent.

Every full-bleed layer is twinned. Same geometry, same percentage; the only difference is where the color lands. The wash covers the whole page, so its screen face fades to transparent and its export face fades to var(--fin-canvas) instead. The texture is the other case: it is a hairline on a transparent field, so only its line mixes into the canvas — the gaps stay transparent in both faces, because an opaque gap would flood the page. Screen and print is the page that separates the two.

The bookkeeping lists match the layer count. Two background layers, so --fin-size, --fin-position and --fin-repeat each carry two entries, in the same order the layers are listed — texture first.

Nothing names a color. Every value is a color-mix() of --accent, --text-heading or --fin-canvas, which is what makes it work in every palette and both canvases for free.

The mark is empty. A monogram baked into a shared finish makes it one organization’s finish.

In lib/finishes/quarry/:

quarry.manifest.json { "name": "quarry", "type": "finish", "format": 1,
"label": "Quarry", "blurb": "…", "order": 10, "swatch": {…} }
quarry.recipe.json the look, in the Studio's layer vocabulary

One folder. After node tools/build-packages-index.js, finish: quarry works in front matter, the deck linter accepts it while still flagging typos, the Studio’s picker lists it and a saved user finish cannot shadow it. The shipped-finish count in design/skills/finish.md still has to be bumped by hand; the ownership guard names the number.

The export sign-off. A finish changes the bytes of every exported file, and its failure mode — a gray cloud across a fade, a title slide washed to near-blank — appears only in the PDF. No screen preview substitutes for rendering it through both engines, in both canvases, and looking at all four.