Naming Principles
Every name in BDS describes a role or slot — not a visual shape — and must come from the closed allowlist.
Intent, not shape
Every word in BDS describes a role or a slot. It does not dictate visual shape and does not dictate the HTML element. The HTML element is chosen by semantic intent at the call site.
This distinction is load-bearing for titles and headings — get it wrong and you ship outline-invisible content that looks correct visually. See HTML Semantics for the element-selection rules.
Closed allowlist
Per ADR-008, the system runs on a closed allowlist of slot names. The allowlist lives in docs/SLOT-ALLOWLIST.md.
Every
bds-{block}__{slot}class uses a slot name that appears inSLOT-ALLOWLIST.md. Anything else fails the lint.
The old approach enumerated banned terms; agents invented new ones (__lead, __quote-text, __plan-name, __hamburger-bar) faster than the banlist grew. Closing the canon inverts the burden: the default is reject, new vocabulary requires a deliberate PR.
Adding a slot
- Identify the role the slot expresses; pick the most generic word that fits.
- Grep for existing allowlist slots that already cover the role — reuse before invent.
- If no existing slot fits, PR an entry into
SLOT-ALLOWLIST.mdwith justification. - Reviewer checks: would this slot work on more than one block? Is it generic (not layout-specific)? Is it structural (not visual)?
Blueprint naming rules
Blueprints (content-system/blueprints/*) are page-level layouts — the Section layer of the Composition Layers model. Their naming follows the same closed canon.
- Single namespace. Every class uses
bds-. Thebp-prefix is deprecated — no newbp-*classes after ADR-008. - One block per family.
bds-hero,bds-cta,bds-services,bds-features,bds-about,bds-support-plan. Each family is one block with structural modifiers, not N separate blueprints. - Slots from the allowlist. Every
bds-{block}__{slot}must use an allowlisted name. Phase C lint fails on anything else. - Structural-only modifiers. Modifier names describe structure (
--split-image,--two-column) — never appearance (--dark,--centered) or theme (--inverse). A "dark centered" CTA themed light makes the name a lie. - Compose, don't reimplement. A blueprint
.tsxthat imports nothing fromcomponents/ui/*is almost always drift. - Use
Framefor aspect-locked images. Never hardcodeaspect-ratioin blueprint CSS.
The bp-* prefix is being migrated to bds-* across existing blueprints — Phase D, one family per PR. Until Phase F, both prefixes coexist.
Related
docs/SLOT-ALLOWLIST.md— the contract; prose here is reference only- ADR-008 — full reasoning and 2026-05-11 inventory data
- Slot Vocabulary — what each allowlisted slot means and when to use it