# T03 — UI Primitive Contract (Recipe Manager UI Kit) Date: 2026-03-27 Scope: `recipe-manager/frontend` ## Goal Stabilize core UI primitives so pages stop re-implementing button/card/chip/layout class strings. This is a **low-risk contract layer**, not a redesign system. --- ## Contract surface (v1) Implemented in: - `frontend/src/components/ui/cn.ts` - `frontend/src/components/ui/primitives.tsx` ### `cn(...values)` - Lightweight class composer used by primitives and page-level variant helpers. - Avoids repetitive template-string class logic. ### `UiPage` - Canonical page shell wrapper (`ui-page` + optional additions). - Use for top-level layout regions (header container, footer container, page root if needed). ### `UiSection` - Canonical section shell (`ui-section`) with controlled padding options: - `padding="md"` (default) - `padding="lg"` - `padding="none"` - Use for grouped content blocks and major page sections. ### `UiCard` - Canonical card surface (`ui-card`) with optional tone: - `tone="default"` - `tone="muted"` - Use for repeatable content cards and skeleton containers. ### `UiButton` - Canonical button primitive (`ui-btn` + variant mapping): - `variant="primary"` - `variant="secondary"` (default) - Use for interactive `