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.
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.
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.
TYPE-5: weight does hierarchy at small sizes, size does it at large ones, never both at once.
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.
Every token name in fjord_ui_core::tokens::ALL, in declaration order.
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.
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.
TYPE-5: weight does hierarchy at small sizes, size does it at large ones, never both at once.
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.
Every token name in fjord_ui_core::tokens::ALL, in declaration order.