import { Button } from '@/components/button';
import {
Card,
CardAction,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from '@/components/card';
import { Input } from '@/components/input';
import { Label } from '@/components/label';
import { Separator } from '@/components/separator';
import type { SeparatorProps } from '@/components/separator';
import { Skeleton } from '@/components/skeleton';
import { Spinner } from '@/components/spinner';
import type { Entry } from './types';
export const card: Entry = {
slug: 'card',
name: 'Card',
group: 'Layout',
description:
'A surface with a header, body and footer. `--card` is a tinted surface in CBAR rather than white — anything CBAR draws flat white uses `--background` instead.',
imports: { subpath: 'card', names: ['Card', 'CardHeader', 'CardTitle', 'CardContent'] },
figma: { set: 'Card' },
compositions: [
{
name: 'Full anatomy',
render: () => (
Monthly reportGenerated on the first of each month.
1,284 requests, 99.94% availability, no incidents.
),
},
{
name: 'With a form',
description:
'The header and footer take a `border` utility when the card holds a form — the rules separate the question from the answer, which a card holding prose does not need.',
render: () => (
Sign inUse your work e-mail.
),
},
],
};
export const separator: Entry = {
slug: 'separator',
name: 'Separator',
group: 'Layout',
description:
'A rule between groups. Decorative by default — pass `decorative={false}` when it genuinely separates two regions and should be announced.',
imports: { subpath: 'separator', names: ['Separator'] },
axes: { orientation: ['horizontal', 'vertical'] },
defaults: { orientation: 'horizontal' },
render: (props) => {
const p = props as SeparatorProps;
return (
);
},
matrices: [{ title: 'Orientation', rows: 'orientation' }],
};
export const skeleton: Entry = {
slug: 'skeleton',
name: 'Skeleton',
group: 'Layout',
description:
'A placeholder for content that has not arrived. Size it with utilities — it has no size prop, because a skeleton should match the shape of what it stands in for.',
imports: { subpath: 'skeleton', names: ['Skeleton'] },
compositions: [
{
name: 'A loading row',
render: () => (
),
},
],
};
export const spinner: Entry = {
slug: 'spinner',
name: 'Spinner',
group: 'Layout',
description:
'An indeterminate busy indicator. It carries an accessible label (default "Loading") so the state is announced, not just drawn.',
imports: { subpath: 'spinner', names: ['Spinner'] },
compositions: [
{
name: 'Sizes',
description: 'Sized with utilities and inheriting colour from its context.',
render: () => (