For agents
Keep Harbor coherent
Load the contract, compose shadcn under frozen laws, validate before done. Install paths below — same tools on every system.
DX · Always tier
Golden path
Compose shadcn + frozen presets. Depth loads on Ask — don’t dump every skill into the first prompt.
import { Button } from "@/components/ui/button"
import { typesetClass, radiusIntent } from "@/lib/design"
export function Panel() {
return (
<section data-surface="application" className="shell-pad shell-stack">
<h2 className="type-section">Issues</h2>
<Button className={radiusIntent("control")}>New</Button>
<div className={typesetClass("docs")}>{/* help HTML */}</div>
</section>
)
}- 1 ·
data-surface - 2 · shadcn atoms only
- 3 ·
typesetClass
DX · closed atoms
Primitive contracts
Required states + ARIA for shipped shadcn atoms. Prefer a rule over a new component — see dx.md.
button
buttoncomponents/ui/button.tsx
States
rest · hover · pressed · focusVisible · disabled · destructive
Must
- Use Button from @/components/ui/button
- motion-press for juicy press
- focus-visible ring (not fill alone)
- Icon-only: aria-label required
input
inputcomponents/ui/input.tsx
States
rest · hover · focusVisible · disabled · invalid
Must
- radiusIntent control (rounded-lg)
- focus ring via ring-ring
- Label every field
badge
badgecomponents/ui/badge.tsx
States
rest
Must
- Semantic status ≠ brand decoration
- Mono for tool/activity names
card
cardcomponents/ui/card.tsx
States
rest
Must
- edge or depth-* — never Tailwind shadow-*
- rounded-2xl panel radius
separator
separatorcomponents/ui/separator.tsx
States
rest
Must
- Stroke before shadow for separation
Design contract install
Install into any project
Agent stack: law book + verified skills + CI gates are required. Contract MCP is optional. shadcn MCP / CLI installs atoms; Harbor keeps agents inside closed tokens via docs, skills, and npm run validate.
Next: explore UI primitives, app shells, theme, and design.md — all styled with Harbor tokens on this route.