Badge <ndo-badge>
Status labels for the whole domain vocabulary: Layer 0 lifecycle stage, resource nature, property regime
and rivalry; Layer 1 scope and governance-rule type; Layer 2 operational state. Every variant traces to a
Rust enum in crates/shared. Styled entirely via CSS custom properties,
so it is safe for shadow DOM.
Lifecycle Stages
variant="lifecycle-ideation"variant="lifecycle-specification"variant="lifecycle-development"variant="lifecycle-prototype"variant="lifecycle-stable"variant="lifecycle-distributed"variant="lifecycle-active"variant="lifecycle-hibernating"variant="lifecycle-deprecated"variant="lifecycle-end-of-life"Resource Nature
variant="nature-physical"variant="nature-digital"variant="nature-service"variant="nature-hybrid"variant="nature-information"Property Regime
variant="regime-nondominium"variant="regime-commons"variant="regime-collective"variant="regime-pool"variant="regime-common-pool"variant="regime-private"variant="regime-public"Operational State (Layer 2)
Where a specific resource instance is right now. This is not a lifecycle stage and the
two are orthogonal: a resource under repair is LifecycleStage.Active and OperationalState.InMaintenance at the same time. The kit used to
render available inside variant="lifecycle-stable",
which welded the two axes back together after PR #132 spent a type separating them. Each state is a filled pill
in its own colour with a leading dot, as Claude Design draws Layer 2; no lifecycle badge has a dot, so the two
never read as the same axis.
variant="op-available"variant="op-reserved"variant="op-in-transit"variant="op-in-storage"variant="op-in-maintenance"variant="op-in-use"variant="op-pending-validation"Rivalry and Scope
Rivalry decides whether a governance rule is even coherent, which is why GovernanceRule carries a rivalry_override. It is shown outlined rather than filled because it
qualifies a regime rather than standing beside it: effective rivalry is the nature's default unless the
creator overrode it, and Service has no confident default.
Scope lives on the Layer 1 specification and is the one field that can quietly undo a Layer 0 guarantee, so
narrowing an open-access regime below Public is a Hard refusal.
variant="rivalry-rivalrous"variant="rivalry-non-rivalrous"variant="scope-project"variant="scope-network"variant="scope-public"Governance Rule Types (Layer 1)
The four discriminants of the RuleData tagged union. These deliberately
leave the pill language: square corners, monospace, a left accent bar. A classification says what a resource is; a rule says what an agent may do and carries a typed payload, and a rule badge that looks
like a classification teaches the wrong model to whoever designs the rule surface next. The kit previously
shipped AccessControl and TransferPolicy,
which exist in no zome; these four are the real Rust variants.
variant="rule-access-requirement"variant="rule-usage-limit"variant="rule-transfer-condition"variant="rule-maintenance-schedule"Special
variant="coming-soon"variant="neutral"Svelte badge modes (@nondominium/ndo-ui)
Filter chips use per-stage colors; card badges simplify lifecycle to green vs gray and regime to dashed gray. All seven regimes: Private, Commons, Collective, Pool, CommonPool, Public, Nondominium. The four-regime "MVP" set this page used to name was a 2026-08-11 UI narrowing that the shared types have since abandoned.
Usage (custom element)
<!-- HTML / any framework --> <ndo-badge variant="lifecycle-active" label="Active"></ndo-badge> <ndo-badge variant="nature-physical">Physical</ndo-badge> <ndo-badge variant="regime-nondominium" label="Nondominium"></ndo-badge>
| Token | Value |
|---|---|
--ndo-emerald-100 | 209 250 229 |
--ndo-emerald-700 | 4 120 87 |
--ndo-spacing-0-5 | 0.125rem (2px) |
--ndo-spacing-2 | 0.5rem (8px) |
--ndo-radius-sm | 0.25rem (4px) |