Components
Rendered from the structured specs under specs/<slug>/spec.json
(ADR-0003) — the spec file is each page's only
data source. This repo owns specs and component tokens;
implementations live in each product repo
(@repo/ui in swarm-os).
Specced components (7)
Badge
stableA small pill label for status and metadata — camp availability ('Open · 12 spots', 'Sold Out', 'Waitlist'), the 'Beestera' eyebrow, and filter chips. Uppercase, caps-tracked, semibold.
Card
stableA bordered/elevated content container — the camp card, dashboard tiles, and general grouped content. A surface with a card radius, hairline border, section-scale padding, and optional elevation.
Button
reviewThe primary action control — a capsule/rounded control carrying a text label and optional icon. Drives registration, navigation, and form-submit actions across the website and app.
Hive Credit Badge
reviewA compact pill showing the signed-in guardian's Hive Credits balance, sitting in the portal's top utility header and linking through to the Hive Credits page. A leading coin glyph, a fixed 'HIVE CREDITS' eyebrow in caps, and either the balance or a 'Start earning' prompt when the balance is zero. Always rendered on the brand gradient, in every colour mode.
Camp card
draftThe responsive, tokenized card for a single camp session — the unit the location-detail page lists. Composes a 16:9 media header with an unmasked club-logo viewport, a Beestera calendar-date tile, the camp title, an availability badge with an inventory count, descriptive tags, an optional goalkeeper-training feature callout, location/dates/club metadata rows, and a price block paired with a Register button. The whole card is the camp-details link; Register stays a separate primary action.
Camp location card
draftThe location-level card for a venue that hosts multiple camps — the unit the browse page lists. Shares the camp card's surface, media header and metadata rows, but summarises a venue rather than a session: the camp count sits as quiet secondary text under the title, pricing is an optional 'from' comparison, and the action is View details. Session-level dates, ages and inventory stay on the camp card.
Input
draftA single-line text field with a label, optional leading icon, and validation states — the workhorse of the registration and CRM forms. Field shell + label + optional icon + optional error message.
Inventory
The full worklist — specced components plus the backlog seen in a source
but not yet specced — lives in
docs/component-inventory.md.