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.

filter Active
card-lifecycle Active
card-regime Nondominium
filter regime Nondominium

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>
TokenValue
--ndo-emerald-100209 250 229
--ndo-emerald-7004 120 87
--ndo-spacing-0-50.125rem (2px)
--ndo-spacing-20.5rem (8px)
--ndo-radius-sm0.25rem (4px)