apps/shade/src/docs/component-contracts.mdx
import { Meta } from '@storybook/addon-docs/blocks';
<Meta title="Components / Components Guide" /> <div className="sb-doc">bg-background, border-border-default, ring-focus-ring) — no hex values, no bg-gray-200-style raw palette utilities.variant, size, loading), not workflow (isMembersPage, layoutMode).className and merges with cn(...).If a component starts collecting workflow-specific props, stop and extract a Pattern — don't grow the API.
Button, Dialog, Tabs — yes. MembersList, PostHeader — no, that's a Pattern.Browse the sidebar for the live inventory and APIs. Full rules: Layers. Agent rules: apps/shade/AGENTS.md.
// Good — visual intent, works in any context
<Button loading={isPending} size="sm" variant="destructive">Delete</Button>
// Bad — leaks product knowledge into a generic control
<Button isMembersPage layoutMode="toolbarWithFilterAndStats">Add</Button>
When you catch yourself reaching for the second kind, that's a Pattern trying to hide as a Button.
</div>