Aura carries two icon systems, and confusing them is a design error. The registry is a semantic naming layer over a line-icon set — swappable, referenced by meaning, never by glyph. The marks are meaning itself: a seat’s identity, a work state, the third-party disclosure star. Swap a registry glyph and nothing breaks; swap a mark and the surface starts lying.
The registry
Screens never import a glyph directly — they ask the registry for a meaning: <Icon name="trust" />, <Icon name="settings" />. The mapping from name to glyph lives in exactly one file, so the entire line-icon language can be retuned in one edit. Weight is the only expression: regular at rest, bold for emphasis, fill for an active or held state.
import { Icon } from "@morna/ui";
<Icon name="today" /> // by meaning, never by glyph
<Icon name="trust" size={22} /> // sizes: 16 · 18 (default) · 22
<Icon name="ask" weight="fill" /> // weight encodes intensity, not styleThe catalog, live
Rendered straight from ICON_NAMES — this grid is the source of truth, not a picture of it. Wayfinding first, then controls, status and preferences.
Meaning-bearing marks
Three families sit outside the registry because their shapes are contracts. A seat’s identity mark is a role-true metaphor — and since the identity hues were retired, the metaphor is doing all the work; a work state’s mark is the shape law (Law v) at icon scale; and the ✦ disclosure star means exactly one thing — a third party saw this — everywhere it appears.
- Seat marks are not decoration. They render duotone and always beside the name — never alone, never reassigned. Their light is neutral now, which makes the shape the only thing distinguishing one seat’s mark from another’s.
- State marks are the shape law. A hollow circle proposes, a spinning notch works, a filled hand-tap waits on you — readable with no color at all.
- The star never varies. ✦ is reserved for disclosure. Using it as a sparkle is a review comment with a law number attached.
Never naked
An icon-only action must say its name: IconButton makes the label a required prop and writes it to aria-label and the tooltip. There is no unlabeled variant to reach for. ButtonGroup attached fuses related actions into one segmented control.