Tokens
Generation 1, "sounding". One cold neutral ramp at oklch hue 245, read from opposite ends for light and dark, so the two schemes are one ramp rather than two hand-tuned palettes (COLOR-1). Every value here is public API: renaming one is a breaking change, and revaluing one is a CHANGELOG entry naming the old and new values, the reason, the blast radius and the invariant that governed the decision.
colour
Every text token clears 4.5:1 against every surface it is permitted to sit on, and every meaningful boundary clears 3:1, with an empty exception list. The structural hairlines deliberately do NOT: a rule that encodes nothing has no floor, and the moment it encodes something it becomes --fj-mark. tests/contrast.rs asserts all of it against these values, parsed out of tokens.css rather than copied.
type
Eight steps, and the whole hierarchy of a page lives inside them. The ladder is compressed on purpose (COLOR-8), so size, weight, tracking and position carry what an unconstrained palette would have carried in value.
weight and tracking
TYPE-5: weight does hierarchy at small sizes, size does it at large ones, never both at once.
what a forge actually reads
The worst case for a monospace is a page of shas, paths and refs, and it is fjord's normal case. 0/O, 1/l/I and rn/m have to be distinguishable at 11px.
the full contract
Every token name in fjord_ui_core::tokens::ALL, in declaration order.
colour
Every text token clears 4.5:1 against every surface it is permitted to sit on, and every meaningful boundary clears 3:1, with an empty exception list. The structural hairlines deliberately do NOT: a rule that encodes nothing has no floor, and the moment it encodes something it becomes --fj-mark. tests/contrast.rs asserts all of it against these values, parsed out of tokens.css rather than copied.
type
Eight steps, and the whole hierarchy of a page lives inside them. The ladder is compressed on purpose (COLOR-8), so size, weight, tracking and position carry what an unconstrained palette would have carried in value.
weight and tracking
TYPE-5: weight does hierarchy at small sizes, size does it at large ones, never both at once.
what a forge actually reads
The worst case for a monospace is a page of shas, paths and refs, and it is fjord's normal case. 0/O, 1/l/I and rn/m have to be distinguishable at 11px.
the full contract
Every token name in fjord_ui_core::tokens::ALL, in declaration order.