Skip to main content

max / makeover-layout

git clone https://makenot.work/git/max/makeover-layout.git git clone git@ssh.makenot.work:max/makeover-layout.git
Name Size
/ src/
· .gitignore 99 B
· Cargo.toml 1.5 KB
· LICENSE 1.0 KB
· README.md 2.2 KB
· rust-toolchain.toml 86 B

README

makeover-layout

The renderer-agnostic half of the make-family design system.

makeover answers what colour, and varies by theme. makeover-geometry answers how much space, and varies by density and surface. This crate answers what the thing is, and varies by nothing.

The deferral rule

A description names intents and relationships, never values. Say Fill::Raised, never #D9DDF4. Say Gap::Peer, never 6px. What is left once colour and spacing are deferred is composition: which edges are lit, what inverts on press, what nests in what.

The constraint that shapes it: a renderer that can only paint rectangles has to be able to express the result. egui has no box-shadow: inset and one stroke per widget with no per-side control. A terminal has box-drawing characters and one cell of resolution, and cannot draw a two-tone lit edge at all. So this crate names the intent, and each renderer picks an expression it can produce, including dropping half of one.

What is here

Depth, and only depth: Bevel, Edge, Fill, Depth. Fill and bevel are named together, because naming them apart is what let them disagree. Every consumer had at least one region carrying a raised bevel over a recessed fill; audiofiles fixed it and wrote the bug down, Balanced Breakfast still had twelve of them a year later. Depth makes that unrepresentable.

The vocabulary was read off audiofiles, the only implementation written by a consumer with no CSS, then checked against both webview apps.

What is not here yet

Badge versus chip, toast versus banner, the list row’s parts, heading levels, segmented controls, and whether a description names loading state at all. Each is a naming decision rather than a transcription, and each is tracked as a subtask of the extraction task. Guessing at them now is how a description becomes a framework.

Status

Not published. Per the sequencing decision, 0.1.0 does not go to crates.io until a second renderer has exercised the vocabulary; a description with one renderer is an API with extra steps. Design and open questions live in the wiki note makeover-layout; the backlog is in GoingsOn under the project of the same name.

Licence

MIT.