Adding a sub-brand to an existing family
1
Create the sub-brand directory
Inside the family directory, next to The directory name becomes the child slug, and the merged brand slug will be
config.global.yaml and the existing sub-brands.aurora-vacations.2
Write only the deltas
Create Note what is absent. There is no
src/brands/aurora/vacations/config.yaml containing nothing but what differs from the family foundation. Everything else — intents, elevation, shape, space, flexibility, presets — is inherited.slug — it comes from the directory structure. The intents.brand override supplies only chroma, inheriting hue: 15 from the parent, because the cascade deep-merges partial objects. And typography overrides one field while keeping the family’s font stacks and fluid settings.3
Generate
From the engine checkout:Every brand regenerates, the new one included.
Adding a standalone flat brand
A brand with no sub-brands is a single directory holding a singleconfig.yaml — but that config has no parent to inherit from, so it must be complete. All seven required sections must be present, and intents must include both brand and neutral or the load throws.
1
Create the brand directory
nova.2
Write a complete config
Create Values are in the units the schema expects:
src/brands/nova/config.yaml. This shape follows the flat-brand pattern used by the engine’s bundled demo brands.base-font-size in rem, space.unit and radius-base in pixels as bare numbers, duration-base in milliseconds as a bare number. Keys are kebab-case and normalize to camelCase at load — see the config overview.3
Generate
4
Verify the output
A flat brand writes to Every file carries a
generated/brands/nova/, with the same per-target subdirectories every brand gets:.gen. marker and a DO NOT EDIT header. Sub-brands nest one level deeper — generated/brands/aurora/vacations/.What happens at load
Two validations run before a brand is usable. The intent roster must containbrand and neutral, and any intent using scheme-end or scheme-track grammar is desugared and checked — including stop positions, reference cycles, and references to intents that do not exist.
After that, the accessibility gate runs over the whole corpus during generation. If an intent cannot reach its APCA target within gamut, the shortfall is reported and the build fails rather than shipping a brand that quietly misses contrast. A new brand is held to exactly the same bar as the six that ship with the engine.
Inheritance
The deep-merge rules, null-delete, and the validator that enforces deltas-only authoring.
Color
How to choose hue and chroma for an intent, and what the solver does with them.