Principles
Components point to semantic roles such as brand/base or text/strong-950, never to a value. The role points to a foundation, and the chain runs one way only.
Light and Dark are two modes of one collection, so no component has a dark variant. Platforms differ in numbers, not intent: a Platform collection carries the 44 or 48 point touch targets and bar heights, so one component obeys both.





“A component never names a color. It names a token, the token names a foundation, and the chain runs one way only.”


Native patterns
21 Apple and 17 Material 3 patterns are redrawn in Luna geometry. The Platform Bridge maps 112 Apple and Material slots to Luna tokens in Brand mode, or to the platform’s own published values in System mode, so a screen can be checked against the native palette in one switch.


What is in the box
- 556
- Variables in six collections
- 79
- Components, every state on a token
- 88
- App screens in light and dark
- 0
- Dark variants to maintain
What I’d take to the next system
A system is its constraints: no paint styles and no dark variants were deliberate choices, and every shortcut removed was one less place for the system to drift.
Naming tokens the way SwiftUI, Compose, Flutter and CSS read them kept the file and the code describing the same thing, and complete app screens built only from instances proved the system faster than any documentation page could.
