|
|
/**
|
|
|
* The blocks catalog — one source for the section rail and the gallery index,
|
|
|
* so a block that lands does not have to be remembered in two places.
|
|
|
* Mirrors `docs/process/PLAN-blocks.md` (F2–F4).
|
|
|
*/
|
|
|
export interface BlockEntry {
|
|
|
slug: string;
|
|
|
label: string;
|
|
|
/** A live demo exists at `/blocks/{slug}`. */
|
|
|
shipped: boolean;
|
|
|
/**
|
|
|
* What lives behind the slug. `block` (the default) means a block of the tier
|
|
|
* and `npm run blocks:check` demands one at `src/uix/blocks/{slug}`; `page` is
|
|
|
* a COMPOSED page — a route with no block behind it, which the rail publishes
|
|
|
* all the same because it is the artefact that proves the blocks assemble.
|
|
|
* @default 'block'
|
|
|
*/
|
|
|
kind?: 'block' | 'page';
|
|
|
}
|
|
|
|
|
|
export interface BlockGroup {
|
|
|
title: string;
|
|
|
items: BlockEntry[];
|
|
|
}
|
|
|
|
|
|
export const BLOCK_CATALOG: BlockGroup[] = [
|
|
|
{
|
|
|
// The composed page goes FIRST because it is the one artefact that proves
|
|
|
// what a block-by-block gallery cannot: that they assemble. Every reference
|
|
|
// catalog ships one for the same reason.
|
|
|
title: 'Compuesto',
|
|
|
items: [{ slug: 'landing', label: 'Landing (14 blocks)', shipped: true, kind: 'page' }]
|
|
|
},
|
|
|
{
|
|
|
title: 'Site',
|
|
|
items: [
|
|
|
{ slug: 'site-header', label: 'Site header', shipped: true },
|
|
|
{ slug: 'hero', label: 'Hero', shipped: true },
|
|
|
{ slug: 'feature-grid', label: 'Feature grid', shipped: true },
|
|
|
{ slug: 'feature-split', label: 'Feature split', shipped: true },
|
|
|
{ slug: 'pricing', label: 'Pricing', shipped: true },
|
|
|
{ slug: 'testimonials', label: 'Testimonials', shipped: true },
|
|
|
{ slug: 'faq', label: 'FAQ', shipped: true },
|
|
|
{ slug: 'stats-band', label: 'Stats band', shipped: true },
|
|
|
{ slug: 'logo-cloud', label: 'Logo cloud', shipped: true },
|
|
|
{ slug: 'article-grid', label: 'Article grid (blog)', shipped: true },
|
|
|
{ slug: 'cta', label: 'CTA', shipped: true },
|
|
|
{ slug: 'newsletter', label: 'Newsletter', shipped: true },
|
|
|
{ slug: 'site-footer', label: 'Site footer', shipped: true },
|
|
|
{ slug: 'banner', label: 'Banner', shipped: true },
|
|
|
{ slug: 'team', label: 'Team', shipped: true },
|
|
|
{ slug: 'contact', label: 'Contact', shipped: true },
|
|
|
{ slug: 'content-section', label: 'Content section', shipped: true },
|
|
|
{ slug: 'cookie-consent', label: 'Cookie consent', shipped: true }
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
title: 'App',
|
|
|
items: [
|
|
|
{ slug: 'app-shell', label: 'App shell', shipped: true },
|
|
|
{ slug: 'auth', label: 'Auth', shipped: false },
|
|
|
{ slug: 'data-table', label: 'Data table', shipped: false },
|
|
|
{ slug: 'dashboard', label: 'Dashboard', shipped: false },
|
|
|
{ slug: 'settings', label: 'Settings', shipped: false },
|
|
|
{ slug: 'user-menu', label: 'User menu', shipped: false },
|
|
|
{ slug: 'notifications', label: 'Notifications', shipped: false },
|
|
|
{ slug: 'wizard', label: 'Wizard', shipped: false },
|
|
|
{ slug: 'error-page', label: 'Error page', shipped: false },
|
|
|
{ slug: 'kanban', label: 'Kanban', shipped: false }
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
title: 'Docs',
|
|
|
items: [
|
|
|
{ slug: 'docs-shell', label: 'Docs shell', shipped: false },
|
|
|
{ slug: 'code-showcase', label: 'Code showcase', shipped: false },
|
|
|
{ slug: 'props-table', label: 'Props table', shipped: false }
|
|
|
]
|
|
|
}
|
|
|
];
|