@godxjp/ui-mcp 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/data/components.ts","../src/data/prop-vocabulary.ts","../src/data/tokens.ts","../src/data/rules.ts","../src/data/patterns.ts","../src/data/skills-index.ts","../src/data/anti-ai-tells.ts","../src/data/redesign-audit.ts","../src/tools/registry.ts","../src/resources/registry.ts"],"sourcesContent":["/**\n * @godxjp/ui-mcp — MCP server entry.\n *\n * Spawned over stdio by an MCP-aware agent (Claude Desktop, Cursor,\n * Continue, Cline, etc.) per the consumer's `.mcp.json` /\n * `claude_desktop_config.json`. Exposes a curated catalogue of the\n * @godxjp/ui framework so the agent can:\n *\n * - list primitives (with group / tagline / props / example)\n * - look up a single component's full API\n * - search by name / use-case / feature\n * - read the shared prop-vocabulary (`SizeProp`, `ColorProp`, …)\n * - read design tokens (per category)\n * - read cardinal rules (by number or all)\n * - fetch canonical code patterns (registration form, settings,\n * data table, app shell, …) — copy-paste-ready snippets\n * - lint a JSX snippet against the most common rule violations\n *\n * The server reads ONLY its own bundled data files. Zero filesystem\n * access into consumer projects, no network, no shell. Safe to mount\n * read-only.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { TOOL_DEFINITIONS, dispatchTool } from \"./tools/registry.js\";\nimport { RESOURCE_DEFINITIONS, readResource } from \"./resources/registry.js\";\n\nasync function main() {\n const server = new Server(\n {\n name: \"godx-ui-mcp\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n );\n\n // ── tools ──────────────────────────────────────────────────────\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOL_DEFINITIONS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const result = await dispatchTool(name, (args ?? {}) as Record<string, unknown>);\n return { content: [{ type: \"text\", text: result }] };\n });\n\n // ── resources ──────────────────────────────────────────────────\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCE_DEFINITIONS,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n const text = await readResource(uri);\n return {\n contents: [\n {\n uri,\n mimeType: uri.endsWith(\".json\") ? \"application/json\" : \"text/markdown\",\n text,\n },\n ],\n };\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Log to stderr so it doesn't pollute the stdio JSON-RPC channel.\n console.error(\"[godx-ui-mcp] connected (stdio)\");\n}\n\nmain().catch((err) => {\n console.error(\"[godx-ui-mcp] fatal:\", err);\n process.exit(1);\n});\n","/**\n * Component catalog — the REAL published `@godxjp/ui` v6 primitive surface.\n * The MCP bundles this so an agent can author pages with the actual API\n * (PageContainer, Stack, ResponsiveGrid, DataTable + ColumnDef, StatusBadge,\n * FormField, Select, Dialog, FilterBar, …) instead of guessing.\n *\n * Each entry maps to a real export. Import via the subpath in every example,\n * e.g. `import { DataTable } from \"@godxjp/ui/data-display\"`.\n *\n * Each entry carries:\n * - `name` — canonical export name\n * - `group` — entry-point group\n * - `tagline` — one-line elevator pitch\n * - `props` — most-used real props with type + description\n * - `example` — copy-paste-ready JSX using the real API\n * - `storyPath` — relative path under `src/stories/`\n * - `rules` — cardinal rules relevant to this primitive\n */\n\nexport type ComponentGroup =\n | \"general\"\n | \"layout\"\n | \"data-display\"\n | \"data-entry\"\n | \"feedback\"\n | \"navigation\"\n | \"composites\"\n | \"shell\"\n | \"providers\";\n\nexport interface ComponentProp {\n name: string;\n type: string;\n required?: boolean;\n description: string;\n defaultValue?: string;\n}\n\nexport interface ComponentEntry {\n name: string;\n group: ComponentGroup;\n tagline: string;\n props: ComponentProp[];\n example: string;\n docPath?: string;\n storyPath: string;\n rules: number[];\n}\n\nexport const COMPONENTS: ComponentEntry[] = [\n // ─── layout ─────────────────────────────────────────────────────────────\n {\n name: \"PageContainer\",\n group: \"layout\",\n tagline: \"Mandatory page shell — EVERY page wraps its content in PageContainer (title/subtitle/extra/footer/breadcrumb).\",\n props: [\n { name: \"title\", type: \"string\", required: true, description: \"Page heading rendered as <h1>.\" },\n { name: \"subtitle\", type: \"string\", description: \"Secondary line beneath the title.\" },\n { name: \"extra\", type: \"ReactNode\", description: \"Action buttons / controls rendered right of the title row.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"Content area pinned below the page body.\" },\n { name: \"breadcrumb\", type: \"BreadcrumbItemProp[]\", description: \"Ordered trail of { label, to? } segments above the title.\" },\n { name: \"variant\", type: '\"default\" | \"narrow\" | \"flush\" | \"ghost\"', defaultValue: '\"default\"', description: \"Page shell layout; flush removes padding for full-bleed content.\" },\n { name: \"density\", type: '\"compact\" | \"default\" | \"comfortable\"', defaultValue: '\"default\"', description: \"Spacing density across the page subtree.\" },\n { name: \"stickyFooter\", type: \"boolean\", defaultValue: \"false\", description: \"Pin footer to viewport bottom on scroll — pairs with variant=\\\"narrow\\\".\" },\n ],\n example: `import { PageContainer, Stack } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\n\nexport default function OrdersPage() {\n return (\n <PageContainer\n title=\"注文一覧\"\n subtitle=\"直近30日間の受注データ\"\n breadcrumb={[{ label: \"ホーム\", to: \"/\" }, { label: \"注文一覧\" }]}\n extra={<Button>新規注文</Button>}\n >\n <Stack gap=\"lg\">{/* page content */}</Stack>\n </PageContainer>\n );\n}`,\n storyPath: \"layout/PageContainer.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Stack\",\n group: \"layout\",\n tagline: \"Vertical flex column with token gap — the default block-stacking primitive (use instead of space-y-*).\",\n props: [\n { name: \"gap\", type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"', defaultValue: '\"md\"', description: \"Vertical space between children (design tokens).\" },\n { name: \"className\", type: \"string\", description: \"Extra classes merged via cn().\" },\n { name: \"children\", type: \"ReactNode\", description: \"Block-level children to stack.\" },\n ],\n example: `import { Stack } from \"@godxjp/ui/layout\";\n\n<Stack gap=\"lg\">\n <KpiRow />\n <FilterBarBlock />\n <TableCard />\n</Stack>`,\n storyPath: \"layout/Stack.stories.tsx\",\n rules: [2, 40],\n },\n {\n name: \"Inline\",\n group: \"layout\",\n tagline: \"Horizontal flex row with token gap — the default inline/row arrangement (use instead of gap-* on a flex div).\",\n props: [\n { name: \"gap\", type: '\"xs\" | \"sm\" | \"md\" | \"lg\"', defaultValue: '\"sm\"', description: \"Horizontal space between children.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes merged via cn().\" },\n { name: \"children\", type: \"ReactNode\", description: \"Inline children in a row.\" },\n ],\n example: `import { Inline } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<Inline gap=\"sm\">\n <Button>保存</Button>\n <Button variant=\"outline\">キャンセル</Button>\n</Inline>`,\n storyPath: \"layout/Inline.stories.tsx\",\n rules: [2],\n },\n {\n name: \"ResponsiveGrid\",\n group: \"layout\",\n tagline: \"Auto-responsive card grid — columns collapse to 1 on mobile, scale up on wider breakpoints.\",\n props: [\n { name: \"columns\", type: \"2 | 3 | 4\", defaultValue: \"3\", description: \"Target column count at desktop; collapses to 1 on mobile.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Grid items — typically Card or CardStat.\" },\n ],\n example: `import { ResponsiveGrid } from \"@godxjp/ui/layout\";\nimport { CardStat } from \"@godxjp/ui/data-display\";\n\n<ResponsiveGrid columns={4}>\n <CardStat label=\"総会員数\" value=\"12,400\" />\n <CardStat label=\"公開中クーポン\" value=\"8\" />\n <CardStat label=\"月間利用数\" value=\"3,210\" />\n <CardStat label=\"割引総額\" value=\"¥480,000\" />\n</ResponsiveGrid>`,\n storyPath: \"layout/ResponsiveGrid.stories.tsx\",\n rules: [24, 40],\n },\n {\n name: \"AppShell\",\n group: \"layout\",\n tagline: \"Root application shell — composes sidebar, topbar rail, main content area, and optional footer.\",\n props: [\n { name: \"sidebar\", type: \"ReactNode\", required: true, description: \"Sidebar node — typically a <Sidebar>.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Main page content rendered in <main>.\" },\n { name: \"topbar\", type: \"ReactNode\", description: \"Full topbar override; else a rail is built from topbarLeft/topbarRight/logo.\" },\n { name: \"topbarRight\", type: \"ReactNode\", description: \"Right slot of the auto-built topbar rail (user menu, switcher).\" },\n { name: \"topbarLeft\", type: \"ReactNode\", description: \"Left slot of the auto-built topbar rail.\" },\n { name: \"logo\", type: \"ReactNode\", description: \"Logo at the far-left of the auto-built topbar rail.\" },\n { name: \"sidebarCollapsed\", type: \"boolean\", defaultValue: \"false\", description: \"Collapse the sidebar to icon-only mode.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"App-level footer outside the main content area.\" },\n ],\n example: `import { AppShell, Sidebar } from \"@godxjp/ui/layout\";\nimport { LayoutDashboard, Users } from \"lucide-react\";\nimport { router } from \"@inertiajs/react\";\n\nconst sidebar = (\n <Sidebar\n activeId=\"/dashboard\"\n onSelect={(id) => router.visit(id)}\n sections={[{ items: [\n { id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard },\n { id: \"/users\", label: \"ユーザー\", icon: Users },\n ] }]}\n product={{ name: \"JOVY CRM\", role: \"本部\", color: \"var(--color-primary)\" }}\n />\n);\n\nexport function CrmLayout({ children }: { children: React.ReactNode }) {\n return <AppShell sidebar={sidebar}>{children}</AppShell>;\n}`,\n storyPath: \"layout/AppShell.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Sidebar\",\n group: \"layout\",\n tagline: \"Navigation sidebar with sections, items, product header, and collapsible icon-only mode.\",\n props: [\n { name: \"activeId\", type: \"string\", required: true, description: \"Id of the active nav item; drives highlight.\" },\n { name: \"sections\", type: \"SidebarSectionProp[]\", required: true, description: \"Array of { label?, items: SidebarItemProp[] } where item = { id, label, icon, badge? }.\" },\n { name: \"onSelect\", type: \"(id: string) => void\", description: \"Called on item click; typically router.visit(id).\" },\n { name: \"product\", type: \"{ name: string; role?: string; color?: string }\", description: \"Product/workspace block at the top.\" },\n { name: \"brand\", type: \"ReactNode\", description: \"Custom brand node replacing the product block.\" },\n { name: \"collapsed\", type: \"boolean\", defaultValue: \"false\", description: \"Icon-only mode; labels/section headings hidden.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"Bottom slot (user info, logout). The .sb-footer wrapper supplies the top border + padding; YOUR content must use SEMANTIC token classes — `text-muted-foreground text-xs` outer with a `text-foreground font-medium` primary line. Do NOT use raw `opacity-*` / arbitrary `text-[11px]` (washed-out, off-design).\" },\n ],\n example: `import { Sidebar } from \"@godxjp/ui/layout\";\nimport { Stack } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { LayoutDashboard, Users, LogOut } from \"lucide-react\";\nimport { router, usePage } from \"@inertiajs/react\";\n\nexport function AppSidebar() {\n const { url } = usePage();\n return (\n <Sidebar\n activeId={url}\n onSelect={(id) => router.visit(id)}\n sections={[{ label: \"メイン\", items: [\n { id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard },\n { id: \"/members\", label: \"会員管理\", icon: Users },\n ] }]}\n product={{ name: \"JOVY CRM\", role: \"本部\" }}\n footer={\n // Canonical footer: semantic tokens only (see Sidebar story).\n <Stack gap=\"sm\">\n <div className=\"text-muted-foreground text-xs\">\n <div className=\"text-foreground font-medium\">山田 花子</div>\n <div>ABCファーマシー</div>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => router.post(\"/logout\")}>\n <LogOut className=\"size-4\" />ログアウト\n </Button>\n </Stack>\n }\n />\n );\n}`,\n storyPath: \"layout/Sidebar.stories.tsx\",\n rules: [2, 23],\n },\n {\n name: \"Topbar\",\n group: \"layout\",\n tagline: \"Application topbar with product/project switcher and search/notification slots (or use AppShell's topbarRight).\",\n props: [\n { name: \"product\", type: \"{ name: string; color?: string }\", required: true, description: \"Current product chip.\" },\n { name: \"project\", type: \"{ name: string } | null\", description: \"Current project chip; null shows placeholder.\" },\n { name: \"onSearchOpen\", type: \"() => void\", description: \"Called when the search bar is clicked.\" },\n { name: \"onProductOpen\", type: \"() => void\", description: \"Called when the product chip is clicked.\" },\n ],\n example: `import { Topbar } from \"@godxjp/ui/layout\";\n\n<Topbar product={{ name: \"JOVY CRM\" }} project={{ name: \"本番環境\" }} />`,\n storyPath: \"layout/Topbar.stories.tsx\",\n rules: [23],\n },\n {\n name: \"PageInset\",\n group: \"layout\",\n tagline: \"Padded horizontal strip aligned with the page header — use inside variant=\\\"flush\\\" for filter bars / intros.\",\n props: [\n { name: \"children\", type: \"ReactNode\", description: \"Content rendered with standard page horizontal padding.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes.\" },\n ],\n example: `import { PageContainer, PageInset } from \"@godxjp/ui/layout\";\n\n<PageContainer title=\"商品一覧\" variant=\"flush\">\n <PageInset><FilterBarBlock /></PageInset>\n {/* full-bleed table below */}\n</PageContainer>`,\n storyPath: \"layout/PageInset.stories.tsx\",\n rules: [],\n },\n {\n name: \"SplitPane\",\n group: \"layout\",\n tagline: \"Two-column layout with a main content area and a fixed-width aside panel.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Main (left) content.\" },\n { name: \"aside\", type: \"ReactNode\", required: true, description: \"Aside (right) panel content.\" },\n { name: \"asideWidth\", type: '\"sm\" | \"md\"', defaultValue: '\"md\"', description: \"Width preset for the aside column.\" },\n ],\n example: `import { SplitPane } from \"@godxjp/ui/layout\";\n\n<SplitPane aside={<DetailPanel />} asideWidth=\"sm\">\n <MainContent />\n</SplitPane>`,\n storyPath: \"layout/SplitPane.stories.tsx\",\n rules: [24],\n },\n {\n name: \"Breadcrumb\",\n group: \"layout\",\n tagline: \"Standalone breadcrumb nav rendering an ordered trail of page segments.\",\n props: [\n { name: \"items\", type: \"BreadcrumbItemProp[]\", required: true, description: \"Array of { label, to? } — omit `to` on the last (current) segment.\" },\n ],\n example: `import { Breadcrumb } from \"@godxjp/ui/layout\";\n\n<Breadcrumb items={[\n { label: \"ホーム\", to: \"/\" },\n { label: \"会員管理\", to: \"/members\" },\n { label: \"田中 太郎\" },\n]} />`,\n storyPath: \"layout/Breadcrumb.stories.tsx\",\n rules: [],\n },\n\n // ─── general ────────────────────────────────────────────────────────────\n {\n name: \"Button\",\n group: \"general\",\n tagline: \"Core button with variant + size presets, built on cva and Radix Slot (asChild).\",\n props: [\n { name: \"variant\", type: '\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"', defaultValue: '\"default\"', description: \"Visual style.\" },\n { name: \"size\", type: '\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\"', defaultValue: '\"default\"', description: \"Size preset (height, padding, icon dims).\" },\n { name: \"asChild\", type: \"boolean\", defaultValue: \"false\", description: \"Render as Radix Slot — merge props onto the child (<a>/<Link>).\" },\n { name: \"disabled\", type: \"boolean\", description: \"Disable the button.\" },\n { name: \"onClick\", type: \"React.MouseEventHandler<HTMLButtonElement>\", description: \"Click handler.\" },\n ],\n example: `import { Button } from \"@godxjp/ui/general\";\nimport { Trash2 } from \"lucide-react\";\n\n<>\n <Button>保存</Button>\n <Button variant=\"outline\" size=\"sm\">編集</Button>\n <Button variant=\"ghost\" size=\"icon-sm\"><Trash2 className=\"size-4\" /></Button>\n</>`,\n storyPath: \"general/Button.stories.tsx\",\n rules: [23],\n },\n\n // ─── data-display ───────────────────────────────────────────────────────\n {\n name: \"DataTable\",\n group: \"data-display\",\n tagline: \"Full-width admin list. Lives in its OWN row (Card + CardContent flush) — never inside a narrow grid column. Cells default to white-space:nowrap (scroll, don't crush).\",\n props: [\n { name: \"data\", type: \"T[]\", required: true, description: \"Row data array.\" },\n { name: \"columns\", type: \"ColumnDef<T>[]\", required: true, description: \"Each: { key, header, render?(row), align?: 'left'|'center'|'right', sortable?, width? }. width is a Tailwind class string e.g. 'w-64'.\" },\n { name: \"getRowId\", type: \"(row: T) => string\", description: \"Row key extractor (falls back to row.id). Required when selectable.\" },\n { name: \"onRowClick\", type: \"(row: T) => void\", description: \"Navigate on row click; ignored when target is interactive.\" },\n { name: \"selectable\", type: \"boolean\", defaultValue: \"false\", description: \"Enable checkbox column + bulk selection.\" },\n { name: \"selected\", type: \"Set<string>\", description: \"Controlled selection set.\" },\n { name: \"onSelectChange\", type: \"(next: Set<string>) => void\", description: \"Selection change handler.\" },\n { name: \"onSortChange\", type: \"(sort | undefined) => void\", description: \"Fires when a sortable header is clicked; undefined clears sort.\" },\n ],\n example: `import { Card, CardContent, DataTable, StatusBadge } from \"@godxjp/ui/data-display\";\nimport type { ColumnDef } from \"@godxjp/ui/data-display\";\nimport { router } from \"@inertiajs/react\";\n\ntype Member = { id: string; name: string; status: string };\nconst columns: ColumnDef<Member>[] = [\n { key: \"name\", header: \"氏名\", width: \"w-64\", render: (m) => <span className=\"font-medium\">{m.name}</span> },\n { key: \"status\", header: \"ステータス\", render: (m) => <StatusBadge status={m.status} /> },\n];\n\n<Card>\n <CardContent flush>\n <DataTable data={members} columns={columns} getRowId={(m) => m.id}\n onRowClick={(m) => router.visit(\"/members/\" + m.id)} />\n </CardContent>\n</Card>`,\n storyPath: \"data-display/DataTable.stories.tsx\",\n rules: [37, 39, 35],\n },\n {\n name: \"Card\",\n group: \"data-display\",\n tagline: \"Surface container with optional accent stripe, variant fill, size, and density. Compose with CardHeader/CardTitle/CardContent/CardFooter.\",\n props: [\n { name: \"accent\", type: '\"primary\" | \"success\" | \"warning\" | \"info\" | \"attention\" | \"destructive\"', description: \"3px left-edge semantic accent stripe.\" },\n { name: \"variant\", type: '\"default\" | \"muted\" | \"outline\" | \"featured\"', defaultValue: '\"default\"', description: \"Surface fill style.\" },\n { name: \"size\", type: '\"default\" | \"compact\"', defaultValue: '\"default\"', description: \"Card size preset.\" },\n { name: \"density\", type: '\"tight\" | \"cozy\"', description: \"Internal padding density (base 16 / tight 12 / cozy 20).\" },\n ],\n example: `import { Card, CardHeader, CardTitle, CardContent } from \"@godxjp/ui/data-display\";\n\n<Card accent=\"success\">\n <CardHeader><CardTitle>注文サマリー</CardTitle></CardHeader>\n <CardContent>総売上: ¥1,234,567</CardContent>\n</Card>`,\n storyPath: \"data-display/Card.stories.tsx\",\n rules: [],\n },\n {\n name: \"CardContent\",\n group: \"data-display\",\n tagline: \"Card body. flush = edge-to-edge (for DataTable/tabs); tight = no top gap; solo = no header above. NEVER put a FilterBar inside flush (it loses padding).\",\n props: [\n { name: \"flush\", type: \"boolean\", description: \"Remove horizontal padding for edge-to-edge tables / tabs lists.\" },\n { name: \"tight\", type: \"boolean\", description: \"No top gap after header — pair with flush toolbars/tabs.\" },\n { name: \"solo\", type: \"boolean\", description: \"No header above: top padding matches the card shell.\" },\n ],\n example: `import { Card, CardContent, DataTable } from \"@godxjp/ui/data-display\";\n\n<Card>\n <CardContent flush>\n <DataTable data={rows} columns={columns} />\n </CardContent>\n</Card>`,\n storyPath: \"data-display/Card.stories.tsx\",\n rules: [37, 38],\n },\n {\n name: \"CardStat\",\n group: \"data-display\",\n tagline: \"KPI tile. ⚠️ CardStat IS ALREADY a bordered Card — render it DIRECTLY in ResponsiveGrid. NEVER wrap it in <Card>/<CardContent> (that double-borders it → looks too thick). NO accent prop (accent is a Card prop).\",\n props: [\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Metric name.\" },\n { name: \"value\", type: \"ReactNode\", required: true, description: \"Metric value (string/number/ReactNode).\" },\n { name: \"hint\", type: \"ReactNode\", description: \"Secondary context below the value.\" },\n { name: \"delta\", type: \"ReactNode\", description: \"Compact trend text beside the value. Sign-aware tone (+ green / - red).\" },\n { name: \"layout\", type: '\"stacked\" | \"inline\"', defaultValue: '\"stacked\"', description: \"stacked = label over value; inline = label left / value right.\" },\n { name: \"align\", type: '\"start\" | \"end\"', description: \"Align the metric group.\" },\n ],\n example: `import { CardStat } from \"@godxjp/ui/data-display\";\nimport { ResponsiveGrid } from \"@godxjp/ui/layout\";\n\n// ✅ CardStat sits directly in the grid — it draws its own card + border.\n<ResponsiveGrid columns={3}>\n <CardStat label=\"総会員数\" value=\"12,450\" hint=\"先月比 +3%\" />\n <CardStat label=\"月次売上\" value=\"¥8,200,000\" delta=\"+12%\" />\n <CardStat label=\"利用率\" value=\"68.4%\" />\n</ResponsiveGrid>\n\n// ❌ Double border — do NOT wrap CardStat in a Card:\n// <Card><CardContent><CardStat label=\"x\" value=\"1\" /></CardContent></Card>`,\n storyPath: \"data-display/CardStat.stories.tsx\",\n rules: [],\n },\n {\n name: \"StatusBadge\",\n group: \"data-display\",\n tagline: \"Lifecycle chip that auto-maps English keys (active/draft/pending/failed/…) to tone + icon. For localized labels or tiers, pass tone explicitly; pass icon={null} for tiers. Chips never wrap.\",\n props: [\n { name: \"status\", type: \"string\", required: true, description: \"Lifecycle key or any domain string. Unknown strings fall back to neutral unless tone is set.\" },\n { name: \"tone\", type: '\"success\" | \"warning\" | \"destructive\" | \"info\" | \"neutral\"', description: \"Override the resolved tone (escape hatch for localized / tier values).\" },\n { name: \"icon\", type: \"LucideIcon | null\", description: \"Override the icon; null hides it — preferred for tier / category badges.\" },\n { name: \"label\", type: \"ReactNode\", description: \"Override display text (default: i18n of key, or raw status).\" },\n ],\n example: `import { StatusBadge } from \"@godxjp/ui/data-display\";\n\n<>\n <StatusBadge status=\"active\" label=\"公開中\" /> {/* green check */}\n <StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} /> {/* tier pill, no icon */}\n <StatusBadge status=\"ゴールド\" tone=\"warning\" icon={null} />\n</>`,\n storyPath: \"data-display/StatusBadge.stories.tsx\",\n rules: [35, 36],\n },\n {\n name: \"Badge\",\n group: \"data-display\",\n tagline: \"Plain label chip with semantic variants. Use for static category tags; use StatusBadge for lifecycle status.\",\n props: [\n { name: \"variant\", type: '\"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"success\" | \"warning\"', defaultValue: '\"default\"', description: \"Visual variant.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Badge text/content.\" },\n ],\n example: `import { Badge } from \"@godxjp/ui/data-display\";\n\n<Badge variant=\"secondary\">A/B</Badge>\n<Badge variant=\"success\">承認済</Badge>`,\n storyPath: \"data-display/Badge.stories.tsx\",\n rules: [35],\n },\n {\n name: \"KeyValueGrid\",\n group: \"data-display\",\n tagline: \"Responsive definition grid for detail-page metadata. COMPOUND — value goes in KeyValueGrid.Item children.\",\n props: [\n { name: \"columns\", type: \"1 | 2 | 3\", defaultValue: \"2\", description: \"Column count; collapses to 1 on mobile.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"KeyValueGrid.Item elements.\" },\n ],\n example: `import { KeyValueGrid } from \"@godxjp/ui/data-display\";\n\n<KeyValueGrid columns={2}>\n <KeyValueGrid.Item label=\"会員ID\" mono>{member.id}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"プラン\">{member.plan}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"メモ\" span={2}>{member.note}</KeyValueGrid.Item>\n</KeyValueGrid>`,\n storyPath: \"data-display/KeyValueGrid.stories.tsx\",\n rules: [],\n },\n {\n name: \"EmptyState\",\n group: \"data-display\",\n tagline: \"Centred empty placeholder with icon, title, description, and optional CTA.\",\n props: [\n { name: \"title\", type: \"string\", required: true, description: \"Primary empty message.\" },\n { name: \"description\", type: \"string\", description: \"Secondary helper text.\" },\n { name: \"icon\", type: \"LucideIcon\", description: \"Icon above the title.\" },\n { name: \"action\", type: \"ReactNode\", description: \"CTA element (e.g. a Button).\" },\n ],\n example: `import { EmptyState } from \"@godxjp/ui/data-display\";\n\n<EmptyState title=\"該当データがありません\" description=\"検索条件を変更してください。\" />`,\n storyPath: \"data-display/EmptyState.stories.tsx\",\n rules: [],\n },\n {\n name: \"ProgressMeter\",\n group: \"data-display\",\n tagline: \"Horizontal progress bar 0–100 with optional label and semantic tone.\",\n props: [\n { name: \"value\", type: \"number\", required: true, description: \"Progress percentage 0–100 (clamped).\" },\n { name: \"label\", type: \"string\", description: \"Text label beside/below the bar.\" },\n { name: \"tone\", type: '\"success\" | \"warning\"', defaultValue: '\"success\"', description: \"Bar colour tone.\" },\n ],\n example: `import { ProgressMeter } from \"@godxjp/ui/data-display\";\n\n<ProgressMeter value={pct} label={pct + \"% 使用中\"} tone={pct >= 80 ? \"warning\" : \"success\"} />`,\n storyPath: \"data-display/ProgressMeter.stories.tsx\",\n rules: [],\n },\n {\n name: \"Timeline\",\n group: \"data-display\",\n tagline: \"Vertical event list with an icon rail. Current item gets a highlighted glyph.\",\n props: [\n { name: \"items\", type: \"TimelineItem[]\", required: true, description: \"Array of { title, location?, time?, note?, current? }.\" },\n ],\n example: `import { Timeline } from \"@godxjp/ui/data-display\";\n\n<Timeline items={[\n { title: \"注文受付\", time: \"2024-06-01 10:00\" },\n { title: \"発送準備中\", time: \"2024-06-01 14:00\" },\n { title: \"配送中\", current: true },\n]} />`,\n storyPath: \"data-display/Timeline.stories.tsx\",\n rules: [],\n },\n {\n name: \"Table\",\n group: \"data-display\",\n tagline: \"Primitive table shell (Table/TableHeader/TableBody/TableRow/TableHead/TableCell). Prefer DataTable for admin lists; use these for custom one-off tables.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"TableHeader / TableBody composition.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes on the table element.\" },\n ],\n example: `import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"@godxjp/ui/data-display\";\n\n<Table>\n <TableHeader><TableRow><TableHead>項目</TableHead><TableHead className=\"text-right\">金額</TableHead></TableRow></TableHeader>\n <TableBody><TableRow><TableCell>送料</TableCell><TableCell className=\"text-right\">¥500</TableCell></TableRow></TableBody>\n</Table>`,\n storyPath: \"data-display/Table.stories.tsx\",\n rules: [],\n },\n {\n name: \"DataState\",\n group: \"data-display\",\n tagline: \"TanStack Query lifecycle widget — skeleton / error / empty / success for one useQuery block. Import from @godxjp/ui/query.\",\n props: [\n { name: \"query\", type: \"UseQueryResult<T>\", required: true, description: \"The useQuery result.\" },\n { name: \"skeleton\", type: \"ReactNode\", required: true, description: \"Shown while loading.\" },\n { name: \"children\", type: \"(data) => ReactNode\", required: true, description: \"Render function with resolved data.\" },\n { name: \"empty\", type: \"ReactNode\", description: \"Shown when isEmpty(data) is true.\" },\n { name: \"isEmpty\", type: \"(data) => boolean\", description: \"Custom empty check.\" },\n ],\n example: `import { DataState } from \"@godxjp/ui/query\";\n\n<DataState query={membersQuery} skeleton={<SkeletonTable />} isEmpty={(d) => d.items.length === 0} empty={<EmptyState title=\"会員なし\" />}>\n {(d) => <MemberTable items={d.items} />}\n</DataState>`,\n storyPath: \"query/DataState.stories.tsx\",\n rules: [],\n },\n {\n name: \"InfiniteQueryState\",\n group: \"data-display\",\n tagline: \"useInfiniteQuery widget — flatten pages, skeleton/empty/error, load-more footer. Import from @godxjp/ui/query.\",\n props: [\n { name: \"query\", type: \"UseInfiniteQueryResult\", required: true, description: \"The useInfiniteQuery result.\" },\n { name: \"skeleton\", type: \"ReactNode\", required: true, description: \"Shown while initial load pends.\" },\n { name: \"flatten\", type: \"(data) => TFlat\", required: true, description: \"Reduce pages to a flat list (use flattenItemPages helper).\" },\n { name: \"children\", type: \"(flat, helpers) => ReactNode\", required: true, description: \"Render with flat data + { fetchNextPage, hasNextPage, isFetchingNextPage }.\" },\n ],\n example: `import { InfiniteQueryState, flattenItemPages } from \"@godxjp/ui/query\";\n\n<InfiniteQueryState query={q} skeleton={<SkeletonRows />} flatten={flattenItemPages} isEmpty={(it) => it.length === 0}>\n {(items) => items.map((a) => <ActivityRow key={a.id} activity={a} />)}\n</InfiniteQueryState>`,\n storyPath: \"query/InfiniteQueryState.stories.tsx\",\n rules: [],\n },\n {\n name: \"MutationFeedback\",\n group: \"data-display\",\n tagline: \"Inline mutation error — renders nothing when idle/successful. Import from @godxjp/ui/query.\",\n props: [\n { name: \"mutation\", type: \"{ isError, error, isPending }\", required: true, description: \"useMutation result.\" },\n { name: \"onRetry\", type: \"() => void\", description: \"Retry handler.\" },\n ],\n example: `import { MutationFeedback } from \"@godxjp/ui/query\";\n\n<MutationFeedback mutation={saveMutation} />`,\n storyPath: \"query/MutationFeedback.stories.tsx\",\n rules: [],\n },\n\n // ─── data-entry ─────────────────────────────────────────────────────────\n {\n name: \"FormField\",\n group: \"data-entry\",\n tagline: \"Wraps a control with label, helper, and error; injects aria-describedby/aria-invalid onto the child.\",\n props: [\n { name: \"id\", type: \"string\", required: true, description: \"Forwarded to Label htmlFor + builds helper/error ids.\" },\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Field label above the control.\" },\n { name: \"required\", type: \"boolean\", defaultValue: \"false\", description: \"Red asterisk + aria-required on the child.\" },\n { name: \"helper\", type: \"string\", description: \"Muted hint shown when there is no error.\" },\n { name: \"error\", type: \"string\", description: \"Destructive error message (role=alert); overrides helper.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"The single control to render.\" },\n ],\n example: `import { FormField, Input } from \"@godxjp/ui/data-entry\";\n\n<FormField id=\"coupon-name\" label=\"クーポン名\" required error={errors.name} helper=\"最大50文字\">\n <Input id=\"coupon-name\" placeholder=\"春の花粉症対策15%OFF\" value={name} onChange={(e) => setName(e.target.value)} />\n</FormField>`,\n storyPath: \"data-entry/FormField.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Input\",\n group: \"data-entry\",\n tagline: \"Styled wrapper around native <input>; accepts all HTML input attributes. Pair with FormField for labelled fields.\",\n props: [\n { name: \"id\", type: \"string\", description: \"Associates with a <label htmlFor>.\" },\n { name: \"type\", type: \"string\", defaultValue: '\"text\"', description: \"Native input type.\" },\n { name: \"placeholder\", type: \"string\", description: \"Placeholder.\" },\n { name: \"value\", type: \"string | number\", description: \"Controlled value.\" },\n { name: \"onChange\", type: \"React.ChangeEventHandler<HTMLInputElement>\", description: \"Native change handler.\" },\n ],\n example: `import { Input } from \"@godxjp/ui/data-entry\";\n\n<Input id=\"qty\" type=\"number\" placeholder=\"例: 500\" value={value} onChange={(e) => setValue(e.target.value)} />`,\n storyPath: \"data-entry/Input.stories.tsx\",\n rules: [],\n },\n {\n name: \"SearchInput\",\n group: \"data-entry\",\n tagline: \"Debounced search box with a clear button. Fires onSearch (NOT onChange) after the debounce. Controlled (value) or uncontrolled (defaultValue).\",\n props: [\n { name: \"onSearch\", type: \"(q: string) => void\", required: true, description: \"Called with the query after the debounce. Use this to drive filtering — NOT onChange.\" },\n { name: \"value\", type: \"string\", description: \"Controlled value.\" },\n { name: \"defaultValue\", type: \"string\", defaultValue: '\"\"', description: \"Initial uncontrolled value.\" },\n { name: \"placeholder\", type: \"string\", description: \"Input placeholder.\" },\n { name: \"debounce\", type: \"number\", defaultValue: \"250\", description: \"Debounce delay (ms).\" },\n ],\n example: `import { SearchInput } from \"@godxjp/ui/data-entry\";\n\n<SearchInput placeholder=\"クーポン名・IDで検索\" value={search} onSearch={setSearch} />`,\n storyPath: \"data-entry/SearchInput.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Select\",\n group: \"data-entry\",\n tagline: \"Radix compound select. Controlled via value + onValueChange on <Select>; compose SelectTrigger>SelectValue and SelectContent>SelectItem. This is the filter/select pattern the app uses.\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled selected value.\" },\n { name: \"defaultValue\", type: \"string\", description: \"Uncontrolled initial value.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Called when the user picks an item.\" },\n { name: \"disabled\", type: \"boolean\", defaultValue: \"false\", description: \"Disable the trigger.\" },\n ],\n example: `import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@godxjp/ui/data-entry\";\n\n<Select value={status} onValueChange={setStatus}>\n <SelectTrigger><SelectValue placeholder=\"全ステータス\" /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">全ステータス</SelectItem>\n <SelectItem value=\"active\">公開中</SelectItem>\n <SelectItem value=\"draft\">下書き</SelectItem>\n </SelectContent>\n</Select>`,\n storyPath: \"data-entry/Select.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Switch\",\n group: \"data-entry\",\n tagline: \"Radix toggle switch (bare). For a labelled row with a hidden form input use SwitchField.\",\n props: [\n { name: \"checked\", type: \"boolean\", description: \"Controlled checked state.\" },\n { name: \"onCheckedChange\", type: \"(checked: boolean) => void\", description: \"Fires when toggled.\" },\n { name: \"id\", type: \"string\", description: \"Links to a <Label htmlFor>.\" },\n { name: \"disabled\", type: \"boolean\", defaultValue: \"false\", description: \"Disable the toggle.\" },\n ],\n example: `import { Switch, Label } from \"@godxjp/ui/data-entry\";\n\n<div className=\"flex items-center gap-2\">\n <Switch id=\"stackable\" checked={stackable} onCheckedChange={setStackable} />\n <Label htmlFor=\"stackable\">他クーポンとの併用を許可</Label>\n</div>`,\n storyPath: \"data-entry/Switch.stories.tsx\",\n rules: [],\n },\n {\n name: \"Textarea\",\n group: \"data-entry\",\n tagline: \"Styled wrapper around native <textarea>. Pair with FormField for labelled fields.\",\n props: [\n { name: \"id\", type: \"string\", description: \"Associates with a <Label htmlFor>.\" },\n { name: \"rows\", type: \"number\", description: \"Visible text rows.\" },\n { name: \"value\", type: \"string\", description: \"Controlled value.\" },\n { name: \"onChange\", type: \"React.ChangeEventHandler<HTMLTextAreaElement>\", description: \"Change handler.\" },\n ],\n example: `import { Textarea } from \"@godxjp/ui/data-entry\";\n\n<Textarea id=\"notes\" rows={4} placeholder=\"自由記述\" value={notes} onChange={(e) => setNotes(e.target.value)} />`,\n storyPath: \"data-entry/Textarea.stories.tsx\",\n rules: [],\n },\n {\n name: \"Label\",\n group: \"data-entry\",\n tagline: \"Styled Radix Label; use htmlFor to associate with a control.\",\n props: [\n { name: \"htmlFor\", type: \"string\", description: \"Id of the associated control.\" },\n { name: \"children\", type: \"ReactNode\", description: \"Label content.\" },\n ],\n example: `import { Label } from \"@godxjp/ui/data-entry\";\n\n<Label htmlFor=\"stackable\">併用を許可</Label>`,\n storyPath: \"data-entry/Label.stories.tsx\",\n rules: [],\n },\n {\n name: \"Checkbox\",\n group: \"data-entry\",\n tagline: \"Radix checkbox; standalone or via CheckboxGroup with an options array.\",\n props: [\n { name: \"checked\", type: \"boolean | 'indeterminate'\", description: \"Controlled checked state.\" },\n { name: \"onCheckedChange\", type: \"(checked) => void\", description: \"Fires when checked state changes.\" },\n { name: \"id\", type: \"string\", description: \"Links to a <Label htmlFor>.\" },\n ],\n example: `import { Checkbox, Label } from \"@godxjp/ui/data-entry\";\n\n<div className=\"flex items-center gap-2\">\n <Checkbox id=\"agree\" checked={agreed} onCheckedChange={(v) => setAgreed(!!v)} />\n <Label htmlFor=\"agree\">利用規約に同意する</Label>\n</div>`,\n storyPath: \"data-entry/Checkbox.stories.tsx\",\n rules: [],\n },\n {\n name: \"RadioGroup\",\n group: \"data-entry\",\n tagline: \"Radio group accepting an options array or RadioItem children.\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled selected value.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Fires on selection change.\" },\n { name: \"options\", type: \"ChoiceOptionProp[]\", description: \"Declarative list: { label, value, disabled?, description? }.\" },\n { name: \"orientation\", type: '\"horizontal\" | \"vertical\"', defaultValue: '\"vertical\"', description: \"Layout direction.\" },\n ],\n example: `import { RadioGroup } from \"@godxjp/ui/data-entry\";\n\n<RadioGroup value={trigger} onValueChange={setTrigger} orientation=\"horizontal\" options={[\n { label: \"初回購入\", value: \"first_purchase\" },\n { label: \"誕生日\", value: \"birthday\" },\n]} />`,\n storyPath: \"data-entry/RadioGroup.stories.tsx\",\n rules: [23],\n },\n {\n name: \"DatePicker\",\n group: \"data-entry\",\n tagline: \"Calendar popover for a single date; controlled via value (Date) + onChange.\",\n props: [\n { name: \"value\", type: \"Date\", description: \"Controlled selected date.\" },\n { name: \"onChange\", type: \"(date: Date | undefined) => void\", description: \"Fires when picked/cleared.\" },\n { name: \"placeholder\", type: \"string\", description: \"Trigger label when empty.\" },\n ],\n example: `import { DatePicker, FormField } from \"@godxjp/ui/data-entry\";\n\n<FormField id=\"valid-from\" label=\"有効開始日\">\n <DatePicker id=\"valid-from\" value={validFrom} onChange={setValidFrom} placeholder=\"日付を選択\" />\n</FormField>`,\n storyPath: \"data-entry/DatePicker.stories.tsx\",\n rules: [],\n },\n\n // ─── feedback ───────────────────────────────────────────────────────────\n {\n name: \"Dialog\",\n group: \"feedback\",\n tagline: \"Compound modal. Controlled via open + onOpenChange. Parts available flat (DialogTrigger/DialogContent/…) or as Dialog.Trigger/Dialog.Content. mode=\\\"confirm\\\" switches to alertdialog.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n { name: \"mode\", type: '\"form\" | \"confirm\"', defaultValue: '\"form\"', description: \"form = Radix Dialog (× close); confirm = AlertDialog (no ×).\" },\n ],\n example: `import { useState } from \"react\";\nimport { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from \"@godxjp/ui/feedback\";\nimport { Button } from \"@godxjp/ui/general\";\n\nfunction CreateDialog() {\n const [open, setOpen] = useState(false);\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild><Button size=\"sm\">新規作成</Button></DialogTrigger>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>新規クーポン作成</DialogTitle>\n <DialogDescription>クーポン情報を入力してください。</DialogDescription>\n </DialogHeader>\n {/* fields */}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>キャンセル</Button>\n <Button onClick={() => setOpen(false)}>保存</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}`,\n storyPath: \"feedback/Dialog.stories.tsx\",\n rules: [23, 3],\n },\n {\n name: \"Sheet\",\n group: \"feedback\",\n tagline: \"Side-panel drawer (Radix Dialog). Parts: Sheet/SheetTrigger/SheetContent(side=right|left|top|bottom)/SheetHeader/SheetTitle/SheetFooter.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n ],\n example: `import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle } from \"@godxjp/ui/feedback\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild><Button variant=\"outline\" size=\"sm\">絞り込み</Button></SheetTrigger>\n <SheetContent side=\"right\">\n <SheetHeader><SheetTitle>フィルター設定</SheetTitle></SheetHeader>\n {/* filter fields */}\n </SheetContent>\n</Sheet>`,\n storyPath: \"feedback/Sheet.stories.tsx\",\n rules: [3],\n },\n {\n name: \"Alert\",\n group: \"feedback\",\n tagline: \"Inline alert banner with variant-aware icon + optional dismiss. Parts: Alert/AlertTitle/AlertDescription/AlertActions/AlertQueryError.\",\n props: [\n { name: \"variant\", type: '\"default\" | \"destructive\" | \"warning\" | \"success\"', defaultValue: '\"default\"', description: \"Colour scheme + default icon.\" },\n { name: \"onDismiss\", type: \"() => void\", description: \"Renders an × dismiss button when provided.\" },\n { name: \"icon\", type: \"LucideIcon | false\", description: \"Override or hide (false) the icon.\" },\n ],\n example: `import { Alert, AlertTitle, AlertDescription } from \"@godxjp/ui/feedback\";\n\n<Alert variant=\"warning\">\n <AlertTitle>3 件の打刻漏れがあります</AlertTitle>\n <AlertDescription>本日中に確認してください。</AlertDescription>\n</Alert>`,\n storyPath: \"feedback/Alert.stories.tsx\",\n rules: [],\n },\n {\n name: \"SkeletonTable\",\n group: \"feedback\",\n tagline: \"Loading placeholder matching the DataTable layout (header + N rows). Drop-in while data loads (deferred props).\",\n props: [\n { name: \"rows\", type: \"number\", defaultValue: \"8\", description: \"Body skeleton rows.\" },\n { name: \"columns\", type: \"number\", defaultValue: \"5\", description: \"Columns in header + body.\" },\n ],\n example: `import { SkeletonTable } from \"@godxjp/ui/feedback\";\n\n{!coupons ? <SkeletonTable rows={10} columns={6} /> : <DataTable data={coupons} columns={columns} />}`,\n storyPath: \"feedback/Skeleton.stories.tsx\",\n rules: [],\n },\n {\n name: \"SkeletonCard\",\n group: \"feedback\",\n tagline: \"Loading placeholder shaped like a CardStat tile. Use inside a ResponsiveGrid while KPIs load.\",\n props: [],\n example: `import { SkeletonCard } from \"@godxjp/ui/feedback\";\nimport { ResponsiveGrid } from \"@godxjp/ui/layout\";\n\n<ResponsiveGrid columns={4}><SkeletonCard /><SkeletonCard /><SkeletonCard /><SkeletonCard /></ResponsiveGrid>`,\n storyPath: \"feedback/Skeleton.stories.tsx\",\n rules: [],\n },\n {\n name: \"Toaster\",\n group: \"feedback\",\n tagline: \"Mount once at app root to enable toasts. IMPORTANT: trigger toasts via `import { toast } from \\\"sonner\\\"` — NOT from @godxjp/ui.\",\n props: [\n { name: \"position\", type: '\"top-right\" | \"top-center\" | \"bottom-right\" | \"…\"', defaultValue: '\"bottom-right\"', description: \"Toast stack anchor.\" },\n { name: \"richColors\", type: \"boolean\", description: \"Enable Sonner rich variant colours.\" },\n ],\n example: `// app root — mount once\nimport { Toaster } from \"@godxjp/ui/feedback\";\n<>{children}<Toaster richColors /></>\n\n// anywhere — import toast from \"sonner\"\nimport { toast } from \"sonner\";\ntoast.success(\"クーポンを公開しました\");\ntoast.error(\"保存に失敗しました\");`,\n storyPath: \"feedback/Toaster.stories.tsx\",\n rules: [],\n },\n\n // ─── navigation ─────────────────────────────────────────────────────────\n {\n name: \"Tabs\",\n group: \"navigation\",\n tagline: \"Radix tab container. Compose Tabs/TabsList/TabsTrigger/TabsContent. Controlled (value/onValueChange) or uncontrolled (defaultValue).\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled active tab key.\" },\n { name: \"defaultValue\", type: \"string\", description: \"Uncontrolled initial tab key.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Active-tab change handler.\" },\n ],\n example: `import { Tabs, TabsList, TabsTrigger, TabsContent } from \"@godxjp/ui/navigation\";\n\n<Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">概要</TabsTrigger>\n <TabsTrigger value=\"history\">履歴</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">概要コンテンツ</TabsContent>\n <TabsContent value=\"history\">履歴コンテンツ</TabsContent>\n</Tabs>`,\n storyPath: \"navigation/Tabs.stories.tsx\",\n rules: [],\n },\n {\n name: \"FilterBar\",\n group: \"navigation\",\n tagline: \"Standard list-page filter strip. Place ABOVE the table Card — NEVER inside CardContent flush (it strips padding). Compose with FilterGroup + SearchInput + Select.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Filter controls + FilterGroup wrappers.\" },\n { name: \"hasActiveFilters\", type: \"boolean\", description: \"Shows a clear-all button when true.\" },\n { name: \"onClear\", type: \"() => void\", description: \"Clear-all handler.\" },\n ],\n example: `import { FilterBar, FilterGroup } from \"@godxjp/ui/navigation\";\nimport { SearchInput, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@godxjp/ui/data-entry\";\n\n<FilterBar hasActiveFilters={search !== \"\"} onClear={() => setSearch(\"\")}>\n <SearchInput placeholder=\"名前で検索\" value={search} onSearch={setSearch} />\n <FilterGroup label=\"ステータス\">\n <Select value={status} onValueChange={setStatus}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">すべて</SelectItem>\n <SelectItem value=\"active\">有効</SelectItem>\n </SelectContent>\n </Select>\n </FilterGroup>\n</FilterBar>`,\n storyPath: \"navigation/FilterBar.stories.tsx\",\n rules: [38, 40],\n },\n {\n name: \"FilterGroup\",\n group: \"navigation\",\n tagline: \"Labelled filter slot inside FilterBar — wraps a single Select/DatePicker.\",\n props: [\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Label shown with the child control.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"The filter control.\" },\n ],\n example: `import { FilterGroup } from \"@godxjp/ui/navigation\";\n\n<FilterGroup label=\"スコープ\"><Select>{/* ... */}</Select></FilterGroup>`,\n storyPath: \"navigation/FilterBar.stories.tsx\",\n rules: [38],\n },\n {\n name: \"Pagination\",\n group: \"navigation\",\n tagline: \"Offset/page-based pagination bar. Sits below a table card.\",\n props: [\n { name: \"current\", type: \"number\", defaultValue: \"1\", description: \"Current page (1-indexed).\" },\n { name: \"total\", type: \"number\", description: \"Total number of items.\" },\n { name: \"pageSize\", type: \"number\", defaultValue: \"10\", description: \"Items per page.\" },\n { name: \"showTotal\", type: \"boolean | (total, range) => ReactNode\", description: \"Show total count, or a custom label fn.\" },\n { name: \"onChange\", type: \"(page: number, pageSize: number) => void\", description: \"Page / page-size change handler.\" },\n ],\n example: `import { Pagination } from \"@godxjp/ui/navigation\";\n\n<Pagination current={page} total={filtered.length} pageSize={10} showTotal onChange={(p) => setPage(p)} />`,\n storyPath: \"navigation/Pagination.stories.tsx\",\n rules: [40],\n },\n {\n name: \"DropdownMenu\",\n group: \"navigation\",\n tagline: \"Radix dropdown menu. Compose DropdownMenu/DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/DropdownMenuSeparator.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n ],\n example: `import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from \"@godxjp/ui/navigation\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<DropdownMenu>\n <DropdownMenuTrigger asChild><Button variant=\"outline\" size=\"sm\">操作</Button></DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem>編集</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem variant=\"destructive\">削除</DropdownMenuItem>\n </DropdownMenuContent>\n</DropdownMenu>`,\n storyPath: \"navigation/DropdownMenu.stories.tsx\",\n rules: [],\n },\n {\n name: \"Steps\",\n group: \"navigation\",\n tagline: \"Multi-step progress indicator — horizontal or vertical, default or dot style.\",\n props: [\n { name: \"items\", type: \"StepItemProp[]\", description: \"Array of { title, subTitle?, description?, icon?, status? }.\" },\n { name: \"current\", type: \"number\", defaultValue: \"0\", description: \"Active step index (0-based).\" },\n { name: \"orientation\", type: '\"horizontal\" | \"vertical\"', defaultValue: '\"horizontal\"', description: \"Layout direction.\" },\n ],\n example: `import { Steps } from \"@godxjp/ui/navigation\";\n\n<Steps current={1} items={[{ title: \"申請\" }, { title: \"審査中\" }, { title: \"完了\" }]} />`,\n storyPath: \"navigation/Steps.stories.tsx\",\n rules: [],\n },\n\n // ─── providers / datetime ───────────────────────────────────────────────\n {\n name: \"AppProvider\",\n group: \"providers\",\n tagline: \"Root locale/timezone/date-time context — wrap the app ONCE. All pickers + formatDate read from it. Import from @godxjp/ui/app.\",\n props: [\n { name: \"defaultLocale\", type: '\"ja\" | \"en\" | \"vi\"', defaultValue: '\"vi\"', description: \"Initial locale.\" },\n { name: \"defaultTimezone\", type: 'string | \"browser\" | \"system\"', defaultValue: '\"browser\"', description: \"Initial IANA timezone.\" },\n { name: \"defaultDateFormat\", type: '\"iso\" | \"dmy\" | \"mdy\" | \"locale\"', defaultValue: '\"locale\"', description: \"Initial date display format.\" },\n { name: \"defaultTimeFormat\", type: '\"24h\" | \"12h\" | \"locale\"', defaultValue: '\"locale\"', description: \"Initial clock format.\" },\n ],\n example: `import { AppProvider } from \"@godxjp/ui/app\";\n\n<AppProvider defaultLocale=\"ja\" defaultTimezone=\"Asia/Tokyo\" defaultDateFormat=\"iso\" defaultTimeFormat=\"24h\">\n {children}\n</AppProvider>`,\n storyPath: \"app/AppProvider.stories.tsx\",\n rules: [5],\n },\n {\n name: \"formatDate\",\n group: \"providers\",\n tagline: \"MANDATORY for all date/time display. Auto-detects ISO date / HH:mm / instant; reads AppProvider context. Import from @godxjp/ui/datetime.\",\n props: [\n { name: \"value\", type: \"string | Date | null | undefined\", required: true, description: \"ISO date, ISO datetime, HH:mm, or Date.\" },\n { name: \"options.kind\", type: '\"auto\" | \"date\" | \"datetime\" | \"time\" | \"long\" | \"relative\"', defaultValue: '\"auto\"', description: \"Output preset; auto infers from the value.\" },\n ],\n example: `import { formatDate } from \"@godxjp/ui/datetime\";\n\nformatDate(coupon.validFrom); // \"2026-05-01\"\nformatDate(order.createdAt, { kind: \"relative\" }); // \"3日前\"`,\n storyPath: \"app/formatDate.stories.tsx\",\n rules: [5],\n },\n];\n\nexport function findComponent(name: string): ComponentEntry | undefined {\n const normalized = name.trim().toLowerCase();\n return COMPONENTS.find((c) => c.name.toLowerCase() === normalized);\n}\n\nexport function componentsByGroup(group: ComponentGroup): ComponentEntry[] {\n return COMPONENTS.filter((c) => c.group === group);\n}\n\nexport function searchComponents(query: string): ComponentEntry[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") {\n return COMPONENTS;\n }\n return COMPONENTS.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.group.includes(q) ||\n c.tagline.toLowerCase().includes(q) ||\n c.props.some((p) => p.name.toLowerCase().includes(q)),\n );\n}\n","/**\n * Shared prop-vocabulary catalog — mirrors `src/props/` in the\n * framework. Consumers reach for this to know the canonical value\n * unions before authoring a new primitive or a wrapper.\n *\n * See also: `docs/specs/04-prop-vocabulary.md` (the rule) +\n * `docs/specs/06-prop-vocabulary-audit.md` (the audit findings).\n */\n\nexport interface PropVocabEntry {\n /** Canonical type name (matches `src/props/{file}.ts`). */\n name: string;\n /** Concept the union represents. */\n concept: string;\n /** Literal values. */\n values: string[];\n /** Primitives that use this exact vocabulary (or alias to it). */\n usedBy: string[];\n /** Optional notes (subtypes, related aliases, gotchas). */\n notes?: string;\n}\n\nexport const PROP_VOCABULARY: PropVocabEntry[] = [\n {\n name: \"SizeProp\",\n concept: \"Dimensional scale for most primitives.\",\n values: [\"small\", \"default\", \"large\"],\n usedBy: [\n \"InputSize\", \"CheckboxGroupSize\", \"ColorPickerSize\", \"MediaUploadSize\",\n \"ProgressSize\", \"RadioGroupSize\", \"RateSize\", \"TransferSize\",\n \"SegmentedControlSize (subset)\", \"SpaceSize (+ number)\",\n \"FlexGap (+ number)\", \"GridGap (+ number)\", \"MasonryGap (+ number)\",\n ],\n },\n {\n name: \"SizeWithXSProp\",\n concept: 'Extension of `SizeProp` with `\"x-small\"` for compact icon-bar / table-row contexts.',\n values: [\"x-small\", \"small\", \"default\", \"large\"],\n usedBy: [\"ButtonSize\"],\n },\n {\n name: \"IconSizeProp\",\n concept: \"Icon-symbol shaped primitives (visual axis = glyph size, not height).\",\n values: [\"sm\", \"md\", \"lg\"],\n usedBy: [\"SpinnerSize\", \"IconButtonSize\"],\n },\n {\n name: \"StatusProp\",\n concept: \"Form-field validation state.\",\n values: [\"default\", \"error\", \"warning\", \"success\"],\n usedBy: [\"InputStatus\"],\n notes: 'Form errors use `\"error\"` (not `\"destructive\"`) — different concern from destructive actions.',\n },\n {\n name: \"ToneProp\",\n concept: \"Same values as StatusProp — name chosen when describing surface colouring rather than validation.\",\n values: [\"default\", \"error\", \"warning\", \"success\"],\n usedBy: [\"(alias of StatusProp)\"],\n },\n {\n name: \"HelpToneProp\",\n concept: \"Help-line / Alert colour ladder. Adds `info` + `warn` to StatusProp.\",\n values: [\"default\", \"info\", \"warn\", \"error\", \"success\"],\n usedBy: [\"FieldHelpTone\"],\n },\n {\n name: \"OrientationProp\",\n concept: \"Layout axis.\",\n values: [\"horizontal\", \"vertical\"],\n usedBy: [\n \"AnchorOrientation\", \"MenuOrientation\", \"RadioGroupOrientation\",\n \"CheckboxGroupOrientation\", \"SegmentedControlOrientation\",\n \"StepsOrientation\", \"TabsOrientation\",\n ],\n },\n {\n name: \"DensityProp\",\n concept: \"Internal row-height / padding scale (distinct from SizeProp — density rescales chrome, size rescales the primitive's own visual axis).\",\n values: [\"compact\", \"default\", \"comfortable\"],\n usedBy: [\"TreeDensity\", \"TableDensity\"],\n },\n {\n name: \"SideProp\",\n concept: \"Edge a floating panel docks against.\",\n values: [\"top\", \"right\", \"bottom\", \"left\"],\n usedBy: [\"SheetSide\", \"TabsPlacement\", \"TableStickySide (subset)\"],\n },\n {\n name: \"PlacementProp\",\n concept: \"Extension of SideProp with a centred anchor (Tabs placement, Tour spotlight).\",\n values: [\"top\", \"right\", \"bottom\", \"left\", \"center\"],\n usedBy: [\"TourPlacement\"],\n },\n {\n name: \"PaddingProp\",\n concept: \"Outer gutter scale for surface containers.\",\n values: [\"tight\", \"default\", \"cozy\", \"none\"],\n usedBy: [\"CardPadding\", \"PageHeaderPadding\", \"PageContentPadding\"],\n },\n {\n name: \"AlignProp\",\n concept: \"CSS-flexbox cross-axis alignment ladder.\",\n values: [\"start\", \"end\", \"center\", \"stretch\", \"baseline\"],\n usedBy: [\"FlexAlign\"],\n },\n {\n name: \"ColorProp\",\n concept: \"Full semantic palette — every CSS variable slot.\",\n values: [\"default\", \"info\", \"success\", \"warning\", \"destructive\", \"attention\", \"primary\", \"secondary\"],\n usedBy: [\"TagPresetColor (− secondary)\", \"TimelineColor (− secondary)\", \"SpinnerTone (+ muted)\"],\n notes:\n 'Each value maps 1:1 to a CSS variable (`--info`, `--success`, `--warning`, `--destructive`, `--attention`, `--primary`, `--secondary`). The `data-accent` axis rebinds `--primary`\\'s hue without renaming the slot.',\n },\n {\n name: \"FeedbackColorProp\",\n concept: \"Subset of ColorProp accepted by feedback primitives (no brand `primary` since they are themselves informational).\",\n values: [\"default\", \"info\", \"success\", \"warning\", \"destructive\"],\n usedBy: [\"AlertColor\", \"ResultColor\", \"ProgressColor\"],\n },\n {\n name: \"LoadingProp\",\n concept: \"Loading-state union — shared across Form / FormField / data-entry primitives.\",\n values: [\"true\", \"false\", '{ kind: \"spinner\" }', '{ kind: \"skeleton\" }', '{ kind, label }'],\n usedBy: [\"FormProps.loading\", \"FormFieldProps.loading\"],\n notes:\n 'Cascade: `<Form loading>` sets a default for every nested `<FormField>`. Per-field `loading` overrides Form\\'s. `true` → spinner (default). `{ kind: \"skeleton\" }` → use for INITIAL fetch state. UX nuance: skeleton on init, spinner on save.',\n },\n];\n\nexport function findVocab(name: string): PropVocabEntry | undefined {\n const normalized = name.trim().toLowerCase().replace(/prop$/i, \"\");\n return PROP_VOCABULARY.find(\n (v) => v.name.toLowerCase().replace(/prop$/i, \"\") === normalized,\n );\n}\n","/**\n * Design tokens catalog — mirrors `src/tokens/tailwind.css` +\n * `src/styles/theme.css` in the framework. CSS variable name +\n * the slot's role + (for fixed values) the literal value.\n *\n * Token values that change per `data-theme` / `data-accent` /\n * `data-density` / `data-font-size` axis are NOT listed with a\n * literal — only the slot name + axis name. Consumers read the\n * runtime value via `getComputedStyle(:root).getPropertyValue(...)`.\n */\n\nexport type TokenCategory =\n | \"color\"\n | \"spacing\"\n | \"typography\"\n | \"radius\"\n | \"shadow\"\n | \"motion\"\n | \"breakpoint\"\n | \"density\"\n | \"z-index\";\n\nexport interface TokenEntry {\n name: string;\n category: TokenCategory;\n role: string;\n /** Fixed value if non-axis. Otherwise omitted. */\n value?: string;\n /** Axis the token re-binds against, if any. */\n axis?: \"data-theme\" | \"data-accent\" | \"data-density\" | \"data-font-size\";\n}\n\nexport const TOKENS: TokenEntry[] = [\n // Color — semantic slots (rebound by `data-theme` + `data-accent`)\n { name: \"--background\", category: \"color\", role: \"Base surface\", axis: \"data-theme\" },\n { name: \"--foreground\", category: \"color\", role: \"Base text\", axis: \"data-theme\" },\n { name: \"--card\", category: \"color\", role: \"Card surface\", axis: \"data-theme\" },\n { name: \"--popover\", category: \"color\", role: \"Popover / dropdown surface\", axis: \"data-theme\" },\n { name: \"--popover-foreground\", category: \"color\", role: \"Popover text\", axis: \"data-theme\" },\n { name: \"--primary\", category: \"color\", role: \"Brand accent (Buttons, links)\", axis: \"data-accent\" },\n { name: \"--primary-foreground\", category: \"color\", role: \"Text on primary surface\", axis: \"data-accent\" },\n { name: \"--secondary\", category: \"color\", role: \"Secondary surface / text dimming\", axis: \"data-theme\" },\n { name: \"--accent\", category: \"color\", role: \"Hover / focus tint\" },\n { name: \"--muted\", category: \"color\", role: \"Muted surface\" },\n { name: \"--muted-foreground\", category: \"color\", role: \"Muted text\" },\n { name: \"--border\", category: \"color\", role: \"Default border color\", axis: \"data-theme\" },\n { name: \"--input\", category: \"color\", role: \"Input field border\" },\n { name: \"--ring\", category: \"color\", role: \"Focus ring\", axis: \"data-accent\" },\n { name: \"--success\", category: \"color\", role: \"Success semantic slot\" },\n { name: \"--warning\", category: \"color\", role: \"Warning semantic slot\" },\n { name: \"--destructive\", category: \"color\", role: \"Danger / destructive action slot\" },\n { name: \"--info\", category: \"color\", role: \"Info / neutral notice slot\" },\n { name: \"--attention\", category: \"color\", role: \"Attention / non-destructive alert slot\" },\n\n // Spacing — fixed scale\n { name: \"--spacing-1\", category: \"spacing\", role: \"4px\", value: \"0.25rem\" },\n { name: \"--spacing-2\", category: \"spacing\", role: \"8px\", value: \"0.5rem\" },\n { name: \"--spacing-3\", category: \"spacing\", role: \"12px\", value: \"0.75rem\" },\n { name: \"--spacing-4\", category: \"spacing\", role: \"16px\", value: \"1rem\" },\n { name: \"--spacing-5\", category: \"spacing\", role: \"20px\", value: \"1.25rem\" },\n { name: \"--spacing-6\", category: \"spacing\", role: \"24px\", value: \"1.5rem\" },\n { name: \"--spacing-8\", category: \"spacing\", role: \"32px\", value: \"2rem\" },\n\n // Typography — fixed scale\n { name: \"--text-2xs\", category: \"typography\", role: \"10px\", value: \"0.625rem\" },\n { name: \"--text-xs\", category: \"typography\", role: \"12px\", value: \"0.75rem\" },\n { name: \"--text-sm\", category: \"typography\", role: \"14px\", value: \"0.875rem\" },\n { name: \"--text-base\", category: \"typography\", role: \"16px\", value: \"1rem\" },\n { name: \"--text-lg\", category: \"typography\", role: \"18px\", value: \"1.125rem\" },\n { name: \"--text-xl\", category: \"typography\", role: \"20px\", value: \"1.25rem\" },\n { name: \"--text-2xl\", category: \"typography\", role: \"24px\", value: \"1.5rem\" },\n { name: \"--font-mono\", category: \"typography\", role: \"Monospace stack\" },\n\n // Radius — fixed scale\n { name: \"--radius-sm\", category: \"radius\", role: \"Small (chips, inputs)\", value: \"0.25rem\" },\n { name: \"--radius-md\", category: \"radius\", role: \"Medium (cards)\", value: \"0.5rem\" },\n { name: \"--radius-lg\", category: \"radius\", role: \"Large (dialogs)\", value: \"0.75rem\" },\n { name: \"--radius-full\", category: \"radius\", role: \"Pill / circle\", value: \"9999px\" },\n\n // Breakpoints — mobile-first min-widths\n { name: \"--breakpoint-xs\", category: \"breakpoint\", role: \"Mobile-first base (≥0px)\", value: \"0\" },\n { name: \"--breakpoint-sm\", category: \"breakpoint\", role: \"Phone landscape / tablet portrait\", value: \"640px\" },\n { name: \"--breakpoint-md\", category: \"breakpoint\", role: \"Tablet landscape\", value: \"768px\" },\n { name: \"--breakpoint-lg\", category: \"breakpoint\", role: \"Laptop\", value: \"1024px\" },\n { name: \"--breakpoint-xl\", category: \"breakpoint\", role: \"Desktop\", value: \"1280px\" },\n { name: \"--breakpoint-xxl\", category: \"breakpoint\", role: \"Wide desktop\", value: \"1536px\" },\n\n // Density — rebound by `data-density`\n { name: \"--density-element\", category: \"density\", role: \"Element height (Input/Button)\", axis: \"data-density\" },\n { name: \"--density-element-sm\", category: \"density\", role: \"Small element\", axis: \"data-density\" },\n { name: \"--density-element-lg\", category: \"density\", role: \"Large element\", axis: \"data-density\" },\n { name: \"--density-card\", category: \"density\", role: \"Card padding\", axis: \"data-density\" },\n { name: \"--density-page\", category: \"density\", role: \"Page (PageContent) padding\", axis: \"data-density\" },\n { name: \"--density-section\", category: \"density\", role: \"Section padding (cozy variant)\", axis: \"data-density\" },\n { name: \"--header-height\", category: \"density\", role: \"Topbar height\", axis: \"data-density\" },\n { name: \"--sidebar-width\", category: \"density\", role: \"Sidebar width (expanded)\", axis: \"data-density\" },\n { name: \"--sidebar-width-collapsed\", category: \"density\", role: \"Sidebar icon-only width\", axis: \"data-density\" },\n { name: \"--touch-target-min\", category: \"density\", role: \"Mobile touch target (does NOT scale)\", value: \"44px\" },\n\n // Motion — fixed timings\n { name: \"--transition-base\", category: \"motion\", role: \"Standard transition duration\", value: \"200ms\" },\n { name: \"--ease-out\", category: \"motion\", role: \"Out easing curve\", value: \"cubic-bezier(0, 0, 0.2, 1)\" },\n { name: \"--ease-in-out\", category: \"motion\", role: \"In-out easing\", value: \"cubic-bezier(0.4, 0, 0.2, 1)\" },\n];\n\nexport function tokensByCategory(category: TokenCategory): TokenEntry[] {\n return TOKENS.filter((t) => t.category === category);\n}\n","/**\n * Cardinal rules — mirrors the cardinal rules in `CLAUDE.md`. The MCP\n * server exposes them via `get_cardinal_rules` so consumer agents\n * can quote them when reviewing PRs or authoring new primitives.\n */\n\nexport interface CardinalRule {\n number: number;\n title: string;\n body: string;\n}\n\nexport const CARDINAL_RULES: CardinalRule[] = [\n { number: 1, title: \"Storybook is mandatory\", body: \"Every primitive / shell / composite has a paired story under `src/stories/<group>/<Name>.stories.tsx` covering every variant + state on light + dark.\" },\n { number: 2, title: \"Tokens, not utilities\", body: \"Visual values come from CSS custom properties in `src/tokens/` + `src/styles/theme.css`. Token-named Tailwind utilities (`bg-background`) are fine; raw value utilities (`bg-blue-500`) are forbidden. (ADR-0003)\" },\n { number: 3, title: \"Radix for interactive primitives\", body: \"Anything with keyboard / ARIA / portal wraps the relevant Radix primitive. (ADR-0001)\" },\n { number: 4, title: \"shadcn-style ownership\", body: \"Primitives are thin wrappers; consumers can fork the source in place. (ADR-0002)\" },\n { number: 5, title: \"One i18next singleton\", body: \"`initI18n()` in `src/i18n/index.ts` is THE instance; consumers extend via `addResourceBundle`. (ADR-0004)\" },\n { number: 6, title: \"WCAG 2.1 AA baseline\", body: \"Every interactive primitive passes axe-core (keyboard nav, ARIA, focus-visible, 4.5:1 contrast, `prefers-reduced-motion`). Stories double as a11y test surfaces.\" },\n { number: 7, title: \"SemVer 2.0 + Keep a Changelog 1.1\", body: \"Every release-worthy change updates `CHANGELOG.md` under `## Unreleased` in the same PR.\" },\n { number: 8, title: \"Inclusive naming\", body: \"`allowlist` / `denylist`, `main` / `primary` / `replica` / `secondary`, `they/them`. Never `whitelist` / `blacklist` / `master` / `slave`. Lint-enforced.\" },\n { number: 9, title: \"No marketing speak\", body: 'Banned: \"powerful\", \"robust\", \"blazing fast\", \"best-in-class\", \"seamless\", \"enterprise-grade\". State what it does.' },\n { number: 10, title: \"English is canonical for docs\", body: \"Localised docs at `docs/i18n/<bcp47>/`; front-matter tracks staleness.\" },\n { number: 11, title: \"Submodule discipline\", body: \"Two-PR workflow: (1) submodule PR → `main`, (2) umbrella PR → bump pin. Never push a pin to a SHA not on the submodule remote.\" },\n { number: 12, title: \"Branch + PR workflow\", body: \"`feat/<scope>` / `fix/<scope>` → submodule `main`. CI green + squash-merge. No direct push to `main`. `--no-verify` forbidden.\" },\n { number: 13, title: \"TypeScript strict\", body: \"Explicit types on every export. `forwardRef` for components; `ComponentPropsWithoutRef` for extension. No `any`. No `@ts-ignore` without comment + issue link.\" },\n { number: 14, title: \"Every third-party library is shadcn / Radix-recommended\", body: \"Locked stack: Radix UI, cmdk, sonner, lucide-react, react-aria-components + `@internationalized/date`, i18next + react-i18next, class-variance-authority + clsx + tailwind-merge. New peer → ADR documenting why it's the canonical choice.\" },\n { number: 15, title: \"No `@apply` re-encoding tokens\", body: \"Inside a primitive `.tsx`, don't `@apply` a Tailwind utility that re-encodes a token — reference the canonical CSS class from `tokens.css` instead. Composite token-named utilities remain fine.\" },\n { number: 16, title: \"CSS source-of-truth is `src/tokens/` + `src/styles/theme.css`\", body: \"A primitive that needs a new color / spacing / radius adds it there FIRST, then references it.\" },\n { number: 17, title: \"`src/stories/` ↔ `src/components/` parity\", body: \"Story set matches primitive set under each group. CI-checked via `scripts/check-stories-parity.mjs`.\" },\n { number: 18, title: \"`docs/reference/<group>/` ↔ `src/components/<group>/` parity\", body: \"Every primitive has a reference page; every page maps to a primitive. CI-checked via `scripts/check-docs-parity.mjs`.\" },\n { number: 19, title: \"No service-specific anything\", body: \"`me-service`, `forge-service`, `admin-service` never appear in source / comments / prop names. Per-deployment brand color lives at `[data-accent=\\\"<palette>\\\"]`.\" },\n { number: 20, title: \"No \\\"platform-only\\\" exports\", body: \"Every primitive ships via `package.json::exports`. Internal-only helpers stay un-exported.\" },\n { number: 21, title: \"Every component honours every theme axis\", body: \"`data-theme` (light / dark), `data-accent` (6 palettes), `data-density` (compact / default / comfortable), `data-font-size` (sm / base / lg / xl). Read from tokens, never hardcode values. Verify every PR via the Storybook toolbar sweep.\" },\n { number: 22, title: \"100% match to the design canon\", body: 'Every visual literal comes from `design-handoff/ui-system/<latest-bundle>/`. Token-pin canon literals; never substitute \"close enough\". If the bundle doesn\\'t cover a case — STOP, ask the user to mock it.' },\n { number: 23, title: \"Concept-first prop API\", body: \"One concept per prop. Reuse shared vocabulary (`size`, `variant`, `color`, `tone`, `accent`, `padding`, `density`, `orientation`, `placement`, `current`, `value` / `defaultValue` / `onValueChange`, `open` / `defaultOpen` / `onOpenChange`, `justify`, `sticky`, `offset`). Before adding a new prop or token: grep for an existing one.\" },\n { number: 24, title: \"Mobile-first\", body: \"Defaults target `xs` (≥0px); progressive enhancement via `sm:` / `md:` / `lg:` / `xl:` / `2xl:`. Touch targets ≥ 44 × 44 px (`--touch-target-min`, does NOT scale with density). Runtime viewport via `useBreakpoint`, never `window.innerWidth`. Stories render at narrow viewport first.\" },\n { number: 25, title: \"Stories are docs; UI is the primitive\", body: \"When a story looks wrong, fix the primitive / CSS / token. Never paper over with a story tweak. Story-only diff without a paired primitive / CSS / token diff is rejected.\" },\n { number: 26, title: \"Library isolation\", body: \"`dist/` ships only the consumer surface. Storybook, tests, scripts, design-handoff, `dev-probe/` stay out of npm. Every `dependencies` entry is `external` in `tsup`. Verification via `pnpm pack` + grep of `dist/`.\" },\n { number: 27, title: \"Per-group folder structure\", body: \"Primitives at `src/components/<group>/<Name>.tsx`; six canonical groups (general, layout, data-display, data-entry, feedback, navigation). Barrel = `src/components/primitives.ts` (single file). Stories + reference docs mirror the same group hierarchy.\" },\n { number: 28, title: \"`src/` folder taxonomy\", body: \"Three classes: consumer surface (matched by `tsup` entry + `package.json::exports`), Storybook-only (`src/stories/`), build-input-only (`cn.ts`, per-group sources consumed via the barrel). No `src/lib/`, `src/utils/`, `src/internal/`, `src/clients/`, `src/screens/`. Service clients live with the composite that uses them.\" },\n { number: 29, title: \"Stories consume framework primitives only\", body: \"No raw `<button>` / `<input>` / hand-rolled chips when a primitive exists. HTML semantics (`<section>`, `<article>`, …) for structure are fine. Inline `style={{}}` limited to layout / positioning; no colour / radius / typography overrides.\" },\n { number: 30, title: \"Story `render` returns JSX directly\", body: \"No opaque `<XyzDemo />` wrapper components, no zero-arg `Demo` helpers. Use `render: function StoryName() { … }` so Storybook's source panel shows runnable JSX, not `<XyzDemo />`.\" },\n { number: 31, title: \"No nested wrapper / convenience primitives\", body: \"One Radix base = one framework primitive. `<SimpleX>` over `<X>` is forbidden; add a prop to `<X>` instead. Composites under `src/components/composites/` that combine multiple primitives are NOT wrappers.\" },\n { number: 32, title: \"No redundant props\", body: \"Before adding a prop / item field / variant, grep the existing surface; if a field already covers the concept, use it. Top-level prop that re-expresses an item field (Timeline `pending` ↔ `items[i].animate`) is rejected.\" },\n { number: 33, title: \"Stories / source / docs name-synchronized\", body: \"No two names for the same export across the framework surface; no legacy aliases in stories / docs (source may keep an alias for a deprecation cycle, but the marketing surfaces use the canonical name only). Rename PR runs `grep -rn '<oldName>' src docs` and clears it.\" },\n { number: 34, title: \"Storybook source panel = real, copy-paste-ready code\", body: \"Storybook's react-docgen serializer strips every function value (`cell: ({row}) => <JSX/>`, `render: ({field}) => <Input/>`, `rowClassName`, `renderItem`, …) to `() => {}`. Any story whose `render` passes a function-valued prop, references a module-level helper (`StatusBadge`, `EMPLOYEE_COLUMNS`, etc.), or uses a render-prop pattern MUST override `parameters.docs.source.code` with the literal copy-paste-ready snippet — type aliases, helper functions spelled out, column definitions with cell JSX visible, inline data array. The `render()` callback stays as-is (module-level constants are fine for runtime performance); `source.code` is the marketing surface. Skip ONLY for stories whose JSX is purely static primitives Storybook can serialize verbatim (`<Button variant=\\\"primary\\\">Click</Button>`). The exemplar is `Table.Default` in `src/stories/data-display/Table.stories.tsx`.\" },\n { number: 35, title: \"Status chips never wrap\", body: \"A `StatusBadge` / `Badge` reads as one atomic unit. Its label must never break across lines — pin `white-space: nowrap` on the chip (done in `badge-layout.css`), especially inside narrow `DataTable` cells (スコープ / ステータス columns). If a cell is too tight, widen the column or shorten the label; never let the chip wrap.\" },\n { number: 36, title: \"StatusBadge tone/icon are the colour escape hatch\", body: \"`StatusBadge` auto-maps a fixed set of English lifecycle keys (active, draft, pending, scheduled, cancelled, failed, …) to tone + icon. For ANY other value — localized labels (公開中, アクティブ) or categorical tiers (会員ランク, 契約プラン) — pass `tone` explicitly (success | warning | destructive | info | neutral) and, for non-lifecycle tiers, `icon={null}` to drop the misleading glyph. Don't let domain labels fall back to neutral grey + ○. Map domain→tone in the CONSUMER layer; the framework only provides the props.\" },\n { number: 37, title: \"DataTable is full-width — never inside a narrow grid column\", body: \"A multi-column `DataTable` occupies its OWN row at the page's full width: `<Card><CardContent flush><DataTable …/></CardContent></Card>`. Never nest it in a `lg:col-span-2` of a `ResponsiveGrid columns={3}` beside a chart — the columns get squeezed until CJK text collapses to one character per line. Charts / KPI cards go in their own row ABOVE the table. (See the `inertia-list-page` pattern.)\" },\n { number: 38, title: \"FilterBar stays OUT of CardContent flush\", body: \"`CardContent flush` strips horizontal padding for edge-to-edge tables. A `FilterBar` placed inside it loses all padding and sticks to the card edge. Render `FilterBar` as a STANDALONE block above the table card; wrap ONLY the `DataTable` / `EmptyState` in the `Card` + `CardContent flush`. Order on a list page: KPIs → FilterBar → table card.\" },\n { number: 39, title: \"Long text columns get an explicit width\", body: \"For columns whose value can be long (name / title / segment / address), set `col.width` to a Tailwind width class (e.g. `w-64`, `w-48`) so the column reserves space instead of shrinking and wrapping to many lines; leave numeric / status columns auto. Table cells default to `white-space: nowrap`, so an over-tight table scrolls horizontally rather than crushing — give the important columns real widths so the default layout reads well before any scroll.\" },\n { number: 40, title: \"Pages are mobile-first\", body: \"Author and verify every page at 320–390px FIRST. Spacing comes only from `Stack` / `Inline` `gap` + `ResponsiveGrid columns={2|3|4}` (which collapse to a single column on narrow screens) — never raw `p-*` / `gap-*` / `space-*` utilities for page layout. Wide tables scroll horizontally on small screens (don't force-fit them); dialogs and sheets are full-height on mobile. Touch targets ≥ 44×44px.\" },\n];\n\nexport function findRule(num: number): CardinalRule | undefined {\n return CARDINAL_RULES.find((r) => r.number === num);\n}\n","/**\n * Canonical code patterns for common consumer scenarios. The MCP\n * server returns one of these whenever a consumer asks \"how do I X\n * with @godxjp/ui?\" — saves the LLM from synthesising from primitive\n * docs over and over.\n *\n * Every pattern is copy-paste-ready: imports listed at top, types\n * spelled out, inline JSX with no opaque helpers.\n */\n\nexport interface PatternEntry {\n /** URL-safe slug. */\n name: string;\n /** One-line elevator pitch. */\n tagline: string;\n /** Categories — used for search. */\n tags: string[];\n /** Full snippet. */\n code: string;\n}\n\nexport const PATTERNS: PatternEntry[] = [\n {\n name: \"common-fixes\",\n tagline: \"Fix the most common @godxjp/ui consumer mistakes & visual bugs (CardStat double-border, grey StatusBadge, crushed/empty table headers, washed-out sidebar footer, Inertia layout crash, SSR hydration). Before → after.\",\n tags: [\"fixes\", \"migration\", \"bug\", \"cardstat\", \"statusbadge\", \"datatable\", \"sidebar\", \"gotcha\", \"review\"],\n code: `// ───────────────────────────────────────────────────────────────────────\n// 1) CardStat shows a DOUBLE border (too thick)\n// Cause: CardStat IS already a bordered Card. Don't wrap it.\n// ❌ <Card><CardContent><CardStat label=\"x\" value=\"1\" /></CardContent></Card>\n// ✅ <ResponsiveGrid columns={4}><CardStat label=\"x\" value=\"1\" /></ResponsiveGrid>\n// Need a section title? Use a heading, NOT a Card:\n// ✅ <Stack gap=\"sm\"><div className=\"text-sm font-medium\">KPI</div>\n// <ResponsiveGrid columns={4}><CardStat .../></ResponsiveGrid></Stack>\n\n// 2) StatusBadge renders grey with a ○ (no colour) for localized/tier labels\n// Cause: it auto-maps only English lifecycle keys. (@godxjp/ui >= 6.1)\n// ❌ <StatusBadge status=\"プレミアム\" />\n// ✅ <StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} /> // tier → pill, no icon\n// ✅ <StatusBadge status=\"active\" label=\"公開中\" /> // lifecycle → keep icon\n\n// 3) Table text collapses to one char per line, or a chip wraps\n// Cause: pre-6.1.2. (@godxjp/ui >= 6.1.2 → cells + chips are nowrap)\n// ✅ npm i @godxjp/ui@^6.2.0\n// ✅ give long columns a width: { key: \"name\", header: \"氏名\", width: \"w-64\" }\n\n// 4) Empty (icon/action) column header shows a blank grey block\n// (@godxjp/ui >= 6.2.0 auto-hides it: [data-slot=table-head][data-empty] → transparent)\n// ✅ npm i @godxjp/ui@^6.2.0 // header: \"\" now renders a transparent cell\n\n// 5) DataTable columns are crushed / squeezed\n// Cause: the table is nested in a narrow grid column.\n// ❌ <ResponsiveGrid columns={3}><div className=\"lg:col-span-2\"><Card><DataTable/></Card></div></ResponsiveGrid>\n// ✅ Table gets its OWN full-width row: <Card><CardContent flush><DataTable/></CardContent></Card>\n\n// 6) FilterBar has no padding (sticks to the edge)\n// Cause: it's inside CardContent flush (flush strips padding — that's for tables).\n// ❌ <Card><CardContent flush><FilterBar/><DataTable/></CardContent></Card>\n// ✅ <FilterBar/> then <Card><CardContent flush><DataTable/></CardContent></Card>\n\n// 7) Sidebar footer looks washed-out / off-design\n// Cause: raw opacity-*/text-[11px]. Use semantic tokens.\n// ✅ <div className=\"text-muted-foreground text-xs\">\n// <div className=\"text-foreground font-medium\">{name}</div><div>{role}</div></div>\n\n// 8) Inertia: \"Objects are not valid as a React child {errors, auth, …}\"\n// Cause: persistent layout passed as a render fn. Use the ARRAY form.\n// ❌ Page.layout = (page) => <Layout>{page}</Layout>\n// ✅ Page.layout = [Layout] // Layout is ({children}) => ...\n\n// 9) Inertia v3 hydration mismatch (\"server rendered text didn't match the client\")\n// Cause: Math.random()/argless new Date() during render (SSR ≠ client).\n// ✅ seed deterministically by index, or compute in an event handler.\n\n// 10) Hide a column on mobile / sign-aware KPI delta (@godxjp/ui >= 6.2.0)\n// ✅ columns: [{ key: \"email\", header: \"メール\", hiddenOnMobile: true }]\n// ✅ <CardStat label=\"売上\" value=\"¥8.2M\" delta=\"+12%\" /> // + green / - red; inverse flips`,\n },\n\n {\n name: \"signup-form\",\n tagline: \"Card-wrapped sign-up form using react-hook-form + zod with FormField/Input and a CardFooter action bar (real @godxjp/ui API).\",\n tags: [\"form\", \"auth\", \"sign-up\", \"zod\", \"validation\", \"react-hook-form\"],\n code: `import { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport { Card, CardHeader, CardTitle, CardContent, CardFooter } from \"@godxjp/ui/data-display\";\nimport { FormField, Input } from \"@godxjp/ui/data-entry\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { Stack } from \"@godxjp/ui/layout\";\n\nconst schema = z.object({\n name: z.string().min(1, \"氏名は必須です\"),\n email: z.string().email(\"有効なメールアドレスを入力してください\"),\n});\ntype Values = z.infer<typeof schema>;\n\nexport function SignUpCard() {\n const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm<Values>({ resolver: zodResolver(schema) });\n const onSubmit = handleSubmit(async (v) => {\n await fetch(\"/api/signup\", { method: \"POST\", body: JSON.stringify(v) });\n });\n return (\n <Card>\n <CardHeader><CardTitle>アカウント作成</CardTitle></CardHeader>\n <CardContent>\n <form id=\"signup\" onSubmit={onSubmit}>\n <Stack gap=\"md\">\n <FormField id=\"name\" label=\"氏名\" required error={errors.name?.message}>\n <Input id=\"name\" {...register(\"name\")} />\n </FormField>\n <FormField id=\"email\" label=\"メールアドレス\" required error={errors.email?.message}>\n <Input id=\"email\" type=\"email\" {...register(\"email\")} />\n </FormField>\n </Stack>\n </form>\n </CardContent>\n <CardFooter separated>\n <Button type=\"submit\" form=\"signup\" disabled={isSubmitting}>アカウントを作成</Button>\n </CardFooter>\n </Card>\n );\n}`,\n },\n\n {\n name: \"settings-tabs\",\n tagline: \"Sectioned settings inside a Card with Tabs + FormField + Select + Switch (real @godxjp/ui API).\",\n tags: [\"settings\", \"form\", \"tabs\", \"admin\"],\n code: `import { Card, CardContent } from \"@godxjp/ui/data-display\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"@godxjp/ui/navigation\";\nimport { FormField, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Switch, Label } from \"@godxjp/ui/data-entry\";\nimport { Stack } from \"@godxjp/ui/layout\";\n\nexport function WorkspaceSettings() {\n return (\n <Card>\n <CardContent>\n <Tabs defaultValue=\"general\">\n <TabsList>\n <TabsTrigger value=\"general\">基本情報</TabsTrigger>\n <TabsTrigger value=\"notify\">通知</TabsTrigger>\n </TabsList>\n <TabsContent value=\"general\">\n <Stack gap=\"md\">\n <FormField id=\"ws-name\" label=\"名前\" required><Input id=\"ws-name\" /></FormField>\n <FormField id=\"visibility\" label=\"公開範囲\">\n <Select defaultValue=\"internal\">\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"private\">プライベート</SelectItem>\n <SelectItem value=\"internal\">社内公開</SelectItem>\n <SelectItem value=\"public\">公開</SelectItem>\n </SelectContent>\n </Select>\n </FormField>\n </Stack>\n </TabsContent>\n <TabsContent value=\"notify\">\n <div className=\"flex items-center gap-2\">\n <Switch id=\"notify-comment\" defaultChecked />\n <Label htmlFor=\"notify-comment\">コメント通知を受け取る</Label>\n </div>\n </TabsContent>\n </Tabs>\n </CardContent>\n </Card>\n );\n}`,\n },\n\n {\n name: \"confirm-destructive\",\n tagline: \"Type-to-confirm destructive dialog — Dialog mode=\\\"confirm\\\" + Input gate + toast (real @godxjp/ui API).\",\n tags: [\"dialog\", \"confirm\", \"destructive\", \"delete\"],\n code: `import { useState } from \"react\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from \"@godxjp/ui/feedback\";\nimport { Input } from \"@godxjp/ui/data-entry\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { Stack } from \"@godxjp/ui/layout\";\nimport { toast } from \"sonner\";\n\nexport function DeleteProjectDialog({ open, onOpenChange, slug }: { open: boolean; onOpenChange: (v: boolean) => void; slug: string }) {\n const [confirm, setConfirm] = useState(\"\");\n return (\n <Dialog open={open} onOpenChange={onOpenChange} mode=\"confirm\">\n <DialogContent>\n <DialogHeader>\n <DialogTitle>プロジェクトを削除</DialogTitle>\n <DialogDescription>この操作は取り消せません。確認のためプロジェクト名 \"{slug}\" と入力してください。</DialogDescription>\n </DialogHeader>\n <Stack gap=\"md\">\n <Input value={confirm} onChange={(e) => setConfirm(e.target.value)} placeholder={slug} />\n </Stack>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>キャンセル</Button>\n <Button variant=\"destructive\" disabled={confirm !== slug} onClick={() => { toast.success(\"削除しました\"); onOpenChange(false); }}>完全に削除</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}`,\n },\n\n {\n name: \"deferred-loading\",\n tagline: \"Inertia deferred props with a Skeleton fallback — SkeletonTable while data loads, then DataTable (real @godxjp/ui API).\",\n tags: [\"loading\", \"skeleton\", \"deferred\", \"inertia\", \"table\"],\n code: `// Server (Laravel): defer the heavy prop\n// Inertia::render('crm/coupons/index', [\n// 'coupons' => Inertia::defer(fn () => Coupon::all()),\n// ]);\nimport { Card, CardContent, DataTable } from \"@godxjp/ui/data-display\";\nimport type { ColumnDef } from \"@godxjp/ui/data-display\";\nimport { SkeletonTable } from \"@godxjp/ui/feedback\";\n\ntype Coupon = { id: string; name: string };\nconst columns: ColumnDef<Coupon>[] = [{ key: \"name\", header: \"クーポン名\" }];\n\n// coupons is undefined until the deferred request resolves\nexport default function Coupons({ coupons }: { coupons?: Coupon[] }) {\n return (\n <Card>\n <CardContent flush>\n {!coupons\n ? <SkeletonTable rows={10} columns={6} />\n : <DataTable data={coupons} columns={columns} getRowId={(c) => c.id} />}\n </CardContent>\n </Card>\n );\n}`,\n },\n\n {\n name: \"inertia-list-page\",\n tagline: \"Inertia + @godxjp/ui list page — PageContainer + FilterBar + DataTable + StatusBadge + Pagination (current primitive API).\",\n tags: [\"inertia\", \"list\", \"table\", \"page\", \"filter\", \"pagination\", \"datatable\", \"crm\"],\n code: `import { Head, router } from \"@inertiajs/react\"\nimport { useMemo, useState } from \"react\"\nimport { PageContainer, ResponsiveGrid, Stack } from \"@godxjp/ui/layout\"\nimport { Card, CardContent, CardStat, DataTable, EmptyState, StatusBadge, type ColumnDef } from \"@godxjp/ui/data-display\"\nimport { SearchInput, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@godxjp/ui/data-entry\"\nimport { FilterBar, FilterGroup, Pagination } from \"@godxjp/ui/navigation\"\nimport { formatDate } from \"@godxjp/ui/datetime\"\nimport { withCrmLayout } from \"@/layouts/crm-layout\" // see \"inertia-persistent-layout\"\n\ntype Coupon = { id: string; name: string; status: string; scope: string; validFrom: string; validTo: string; usage: number }\nconst PAGE_SIZE = 10\n\nfunction Coupons({ coupons }: { coupons: Coupon[] }) {\n const [q, setQ] = useState(\"\")\n const [status, setStatus] = useState(\"all\")\n const [page, setPage] = useState(1)\n\n const filtered = useMemo(() => coupons.filter((c) => {\n if (q && !c.name.toLowerCase().includes(q.toLowerCase())) return false\n if (status !== \"all\" && c.status !== status) return false\n return true\n }), [coupons, q, status])\n const paged = filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE)\n\n // ColumnDef = { key, header, render?, align?: \"left\"|\"center\"|\"right\", sortable?, width? }\n const columns: ColumnDef<Coupon>[] = [\n { key: \"name\", header: \"クーポン名\", render: (c) => <span className=\"font-medium\">{c.name}</span> },\n { key: \"scope\", header: \"スコープ\", render: (c) => <StatusBadge status={c.scope} tone=\"info\" icon={null} /> },\n { key: \"status\", header: \"ステータス\", render: (c) => <StatusBadge status={c.status} /> },\n { key: \"valid\", header: \"有効期間\", render: (c) => \\`\\${formatDate(c.validFrom)} 〜 \\${formatDate(c.validTo)}\\` },\n { key: \"usage\", header: \"利用数\", align: \"right\", render: (c) => c.usage.toLocaleString() },\n ]\n\n return (\n <>\n <Head title=\"クーポン管理\" />\n {/* RULE: every page wraps in PageContainer; spacing via Stack/ResponsiveGrid, never p-*/gap-* */}\n <PageContainer title=\"クーポン管理\" subtitle=\"配信中のクーポン一覧\">\n <Stack gap=\"lg\">\n <ResponsiveGrid columns={3}>\n <CardStat label=\"公開中\" value={coupons.filter((c) => c.status === \"公開中\").length} />\n <CardStat label=\"総利用数\" value={coupons.reduce((s, c) => s + c.usage, 0).toLocaleString()} />\n <CardStat label=\"件数\" value={coupons.length} />\n </ResponsiveGrid>\n\n <FilterBar hasActiveFilters={q !== \"\" || status !== \"all\"} onClear={() => { setQ(\"\"); setStatus(\"all\"); setPage(1) }}>\n {/* SearchInput is value + onSearch(v) — NOT onChange */}\n <SearchInput placeholder=\"クーポン名で検索\" value={q} onSearch={(v) => { setQ(v); setPage(1) }} />\n <FilterGroup label=\"ステータス\">\n <Select value={status} onValueChange={(v) => { setStatus(v); setPage(1) }}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">全ステータス</SelectItem>\n <SelectItem value=\"公開中\">公開中</SelectItem>\n <SelectItem value=\"下書き\">下書き</SelectItem>\n </SelectContent>\n </Select>\n </FilterGroup>\n </FilterBar>\n\n <Card>\n <CardContent flush>\n {filtered.length === 0\n ? <EmptyState title=\"該当するクーポンがありません\" description=\"検索条件を変更してください。\" />\n : <DataTable data={paged} columns={columns} getRowId={(c) => c.id} onRowClick={(c) => router.visit(\\`/coupons/\\${c.id}\\`)} />}\n </CardContent>\n </Card>\n\n {filtered.length > PAGE_SIZE && (\n <Pagination current={page} total={filtered.length} pageSize={PAGE_SIZE} showTotal onChange={(p) => setPage(p)} />\n )}\n </Stack>\n </PageContainer>\n </>\n )\n}\n\nCoupons.layout = withCrmLayout\nexport default Coupons`,\n },\n\n {\n name: \"inertia-detail-page\",\n tagline: \"Inertia detail page — receives {id} prop, KeyValueGrid (compound) + CardStat + EmptyState fallback.\",\n tags: [\"inertia\", \"detail\", \"show\", \"page\", \"keyvaluegrid\", \"crm\"],\n code: `import { Head, router } from \"@inertiajs/react\"\nimport { PageContainer, ResponsiveGrid, Stack } from \"@godxjp/ui/layout\"\nimport { Card, CardContent, CardStat, EmptyState, KeyValueGrid, StatusBadge } from \"@godxjp/ui/data-display\"\nimport { Button } from \"@godxjp/ui/general\"\nimport { formatDate } from \"@godxjp/ui/datetime\"\nimport { ArrowLeft } from \"lucide-react\"\nimport { withCrmLayout } from \"@/layouts/crm-layout\"\n\n// Detail routes pass the param as an Inertia prop:\n// Route::get('/members/{id}', fn ($id) => Inertia::render('crm/members/show', ['id' => $id]))\nfunction MemberShow({ id }: { id: string }) {\n const member = MEMBERS.find((m) => m.id === id)\n\n if (!member) {\n return (\n <>\n <Head title=\"会員詳細\" />\n <PageContainer title=\"会員詳細\" subtitle=\"会員が見つかりません\">\n <EmptyState title=\"会員が見つかりません\" description={\\`ID「\\${id}」は存在しません。\\`} />\n <Button variant=\"outline\" onClick={() => router.visit(\"/members\")}><ArrowLeft className=\"size-4\" />一覧へ戻る</Button>\n </PageContainer>\n </>\n )\n }\n\n return (\n <>\n <Head title={member.name} />\n <PageContainer title={member.name} subtitle={\\`\\${member.id} / \\${member.rank}\\`}>\n <Stack gap=\"lg\">\n <ResponsiveGrid columns={4}>\n <CardStat label=\"累計購入額\" value={\\`¥\\${member.total.toLocaleString()}\\`} />\n <CardStat label=\"来店回数\" value={member.visits} />\n <CardStat label=\"ポイント\" value={member.points.toLocaleString()} />\n <CardStat label=\"LTV\" value={\\`¥\\${member.ltv.toLocaleString()}\\`} />\n </ResponsiveGrid>\n <Card>\n <CardContent>\n {/* KeyValueGrid is COMPOUND — value goes in children, not a prop */}\n <KeyValueGrid columns={2}>\n <KeyValueGrid.Item label=\"氏名\">{member.name}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"ランク\"><StatusBadge status={member.rank} tone=\"info\" icon={null} /></KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"ステータス\"><StatusBadge status={member.status} /></KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"登録日\">{formatDate(member.registeredAt)}</KeyValueGrid.Item>\n </KeyValueGrid>\n </CardContent>\n </Card>\n </Stack>\n </PageContainer>\n </>\n )\n}\n\nMemberShow.layout = withCrmLayout\nexport default MemberShow`,\n },\n\n {\n name: \"inertia-persistent-layout\",\n tagline: \"Inertia persistent layout (AppShell+Sidebar) — the array-form gotcha + the SSR/Math.random gotcha.\",\n tags: [\"inertia\", \"layout\", \"appshell\", \"sidebar\", \"ssr\", \"hydration\", \"gotcha\"],\n code: `// resources/js/layouts/crm-layout.tsx\nimport { router, usePage } from \"@inertiajs/react\"\nimport { AppShell, Sidebar } from \"@godxjp/ui/layout\"\nimport { LayoutDashboard } from \"lucide-react\"\nimport type { ReactNode } from \"react\"\n\nexport function CrmLayout({ children }: { children: ReactNode }) {\n const { url } = usePage()\n const sections = [{ label: \"メイン\", items: [{ id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard }] }]\n return (\n <AppShell sidebar={<Sidebar activeId={url} onSelect={(id) => router.visit(id)} sections={sections} product={{ name: \"JOVY CRM\" }} />}>\n {children}\n </AppShell>\n )\n}\n\n// ⚠️ GOTCHA 1 — persistent layout MUST be the ARRAY form.\n// A render fn \\`(page) => <CrmLayout>{page}</CrmLayout>\\` is indistinguishable from a\n// component; Inertia React calls it with the page-PROPS object and renders that\n// object as a child → \"Objects are not valid as a React child {errors, auth, …}\".\nexport const withCrmLayout = [CrmLayout] // ✅ array → Inertia passes the page as children\n// page usage: Dashboard.layout = withCrmLayout\n\n// ⚠️ GOTCHA 2 — Inertia v3 SSRs even in \\`npm run dev\\`. NEVER call Math.random() or\n// argless new Date() during render (e.g. fabricating chart/demo numbers) → React\n// hydration mismatch (\"server rendered text didn't match the client\"). Seed\n// deterministically by index, or compute inside an event handler:\nconst seeded = (n: number) => { const x = Math.sin((n + 1) * 99.71) * 1e4; return x - Math.floor(x) }`,\n },\n\n {\n name: \"status-badge-coloring\",\n tagline: \"Colour a StatusBadge for localized labels and tiers via tone + icon (escape-hatch props, @godxjp/ui ≥ 6.1).\",\n tags: [\"statusbadge\", \"badge\", \"tone\", \"color\", \"status\", \"tier\", \"table\"],\n code: `import { StatusBadge } from \"@godxjp/ui/data-display\"\n\n// StatusBadge auto-colours a fixed set of English LIFECYCLE keys:\n// active/completed (success ✓) · draft (neutral ○) · pending/temporary (warning ⏱)\n// scheduled/sending (info) · cancelled (neutral) · failed/deleted/bounced (destructive ✕)\n// Anything else (localized labels, tiers) falls back to neutral grey ○ unless you override.\n\n// 1) Lifecycle with localized text — map to the key, keep JP via \\`label\\` (icon stays):\n<StatusBadge status=\"active\" label=\"公開中\" /> // green ✓ 公開中\n\n// 2) Unknown label — set tone explicitly (no icon, since the key is unknown):\n<StatusBadge status=\"公開中\" tone=\"success\" />\n\n// 3) Tier / category — coloured pill, drop the misleading glyph with icon={null}:\n<StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} />\n<StatusBadge status=\"ゴールド\" tone=\"warning\" icon={null} />\n<StatusBadge status=\"法人共通\" tone=\"info\" icon={null} />\n\n// tone: \"success\" | \"warning\" | \"destructive\" | \"info\" | \"neutral\" (import type StatusBadgeTone)\n// RULE: a chip never wraps — it is pinned white-space: nowrap, so it stays one line in\n// narrow table cells. Centralize the domain→tone map in ONE small consumer wrapper and\n// import that instead of the raw StatusBadge across pages.`,\n },\n];\n\nexport function findPattern(name: string): PatternEntry | undefined {\n const slug = name.trim().toLowerCase();\n return PATTERNS.find((p) => p.name === slug);\n}\n\nexport function searchPatterns(query: string): PatternEntry[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return PATTERNS;\n return PATTERNS.filter(\n (p) =>\n p.name.includes(q) ||\n p.tagline.toLowerCase().includes(q) ||\n p.tags.some((t) => t.includes(q)),\n );\n}\n","/**\n * Skills index — TOKEN-EFFICIENT registry of every taste / design\n * skill the MCP exposes. The agent uses `list_skills` to discover\n * (returns just id + name + tagline + section list) then\n * `get_skill_section` to drill into one section.\n *\n * Sources synthesised from Leonxlnx/taste-skill + framework-native\n * design knowledge. Body strings are stored separately in their\n * existing data files (design-thinking.ts, anti-ai-tells.ts, etc.)\n * to avoid duplication.\n */\n\nexport interface SkillSection {\n /** URL-safe section id. */\n id: string;\n /** Display title. */\n title: string;\n /** One-line tagline of what this section covers. */\n tagline: string;\n /** Body — Markdown. */\n body: string;\n}\n\nexport interface Skill {\n id: string;\n name: string;\n /** When to reach for this skill — written so the router can match a task to it. */\n whenToUse: string;\n /** Source attribution. */\n source: string;\n sections: SkillSection[];\n}\n\nexport const SKILLS: Skill[] = [\n // ── taste (foundational) ───────────────────────────────────────\n {\n id: \"taste\",\n name: \"Taste baseline — Senior UI/UX engineering\",\n whenToUse:\n \"Default for any production app screen. Metric-based rules, strict component architecture, CSS hardware acceleration, balanced design engineering.\",\n source: \"Leonxlnx/taste-skill (root) + @godxjp/ui design-thinking.ts\",\n sections: [\n {\n id: \"mobile-first\",\n title: \"Mobile-first non-negotiable\",\n tagline:\n \"Defaults target xs (≥0px); enhance via sm: / md: / lg: / xl: / 2xl:\",\n body: `Cardinal rule 24. Touch targets ≥ 44×44 px. NEVER read\nwindow.innerWidth — use useBreakpoint(). Stories render at narrow\nviewport first. Multi-column layouts: grid grid-cols-1 sm:grid-cols-N.\nEXCEPTION: name pairs (姓+名) use grid-cols-2 always.`,\n },\n {\n id: \"one-intent-per-screen\",\n title: \"One intent per screen\",\n tagline: \"Pick the ONE primary question this page answers. 60-80% visual weight to it.\",\n body: `Wall-of-cards dashboards are AI slop. Show 1-2 hero metrics\n+ ONE primary list + contextual actions. Tertiary content lives in\nSheet / DropdownMenu / next page. The 8-stat-card grid pattern is a\nRED FLAG — it means \"I couldn't decide what mattered\".`,\n },\n {\n id: \"type-hierarchy\",\n title: \"Type does the hierarchy work\",\n tagline: \"Weight + size + color, NOT colored background blocks.\",\n body: `Typography.Title size={1..5} is the canonical scale. h2 → h3 → h4\neach ~75% of previous. Don't skip levels. Body = Typography.Paragraph.\nMetadata = Typography.Text color=\"secondary\". Type contrast alone IS\nthe hierarchy — colored background blocks for every section is AI\nslop. Reserve colored bg for genuinely different surfaces (Card vs\npage, Alert vs body).`,\n },\n {\n id: \"whitespace-is-content\",\n title: \"Whitespace IS content\",\n tagline: \"Use the smallest spacing step that visually separates concepts.\",\n body: `Spacing ladder: --spacing-1 (4px) for tight groups, -2 (8) for\ncontrol pairs, -3 (12) for related controls in form, -4 (16) for\nsections, -6 (24) for cards in grid, -8 (32) for page rhythm.\n\"Premium via excess padding\" (everything spacing-6 to feel premium)\nis wrong — undersized content lost in oceans of grey. Premium = VARIED\nspacing — tight where related, generous where not.`,\n },\n {\n id: \"two-accents\",\n title: \"Two accents do real work — not eight\",\n tagline: \"ONE brand color for action + ONE semantic color contextually. Not a rainbow.\",\n body: `Use --primary for actions (Button, link, focus ring) + ONE\nsemantic (destructive for delete confirm, warning for deadline alert,\nsuccess for completed state). NEVER a rainbow tag wall. Tag variety\nvia appearance (soft/solid/outline) of the SAME hue, not different\nhues.`,\n },\n {\n id: \"form-discipline\",\n title: \"Form discipline — label, help, error always\",\n tagline: \"Every input has explicit label + help + error wired via FormField.\",\n body: `Never placeholder-as-label (disappears on focus). Use\n<FormField label description /> — it wires the Radix Label, the\ndescription text, and the error via aria-describedby + role=\"alert\"\nautomatically. Server errors as inline near the field, NOT as toasts\n(SR can't announce a disappearing toast).`,\n },\n {\n id: \"loading-states\",\n title: \"Skeleton for INIT, Spinner for ACTIVE work\",\n tagline: \"Different states for different moments — never mix.\",\n body: `<Form loading={{ kind: \"skeleton\" }}> while fetching existing\nvalues (no data yet — maintain layout, prevent flash). <Form loading>\n(boolean true) while saving (data is there, you're transforming).\nSkeleton during save is wrong (user sees structure they already saw —\nbroken). Spinner during init is wrong (nothing to spin over).`,\n },\n ],\n },\n\n // ── soft (Awwwards / premium agency) ───────────────────────────\n {\n id: \"soft\",\n name: \"Awwwards-tier — $150k agency build\",\n whenToUse:\n \"Premium agency brief — marketing site, hero pages, product showcase. NOT every internal SaaS screen. Apply when the brief asks for 'Linear-tier', 'Apple-esque', 'Awwwards-style'.\",\n source: \"Leonxlnx/taste-skill/soft-skill\",\n sections: [\n {\n id: \"absolute-zero\",\n title: \"Absolute Zero — banned defaults\",\n tagline: \"Inter / Roboto / Lucide / shadow-md / 3-col Bootstrap / linear easing — banned.\",\n body: `BANNED FONTS: Inter, Roboto, Arial, Open Sans, Helvetica → use Geist\n/ Clash Display / PP Editorial New / Plus Jakarta Sans.\nBANNED ICONS: standard thick Lucide / Material → use Phosphor Light /\nRemix Line.\nBANNED BORDERS: generic 1px solid gray → hairline rings (ring-1\nring-black/5), tinted borders, OR whitespace as separator.\nBANNED SHADOWS: shadow-md, rgba(0,0,0,0.3) → ultra-diffuse low-opacity\n(<0.05), TINTED to background.\nBANNED LAYOUTS: edge-to-edge sticky navbars, symmetric 3-col → floating\nglass nav pills, asymmetric bento grids.\nBANNED MOTION: linear / ease-in-out / instant → custom cubic-bezier\n(0.32, 0.72, 0, 1), spring physics, scroll interpolation.`,\n },\n {\n id: \"vibe-archetypes\",\n title: \"3 Vibe Archetypes (pick 1)\",\n tagline: \"Ethereal Glass (SaaS/AI) | Editorial Luxury (Lifestyle/Agency) | Soft Structuralism (Consumer/Health)\",\n body: `1. ETHEREAL GLASS (SaaS / AI / Tech): OLED black #050505, radial\n mesh gradients (purple/emerald orbs), Vantablack cards with heavy\n backdrop-blur-2xl, white/10 hairlines. Wide geometric Grotesk.\n2. EDITORIAL LUXURY (Lifestyle / Real Estate / Agency): Warm creams\n #FDFBF7, muted sage, deep espresso. High-contrast Variable Serif\n for massive headings. CSS noise overlay opacity-0.03 for paper.\n3. SOFT STRUCTURALISM (Consumer / Health / Portfolio): Silver-grey\n or pure white. Massive bold Grotesk typography. Airy floating\n components, unbelievably soft diffused ambient shadows\n (shadow-[0_30px_60px_-30px_rgba(0,0,0,0.06)]).`,\n },\n {\n id: \"layout-archetypes\",\n title: \"3 Layout Archetypes (pick 1)\",\n tagline: \"Asymmetric Bento | Z-Axis Cascade | Editorial Split — ALL collapse to single-col on mobile.\",\n body: `1. ASYMMETRIC BENTO: Masonry CSS Grid varying card sizes\n (col-span-8 row-span-2 next to stacked col-span-4). Mobile:\n grid-cols-1, gap-6, all col-span reset to 1.\n2. Z-AXIS CASCADE: Elements stacked like physical cards, slightly\n overlapping with varying depth + -2deg/3deg rotations. Mobile:\n REMOVE rotations + negative-margin overlaps below 768px (touch\n conflicts), stack vertically.\n3. EDITORIAL SPLIT: Massive typography w-1/2 left, interactive\n scrollable content right. Mobile: full-width vertical stack,\n typography on top, content below with horizontal scroll preserved.\n\nUNIVERSAL MOBILE OVERRIDE: w-full, px-4, py-8 below 768px. NEVER\nh-screen — always min-h-[100dvh] (iOS Safari viewport jump fix).`,\n },\n {\n id: \"double-bezel\",\n title: \"Double-Bezel / Doppelrand architecture\",\n tagline: \"Cards nested like physical hardware — glass plate in aluminum tray.\",\n body: `Never flat. Wrap every premium card in two nested enclosures:\n\nOUTER SHELL: subtle bg (bg-black/5 or bg-white/5), hairline outer\nborder (ring-1 ring-black/5 or border border-white/10), padding\np-1.5 / p-2, large outer radius (rounded-[2rem]).\n\nINNER CORE: distinct background, inner highlight\n(shadow-[inset_0_1px_1px_rgba(255,255,255,0.15)]), mathematically\nsmaller radius (rounded-[calc(2rem-0.375rem)]) for concentric curves.\n\nThe math gives \"machined hardware\" look. Concentric curves = human\neye reads \"precision\".`,\n },\n {\n id: \"button-in-button\",\n title: \"Button-in-Button trailing icon\",\n tagline: \"Trailing arrow lives in its OWN nested pill — not naked next to text.\",\n body: `Primary buttons: rounded-full, px-6 py-3 generous padding. Trailing\narrow/icon NEVER sits naked next to text. Nests in its own circular\nwrapper: w-8 h-8 rounded-full bg-black/5 flex items-center justify-\ncenter, flush with main button's right inner padding. On hover, inner\nicon translates diagonally + scales up — internal kinetic tension.`,\n },\n {\n id: \"magnetic-hover\",\n title: \"Magnetic button hover physics\",\n tagline: \"Custom cubic-bezier, scale on press, internal translate on hover. NO linear easing.\",\n body: `Use group utility. Hover ≠ background color change. On hover:\nnested inner icon circle translates diagonally (group-hover:translate-\nx-1 group-hover:-translate-y-[1px]) AND scales up (scale-105). On\npress: scale entire button down slightly (active:scale-[0.98]) —\nsimulates physical click. Custom cubic-bezier on ALL transitions\n(NEVER linear / ease-in-out).`,\n },\n {\n id: \"scroll-entry\",\n title: \"Scroll-interpolation entry animations\",\n tagline: \"Elements never appear statically — gentle fade-up from below with blur.\",\n body: `As elements enter viewport: translate-y-16 blur-md opacity-0 →\ntranslate-y-0 blur-0 opacity-100 over 800ms+. Use IntersectionObserver\nor Framer Motion's whileInView. NEVER window.addEventListener(\"scroll\")\n— continuous reflows kill mobile perf.`,\n },\n {\n id: \"performance-guardrails\",\n title: \"Performance guardrails\",\n tagline: \"GPU-safe transforms, blur only on fixed/sticky, noise on pointer-events-none.\",\n body: `- Animate transform + opacity ONLY. NEVER top/left/width/height\n (layout reflow). will-change: transform sparingly.\n- backdrop-blur only on FIXED/STICKY elements. NEVER on scrolling\n containers — continuous GPU repaints, severe mobile frame drops.\n- grain/noise: FIXED pointer-events-none pseudo-element (position:\n fixed; inset: 0; z-index: 50). Never on scrolling containers.\n- Z-index discipline: no arbitrary z-50 or z-[9999]. Reserve for\n systemic layers (sticky nav, modals, overlays, tooltips).`,\n },\n ],\n },\n\n // ── minimalist (editorial workspace) ───────────────────────────\n {\n id: \"minimalist\",\n name: \"Minimalist — editorial workspace\",\n whenToUse:\n \"Document-style apps (Notion-clone, knowledge base, blog admin). Warm monochrome + spot pastels. Bento grids. Editorial serif headings + sans body + monospace for data.\",\n source: \"Leonxlnx/taste-skill/minimalist-skill\",\n sections: [\n {\n id: \"negative-constraints\",\n title: \"Banned defaults\",\n tagline: \"Inter / Roboto / Lucide / shadow-md / pill containers / emojis / Acme — banned.\",\n body: `BANNED: Inter / Roboto / Open Sans fonts. Lucide / Feather / Heroicons\ndefault icons. Tailwind heavy shadows (md/lg/xl). Primary-colored hero\nbackgrounds. Gradients, neon, full glassmorphism. rounded-full on\nlarge containers. Emojis anywhere in markup. Generic names (John Doe,\nAcme, Lorem Ipsum). AI clichés (Elevate, Seamless, Unleash, Next-Gen).`,\n },\n {\n id: \"typography\",\n title: \"Editorial typography\",\n tagline: \"Serif heading + character sans body + mono data. Off-black for body, never pure.\",\n body: `Pair: editorial serif (Lyon Text / Newsreader / Playfair / Instrument\nSerif) for headings WITH character sans (SF Pro Display / Geist Sans /\nSwitzer) body WITH monospace (Geist Mono / JetBrains Mono / SF Mono)\nfor data + keystrokes.\n\nTight tracking on serif headings (-0.02em to -0.04em). Tight\nline-height (1.1). Body line-height 1.6. Body color: off-black\n#111111 or #2F3437 — NEVER pure #000. Secondary text: muted gray\n#787774.`,\n },\n {\n id: \"palette\",\n title: \"Warm monochrome + spot pastels\",\n tagline: \"Canvas warm bone #F7F6F3. Accents from 4 desaturated pastels only.\",\n body: `Canvas: #FFFFFF or warm bone #F7F6F3 / #FBFBFA.\nCards: #FFFFFF or #F9F9F8.\nBorders: ultra-light #EAEAEA or rgba(0,0,0,0.06).\n\nAccents EXCLUSIVELY from 4 muted pastels:\n- Pale Red: bg #FDEBEC | text #9F2F2D\n- Pale Blue: bg #E1F3FE | text #1F6C9F\n- Pale Green: bg #EDF3EC | text #346538\n- Pale Yellow: bg #FBF3DB | text #956400`,\n },\n {\n id: \"bento-grids\",\n title: \"Asymmetric bento grids\",\n tagline: \"Cards: 1px solid #EAEAEA, 8-12px radius MAX, 24-40px padding, NO shadow.\",\n body: `Asymmetric CSS Grid layouts (1x1, 1x2, 2x1, 2x2). Cards:\nborder: 1px solid #EAEAEA, border-radius 8px or 12px MAX (never larger),\ngenerous internal padding (24-40px), no box-shadow. Use raw CSS Grid\nwith gridColumn/gridRow span for the bento layout.`,\n },\n {\n id: \"components\",\n title: \"Component refinements\",\n tagline: \"Primary CTA: solid black bg, 4-6px radius. Tags: pill + uppercase + 0.05em tracking + pastel.\",\n body: `PRIMARY CTA: solid #111 bg, white text, 4-6px radius (NOT full pill),\nno shadow. Hover: shift to #333 or active:scale(0.98).\nTAGS/BADGES: pill (border-radius 9999px), text-xs UPPERCASE,\nletter-spacing 0.05em. Background = muted pastel. Deep text color.\nACCORDIONS (FAQ): strip ALL container chrome. Items separated by\nborder-bottom: 1px solid #EAEAEA only. Toggle: sharp + / − icons.\nKBD: <kbd> as physical key — 1px solid #EAEAEA, 4px radius, #F7F6F3\nbg, monospace.\nFAUX-OS chrome (for product previews): white top bar + 3 small light-\ngray circles (macOS replica).`,\n },\n {\n id: \"motion\",\n title: \"Subtle invisible motion\",\n tagline: \"Scroll-entry fade-up 600ms cubic-bezier(.16,1,.3,1). Card hover lift via shadow shift only.\",\n body: `Scroll entry: translateY(12px) + opacity(0) → 0/1 over 600ms with\ncubic-bezier(0.16, 1, 0.3, 1). IntersectionObserver, never raw scroll.\nHover lift: box-shadow 0 → 0 2px 8px rgba(0,0,0,0.04) over 200ms.\nButtons: scale(0.98) on :active. Staggered list reveals: animation-\ndelay calc(var(--index) * 80ms). Background ambient: optional slow\nradial gradient blob, 20s+ duration, opacity 0.02-0.04, on\nposition:fixed pointer-events-none layer.`,\n },\n ],\n },\n\n // ── brutalist ──────────────────────────────────────────────────\n {\n id: \"brutalist\",\n name: \"Brutalist — Swiss print + military terminal\",\n whenToUse:\n \"Data-heavy dashboards, declassified-blueprint feel, portfolios needing raw mechanical aesthetic. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects.\",\n source: \"Leonxlnx/taste-skill/brutalist-skill\",\n sections: [\n {\n id: \"principles\",\n title: \"Brutalist principles\",\n tagline: \"Raw mechanical interfaces — rigid grids, extreme type contrast, utilitarian color, analog degradation.\",\n body: `Rejects ornament. Embraces structure as aesthetic. Grids are visible\n(via borders or rules). Type scale is dramatically contrasted (massive\ndisplay heading next to small tabular body). Color is utilitarian —\nblack, off-white, single signal color (red, amber, terminal green).\nAnalog effects (printer-bleed, halftone, screenprint registration\nerrors) add character without becoming kitsch. Best for: dev tools,\ndeclassified-data presentations, raw-fact dashboards, technical\nportfolios.`,\n },\n ],\n },\n\n // ── gpt-tasteskill ─────────────────────────────────────────────\n {\n id: \"gpt-tasteskill\",\n name: \"GPT taste — editorial + advanced GSAP motion\",\n whenToUse:\n \"Long-scroll marketing pages with cinematic scroll choreography. Pins, stacks, scrubbed timelines. AIDA structure. Wide editorial typography. Bans 6-line wraps. Gapless bento grids.\",\n source: \"Leonxlnx/taste-skill/gpt-tasteskill\",\n sections: [\n {\n id: \"principles\",\n title: \"GSAP motion + AIDA structure\",\n tagline: \"Python-driven layout randomization, strict ScrollTrigger choreography, wide editorial typography.\",\n body: `AIDA (Attention/Interest/Desire/Action) page spine. Wide editorial\ntypography — bans 6-line wraps (line lengths cap at ~5). Gapless bento\ngrids (cards flush against each other, no gutter — outline borders\ndo the separation). Inline micro-images (small contextual photos\nwithin a section, not just hero). Massive section spacing (180-240px\nbetween sections, not 80). GSAP ScrollTriggers: pinning (section\nlocks while sub-content scrolls), stacking (next section slides\nover current), scrubbing (animation tied to scroll progress).`,\n },\n ],\n },\n\n // ── redesign ───────────────────────────────────────────────────\n {\n id: \"redesign\",\n name: \"Redesign — audit + upgrade existing UI\",\n whenToUse:\n \"Working on an existing project (not greenfield). Find generic patterns, weak points, missing states. Apply fixes in priority order — font swap first, palette cleanup second, etc.\",\n source: \"Leonxlnx/taste-skill/redesign-skill + redesign-audit.ts\",\n sections: [\n {\n id: \"fix-priority\",\n title: \"Fix priority order\",\n tagline: \"Font → palette → states → layout → components → loading/empty/error → typography polish.\",\n body: `Apply in THIS order for max visual impact at min risk:\n\n1. FONT SWAP — biggest instant improvement, lowest risk.\n2. COLOR PALETTE CLEANUP — remove clashing / oversaturated colors.\n3. HOVER + ACTIVE STATES — makes interface feel alive.\n4. LAYOUT + SPACING — proper grid, max-width, consistent padding.\n5. REPLACE GENERIC COMPONENTS — cliche → modern alternatives.\n6. LOADING / EMPTY / ERROR STATES — makes it feel finished.\n7. TYPOGRAPHY SCALE + SPACING POLISH — premium final touch.\n\nRules: work with existing stack, don't migrate frameworks, don't break\nfunctionality, test after every change. Small targeted improvements\nover big rewrites.`,\n },\n {\n id: \"audit-checklist\",\n title: \"Audit checklist (8 categories)\",\n tagline: \"Typography / color / layout / interactivity / content / components / iconography / code / omissions.\",\n body: `See redesign-audit.ts (50+ checks). Common findings:\n\nTYPOGRAPHY: Inter everywhere, weak headlines, full-width paragraphs,\nonly 400/700 weights, proportional numbers in data, Title Case On\nEvery Header.\nCOLOR: pure #000, oversaturated accents, multiple competing accents,\npurple/blue AI gradient, generic black shadows, empty flat sections.\nLAYOUT: 3-equal-card columns (most generic AI pattern), height:100vh\niOS jump, no max-width container, dashboard always left sidebar.\nINTERACTIVITY: no hover, no active feedback, no focus ring, generic\nspinners, no empty states, alert() for errors, dead links.\nCONTENT: John Doe / Acme / Lorem Ipsum, AI clichés, exclamation marks\nin success, passive voice errors.\nOMISSIONS: no legal links, no back nav, no 404, no form validation,\nno skip-to-content.`,\n },\n ],\n },\n\n // ── output (full-output enforcement) ───────────────────────────\n {\n id: \"output\",\n name: \"Full-output enforcement\",\n whenToUse:\n \"Always. Bans the // ... / // TODO / 'I'll leave this as an exercise' patterns. Treat every task as production-critical.\",\n source: \"Leonxlnx/taste-skill/output-skill + output-quality.ts\",\n sections: [\n {\n id: \"banned\",\n title: \"Banned patterns\",\n tagline: \"// ... / // TODO / 'for brevity' / 'rest follows pattern' — HARD FAILURES.\",\n body: `In code: // ..., // rest of code, // implement here, // TODO,\n/* ... */, // similar to above, // continue pattern, // add more\nas needed, bare ... standing for omitted code.\n\nIn prose: \"Let me know if you want me to continue\", \"for brevity\",\n\"the rest follows the same pattern\", \"similarly for the remaining\",\n\"and so on\" (replacing actual content), \"I'll leave that as an\nexercise\".\n\nStructural: skeleton when full implementation was requested, first +\nlast section skipping middle, describing what code should do instead\nof writing it.`,\n },\n {\n id: \"long-output-protocol\",\n title: \"Long-output protocol\",\n tagline: \"Write at full quality to clean breakpoint, then [PAUSED] marker, never compress.\",\n body: `When response approaches token limit:\n- Do NOT compress remaining sections.\n- Write at FULL QUALITY up to clean breakpoint (end of function /\n file / section).\n- End with: [PAUSED — X of Y complete. Send \"continue\" to resume\n from: <section name>]\n- On \"continue\": pick up EXACTLY where stopped. No recap, no\n repetition.`,\n },\n ],\n },\n\n // ── brandkit ───────────────────────────────────────────────────\n {\n id: \"brandkit\",\n name: \"Brandkit — identity guidelines boards\",\n whenToUse:\n \"Designing a brand identity board first (before screens). Logo system, color palette, typography lockup, icon system, photography direction, brand voice.\",\n source: \"Leonxlnx/taste-skill/brandkit\",\n sections: [\n {\n id: \"principles\",\n title: \"Brandkit principles\",\n tagline: \"Premium brand-guidelines boards — minimalist / cinematic / editorial / dark-tech / luxury / cultural variants.\",\n body: `Compositions for brand identity decks. Minimalist (workspace),\ncinematic (entertainment), editorial (publishing), dark-tech (SaaS),\nluxury (lifestyle), cultural (heritage), security (defense / fintech),\ngaming, developer-tool, consumer-app. Logo concepts with intentional\nsymbolic meaning. Refined composition (asymmetric grid, generous\nbreathing). Sparse typography. Premium mockups. Art-directed\nimagery. Flexible grid layouts.`,\n },\n ],\n },\n\n // ── stitch ─────────────────────────────────────────────────────\n {\n id: \"stitch\",\n name: \"Stitch — semantic DESIGN.md for Google Stitch\",\n whenToUse:\n \"Pairing with Google Stitch (or similar AI UI generator). Generate DESIGN.md files that enforce premium standards — strict typography, calibrated color, asymmetric layouts, perpetual micro-motion.\",\n source: \"Leonxlnx/taste-skill/stitch-skill\",\n sections: [\n {\n id: \"principles\",\n title: \"Stitch DESIGN.md principles\",\n tagline: \"Agent-friendly design specs — strict type, calibrated color, asymmetric layout, micro-motion, hardware acceleration.\",\n body: `DESIGN.md = instruction set for downstream AI UI generators.\nEnforces: strict typography (no Inter, specific fonts named),\ncalibrated color (specific hex, not \"blue\"), asymmetric layouts\n(specific grid template strings), perpetual micro-motion (specific\ntiming functions), hardware-accelerated performance (transform/\nopacity only). Output is consumable by AI agents — explicit beats\nexpressive.`,\n },\n ],\n },\n\n // ── imagegen-mobile ────────────────────────────────────────────\n {\n id: \"imagegen-mobile\",\n name: \"Imagegen mobile — app screen reference images\",\n whenToUse:\n \"Pre-code phase. Generate mobile screen mockups before implementing. Onboarding flows, auth, home dashboards, profile, settings, chat, ecommerce, fintech, health, productivity.\",\n source: \"Leonxlnx/taste-skill/imagegen-frontend-mobile\",\n sections: [\n {\n id: \"principles\",\n title: \"Mobile image direction principles\",\n tagline: \"App-native, premium, readable, flow-aware, platform-aware. Wrap in subtle premium phone mockup. Multi-screen consistency.\",\n body: `Generate premium app-native mobile screen images + flow images\n(NOT generic AI mockups, NOT phone-shaped websites). Default mockup\npresence: subtle premium iPhone frame with visible chrome, focus\nstays on app content. Generate 3-5 screens per flow (onboarding,\nauth, home, detail, settings). Logical flow (each screen continues\nthe user's task). First-screen cleanliness (don't dump every feature\non the entry screen). Safe-area awareness (status bar + home\nindicator preserved). Mobile anti-tells: no purple-blue fintech\ngradients, no random glass cards, no ambient blobs, no fake neon, no\ndribbble floating widgets, no oversized corner radii on everything,\nno rainbow chip walls, no fake chart dashboard spam, no cloned\nscreens in flows.`,\n },\n ],\n },\n\n // ── imagegen-web ───────────────────────────────────────────────\n {\n id: \"imagegen-web\",\n name: \"Imagegen web — landing page section images\",\n whenToUse:\n \"Pre-code phase for landing / marketing sites. Generate ONE image per section (8 sections → 8 images). Hero composition variety (NOT always left-text/right-image).\",\n source: \"Leonxlnx/taste-skill/imagegen-frontend-web\",\n sections: [\n {\n id: \"hard-output-rule\",\n title: \"Hard output rule — one image per section\",\n tagline: \"8 sections requested → 8 separate images. NEVER combine sections.\",\n body: `Each image = one section, own image call. NEVER combine multiple\nsections into one frame. NEVER return a single tall image with the\nwhole page. Default to 6 sections if \"landing page\" with no count.\n8 sections for \"full website template\". Announce each (\"Section 1\nof 8: Hero\", \"Section 2 of 8: Trust bar\").`,\n },\n {\n id: \"hero-composition-bias\",\n title: \"Hero composition variety\",\n tagline: \"Left-text / right-image hero is the most overused AI pattern. Pick from 10 alternatives first.\",\n body: `Before reaching for left-text/right-image hero, consider:\n- centered over background image\n- bottom-left over image\n- bottom-right over image\n- top-left lead\n- stacked center\n- image-as-canvas\n- off-grid editorial\n- mini minimalist\n- right-text / left-image (inverted classic)\nUse left-text/right-image ONLY when genuinely the strongest choice\nfor the brand.`,\n },\n ],\n },\n\n // ── image-to-code ──────────────────────────────────────────────\n {\n id: \"image-to-code\",\n name: \"Image-to-code — generate design first, then implement\",\n whenToUse:\n \"Visual-first brief in Codex. First generate the design image yourself, deeply analyze, THEN implement code matching it.\",\n source: \"Leonxlnx/taste-skill/image-to-code-skill\",\n sections: [\n {\n id: \"workflow\",\n title: \"Image-to-code workflow\",\n tagline: \"Generate design image → analyze → implement. Prefer large readable section-specific images.\",\n body: `Workflow:\n1. Generate the design image FIRST (one per section, large + readable).\n2. Deeply analyze: composition, hierarchy, palette, typography, motion.\n3. Implement React/HTML/CSS matching as closely as possible.\n\nPrefer LARGE, readable, section-specific images over tiny compressed\nboards. Generate fresh standalone images for sections / detail views\ninstead of cropping old. Avoid lazy under-generation. Avoid cards-\ninside-cards-inside-cards UI. Keep the hero clean, spacious, readable,\nvisible on a small laptop.`,\n },\n ],\n },\n];\n\nexport function findSkill(id: string): Skill | undefined {\n return SKILLS.find((s) => s.id === id);\n}\n\nexport function findSection(skillId: string, sectionId: string): SkillSection | undefined {\n return findSkill(skillId)?.sections.find((s) => s.id === sectionId);\n}\n\n/**\n * Naïve task router — keyword match. Replace with embedding-based\n * matcher in v2 if it proves useful.\n */\nexport interface RouteResult {\n skill: string;\n section: string | \"<see whenToUse>\";\n why: string;\n alsoSee?: string[];\n}\n\nexport function routeTask(task: string): RouteResult[] {\n const q = task.toLowerCase();\n const matches: RouteResult[] = [];\n\n const route = (\n kw: string[],\n skill: string,\n section: string | \"<see whenToUse>\",\n why: string,\n alsoSee?: string[],\n ) => {\n if (kw.some((k) => q.includes(k))) matches.push({ skill, section, why, alsoSee });\n };\n\n // Premium / agency / Awwwards\n route([\"premium\", \"awwwards\", \"agency\", \"linear\", \"apple\", \"high-end\", \"luxury\"],\n \"soft\", \"vibe-archetypes\",\n \"Premium tier — pick a Vibe + Layout archetype + apply Double-Bezel.\",\n [\"soft/double-bezel\", \"soft/magnetic-hover\"]);\n\n // Marketing / landing\n route([\"landing page\", \"marketing\", \"hero\", \"long scroll\"],\n \"imagegen-web\", \"hero-composition-bias\",\n \"Landing pages benefit from hero composition variety + per-section image generation.\",\n [\"gpt-tasteskill/principles\", \"soft/layout-archetypes\"]);\n\n // Mobile app screens\n route([\"mobile app\", \"ios\", \"android\", \"phone screen\", \"onboarding flow\"],\n \"imagegen-mobile\", \"principles\",\n \"Mobile app design — generate screens first, avoid phone-shaped-website.\",\n [\"taste/mobile-first\"]);\n\n // Workspace / Notion-like\n route([\"workspace\", \"notion\", \"document\", \"editorial\", \"knowledge base\"],\n \"minimalist\", \"palette\",\n \"Editorial workspace = warm monochrome + spot pastels + serif headings.\",\n [\"minimalist/typography\", \"minimalist/bento-grids\"]);\n\n // Data dashboard\n route([\"dashboard\", \"data heavy\", \"tabular\", \"ops table\"],\n \"brutalist\", \"principles\",\n \"Data-heavy dashboards work with Brutalist (rigid grids, utilitarian color).\",\n [\"taste/one-intent-per-screen\"]);\n\n // Brand work\n route([\"brand\", \"identity\", \"logo\", \"guidelines\"],\n \"brandkit\", \"principles\",\n \"Brand identity work — boards before screens.\");\n\n // Existing project upgrade\n route([\"refactor\", \"redesign\", \"upgrade existing\", \"audit\"],\n \"redesign\", \"fix-priority\",\n \"Existing project = run audit first, fix in priority order (font → palette → states → ...).\",\n [\"redesign/audit-checklist\"]);\n\n // Form work\n route([\"form\", \"validation\", \"submit\", \"sign up\", \"registration\"],\n \"taste\", \"form-discipline\",\n \"Form must have explicit label + help + error wired via FormField (rule 34).\");\n\n // Loading / saving\n route([\"loading\", \"saving\", \"skeleton\", \"spinner\"],\n \"taste\", \"loading-states\",\n \"Skeleton for INIT fetch, Spinner for active work. Never mix.\");\n\n // Mobile-first concerns\n route([\"mobile first\", \"responsive\", \"breakpoint\"],\n \"taste\", \"mobile-first\",\n \"Default styles target xs. Touch targets ≥ 44px. Use useBreakpoint().\");\n\n // Output quality\n route([\"complete code\", \"full implementation\", \"no placeholder\"],\n \"output\", \"banned\",\n \"Banned: // ..., // TODO, 'for brevity'. Ship complete runnable code.\");\n\n // GSAP motion\n route([\"gsap\", \"scrolltrigger\", \"scroll choreography\", \"pinning\"],\n \"gpt-tasteskill\", \"principles\",\n \"GSAP ScrollTrigger — pinning, stacking, scrubbing.\");\n\n // Image-first / design-first\n route([\"from image\", \"image to code\", \"design first\"],\n \"image-to-code\", \"workflow\",\n \"Generate design image first → analyze → implement.\");\n\n if (matches.length === 0) {\n return [{\n skill: \"taste\",\n section: \"<see whenToUse>\",\n why: `No keyword match for \"${task}\". Default to the \"taste\" baseline — see whenToUse for sections.`,\n }];\n }\n\n return matches;\n}\n","/**\n * Anti-AI-tells catalog — specific patterns that signal \"this UI was\n * synthesised by an LLM without taste\". Adapted from the taste-skill\n * SKILL.md (mobile + web) and the @godxjp/ui review log. The MCP\n * exposes this so consumer agents can self-audit BEFORE shipping.\n */\n\nexport interface AiTell {\n /** The pattern, by category. */\n category: \"visual\" | \"layout\" | \"copy\" | \"interaction\" | \"imagery\" | \"structure\";\n /** Short name. */\n name: string;\n /** What it looks like + why it's a tell. */\n body: string;\n /** What to do instead — concrete fix. */\n fix: string;\n}\n\nexport const ANTI_AI_TELLS: AiTell[] = [\n // ── visual ─────────────────────────────────────────────────────\n {\n category: \"visual\",\n name: \"Purple-blue gradient hero\",\n body: `The default LLM color palette — purple → blue → cyan radial /\nlinear gradient as hero background. Looks like every AI-generated\nSaaS landing page from 2023.`,\n fix: `Use the framework's accent palette (\\`data-accent=\"blue\"\\` /\n\"violet\" / \"cyan\" / \"green\" / \"orange\" / \"rose\"). Solid surface\ncolors with semantic meaning. If you want depth, use a SINGLE\nsubtle gradient that supports brand (not decoration).`,\n },\n {\n category: \"visual\",\n name: \"Glassmorphism without purpose\",\n body: `Frosted-glass cards stacked on a colorful blurry background.\nLooked novel in 2020 — now a tell that the designer reached for\ntrend instead of solving a problem.`,\n fix: `Solid surface tiers (Card on background, Popover on Card,\nDialog on backdrop). The framework's elevation system already\nencodes 3 surface tiers — use them.`,\n },\n {\n category: \"visual\",\n name: \"Ambient blobs / floating shapes\",\n body: `Random gradient blobs floating behind content with no narrative\npurpose. The \"creative space-filler\" AI pattern. Reads as\ndistracting noise.`,\n fix: `If the page needs visual interest, use a REAL image (product\nphoto, founder photo, branded illustration). If you need\n\"breathing room\", use whitespace. Never use shapes as filler.`,\n },\n {\n category: \"visual\",\n name: \"Oversized border-radius on everything\",\n body: `Every Card / Button / Input with \\`border-radius: 24px\\`. Reads\nas \"I picked one radius and applied it globally\". Premium design\nuses ROLES — small radius on inputs (4-6px), medium on cards\n(8-12px), pill on chips (full).`,\n fix: `Use the framework's radius scale (\\`--radius-sm | -md | -lg | -full\\`).\nEach primitive defaults to the right role; only override when the\ndesign canon specifically calls for it.`,\n },\n {\n category: \"visual\",\n name: \"Rainbow chip wall\",\n body: `Row of Tags / Badges each in a different color (red, orange,\nyellow, green, blue, purple) — usually navigation or filter\ncategories. Reads as chaos; eye can't anchor.`,\n fix: `Pick ONE accent for the tag row. Use \\`appearance\\` (\"soft\" vs\n\"solid\" vs \"outline\") for variety within the same hue. Reserve\nnon-neutral colors (success / warning / destructive) for tags\nthat genuinely carry that meaning.`,\n },\n\n // ── layout ─────────────────────────────────────────────────────\n {\n category: \"layout\",\n name: \"8-card stat dashboard\",\n body: `Homepage with a 4x2 grid of \"stat cards\" — each with an icon, a\nnumber, a sparkline, a delta. None of them relate to a real\nbusiness question; they were chosen because \"more cards = more\ndata\". Classic AI dashboard slop.`,\n fix: `Show 1-2 hero metrics (the ones executives ASK about), then the\ntop action list (orders waiting, tasks due, alerts). If the user\nneeds more analytics, link to a dedicated Reports page.`,\n },\n {\n category: \"layout\",\n name: \"Phone-shaped website\",\n body: `Mobile screen rendered as a vertical strip with the same density\n+ same layout as desktop — just narrower. Cramped tap targets,\nhorizontal scrolling for overflow, no system bar awareness.`,\n fix: `Mobile is its OWN design. Use full-width inputs (\\`block\\` Button),\nstacked layout, larger tap targets, Sheet/Drawer for secondary\ncontent, system-bar safe area. The framework's \\`useBreakpoint\\`\n+ Tailwind \\`sm:\\` variants give you the canvas.`,\n },\n {\n category: \"layout\",\n name: \"Wall-of-tabs navigation\",\n body: `10+ tabs at the top of a screen, no priority. User has to read all\nof them to find the right one. AI default: \"more tabs = more\nfeatures = better\".`,\n fix: `2-4 tabs max. If you have more categories, use a sidebar (Menu),\nor a Cascader / Tree picker. Tabs are for switching between PEERS\n(2-4 mutually exclusive views of the same data).`,\n },\n {\n category: \"layout\",\n name: \"Identical clone screens\",\n body: `5 onboarding steps where every screen has the same headline +\nillustration + 2 buttons layout. Reads as \"I copy-pasted the\ntemplate\" — and devalues the user's time at each step.`,\n fix: `Each step has a distinct visual + interactive feel. Step 1 might\nbe a centered question, step 2 a side-by-side comparison, step 3\na multi-field form, step 4 a single yes/no card. Same palette +\ntype system for coherence; different composition for engagement.`,\n },\n\n // ── copy ───────────────────────────────────────────────────────\n {\n category: \"copy\",\n name: \"Filler corporate phrases\",\n body: `\"Elevate your potential\", \"unlock seamless productivity\",\n\"transform your workflow\", \"next-generation experience\". Reads as\nnothing because it MEANS nothing.`,\n fix: `Write what the feature DOES, specifically. \"Sync 1,000 rows in 2\nseconds\" beats \"Lightning-fast performance\". \"Replaces 3 manual\nsteps\" beats \"Streamline your workflow\".`,\n },\n {\n category: \"copy\",\n name: \"Generic brand placeholders\",\n body: `Acme, NovaCore, Flowbit, Quantix, VeloPay, Lumen, Apex — the\ngo-to AI brand names that scream \"I couldn't think of one\".`,\n fix: `Use believable real-sounding names: 株式会社ABC商事, Tanaka\nTrading, Yokohama Coffee Roasters, Mountain View Bakery. Or use\nyour actual project's brand if known.`,\n },\n {\n category: \"copy\",\n name: \"Vague empty-state copy\",\n body: `\"Get started\", \"Begin your journey\", \"No items yet\" — without\nsaying WHAT to do or WHY there's nothing.`,\n fix: `Be specific + actionable: \"まだ注文がありません。商品を追加して\n最初の注文を作成しましょう。\" + a clear next-action Button.\nEmpty states are TEACHING MOMENTS — use them to onboard.`,\n },\n {\n category: \"copy\",\n name: \"Apologetic / passive-voice error messages\",\n body: `\"Sorry, something went wrong\" / \"An error has occurred\" — no\ninformation about WHAT, no recovery action.`,\n fix: `Specific + actionable: \"メールアドレスの形式が正しくありません\n(例: name@example.com)\". For server errors: \"通信エラー\n(再試行 ボタン)\". Never apologise if you can't say what failed\nor what to do.`,\n },\n\n // ── interaction ────────────────────────────────────────────────\n {\n category: \"interaction\",\n name: \"Hover-only affordances\",\n body: `Action buttons that only appear on hover (table row actions\nhidden until mouseover). Breaks on mobile (no hover), inaccessible\n(keyboard users can't discover).`,\n fix: `Show actions inline or in a kebab menu (DropdownMenu) that's\nALWAYS visible. If you must hide on desktop for density, ensure\nthe same actions are reachable via keyboard (Tab to row, Enter to\nexpand a row-actions DropdownMenu).`,\n },\n {\n category: \"interaction\",\n name: \"Auto-advancing carousel\",\n body: `Hero carousel that rotates every 3 seconds. Users haven't\nfinished reading slide 1; now slide 2 is gone. Accessibility\nnightmare (cognitive load, motion-sensitive).`,\n fix: `Carousel ONLY rotates on explicit user action (arrow click,\ndot click, swipe). \\`<Carousel autoplay={false}>\\` is the default\nin the framework for this reason.`,\n },\n {\n category: \"interaction\",\n name: \"Drag-without-handle\",\n body: `Cards / list items reorderable by long-press anywhere — no\nvisual indicator that they ARE draggable. Users discover it by\naccident or never.`,\n fix: `Show a drag handle icon (\\`<GripVertical>\\`) on the left of the\nrow. Users see it, understand \"this row is draggable\", reach for\nit deliberately.`,\n },\n {\n category: \"interaction\",\n name: \"Disappearing focus ring\",\n body: `\\`outline: none\\` on focus to \"look cleaner\". Keyboard users\ncan't see where they are; total navigation failure.`,\n fix: `Use \\`:focus-visible\\` (Radix primitives do automatically) so the\nring shows on keyboard focus, hides on mouse-click. Don't strip.`,\n },\n\n // ── imagery ────────────────────────────────────────────────────\n {\n category: \"imagery\",\n name: \"Stock photo of generic smiling team\",\n body: `Empty state / About page with a photo of a \"diverse team in an\nopen office laughing at a laptop\". Reads as 2010 corporate stock.\nNo relationship to your product.`,\n fix: `Real photos of YOUR team / users (with consent), product\nscreenshots, branded illustrations. Avatar's INITIALS fallback is\nbetter than a generic stock person.`,\n },\n {\n category: \"imagery\",\n name: \"Floating 3D crypto icon\",\n body: `Empty state with a chrome / pastel 3D icon (coin, key, shield)\nfloating in the center. Looks like every NFT marketplace from\n2021.`,\n fix: `Simple lucide-react line icon (\\`<Inbox size={48} />\\`) +\ndescriptive title. Or a flat illustration matching the brand\npalette. Skip the 3D entirely unless your brand IS 3D.`,\n },\n {\n category: \"imagery\",\n name: \"Decorative gradient mesh background\",\n body: `Page sections with a colorful gradient mesh (\"Stripe-style\")\nbehind text. Looks \"premium\" until you realize every AI design\nuses it. Often hurts text contrast.`,\n fix: `Solid background (\\`--background\\`). If you need depth, use a\nsubtle 1px border + \\`--card\\` background tint. Reserve high-effort\nbackgrounds for pages where they matter (marketing hero, product\nshowcase) — not every internal screen.`,\n },\n\n // ── structure ──────────────────────────────────────────────────\n {\n category: \"structure\",\n name: \"Settings as one long form\",\n body: `Settings page with 40 form fields in a single scroll. User\nloses their place, can't find the field they came for.`,\n fix: `Section the form with \\`<Typography.Title size={5}>\\` subheaders\n+ \\`<Separator />\\`. Group by concern (基本情報 / 公開範囲 / 通知 /\nセキュリティ). If 40 fields is still too many, split into Tabs\nor a Sidebar-driven multi-page settings flow.`,\n },\n {\n category: \"structure\",\n name: \"Modal-in-modal-in-modal\",\n body: `Click a Button → Dialog opens → click \"Edit\" → another Dialog\nopens → click \"Confirm\" → AlertDialog opens. Triple stack;\nuser loses context.`,\n fix: `Use Sheet for the FIRST level (side panel), Dialog for the\nconfirm. Or, redesign the flow so the edit is INLINE in the\nfirst Dialog (no second Dialog needed). AlertDialog for confirm\nis correct — but ONE deep, not three.`,\n },\n {\n category: \"structure\",\n name: \"Spinner-only loading state\",\n body: `Page-level spinner while data loads. User stares at an empty\nshell with a centered spinner. Layout shifts when content\narrives.`,\n fix: `Use Skeleton placeholders matching the eventual content shape.\nThe framework's \\`<Form loading={{ kind: \"skeleton\" }}>\\` cascades\nto every field; \\`<Skeleton className=\"h-9 w-full rounded-md\" />\\`\nfor individual blocks. Layout stays stable, perceived speed\nimproves.`,\n },\n];\n\nexport function aiTellsByCategory(cat: AiTell[\"category\"]): AiTell[] {\n return ANTI_AI_TELLS.filter((t) => t.category === cat);\n}\n","/**\n * Redesign audit checklist — for upgrading an existing project (or\n * critiquing a new design before shipping). Adapted from\n * Leonxlnx/taste-skill `redesign-existing-projects` SKILL. The MCP\n * exposes this so consumer agents can run a structured audit on a\n * page they're working on.\n *\n * Fix priority is ordered for MAXIMUM visual impact at MINIMUM\n * risk — agents should apply in this order.\n */\n\nexport interface AuditCheck {\n category:\n | \"typography\"\n | \"color-surface\"\n | \"layout\"\n | \"interactivity\"\n | \"content\"\n | \"components\"\n | \"iconography\"\n | \"code-quality\"\n | \"omissions\";\n /** What to look for. */\n symptom: string;\n /** Concrete fix. */\n fix: string;\n /** @godxjp/ui-specific notes if applicable. */\n uiNote?: string;\n}\n\nexport const REDESIGN_CHECKS: AuditCheck[] = [\n // ── typography ─────────────────────────────────────────────────\n {\n category: \"typography\",\n symptom: \"Inter / Roboto / Open Sans everywhere — the AI default.\",\n fix: \"Pick a font with character: Geist, Outfit, Cabinet Grotesk, Satoshi for sans. For editorial / creative — pair a serif heading (Newsreader, Lyon, Playfair) with a sans body.\",\n uiNote: \"Override --font-sans + --font-serif at the consumer's root CSS. Framework reads from these tokens.\",\n },\n {\n category: \"typography\",\n symptom: \"Headlines lack presence — small + thin + default tracking.\",\n fix: \"Increase display size, tighten letter-spacing (-0.02em to -0.04em), reduce line-height (1.1). Headlines should feel HEAVY and INTENTIONAL.\",\n uiNote: \"Typography.Title size={1} for hero; override fontFamily + letterSpacing inline.\",\n },\n {\n category: \"typography\",\n symptom: \"Body paragraphs full-width — hard to read.\",\n fix: \"Limit paragraph max-width to ~65ch. Increase line-height to 1.6+.\",\n uiNote: \"Wrap Typography.Paragraph in `<div style={{ maxWidth: '65ch' }}>`.\",\n },\n {\n category: \"typography\",\n symptom: \"Only Regular (400) + Bold (700) weights — flat hierarchy.\",\n fix: \"Introduce Medium (500) + SemiBold (600) for subtle weight contrasts.\",\n },\n {\n category: \"typography\",\n symptom: \"Numbers in proportional font — columns jitter in tables.\",\n fix: \"`font-variant-numeric: tabular-nums` for data, or a monospace font like Geist Mono.\",\n uiNote: \"Table primitive already uses `tabular-nums` on `.num` cells. For ad-hoc numeric labels, add the CSS prop manually.\",\n },\n {\n category: \"typography\",\n symptom: \"Orphaned words — single word on the last line of a heading.\",\n fix: \"`text-wrap: balance` (h1/h2/h3) or `text-wrap: pretty` (body).\",\n },\n {\n category: \"typography\",\n symptom: \"Title Case On Every Header.\",\n fix: \"Use sentence case instead. More modern, easier to read.\",\n },\n\n // ── color / surface ────────────────────────────────────────────\n {\n category: \"color-surface\",\n symptom: \"Pure #000000 background.\",\n fix: \"Replace with off-black (#0A0A0A) / dark charcoal (#121212) / tinted dark (deep navy).\",\n uiNote: \"Framework dark theme already uses tinted dark values — verify the consumer's override didn't force pure black.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Oversaturated accent colors.\",\n fix: \"Keep saturation below 80%. Desaturate so accents BLEND with neutrals rather than scream.\",\n },\n {\n category: \"color-surface\",\n symptom: \"More than one accent color competing.\",\n fix: \"Pick ONE. Remove the rest. Consistency beats variety in palette.\",\n uiNote: \"Set ONE `data-accent` at `<html>` root. Use semantic colors (success / warning / destructive) only for genuinely semantic content.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Purple/blue 'AI gradient' aesthetic — most common AI fingerprint.\",\n fix: \"Replace with neutral base + ONE considered accent. Drop the gradient entirely if it has no narrative purpose.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Generic black `box-shadow` everywhere.\",\n fix: \"Tint shadow to match background hue (e.g. cool gray bg → cool gray shadow). Colored shadows over pure black.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Random dark section breaking an otherwise light page.\",\n fix: \"Either commit to full dark mode OR keep light consistently. If contrast needed, use a SLIGHTLY darker shade of the same palette — not a sudden jump to #111.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Empty flat sections with no visual depth.\",\n fix: \"Add subtle background imagery at low opacity (`/picsum.photos/seed/{name}/1920/1080`) OR ambient gradient at 0.02-0.05 opacity. Empty flat = unfinished.\",\n },\n\n // ── layout ─────────────────────────────────────────────────────\n {\n category: \"layout\",\n symptom: \"Everything centered + symmetric.\",\n fix: \"Break symmetry: offset margins, mixed aspect ratios, left-aligned header over centered body.\",\n },\n {\n category: \"layout\",\n symptom: \"Three equal card columns as feature row — the most generic AI layout.\",\n fix: \"Replace with 2-column zig-zag, asymmetric grid, horizontal scroll, or masonry. The 3-equal-cols pattern is RED FLAG #1.\",\n uiNote: \"Use Bento Grid (custom CSS grid with `gridColumn: 'span N'`) instead of `<Grid cols={3}>` for hero sections.\",\n },\n {\n category: \"layout\",\n symptom: \"`height: 100vh` causing iOS Safari jump.\",\n fix: \"Use `min-height: 100dvh` (dynamic viewport) instead.\",\n },\n {\n category: \"layout\",\n symptom: \"No max-width container — content stretches edge-to-edge.\",\n fix: \"Add a container constraint (1200-1440px) with `margin: auto`. Or use `max-w-4xl / max-w-5xl` for content-heavy pages.\",\n uiNote: \"Framework's PageContent constrains via `var(--container-max-width)`. Consumer may override.\",\n },\n {\n category: \"layout\",\n symptom: \"Cards forced to same height by flexbox.\",\n fix: \"Allow variable heights or use masonry when content varies.\",\n uiNote: \"Use Masonry primitive — handles variable heights without flexbox stretch.\",\n },\n {\n category: \"layout\",\n symptom: \"Buttons at random vertical positions in card rows.\",\n fix: \"Pin CTAs to card bottom — same Y-position across the row regardless of content above.\",\n uiNote: \"Card's `actions` footer slot bottom-aligns automatically.\",\n },\n {\n category: \"layout\",\n symptom: \"Feature lists starting at different vertical positions in pricing tables.\",\n fix: \"Fixed-height title/price block + consistent spacing above the feature list. Cards align across columns.\",\n },\n {\n category: \"layout\",\n symptom: \"Dashboard ALWAYS has a left sidebar.\",\n fix: \"Consider top navigation, floating command menu, or collapsible panel. Sidebar isn't the only chrome.\",\n uiNote: \"Framework supports both — AppShell with sidebar slot is optional; can use Topbar-only for some flows.\",\n },\n\n // ── interactivity ──────────────────────────────────────────────\n {\n category: \"interactivity\",\n symptom: \"No hover states on buttons.\",\n fix: \"Background shift, scale, or translate on hover — 150-200ms ease.\",\n uiNote: \"Framework Button has built-in hover. If overridden — restore.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No active/pressed feedback.\",\n fix: \"`scale(0.98)` or `translateY(1px)` on `:active`. Simulates a physical click.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No focus ring (`outline: none`).\",\n fix: \"Restore visible `:focus-visible` ring. Accessibility requirement, not optional.\",\n },\n {\n category: \"interactivity\",\n symptom: \"Generic circular spinner for page-level loading.\",\n fix: \"Replace with Skeleton placeholders matching the eventual content shape.\",\n uiNote: \"Framework Skeleton + Form `loading={{ kind: 'skeleton' }}` handles cascading initial-fetch state.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No empty states — empty dashboard shows nothing.\",\n fix: \"Design a composed 'getting started' view: Empty primitive with title + description + next-action button.\",\n },\n {\n category: \"interactivity\",\n symptom: \"`window.alert()` for errors.\",\n fix: \"Inline error in the relevant Field, OR toast for non-form errors, OR Dialog for blocking errors.\",\n },\n {\n category: \"interactivity\",\n symptom: \"Dead links (`href='#'`).\",\n fix: \"Either link to real destinations or visually disable the button.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No indication of current page in navigation.\",\n fix: \"Style the active nav link distinctly.\",\n uiNote: \"Sidebar handles via `activeId` — pass it.\",\n },\n\n // ── content ────────────────────────────────────────────────────\n {\n category: \"content\",\n symptom: \"Generic names — 'John Doe', 'Jane Smith'.\",\n fix: \"Diverse, realistic names. For Japanese apps: 田中 太郎, 佐藤 美咲, Nguyễn Lan, Maria Cruz.\",\n },\n {\n category: \"content\",\n symptom: \"Fake round numbers — '99.99%', '50%', '$100.00'.\",\n fix: \"Organic data: '47.2%', '$99.00', '+1 (312) 847-1928'.\",\n },\n {\n category: \"content\",\n symptom: \"Placeholder brand names — Acme, Nexus, SmartFlow.\",\n fix: \"Invent contextual believable brands or use the consumer's real brand.\",\n },\n {\n category: \"content\",\n symptom: \"AI copy clichés — 'elevate', 'seamless', 'unleash', 'next-gen', 'game-changer', 'delve', 'tapestry', 'in the world of'.\",\n fix: \"Plain specific language. Numbers, nouns, verbs.\",\n uiNote: \"Framework's cardinal rule 9 bans this in framework docs; same discipline applies to consumer copy.\",\n },\n {\n category: \"content\",\n symptom: \"Exclamation marks in success messages.\",\n fix: \"Remove. Be confident, not loud.\",\n },\n {\n category: \"content\",\n symptom: \"'Oops!' or apologetic error messages.\",\n fix: \"Direct + specific: 'Connection failed. Please try again.' / 'メールアドレスの形式が正しくありません'.\",\n },\n {\n category: \"content\",\n symptom: \"Lorem Ipsum.\",\n fix: \"Real draft copy. Even rough placeholder beats Latin.\",\n },\n\n // ── components ─────────────────────────────────────────────────\n {\n category: \"components\",\n symptom: \"Generic card look (border + shadow + white).\",\n fix: \"Remove border OR shadow OR background — keep ONE. Cards exist only when elevation communicates hierarchy.\",\n },\n {\n category: \"components\",\n symptom: \"Always one filled + one ghost button.\",\n fix: \"Add text links / tertiary styles for variety.\",\n uiNote: \"Button has `variant='link'` for tertiary actions.\",\n },\n {\n category: \"components\",\n symptom: \"3-card carousel testimonials with dots.\",\n fix: \"Replace with masonry wall of quotes, embedded social posts, or single rotating quote.\",\n },\n {\n category: \"components\",\n symptom: \"Pricing table with 3 equal towers.\",\n fix: \"Highlight recommended tier with COLOR and emphasis, not just extra height.\",\n },\n {\n category: \"components\",\n symptom: \"Modals for everything.\",\n fix: \"Use inline editing, Sheet (slide-over), or expandable Collapse for simple actions. Reserve Dialog for true blocking decisions.\",\n },\n {\n category: \"components\",\n symptom: \"Footer link farm with 4 columns.\",\n fix: \"Simplify. Main nav paths + legally required links. No marketing kitchen sink.\",\n },\n\n // ── iconography ────────────────────────────────────────────────\n {\n category: \"iconography\",\n symptom: \"Lucide or Feather icons exclusively.\",\n fix: \"Use Phosphor (Bold / Fill), Heroicons, or a custom set. AI default tell.\",\n uiNote: \"Framework ships with lucide as locked dependency (rule 14). For editorial differentiation, layer Phosphor on top.\",\n },\n {\n category: \"iconography\",\n symptom: \"Cliche icon metaphors — rocketship 'launch', shield 'security'.\",\n fix: \"Less obvious: bolt, fingerprint, spark, vault, gem.\",\n },\n {\n category: \"iconography\",\n symptom: \"Stock 'diverse team in office' photo.\",\n fix: \"Real team photos, candid shots, or a consistent illustration style. Avatar initials fallback > generic stock person.\",\n },\n\n // ── code quality ───────────────────────────────────────────────\n {\n category: \"code-quality\",\n symptom: \"Div soup — no semantic HTML.\",\n fix: \"`<nav>`, `<main>`, `<article>`, `<aside>`, `<section>` for landmarks.\",\n uiNote: \"AppShell renders the canonical landmark structure automatically.\",\n },\n {\n category: \"code-quality\",\n symptom: \"Inline styles mixed with CSS classes haphazardly.\",\n fix: \"Move styling into the project's system. Inline `style={{}}` only for layout / positioning (rule 29).\",\n },\n {\n category: \"code-quality\",\n symptom: \"Missing alt text on images.\",\n fix: \"Describe content for SR. Never leave `alt=''` or `alt='image'` on meaningful images.\",\n },\n {\n category: \"code-quality\",\n symptom: \"Arbitrary z-index values like `9999`.\",\n fix: \"Establish a clean z-index scale in CSS variables.\",\n },\n\n // ── strategic omissions ────────────────────────────────────────\n {\n category: \"omissions\",\n symptom: \"No legal links in footer.\",\n fix: \"Add Privacy Policy + Terms of Service.\",\n },\n {\n category: \"omissions\",\n symptom: \"Dead ends in user flows — no 'back'.\",\n fix: \"Every page has a way back. Breadcrumb, back button, OR clear nav state.\",\n },\n {\n category: \"omissions\",\n symptom: \"No custom 404 page.\",\n fix: \"Design a helpful branded 404 with a way home and search.\",\n },\n {\n category: \"omissions\",\n symptom: \"No form validation.\",\n fix: \"Client-side validation via zod schema. Framework's Form + FormField handle field-level errors automatically.\",\n },\n {\n category: \"omissions\",\n symptom: \"No 'skip to content' link.\",\n fix: \"Hidden skip-link, first focusable element. Essential for keyboard users.\",\n uiNote: \"AppShell renders one automatically.\",\n },\n];\n\nexport const FIX_PRIORITY = [\n \"1. Font swap — biggest instant improvement, lowest risk\",\n \"2. Color palette cleanup — remove clashing / oversaturated colors\",\n \"3. Hover + active states — makes the interface feel alive\",\n \"4. Layout + spacing — proper grid, max-width, consistent padding\",\n \"5. Replace generic components — swap cliche patterns for modern alternatives\",\n \"6. Add loading, empty, error states — makes it feel finished\",\n \"7. Polish typography scale + spacing — the premium final touch\",\n];\n\nexport const REDESIGN_RULES = [\n \"Work with the existing tech stack. Do NOT migrate frameworks or styling libraries.\",\n \"Do NOT break existing functionality. Test after every change.\",\n \"Before importing any new library, check `package.json` first.\",\n \"Keep changes reviewable + focused. Small targeted improvements over big rewrites.\",\n \"Run the audit before fixing — listing issues first prevents accidental scope creep.\",\n];\n\nexport function checksByCategory(cat: AuditCheck[\"category\"]): AuditCheck[] {\n return REDESIGN_CHECKS.filter((c) => c.category === cat);\n}\n","/**\n * Tool registry — declares MCP tool schemas + dispatches calls.\n *\n * Token-efficient design (per PLAN.md):\n * - `list_*` returns SMALL metadata (1-line each).\n * - `get_*` / `get_*_section` returns ONE focused unit.\n * - `route_task` returns a SMALL pointer to skill+section.\n *\n * The agent walks: list → narrow → drill into one section. Avoids\n * dumping 50KB blobs.\n */\n\nimport {\n COMPONENTS,\n componentsByGroup,\n findComponent,\n type ComponentGroup,\n} from \"../data/components.js\";\nimport { PROP_VOCABULARY, findVocab } from \"../data/prop-vocabulary.js\";\nimport { TOKENS, tokensByCategory, type TokenCategory } from \"../data/tokens.js\";\nimport { CARDINAL_RULES, findRule } from \"../data/rules.js\";\nimport { PATTERNS, findPattern, searchPatterns } from \"../data/patterns.js\";\nimport { SKILLS, findSkill, findSection, routeTask } from \"../data/skills-index.js\";\nimport { ANTI_AI_TELLS, aiTellsByCategory, type AiTell } from \"../data/anti-ai-tells.js\";\nimport { REDESIGN_CHECKS, FIX_PRIORITY, REDESIGN_RULES, checksByCategory, type AuditCheck } from \"../data/redesign-audit.js\";\n\nexport const TOOL_DEFINITIONS = [\n // ── DISCOVERY (small responses) ────────────────────────────────\n {\n name: \"list_skills\",\n description:\n \"List every design / taste skill bundled by this MCP (taste / soft / minimalist / brutalist / gpt-tasteskill / redesign / output / brandkit / stitch / imagegen-mobile / imagegen-web / image-to-code). Returns id + name + whenToUse + section ids. ~1KB. Use FIRST to discover what skills exist; then `get_skill_section` to drill in.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_primitives\",\n description:\n \"List every @godxjp/ui primitive / composite / shell. Returns group + tagline per entry. ~3KB. Optionally filter by group.\",\n inputSchema: {\n type: \"object\",\n properties: {\n group: {\n type: \"string\",\n enum: [\"general\", \"layout\", \"data-display\", \"data-entry\", \"feedback\", \"navigation\", \"composites\", \"shell\", \"providers\"],\n },\n },\n },\n },\n {\n name: \"list_patterns\",\n description: \"List every canonical code pattern (registration-form / settings-page / data-table / confirm-destructive / app-shell / filter-bar / loading-states). ~500 bytes. Use before `get_pattern`.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_anti_ai_tells\",\n description:\n \"List every AI-tell pattern to AVOID (organised by category: visual / layout / copy / interaction / imagery / structure). ~2KB. Use to self-audit a design before shipping.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"visual\", \"layout\", \"copy\", \"interaction\", \"imagery\", \"structure\"] },\n },\n },\n },\n {\n name: \"list_redesign_checks\",\n description:\n \"List the redesign audit checklist (50+ checks across 9 categories: typography / color-surface / layout / interactivity / content / components / iconography / code-quality / omissions). ~5KB. Use when auditing an existing project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"typography\", \"color-surface\", \"layout\", \"interactivity\", \"content\", \"components\", \"iconography\", \"code-quality\", \"omissions\"] },\n },\n },\n },\n\n // ── DRILL-DOWN (medium responses) ──────────────────────────────\n {\n name: \"get_anti_ai_tell\",\n description: \"Fetch ONE anti-AI-tell — full body + concrete fix. Use after `list_anti_ai_tells`.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Exact tell name from list_anti_ai_tells.\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_redesign_check\",\n description: \"Fetch redesign check(s) matching a symptom snippet. Returns full fix + UI note. Use after `list_redesign_checks`.\",\n inputSchema: {\n type: \"object\",\n properties: { symptom: { type: \"string\", description: \"Fragment of the symptom text (e.g. 'Inter everywhere' / '100vh').\" } },\n required: [\"symptom\"],\n },\n },\n {\n name: \"get_skill_section\",\n description:\n \"Fetch ONE section of ONE skill — token-efficient. E.g. `skill='soft', section='double-bezel'`. Use after `list_skills` narrowed the relevant skill + section.\",\n inputSchema: {\n type: \"object\",\n properties: {\n skill: { type: \"string\", description: \"Skill id (e.g. 'soft', 'minimalist', 'taste').\" },\n section: { type: \"string\", description: \"Section id within that skill.\" },\n },\n required: [\"skill\", \"section\"],\n },\n },\n {\n name: \"get_component\",\n description: \"Full API for one @godxjp/ui component — props, types, default, example, story + doc paths, cardinal rules. ~2KB.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Component name (e.g. 'Button', 'DataTable').\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_pattern\",\n description: \"Full code snippet for one canonical pattern — copy-paste-ready.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Pattern slug (use list_patterns first).\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_rule\",\n description: \"Read one cardinal rule from CLAUDE.md (by number) OR all if no number.\",\n inputSchema: {\n type: \"object\",\n properties: { number: { type: \"number\", description: \"Rule number (1-N).\" } },\n },\n },\n {\n name: \"get_vocab\",\n description: \"Read shared prop-vocabulary type (`SizeProp`, `StatusProp`, `ColorProp`, `LoadingProp`, etc.) OR all if no name.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Vocab type name.\" } },\n },\n },\n {\n name: \"get_tokens\",\n description: \"Read design tokens, optionally filtered by category.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"color\", \"spacing\", \"typography\", \"radius\", \"shadow\", \"motion\", \"breakpoint\", \"density\", \"z-index\"] },\n },\n },\n },\n\n // ── TASK ROUTING (smallest response — pointer) ─────────────────\n {\n name: \"route_task\",\n description:\n \"Natural-language task → skill+section pointer. ~300 bytes. E.g. 'I want to design a premium agency hero' → `{skill:'soft', section:'vibe-archetypes', why:'...'}`. Use FIRST when you don't know which skill applies.\",\n inputSchema: {\n type: \"object\",\n properties: { task: { type: \"string\", description: \"Describe what you want to build.\" } },\n required: [\"task\"],\n },\n },\n {\n name: \"suggest_primitive\",\n description:\n \"Use case → primitive recommendation. E.g. 'confirm a destructive delete' → DangerZone pattern + Dialog suggestion.\",\n inputSchema: {\n type: \"object\",\n properties: { use_case: { type: \"string\" } },\n required: [\"use_case\"],\n },\n },\n {\n name: \"search_components\",\n description: \"Fuzzy-search primitives by name / tagline / prop. Returns ranked matches.\",\n inputSchema: {\n type: \"object\",\n properties: { query: { type: \"string\" } },\n required: [\"query\"],\n },\n },\n\n // ── LINT / AUDIT (one-shot critique) ───────────────────────────\n {\n name: \"lint_jsx\",\n description:\n \"Heuristic check of a JSX snippet for common violations — raw `<button>` / `<input>`, `color='error'` on Tag/Badge, missing aria-label, missing source.code override on stories with cell renderers (rule 34), etc.\",\n inputSchema: {\n type: \"object\",\n properties: { jsx: { type: \"string\" } },\n required: [\"jsx\"],\n },\n },\n];\n\nexport async function dispatchTool(\n name: string,\n args: Record<string, unknown>,\n): Promise<string> {\n switch (name) {\n // Discovery\n case \"list_skills\": return listSkills();\n case \"list_primitives\": return listPrimitives(args.group as ComponentGroup | undefined);\n case \"list_patterns\": return listPatterns();\n case \"list_anti_ai_tells\": return listAntiAiTells(args.category as AiTell[\"category\"] | undefined);\n case \"list_redesign_checks\": return listRedesignChecks(args.category as AuditCheck[\"category\"] | undefined);\n case \"get_anti_ai_tell\": return getAntiAiTell(String(args.name ?? \"\"));\n case \"get_redesign_check\": return getRedesignCheck(String(args.symptom ?? \"\"));\n // Drill-down\n case \"get_skill_section\": return getSkillSection(String(args.skill ?? \"\"), String(args.section ?? \"\"));\n case \"get_component\": return getComponent(String(args.name ?? \"\"));\n case \"get_pattern\": return getPattern(String(args.name ?? \"\"));\n case \"get_rule\": return getRule(typeof args.number === \"number\" ? args.number : undefined);\n case \"get_vocab\": return getVocab(args.name as string | undefined);\n case \"get_tokens\": return getTokens(args.category as TokenCategory | undefined);\n // Task routing\n case \"route_task\": return routeTaskTool(String(args.task ?? \"\"));\n case \"suggest_primitive\": return suggestPrimitive(String(args.use_case ?? \"\"));\n case \"search_components\": return searchComponents(String(args.query ?? \"\"));\n // Lint\n case \"lint_jsx\": return lintJsx(String(args.jsx ?? \"\"));\n default: return `Unknown tool: ${name}`;\n }\n}\n\n// ── implementations ───────────────────────────────────────────────\n\nfunction listSkills(): string {\n let out = `# Available skills (${SKILLS.length})\\n\\n`;\n out += `Use \\`get_skill_section skill=\"...\" section=\"...\"\\` to drill in.\\n\\n`;\n for (const s of SKILLS) {\n out += `## ${s.id} — ${s.name}\\n`;\n out += `**When to use:** ${s.whenToUse}\\n\\n`;\n out += `**Sections:** ${s.sections.map((sec) => `\\`${sec.id}\\``).join(\", \")}\\n\\n`;\n }\n out += `\\n_Source: ${SKILLS.map((s) => s.source).filter((v, i, a) => a.indexOf(v) === i).slice(0, 3).join(\"; \")}, …_`;\n return out;\n}\n\nfunction listPrimitives(group?: ComponentGroup): string {\n const list = group ? componentsByGroup(group) : COMPONENTS;\n if (list.length === 0) return `No components${group ? ` in group \"${group}\"` : \"\"}.`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, c) => {\n (acc[c.group] ??= []).push(c);\n return acc;\n }, {});\n let out = `# @godxjp/ui primitives${group ? ` — ${group}` : \"\"}\\n\\n${list.length} components.\\n\\n`;\n for (const [g, items] of Object.entries(grouped)) {\n out += `## ${g}\\n\\n`;\n for (const c of items) out += `- **${c.name}** — ${c.tagline}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction listPatterns(): string {\n let out = `# Canonical patterns (${PATTERNS.length})\\n\\n`;\n for (const p of PATTERNS) {\n out += `- **${p.name}** — ${p.tagline} \\n _tags: ${p.tags.join(\", \")}_\\n`;\n }\n return out;\n}\n\nfunction listAntiAiTells(cat?: AiTell[\"category\"]): string {\n const list = cat ? aiTellsByCategory(cat) : ANTI_AI_TELLS;\n // Compact list — names only. Use `get_anti_ai_tell` for full body + fix.\n let out = `# AI tells to AVOID${cat ? ` — ${cat}` : \"\"} (${list.length})\\n\\n`;\n out += `_Compact list. Use \\`get_anti_ai_tell name=\"<name>\"\\` for the full body + fix._\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, t) => {\n (acc[t.category] ??= []).push(t);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n`;\n for (const t of items) out += `- ${t.name}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction getAntiAiTell(name: string): string {\n const t = ANTI_AI_TELLS.find((x) => x.name.toLowerCase() === name.trim().toLowerCase());\n if (!t) {\n let out = `Anti-AI-tell \"${name}\" not found. Use \\`list_anti_ai_tells\\` to discover. Closest:\\n\\n`;\n for (const x of ANTI_AI_TELLS.slice(0, 8)) out += `- ${x.name} (${x.category})\\n`;\n return out;\n }\n return `# ${t.name}\\n\\n**Category:** ${t.category}\\n\\n## Symptom\\n\\n${t.body}\\n\\n## Fix\\n\\n${t.fix}\\n`;\n}\n\nfunction listRedesignChecks(cat?: AuditCheck[\"category\"]): string {\n const list = cat ? checksByCategory(cat) : REDESIGN_CHECKS;\n // Compact list — symptoms only. Use `get_redesign_check` for the full fix + ui-note.\n let out = `# Redesign audit${cat ? ` — ${cat}` : \"\"} (${list.length} checks)\\n\\n`;\n if (!cat) {\n out += `## Fix priority\\n${FIX_PRIORITY.map((p) => p).join(\"\\n\")}\\n\\n`;\n out += `## Rules\\n${REDESIGN_RULES.map((r) => `- ${r}`).join(\"\\n\")}\\n\\n`;\n }\n out += `_Compact list of symptoms. Use \\`get_redesign_check symptom=\"<text snippet>\"\\` for the full fix + UI note._\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, c) => {\n (acc[c.category] ??= []).push(c);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n`;\n for (const item of items) out += `- ${item.symptom}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction getRedesignCheck(snippet: string): string {\n const q = snippet.trim().toLowerCase();\n if (!q) return \"Pass `symptom` — a fragment matching the audit check symptom (e.g. 'Inter everywhere' / '100vh' / 'Acme').\";\n const matches = REDESIGN_CHECKS.filter(\n (c) => c.symptom.toLowerCase().includes(q) || c.fix.toLowerCase().includes(q),\n );\n if (!matches.length) {\n return `No redesign check matches \"${snippet}\". Use \\`list_redesign_checks\\` to see all.`;\n }\n let out = `# Redesign checks matching \"${snippet}\" (${matches.length})\\n\\n`;\n for (const c of matches) {\n out += `## ${c.category}\\n\\n**Symptom:** ${c.symptom}\\n\\n**Fix:** ${c.fix}\\n${c.uiNote ? `\\n_UI note:_ ${c.uiNote}\\n` : \"\"}\\n`;\n }\n return out;\n}\n\nfunction getSkillSection(skillId: string, sectionId: string): string {\n const skill = findSkill(skillId);\n if (!skill) return `Skill \"${skillId}\" not found. Use \\`list_skills\\` for available ids.`;\n if (!sectionId) {\n let out = `# ${skill.name}\\n\\n${skill.whenToUse}\\n\\n## Sections\\n`;\n for (const sec of skill.sections) out += `- \\`${sec.id}\\` — ${sec.tagline}\\n`;\n return out;\n }\n const section = findSection(skillId, sectionId);\n if (!section) {\n let out = `Section \"${sectionId}\" not in skill \"${skillId}\". Available:\\n`;\n for (const sec of skill.sections) out += `- \\`${sec.id}\\` — ${sec.tagline}\\n`;\n return out;\n }\n return `# ${skill.name} → ${section.title}\\n\\n${section.tagline}\\n\\n${section.body}\\n\\n_Source: ${skill.source}_`;\n}\n\nfunction getComponent(name: string): string {\n const c = findComponent(name);\n if (!c) return `Component \"${name}\" not found. Use \\`list_primitives\\` to discover.`;\n let out = `# ${c.name}\\n\\n**Group:** ${c.group}\\n\\n${c.tagline}\\n\\n## Props\\n\\n`;\n out += `| Name | Type | Required | Default | Description |\\n|---|---|---|---|---|\\n`;\n for (const p of c.props) {\n out += `| \\`${p.name}\\` | \\`${p.type}\\` | ${p.required ? \"✓\" : \"\"} | ${p.defaultValue ? `\\`${p.defaultValue}\\`` : \"\"} | ${p.description} |\\n`;\n }\n out += `\\n## Example\\n\\n\\`\\`\\`tsx\\n${c.example}\\n\\`\\`\\`\\n\\n`;\n if (c.docPath) out += `**Reference doc:** \\`docs/reference/${c.docPath}\\`\\n\\n`;\n out += `**Storybook:** \\`src/stories/${c.storyPath}\\`\\n\\n`;\n out += `**Cardinal rules:** ${c.rules.map((n) => `#${n}`).join(\", \")}\\n`;\n return out;\n}\n\nfunction getPattern(name: string): string {\n const p = findPattern(name);\n if (!p) {\n const candidates = searchPatterns(name);\n if (candidates.length === 0) return `Pattern \"${name}\" not found.`;\n let out = `Pattern \"${name}\" not found. Closest:\\n`;\n for (const c of candidates) out += `- ${c.name} — ${c.tagline}\\n`;\n return out;\n }\n return `# Pattern: ${p.name}\\n\\n${p.tagline}\\n\\n**Tags:** ${p.tags.join(\", \")}\\n\\n\\`\\`\\`tsx\\n${p.code}\\n\\`\\`\\`\\n`;\n}\n\nfunction getRule(num?: number): string {\n if (num !== undefined) {\n const r = findRule(num);\n if (!r) return `Rule ${num} not found. Valid: 1-${CARDINAL_RULES.length}.`;\n return `# Rule ${r.number} — ${r.title}\\n\\n${r.body}\\n`;\n }\n let out = `# Cardinal rules (${CARDINAL_RULES.length})\\n\\n`;\n for (const r of CARDINAL_RULES) out += `## ${r.number}. ${r.title}\\n\\n${r.body}\\n\\n`;\n return out;\n}\n\nfunction getVocab(name?: string): string {\n if (name) {\n const v = findVocab(name);\n if (!v) return `Vocab \"${name}\" not found.`;\n let out = `# ${v.name}\\n\\n${v.concept}\\n\\n`;\n out += `**Values:** ${v.values.map((x) => `\\`${x}\\``).join(\" | \")}\\n\\n`;\n out += `**Used by:** ${v.usedBy.map((x) => `\\`${x}\\``).join(\", \")}\\n\\n`;\n if (v.notes) out += `**Notes:** ${v.notes}\\n`;\n return out;\n }\n let out = `# Prop vocabulary\\n\\n${PROP_VOCABULARY.length} shared types.\\n\\n`;\n for (const v of PROP_VOCABULARY) {\n out += `## ${v.name}\\n${v.concept}\\n\\nValues: ${v.values.map((x) => `\\`${x}\\``).join(\" | \")}\\n\\n`;\n }\n return out;\n}\n\nfunction getTokens(cat?: TokenCategory): string {\n const list = cat ? tokensByCategory(cat) : TOKENS;\n if (list.length === 0) return `No tokens${cat ? ` in \"${cat}\"` : \"\"}.`;\n let out = `# Design tokens${cat ? ` — ${cat}` : \"\"}\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, t) => {\n (acc[t.category] ??= []).push(t);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n\\n| Name | Role | Value | Axis |\\n|---|---|---|---|\\n`;\n for (const t of items) out += `| \\`${t.name}\\` | ${t.role} | ${t.value ?? \"—\"} | ${t.axis ?? \"—\"} |\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction routeTaskTool(task: string): string {\n if (!task.trim()) return \"Describe the task (e.g. 'design a premium agency hero', 'audit existing settings page').\";\n const results = routeTask(task);\n let out = `# Routing \"${task}\"\\n\\n`;\n for (const r of results) {\n out += `- **skill:** \\`${r.skill}\\`, **section:** \\`${r.section}\\` \\n ${r.why}\\n`;\n if (r.alsoSee?.length) out += ` _Also see:_ ${r.alsoSee.map((s) => `\\`${s}\\``).join(\", \")}\\n`;\n }\n out += `\\nFetch with: \\`get_skill_section skill=\"X\" section=\"Y\"\\``;\n return out;\n}\n\nfunction suggestPrimitive(useCase: string): string {\n const q = useCase.trim().toLowerCase();\n if (!q) return \"Describe your use case.\";\n const suggestions: Array<{ component: string; rationale: string; score: number }> = [];\n const check = (kw: string[], component: string, rationale: string, weight = 2) => {\n if (kw.some((k) => q.includes(k))) suggestions.push({ component, rationale, score: weight });\n };\n check([\"form\", \"submit\", \"validation\", \"register\", \"sign up\"], \"Form + FormField\", \"RHF + zod composition.\", 5);\n check([\"table\", \"rows\", \"columns\"], \"DataTable / Table\", \"DataTable for chrome (toolbar+pagination+batch). Table for slim primitive.\", 5);\n check([\"modal\", \"dialog\", \"confirm\"], \"Dialog / AlertDialog\", \"Radix Dialog. AlertDialog for destructive.\", 4);\n check([\"drawer\", \"side panel\", \"sheet\"], \"Sheet\", \"Side panel for filters/settings.\", 4);\n check([\"toast\", \"notification\"], \"toast / Toaster\", \"Sonner-backed.\", 4);\n check([\"loading\", \"saving\", \"spinner\"], \"Spinner / Form loading prop\", \"Spinner=active work, Skeleton=init fetch.\", 3);\n check([\"alert\", \"banner\"], \"Alert\", \"5 semantic colors × outlined/banner.\", 3);\n check([\"select\", \"dropdown\"], \"Select / AutoComplete\", \"Select=discrete options, AutoComplete=free-text+suggestions.\", 3);\n check([\"filter\"], \"Form layout='inline' + pattern 'filter-bar'\", \"Inline form above table.\", 4);\n check([\"delete\", \"destructive\"], \"Pattern 'confirm-destructive'\", \"Card accent='destructive' + typed-name confirm.\", 4);\n if (!suggestions.length) return `No direct match for \"${useCase}\". Try \\`list_primitives\\` or \\`search_components\\`.`;\n suggestions.sort((a, b) => b.score - a.score);\n let out = `# Suggestions for \"${useCase}\"\\n\\n`;\n for (const s of suggestions) out += `- **${s.component}** — ${s.rationale}\\n`;\n return out;\n}\n\nfunction searchComponents(query: string): string {\n const q = query.trim().toLowerCase();\n if (!q) return listPrimitives();\n const matches = COMPONENTS.map((c) => {\n let score = 0;\n if (c.name.toLowerCase().includes(q)) score += 5;\n if (c.tagline.toLowerCase().includes(q)) score += 2;\n if (c.props.some((p) => p.name.toLowerCase().includes(q))) score += 1;\n return { c, score };\n })\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 12);\n if (!matches.length) return `No matches for \"${query}\".`;\n let out = `# Search \"${query}\" — ${matches.length} matches\\n\\n`;\n for (const { c, score } of matches) out += `- **${c.name}** (${c.group}, ${score}) — ${c.tagline}\\n`;\n return out;\n}\n\nfunction lintJsx(jsx: string): string {\n const issues: string[] = [];\n const check = (regex: RegExp, msg: string) => { if (regex.test(jsx)) issues.push(msg); };\n // Lowercase HTML tags only — React PascalCase (Button) MUST NOT match.\n check(/<button[\\s>]/, \"Use `<Button>` instead of raw `<button>` (rule 29).\");\n check(/<input[\\s>]/, \"Use `<Input>` instead of raw `<input>` (rule 29).\");\n check(/<select[\\s>]/, \"Use `<Select>` instead of raw `<select>` (rule 29).\");\n check(/<textarea[\\s>]/, \"Use `<Textarea>` instead of raw `<textarea>` (rule 29).\");\n check(/bg-(red|blue|green|yellow|gray|slate|zinc|neutral|stone|orange|amber|lime|emerald|teal|cyan|sky|indigo|violet|purple|fuchsia|pink|rose)-\\d{2,3}\\b/, \"Use semantic token utilities (`bg-primary`/`bg-destructive`) not raw color scales (rule 2).\");\n check(/<Tag[\\s\\S]*?color=[\"']error[\"']/i, 'Tag `color=\"error\"` → `\"destructive\"` (v5.0, PR #60).');\n check(/<Badge[\\s\\S]*?variant=[\"']error[\"']/i, 'Badge `variant=\"error\"` → `\"destructive\"` (v5.0, PR #63).');\n check(/(Flex|Space|Grid|Masonry)[\\s\\S]*?(gap|size)=[\"']middle[\"']/i, '`\"middle\"` → `\"default\"` for Flex/Space/Grid/Masonry (v5.0).');\n check(/<IconButton[\\s\\S]*?size=[\"']default[\"']/i, 'IconButton `size=\"default\"` → `\"md\"` (v5.0).');\n check(/<SegmentedControl[\\s\\S]*?size=[\"']sm[\"']/i, 'SegmentedControl `size=\"sm\"` → `\"small\"` (v5.0).');\n check(/<PageContent[\\s\\S]*?padding=[\"'](compact|comfortable)[\"']/i, 'PageContent `padding=\"compact\"/\"comfortable\"` → `\"tight\"/\"cozy\"` (v5.0).');\n check(/<Pagination[\\s\\S]*?justify=[\"']between[\"']/i, 'Pagination `justify=\"between\"` → `\"space-between\"` (v5.0).');\n if (/<IconButton(?![^>]*aria-label)/i.test(jsx) && !/asChild/i.test(jsx)) {\n issues.push(\"`<IconButton>` should have `aria-label` (rule 6 — WCAG).\");\n }\n if (/cell:\\s*\\(\\{?\\s*row\\s*\\}?\\)\\s*=>/i.test(jsx) && /export\\s+const\\s+\\w+\\s*:\\s*Story/i.test(jsx)) {\n if (!/parameters[\\s\\S]{0,200}source[\\s\\S]{0,100}code:/i.test(jsx)) {\n issues.push(\"Stories with function-valued cell renderers MUST override `parameters.docs.source.code` (rule 34).\");\n }\n }\n // Anti-AI tells\n if (/text-(red|blue|green|yellow)-\\d{2,3}\\b/.test(jsx)) issues.push(\"Hard-coded color scales — use semantic tokens. Tells AI-slop palette (rule 2 + anti-AI-tells.visual.rainbow-chip-wall).\");\n if (/h-\\[?100vh\\]?/.test(jsx)) issues.push(\"`100vh` causes iOS Safari viewport jump — use `min-h-[100dvh]` (redesign.layout / soft.absolute-zero).\");\n if (/className=[\"'][^\"']*(?:shadow-md|shadow-lg|shadow-xl)[\"']/.test(jsx)) issues.push(\"Tailwind heavy shadows are an AI tell — use ultra-diffuse low-opacity (< 0.05) or tinted shadows (soft.absolute-zero, minimalist).\");\n if (/Inter|Roboto|Helvetica|Open\\s*Sans/i.test(jsx)) issues.push(\"Banned default fonts (Inter/Roboto/Helvetica/Open Sans). Use Geist/Clash Display/PP Editorial New (soft.absolute-zero, minimalist.negative-constraints).\");\n if (/Acme|NovaCore|Flowbit|Quantix|VeloPay|John\\s+Doe|Jane\\s+Smith|Lorem\\s+Ipsum/i.test(jsx)) issues.push(\"Generic placeholder content (Acme/NovaCore/John Doe/Lorem Ipsum). Use believable real-sounding names (anti-AI-tells.copy).\");\n if (issues.length === 0) return \"✅ No issues found against the heuristic checks.\";\n let out = `# Lint findings — ${issues.length} issue${issues.length === 1 ? \"\" : \"s\"}\\n\\n`;\n for (const i of issues) out += `- ${i}\\n`;\n out += `\\nNote: heuristic only — not a substitute for the full CI gate.\\n`;\n return out;\n}\n","/**\n * Resource registry — exposes catalogs as MCP resources so agents\n * can discover + browse them without invoking tools.\n *\n * godx-ui://components — full component catalog (JSON)\n * godx-ui://components/{name} — single component (Markdown)\n * godx-ui://prop-vocabulary — full vocab (JSON)\n * godx-ui://tokens — all tokens (JSON)\n * godx-ui://tokens/{category} — tokens in category (JSON)\n * godx-ui://rules — all cardinal rules (Markdown)\n * godx-ui://rules/{number} — single rule (Markdown)\n * godx-ui://patterns — pattern catalog (JSON)\n * godx-ui://patterns/{name} — single pattern (Markdown)\n */\n\nimport { COMPONENTS, findComponent } from \"../data/components.js\";\nimport { PROP_VOCABULARY } from \"../data/prop-vocabulary.js\";\nimport { TOKENS, tokensByCategory, type TokenCategory } from \"../data/tokens.js\";\nimport { CARDINAL_RULES, findRule } from \"../data/rules.js\";\nimport { PATTERNS, findPattern } from \"../data/patterns.js\";\n\nexport const RESOURCE_DEFINITIONS = [\n {\n uri: \"godx-ui://components\",\n name: \"All components\",\n description: \"Full component catalog as JSON — name, group, tagline, props, example, rules.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://prop-vocabulary\",\n name: \"Shared prop vocabulary\",\n description: \"Cross-cutting prop types (SizeProp, StatusProp, ColorProp, LoadingProp, …) as JSON.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://tokens\",\n name: \"All design tokens\",\n description: \"Every CSS variable + role + value + axis as JSON.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://rules\",\n name: \"Cardinal rules (34)\",\n description: \"The 34 binding rules from CLAUDE.md as Markdown.\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"godx-ui://patterns\",\n name: \"Code patterns\",\n description: \"Canonical pattern catalog (registration-form, settings-page, data-table, …) as JSON.\",\n mimeType: \"application/json\",\n },\n];\n\nexport async function readResource(uri: string): Promise<string> {\n // godx-ui://components\n if (uri === \"godx-ui://components\") {\n return JSON.stringify(COMPONENTS, null, 2);\n }\n // godx-ui://components/{name}\n if (uri.startsWith(\"godx-ui://components/\")) {\n const name = uri.slice(\"godx-ui://components/\".length);\n const c = findComponent(name);\n if (!c) throw new Error(`Component not found: ${name}`);\n return formatComponentMarkdown(c);\n }\n\n if (uri === \"godx-ui://prop-vocabulary\") {\n return JSON.stringify(PROP_VOCABULARY, null, 2);\n }\n\n if (uri === \"godx-ui://tokens\") {\n return JSON.stringify(TOKENS, null, 2);\n }\n if (uri.startsWith(\"godx-ui://tokens/\")) {\n const cat = uri.slice(\"godx-ui://tokens/\".length) as TokenCategory;\n return JSON.stringify(tokensByCategory(cat), null, 2);\n }\n\n if (uri === \"godx-ui://rules\") {\n let out = `# Cardinal rules (${CARDINAL_RULES.length})\\n\\n`;\n for (const r of CARDINAL_RULES) {\n out += `## ${r.number}. ${r.title}\\n\\n${r.body}\\n\\n`;\n }\n return out;\n }\n if (uri.startsWith(\"godx-ui://rules/\")) {\n const num = Number(uri.slice(\"godx-ui://rules/\".length));\n const r = findRule(num);\n if (!r) throw new Error(`Rule not found: ${num}`);\n return `# Rule ${r.number} — ${r.title}\\n\\n${r.body}\\n`;\n }\n\n if (uri === \"godx-ui://patterns\") {\n return JSON.stringify(PATTERNS.map(({ name, tagline, tags }) => ({ name, tagline, tags })), null, 2);\n }\n if (uri.startsWith(\"godx-ui://patterns/\")) {\n const name = uri.slice(\"godx-ui://patterns/\".length);\n const p = findPattern(name);\n if (!p) throw new Error(`Pattern not found: ${name}`);\n return `# ${p.name}\\n\\n${p.tagline}\\n\\n**Tags:** ${p.tags.join(\", \")}\\n\\n\\`\\`\\`tsx\\n${p.code}\\n\\`\\`\\`\\n`;\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n}\n\nfunction formatComponentMarkdown(c: ReturnType<typeof findComponent> & object): string {\n let out = `# ${c.name}\\n\\n**Group:** ${c.group}\\n\\n${c.tagline}\\n\\n`;\n out += `## Props\\n\\n`;\n out += `| Name | Type | Required | Default | Description |\\n|---|---|---|---|---|\\n`;\n for (const p of c.props) {\n out += `| \\`${p.name}\\` | \\`${p.type}\\` | ${p.required ? \"✓\" : \"\"} | ${p.defaultValue ? `\\`${p.defaultValue}\\`` : \"\"} | ${p.description} |\\n`;\n }\n out += `\\n## Example\\n\\n\\`\\`\\`tsx\\n${c.example}\\n\\`\\`\\`\\n`;\n return out;\n}\n"],"mappings":"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","names":["out"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data/components.ts","../src/data/prop-vocabulary.ts","../src/data/tokens.ts","../src/data/rules.ts","../src/data/patterns.ts","../src/data/skills-index.ts","../src/data/anti-ai-tells.ts","../src/data/redesign-audit.ts","../src/tools/registry.ts","../src/resources/registry.ts"],"sourcesContent":["/**\n * @godxjp/ui-mcp — MCP server entry.\n *\n * Spawned over stdio by an MCP-aware agent (Claude Desktop, Cursor,\n * Continue, Cline, etc.) per the consumer's `.mcp.json` /\n * `claude_desktop_config.json`. Exposes a curated catalogue of the\n * @godxjp/ui framework so the agent can:\n *\n * - list primitives (with group / tagline / props / example)\n * - look up a single component's full API\n * - search by name / use-case / feature\n * - read the shared prop-vocabulary (`SizeProp`, `ColorProp`, …)\n * - read design tokens (per category)\n * - read cardinal rules (by number or all)\n * - fetch canonical code patterns (registration form, settings,\n * data table, app shell, …) — copy-paste-ready snippets\n * - lint a JSX snippet against the most common rule violations\n *\n * The server reads ONLY its own bundled data files. Zero filesystem\n * access into consumer projects, no network, no shell. Safe to mount\n * read-only.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { TOOL_DEFINITIONS, dispatchTool } from \"./tools/registry.js\";\nimport { RESOURCE_DEFINITIONS, readResource } from \"./resources/registry.js\";\n\nasync function main() {\n const server = new Server(\n {\n name: \"godx-ui-mcp\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n );\n\n // ── tools ──────────────────────────────────────────────────────\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOL_DEFINITIONS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const result = await dispatchTool(name, (args ?? {}) as Record<string, unknown>);\n return { content: [{ type: \"text\", text: result }] };\n });\n\n // ── resources ──────────────────────────────────────────────────\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCE_DEFINITIONS,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n const text = await readResource(uri);\n return {\n contents: [\n {\n uri,\n mimeType: uri.endsWith(\".json\") ? \"application/json\" : \"text/markdown\",\n text,\n },\n ],\n };\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Log to stderr so it doesn't pollute the stdio JSON-RPC channel.\n console.error(\"[godx-ui-mcp] connected (stdio)\");\n}\n\nmain().catch((err) => {\n console.error(\"[godx-ui-mcp] fatal:\", err);\n process.exit(1);\n});\n","/**\n * Component catalog — the REAL published `@godxjp/ui` v6 primitive surface.\n * The MCP bundles this so an agent can author pages with the actual API\n * (PageContainer, Stack, ResponsiveGrid, DataTable + ColumnDef, StatusBadge,\n * FormField, Select, Dialog, FilterBar, …) instead of guessing.\n *\n * Each entry maps to a real export. Import via the subpath in every example,\n * e.g. `import { DataTable } from \"@godxjp/ui/data-display\"`.\n *\n * Each entry carries:\n * - `name` — canonical export name\n * - `group` — entry-point group\n * - `tagline` — one-line elevator pitch\n * - `props` — most-used real props with type + description\n * - `example` — copy-paste-ready JSX using the real API\n * - `storyPath` — relative path under `src/stories/`\n * - `rules` — cardinal rules relevant to this primitive\n */\n\nexport type ComponentGroup =\n | \"general\"\n | \"layout\"\n | \"data-display\"\n | \"data-entry\"\n | \"feedback\"\n | \"navigation\"\n | \"composites\"\n | \"shell\"\n | \"providers\";\n\nexport interface ComponentProp {\n name: string;\n type: string;\n required?: boolean;\n description: string;\n defaultValue?: string;\n}\n\nexport interface ComponentEntry {\n name: string;\n group: ComponentGroup;\n tagline: string;\n props: ComponentProp[];\n example: string;\n docPath?: string;\n storyPath: string;\n rules: number[];\n}\n\nexport const COMPONENTS: ComponentEntry[] = [\n // ─── layout ─────────────────────────────────────────────────────────────\n {\n name: \"PageContainer\",\n group: \"layout\",\n tagline: \"Mandatory page shell — EVERY page wraps its content in PageContainer (title/subtitle/extra/footer/breadcrumb).\",\n props: [\n { name: \"title\", type: \"string\", required: true, description: \"Page heading rendered as <h1>.\" },\n { name: \"subtitle\", type: \"string\", description: \"Secondary line beneath the title.\" },\n { name: \"extra\", type: \"ReactNode\", description: \"Action buttons / controls rendered right of the title row.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"Content area pinned below the page body.\" },\n { name: \"breadcrumb\", type: \"BreadcrumbItemProp[]\", description: \"Ordered trail of { label, to? } segments above the title.\" },\n { name: \"variant\", type: '\"default\" | \"narrow\" | \"flush\" | \"ghost\"', defaultValue: '\"default\"', description: \"Page shell layout; flush removes padding for full-bleed content.\" },\n { name: \"density\", type: '\"compact\" | \"default\" | \"comfortable\"', defaultValue: '\"default\"', description: \"Spacing density across the page subtree.\" },\n { name: \"stickyFooter\", type: \"boolean\", defaultValue: \"false\", description: \"Pin footer to viewport bottom on scroll — pairs with variant=\\\"narrow\\\".\" },\n ],\n example: `import { PageContainer, Stack } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\n\nexport default function OrdersPage() {\n return (\n <PageContainer\n title=\"注文一覧\"\n subtitle=\"直近30日間の受注データ\"\n breadcrumb={[{ label: \"ホーム\", to: \"/\" }, { label: \"注文一覧\" }]}\n extra={<Button>新規注文</Button>}\n >\n <Stack gap=\"lg\">{/* page content */}</Stack>\n </PageContainer>\n );\n}`,\n storyPath: \"layout/PageContainer.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Stack\",\n group: \"layout\",\n tagline: \"Vertical flex column with token gap — the default block-stacking primitive (use instead of space-y-*).\",\n props: [\n { name: \"gap\", type: '\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"', defaultValue: '\"md\"', description: \"Vertical space between children (design tokens).\" },\n { name: \"className\", type: \"string\", description: \"Extra classes merged via cn().\" },\n { name: \"children\", type: \"ReactNode\", description: \"Block-level children to stack.\" },\n ],\n example: `import { Stack } from \"@godxjp/ui/layout\";\n\n<Stack gap=\"lg\">\n <KpiRow />\n <FilterBarBlock />\n <TableCard />\n</Stack>`,\n storyPath: \"layout/Stack.stories.tsx\",\n rules: [2, 40],\n },\n {\n name: \"Inline\",\n group: \"layout\",\n tagline: \"Horizontal flex row with token gap — the default inline/row arrangement (use instead of gap-* on a flex div).\",\n props: [\n { name: \"gap\", type: '\"xs\" | \"sm\" | \"md\" | \"lg\"', defaultValue: '\"sm\"', description: \"Horizontal space between children.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes merged via cn().\" },\n { name: \"children\", type: \"ReactNode\", description: \"Inline children in a row.\" },\n ],\n example: `import { Inline } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<Inline gap=\"sm\">\n <Button>保存</Button>\n <Button variant=\"outline\">キャンセル</Button>\n</Inline>`,\n storyPath: \"layout/Inline.stories.tsx\",\n rules: [2],\n },\n {\n name: \"ResponsiveGrid\",\n group: \"layout\",\n tagline: \"Auto-responsive card grid — columns collapse to 1 on mobile, scale up on wider breakpoints.\",\n props: [\n { name: \"columns\", type: \"2 | 3 | 4\", defaultValue: \"3\", description: \"Target column count at desktop; collapses to 1 on mobile.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Grid items — typically Card or CardStat.\" },\n ],\n example: `import { ResponsiveGrid } from \"@godxjp/ui/layout\";\nimport { CardStat } from \"@godxjp/ui/data-display\";\n\n<ResponsiveGrid columns={4}>\n <CardStat label=\"総会員数\" value=\"12,400\" />\n <CardStat label=\"公開中クーポン\" value=\"8\" />\n <CardStat label=\"月間利用数\" value=\"3,210\" />\n <CardStat label=\"割引総額\" value=\"¥480,000\" />\n</ResponsiveGrid>`,\n storyPath: \"layout/ResponsiveGrid.stories.tsx\",\n rules: [24, 40],\n },\n {\n name: \"AppShell\",\n group: \"layout\",\n tagline: \"Root application shell — composes sidebar, topbar rail, main content area, and optional footer.\",\n props: [\n { name: \"sidebar\", type: \"ReactNode\", required: true, description: \"Sidebar node — typically a <Sidebar>.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Main page content rendered in <main>.\" },\n { name: \"topbar\", type: \"ReactNode\", description: \"Full topbar override; else a rail is built from topbarLeft/topbarRight/logo.\" },\n { name: \"topbarRight\", type: \"ReactNode\", description: \"Right slot of the auto-built topbar rail (user menu, switcher).\" },\n { name: \"topbarLeft\", type: \"ReactNode\", description: \"Left slot of the auto-built topbar rail.\" },\n { name: \"logo\", type: \"ReactNode\", description: \"Logo at the far-left of the auto-built topbar rail.\" },\n { name: \"sidebarCollapsed\", type: \"boolean\", defaultValue: \"false\", description: \"Collapse the sidebar to icon-only mode.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"App-level footer outside the main content area.\" },\n ],\n example: `import { AppShell, Sidebar } from \"@godxjp/ui/layout\";\nimport { LayoutDashboard, Users } from \"lucide-react\";\nimport { router } from \"@inertiajs/react\";\n\nconst sidebar = (\n <Sidebar\n activeId=\"/dashboard\"\n onSelect={(id) => router.visit(id)}\n sections={[{ items: [\n { id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard },\n { id: \"/users\", label: \"ユーザー\", icon: Users },\n ] }]}\n product={{ name: \"JOVY CRM\", role: \"本部\", color: \"var(--color-primary)\" }}\n />\n);\n\nexport function CrmLayout({ children }: { children: React.ReactNode }) {\n return <AppShell sidebar={sidebar}>{children}</AppShell>;\n}`,\n storyPath: \"layout/AppShell.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Sidebar\",\n group: \"layout\",\n tagline: \"Navigation sidebar with sections, items, product header, and collapsible icon-only mode.\",\n props: [\n { name: \"activeId\", type: \"string\", required: true, description: \"Id of the active nav item; drives highlight.\" },\n { name: \"sections\", type: \"SidebarSectionProp[]\", required: true, description: \"Array of { label?, items: SidebarItemProp[] } where item = { id, label, icon, badge? }.\" },\n { name: \"onSelect\", type: \"(id: string) => void\", description: \"Called on item click; typically router.visit(id).\" },\n { name: \"product\", type: \"{ name: string; role?: string; color?: string }\", description: \"Product/workspace block at the top.\" },\n { name: \"brand\", type: \"ReactNode\", description: \"Custom brand node replacing the product block.\" },\n { name: \"collapsed\", type: \"boolean\", defaultValue: \"false\", description: \"Icon-only mode; labels/section headings hidden.\" },\n { name: \"footer\", type: \"ReactNode\", description: \"Bottom slot (user info, logout). The .sb-footer wrapper supplies the top border + padding; YOUR content must use SEMANTIC token classes — `text-muted-foreground text-xs` outer with a `text-foreground font-medium` primary line. Do NOT use raw `opacity-*` / arbitrary `text-[11px]` (washed-out, off-design).\" },\n ],\n example: `import { Sidebar } from \"@godxjp/ui/layout\";\nimport { Stack } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { LayoutDashboard, Users, LogOut } from \"lucide-react\";\nimport { router, usePage } from \"@inertiajs/react\";\n\nexport function AppSidebar() {\n const { url } = usePage();\n return (\n <Sidebar\n activeId={url}\n onSelect={(id) => router.visit(id)}\n sections={[{ label: \"メイン\", items: [\n { id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard },\n { id: \"/members\", label: \"会員管理\", icon: Users },\n ] }]}\n product={{ name: \"JOVY CRM\", role: \"本部\" }}\n footer={\n // Canonical footer: semantic tokens only (see Sidebar story).\n <Stack gap=\"sm\">\n <div className=\"text-muted-foreground text-xs\">\n <div className=\"text-foreground font-medium\">山田 花子</div>\n <div>ABCファーマシー</div>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => router.post(\"/logout\")}>\n <LogOut className=\"size-4\" />ログアウト\n </Button>\n </Stack>\n }\n />\n );\n}`,\n storyPath: \"layout/Sidebar.stories.tsx\",\n rules: [2, 23],\n },\n {\n name: \"Topbar\",\n group: \"layout\",\n tagline: \"Application topbar with product/project switcher and search/notification slots (or use AppShell's topbarRight).\",\n props: [\n { name: \"product\", type: \"{ name: string; color?: string }\", required: true, description: \"Current product chip.\" },\n { name: \"project\", type: \"{ name: string } | null\", description: \"Current project chip; null shows placeholder.\" },\n { name: \"onSearchOpen\", type: \"() => void\", description: \"Called when the search bar is clicked.\" },\n { name: \"onProductOpen\", type: \"() => void\", description: \"Called when the product chip is clicked.\" },\n ],\n example: `import { Topbar } from \"@godxjp/ui/layout\";\n\n<Topbar product={{ name: \"JOVY CRM\" }} project={{ name: \"本番環境\" }} />`,\n storyPath: \"layout/Topbar.stories.tsx\",\n rules: [23],\n },\n {\n name: \"PageInset\",\n group: \"layout\",\n tagline: \"Padded horizontal strip aligned with the page header — use inside variant=\\\"flush\\\" for filter bars / intros.\",\n props: [\n { name: \"children\", type: \"ReactNode\", description: \"Content rendered with standard page horizontal padding.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes.\" },\n ],\n example: `import { PageContainer, PageInset } from \"@godxjp/ui/layout\";\n\n<PageContainer title=\"商品一覧\" variant=\"flush\">\n <PageInset><FilterBarBlock /></PageInset>\n {/* full-bleed table below */}\n</PageContainer>`,\n storyPath: \"layout/PageInset.stories.tsx\",\n rules: [],\n },\n {\n name: \"SplitPane\",\n group: \"layout\",\n tagline: \"Two-column layout with a main content area and a fixed-width aside panel.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Main (left) content.\" },\n { name: \"aside\", type: \"ReactNode\", required: true, description: \"Aside (right) panel content.\" },\n { name: \"asideWidth\", type: '\"sm\" | \"md\"', defaultValue: '\"md\"', description: \"Width preset for the aside column.\" },\n ],\n example: `import { SplitPane } from \"@godxjp/ui/layout\";\n\n<SplitPane aside={<DetailPanel />} asideWidth=\"sm\">\n <MainContent />\n</SplitPane>`,\n storyPath: \"layout/SplitPane.stories.tsx\",\n rules: [24],\n },\n {\n name: \"Breadcrumb\",\n group: \"layout\",\n tagline: \"Standalone breadcrumb nav rendering an ordered trail of page segments.\",\n props: [\n { name: \"items\", type: \"BreadcrumbItemProp[]\", required: true, description: \"Array of { label, to? } — omit `to` on the last (current) segment.\" },\n ],\n example: `import { Breadcrumb } from \"@godxjp/ui/layout\";\n\n<Breadcrumb items={[\n { label: \"ホーム\", to: \"/\" },\n { label: \"会員管理\", to: \"/members\" },\n { label: \"田中 太郎\" },\n]} />`,\n storyPath: \"layout/Breadcrumb.stories.tsx\",\n rules: [],\n },\n\n // ─── general ────────────────────────────────────────────────────────────\n {\n name: \"Button\",\n group: \"general\",\n tagline: \"Core button with variant + size presets, built on cva and Radix Slot (asChild).\",\n props: [\n { name: \"variant\", type: '\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"', defaultValue: '\"default\"', description: \"Visual style.\" },\n { name: \"size\", type: '\"default\" | \"xs\" | \"sm\" | \"lg\" | \"icon\" | \"icon-xs\" | \"icon-sm\" | \"icon-lg\"', defaultValue: '\"default\"', description: \"Size preset (height, padding, icon dims).\" },\n { name: \"asChild\", type: \"boolean\", defaultValue: \"false\", description: \"Render as Radix Slot — merge props onto the child (<a>/<Link>).\" },\n { name: \"disabled\", type: \"boolean\", description: \"Disable the button.\" },\n { name: \"onClick\", type: \"React.MouseEventHandler<HTMLButtonElement>\", description: \"Click handler.\" },\n ],\n example: `import { Button } from \"@godxjp/ui/general\";\nimport { Trash2 } from \"lucide-react\";\n\n<>\n <Button>保存</Button>\n <Button variant=\"outline\" size=\"sm\">編集</Button>\n <Button variant=\"ghost\" size=\"icon-sm\"><Trash2 className=\"size-4\" /></Button>\n</>`,\n storyPath: \"general/Button.stories.tsx\",\n rules: [23],\n },\n\n // ─── data-display ───────────────────────────────────────────────────────\n {\n name: \"DataTable\",\n group: \"data-display\",\n tagline: \"Full-width admin list. Lives in its OWN row (Card + CardContent flush) — never inside a narrow grid column. Cells default to white-space:nowrap (scroll, don't crush).\",\n props: [\n { name: \"data\", type: \"T[]\", required: true, description: \"Row data array.\" },\n { name: \"columns\", type: \"ColumnDef<T>[]\", required: true, description: \"Each: { key, header, render?(row), align?: 'left'|'center'|'right', sortable?, width? }. width is a Tailwind class string e.g. 'w-64'.\" },\n { name: \"getRowId\", type: \"(row: T) => string\", description: \"Row key extractor (falls back to row.id). Required when selectable.\" },\n { name: \"onRowClick\", type: \"(row: T) => void\", description: \"Navigate on row click; ignored when target is interactive.\" },\n { name: \"selectable\", type: \"boolean\", defaultValue: \"false\", description: \"Enable checkbox column + bulk selection.\" },\n { name: \"selected\", type: \"Set<string>\", description: \"Controlled selection set.\" },\n { name: \"onSelectChange\", type: \"(next: Set<string>) => void\", description: \"Selection change handler.\" },\n { name: \"onSortChange\", type: \"(sort | undefined) => void\", description: \"Fires when a sortable header is clicked; undefined clears sort.\" },\n ],\n example: `import { Card, CardContent, DataTable, StatusBadge } from \"@godxjp/ui/data-display\";\nimport type { ColumnDef } from \"@godxjp/ui/data-display\";\nimport { router } from \"@inertiajs/react\";\n\ntype Member = { id: string; name: string; status: string };\nconst columns: ColumnDef<Member>[] = [\n { key: \"name\", header: \"氏名\", width: \"w-64\", render: (m) => <span className=\"font-medium\">{m.name}</span> },\n { key: \"status\", header: \"ステータス\", render: (m) => <StatusBadge status={m.status} /> },\n];\n\n<Card>\n <CardContent flush>\n <DataTable data={members} columns={columns} getRowId={(m) => m.id}\n onRowClick={(m) => router.visit(\"/members/\" + m.id)} />\n </CardContent>\n</Card>`,\n storyPath: \"data-display/DataTable.stories.tsx\",\n rules: [37, 39, 35],\n },\n {\n name: \"Card\",\n group: \"data-display\",\n tagline: \"Surface container with optional accent stripe, variant fill, size, and density. ⚠️ The bare <Card> has NO inner padding — body content MUST be wrapped in <CardContent> (titles in <CardHeader>), or it sits FLUSH against the card edges. Never hand-roll padding with className=\\\"p-4\\\"; use <CardContent>. Compose with CardHeader/CardTitle/CardContent/CardFooter.\",\n props: [\n { name: \"accent\", type: '\"primary\" | \"success\" | \"warning\" | \"info\" | \"attention\" | \"destructive\"', description: \"3px left-edge semantic accent stripe.\" },\n { name: \"variant\", type: '\"default\" | \"muted\" | \"outline\" | \"featured\"', defaultValue: '\"default\"', description: \"Surface fill style.\" },\n { name: \"size\", type: '\"default\" | \"compact\"', defaultValue: '\"default\"', description: \"Card size preset.\" },\n { name: \"density\", type: '\"tight\" | \"cozy\"', description: \"Internal padding density (base 16 / tight 12 / cozy 20).\" },\n ],\n example: `import { Card, CardHeader, CardTitle, CardContent } from \"@godxjp/ui/data-display\";\n\n<Card accent=\"success\">\n <CardHeader><CardTitle>注文サマリー</CardTitle></CardHeader>\n <CardContent>総売上: ¥1,234,567</CardContent>\n</Card>`,\n storyPath: \"data-display/Card.stories.tsx\",\n rules: [],\n },\n {\n name: \"CardContent\",\n group: \"data-display\",\n tagline: \"Card body. flush = edge-to-edge (for DataTable/tabs); tight = no top gap; solo = no header above. NEVER put a FilterBar inside flush (it loses padding).\",\n props: [\n { name: \"flush\", type: \"boolean\", description: \"Remove horizontal padding for edge-to-edge tables / tabs lists.\" },\n { name: \"tight\", type: \"boolean\", description: \"No top gap after header — pair with flush toolbars/tabs.\" },\n { name: \"solo\", type: \"boolean\", description: \"No header above: top padding matches the card shell.\" },\n ],\n example: `import { Card, CardContent, DataTable } from \"@godxjp/ui/data-display\";\n\n<Card>\n <CardContent flush>\n <DataTable data={rows} columns={columns} />\n </CardContent>\n</Card>`,\n storyPath: \"data-display/Card.stories.tsx\",\n rules: [37, 38],\n },\n {\n name: \"CardStat\",\n group: \"data-display\",\n tagline: \"KPI tile. ⚠️ CardStat IS ALREADY a bordered Card — render it DIRECTLY in ResponsiveGrid. NEVER wrap it in <Card>/<CardContent> (that double-borders it → looks too thick). NO accent prop (accent is a Card prop).\",\n props: [\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Metric name.\" },\n { name: \"value\", type: \"ReactNode\", required: true, description: \"Metric value (string/number/ReactNode).\" },\n { name: \"hint\", type: \"ReactNode\", description: \"Secondary context below the value.\" },\n { name: \"delta\", type: \"ReactNode\", description: \"Compact trend text beside the value. Sign-aware tone (+ green / - red).\" },\n { name: \"layout\", type: '\"stacked\" | \"inline\"', defaultValue: '\"stacked\"', description: \"stacked = label over value; inline = label left / value right.\" },\n { name: \"align\", type: '\"start\" | \"end\"', description: \"Align the metric group.\" },\n ],\n example: `import { CardStat } from \"@godxjp/ui/data-display\";\nimport { ResponsiveGrid } from \"@godxjp/ui/layout\";\n\n// ✅ CardStat sits directly in the grid — it draws its own card + border.\n<ResponsiveGrid columns={3}>\n <CardStat label=\"総会員数\" value=\"12,450\" hint=\"先月比 +3%\" />\n <CardStat label=\"月次売上\" value=\"¥8,200,000\" delta=\"+12%\" />\n <CardStat label=\"利用率\" value=\"68.4%\" />\n</ResponsiveGrid>\n\n// ❌ Double border — do NOT wrap CardStat in a Card:\n// <Card><CardContent><CardStat label=\"x\" value=\"1\" /></CardContent></Card>`,\n storyPath: \"data-display/CardStat.stories.tsx\",\n rules: [],\n },\n {\n name: \"StatusBadge\",\n group: \"data-display\",\n tagline: \"Lifecycle chip that auto-maps English keys (active/draft/pending/failed/…) to tone + icon. For localized labels or tiers, pass tone explicitly; pass icon={null} for tiers. Chips never wrap.\",\n props: [\n { name: \"status\", type: \"string\", required: true, description: \"Lifecycle key or any domain string. Unknown strings fall back to neutral unless tone is set.\" },\n { name: \"tone\", type: '\"success\" | \"warning\" | \"destructive\" | \"info\" | \"neutral\"', description: \"Override the resolved tone (escape hatch for localized / tier values).\" },\n { name: \"icon\", type: \"LucideIcon | null\", description: \"Override the icon; null hides it — preferred for tier / category badges.\" },\n { name: \"label\", type: \"ReactNode\", description: \"Override display text (default: i18n of key, or raw status).\" },\n ],\n example: `import { StatusBadge } from \"@godxjp/ui/data-display\";\n\n<>\n <StatusBadge status=\"active\" label=\"公開中\" /> {/* green check */}\n <StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} /> {/* tier pill, no icon */}\n <StatusBadge status=\"ゴールド\" tone=\"warning\" icon={null} />\n</>`,\n storyPath: \"data-display/StatusBadge.stories.tsx\",\n rules: [35, 36],\n },\n {\n name: \"Badge\",\n group: \"data-display\",\n tagline: \"Plain label chip with semantic variants. Use for static category tags; use StatusBadge for lifecycle status.\",\n props: [\n { name: \"variant\", type: '\"default\" | \"secondary\" | \"destructive\" | \"outline\" | \"success\" | \"warning\"', defaultValue: '\"default\"', description: \"Visual variant.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Badge text/content.\" },\n ],\n example: `import { Badge } from \"@godxjp/ui/data-display\";\n\n<Badge variant=\"secondary\">A/B</Badge>\n<Badge variant=\"success\">承認済</Badge>`,\n storyPath: \"data-display/Badge.stories.tsx\",\n rules: [35],\n },\n {\n name: \"KeyValueGrid\",\n group: \"data-display\",\n tagline: \"Responsive definition grid for detail-page metadata. COMPOUND — value goes in KeyValueGrid.Item children.\",\n props: [\n { name: \"columns\", type: \"1 | 2 | 3\", defaultValue: \"2\", description: \"Column count; collapses to 1 on mobile.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"KeyValueGrid.Item elements.\" },\n ],\n example: `import { KeyValueGrid } from \"@godxjp/ui/data-display\";\n\n<KeyValueGrid columns={2}>\n <KeyValueGrid.Item label=\"会員ID\" mono>{member.id}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"プラン\">{member.plan}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"メモ\" span={2}>{member.note}</KeyValueGrid.Item>\n</KeyValueGrid>`,\n storyPath: \"data-display/KeyValueGrid.stories.tsx\",\n rules: [],\n },\n {\n name: \"EmptyState\",\n group: \"data-display\",\n tagline: \"Centred empty placeholder with icon, title, description, and optional CTA.\",\n props: [\n { name: \"title\", type: \"string\", required: true, description: \"Primary empty message.\" },\n { name: \"description\", type: \"string\", description: \"Secondary helper text.\" },\n { name: \"icon\", type: \"LucideIcon\", description: \"Icon above the title.\" },\n { name: \"action\", type: \"ReactNode\", description: \"CTA element (e.g. a Button).\" },\n ],\n example: `import { EmptyState } from \"@godxjp/ui/data-display\";\n\n<EmptyState title=\"該当データがありません\" description=\"検索条件を変更してください。\" />`,\n storyPath: \"data-display/EmptyState.stories.tsx\",\n rules: [],\n },\n {\n name: \"ProgressMeter\",\n group: \"data-display\",\n tagline: \"Horizontal progress bar 0–100 with optional label and semantic tone.\",\n props: [\n { name: \"value\", type: \"number\", required: true, description: \"Progress percentage 0–100 (clamped).\" },\n { name: \"label\", type: \"string\", description: \"Text label beside/below the bar.\" },\n { name: \"tone\", type: '\"success\" | \"warning\"', defaultValue: '\"success\"', description: \"Bar colour tone.\" },\n ],\n example: `import { ProgressMeter } from \"@godxjp/ui/data-display\";\n\n<ProgressMeter value={pct} label={pct + \"% 使用中\"} tone={pct >= 80 ? \"warning\" : \"success\"} />`,\n storyPath: \"data-display/ProgressMeter.stories.tsx\",\n rules: [],\n },\n {\n name: \"Timeline\",\n group: \"data-display\",\n tagline: \"Vertical event list with an icon rail. Current item gets a highlighted glyph.\",\n props: [\n { name: \"items\", type: \"TimelineItem[]\", required: true, description: \"Array of { title, location?, time?, note?, current? }.\" },\n ],\n example: `import { Timeline } from \"@godxjp/ui/data-display\";\n\n<Timeline items={[\n { title: \"注文受付\", time: \"2024-06-01 10:00\" },\n { title: \"発送準備中\", time: \"2024-06-01 14:00\" },\n { title: \"配送中\", current: true },\n]} />`,\n storyPath: \"data-display/Timeline.stories.tsx\",\n rules: [],\n },\n {\n name: \"Table\",\n group: \"data-display\",\n tagline: \"Primitive table shell (Table/TableHeader/TableBody/TableRow/TableHead/TableCell). Prefer DataTable for admin lists; use these for custom one-off tables.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"TableHeader / TableBody composition.\" },\n { name: \"className\", type: \"string\", description: \"Extra classes on the table element.\" },\n ],\n example: `import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"@godxjp/ui/data-display\";\n\n<Table>\n <TableHeader><TableRow><TableHead>項目</TableHead><TableHead className=\"text-right\">金額</TableHead></TableRow></TableHeader>\n <TableBody><TableRow><TableCell>送料</TableCell><TableCell className=\"text-right\">¥500</TableCell></TableRow></TableBody>\n</Table>`,\n storyPath: \"data-display/Table.stories.tsx\",\n rules: [],\n },\n {\n name: \"DataState\",\n group: \"data-display\",\n tagline: \"TanStack Query lifecycle widget — skeleton / error / empty / success for one useQuery block. Import from @godxjp/ui/query.\",\n props: [\n { name: \"query\", type: \"UseQueryResult<T>\", required: true, description: \"The useQuery result.\" },\n { name: \"skeleton\", type: \"ReactNode\", required: true, description: \"Shown while loading.\" },\n { name: \"children\", type: \"(data) => ReactNode\", required: true, description: \"Render function with resolved data.\" },\n { name: \"empty\", type: \"ReactNode\", description: \"Shown when isEmpty(data) is true.\" },\n { name: \"isEmpty\", type: \"(data) => boolean\", description: \"Custom empty check.\" },\n ],\n example: `import { DataState } from \"@godxjp/ui/query\";\n\n<DataState query={membersQuery} skeleton={<SkeletonTable />} isEmpty={(d) => d.items.length === 0} empty={<EmptyState title=\"会員なし\" />}>\n {(d) => <MemberTable items={d.items} />}\n</DataState>`,\n storyPath: \"query/DataState.stories.tsx\",\n rules: [],\n },\n {\n name: \"InfiniteQueryState\",\n group: \"data-display\",\n tagline: \"useInfiniteQuery widget — flatten pages, skeleton/empty/error, load-more footer. Import from @godxjp/ui/query.\",\n props: [\n { name: \"query\", type: \"UseInfiniteQueryResult\", required: true, description: \"The useInfiniteQuery result.\" },\n { name: \"skeleton\", type: \"ReactNode\", required: true, description: \"Shown while initial load pends.\" },\n { name: \"flatten\", type: \"(data) => TFlat\", required: true, description: \"Reduce pages to a flat list (use flattenItemPages helper).\" },\n { name: \"children\", type: \"(flat, helpers) => ReactNode\", required: true, description: \"Render with flat data + { fetchNextPage, hasNextPage, isFetchingNextPage }.\" },\n ],\n example: `import { InfiniteQueryState, flattenItemPages } from \"@godxjp/ui/query\";\n\n<InfiniteQueryState query={q} skeleton={<SkeletonRows />} flatten={flattenItemPages} isEmpty={(it) => it.length === 0}>\n {(items) => items.map((a) => <ActivityRow key={a.id} activity={a} />)}\n</InfiniteQueryState>`,\n storyPath: \"query/InfiniteQueryState.stories.tsx\",\n rules: [],\n },\n {\n name: \"MutationFeedback\",\n group: \"data-display\",\n tagline: \"Inline mutation error — renders nothing when idle/successful. Import from @godxjp/ui/query.\",\n props: [\n { name: \"mutation\", type: \"{ isError, error, isPending }\", required: true, description: \"useMutation result.\" },\n { name: \"onRetry\", type: \"() => void\", description: \"Retry handler.\" },\n ],\n example: `import { MutationFeedback } from \"@godxjp/ui/query\";\n\n<MutationFeedback mutation={saveMutation} />`,\n storyPath: \"query/MutationFeedback.stories.tsx\",\n rules: [],\n },\n\n // ─── data-entry ─────────────────────────────────────────────────────────\n {\n name: \"FormField\",\n group: \"data-entry\",\n tagline: \"Wraps a control with label, helper, and error; injects aria-describedby/aria-invalid onto the child.\",\n props: [\n { name: \"id\", type: \"string\", required: true, description: \"Forwarded to Label htmlFor + builds helper/error ids.\" },\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Field label above the control.\" },\n { name: \"required\", type: \"boolean\", defaultValue: \"false\", description: \"Red asterisk + aria-required on the child.\" },\n { name: \"helper\", type: \"string\", description: \"Muted hint shown when there is no error.\" },\n { name: \"error\", type: \"string\", description: \"Destructive error message (role=alert); overrides helper.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"The single control to render.\" },\n ],\n example: `import { FormField, Input } from \"@godxjp/ui/data-entry\";\n\n<FormField id=\"coupon-name\" label=\"クーポン名\" required error={errors.name} helper=\"最大50文字\">\n <Input id=\"coupon-name\" placeholder=\"春の花粉症対策15%OFF\" value={name} onChange={(e) => setName(e.target.value)} />\n</FormField>`,\n storyPath: \"data-entry/FormField.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Input\",\n group: \"data-entry\",\n tagline: \"Styled wrapper around native <input>; accepts all HTML input attributes. Pair with FormField for labelled fields.\",\n props: [\n { name: \"id\", type: \"string\", description: \"Associates with a <label htmlFor>.\" },\n { name: \"type\", type: \"string\", defaultValue: '\"text\"', description: \"Native input type.\" },\n { name: \"placeholder\", type: \"string\", description: \"Placeholder.\" },\n { name: \"value\", type: \"string | number\", description: \"Controlled value.\" },\n { name: \"onChange\", type: \"React.ChangeEventHandler<HTMLInputElement>\", description: \"Native change handler.\" },\n ],\n example: `import { Input } from \"@godxjp/ui/data-entry\";\n\n<Input id=\"qty\" type=\"number\" placeholder=\"例: 500\" value={value} onChange={(e) => setValue(e.target.value)} />`,\n storyPath: \"data-entry/Input.stories.tsx\",\n rules: [],\n },\n {\n name: \"SearchInput\",\n group: \"data-entry\",\n tagline: \"Debounced search box with a clear button. Fires onSearch (NOT onChange) after the debounce. Controlled (value) or uncontrolled (defaultValue).\",\n props: [\n { name: \"onSearch\", type: \"(q: string) => void\", required: true, description: \"Called with the query after the debounce. Use this to drive filtering — NOT onChange.\" },\n { name: \"value\", type: \"string\", description: \"Controlled value.\" },\n { name: \"defaultValue\", type: \"string\", defaultValue: '\"\"', description: \"Initial uncontrolled value.\" },\n { name: \"placeholder\", type: \"string\", description: \"Input placeholder.\" },\n { name: \"debounce\", type: \"number\", defaultValue: \"250\", description: \"Debounce delay (ms).\" },\n ],\n example: `import { SearchInput } from \"@godxjp/ui/data-entry\";\n\n<SearchInput placeholder=\"クーポン名・IDで検索\" value={search} onSearch={setSearch} />`,\n storyPath: \"data-entry/SearchInput.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Select\",\n group: \"data-entry\",\n tagline: \"Radix compound select. Controlled via value + onValueChange on <Select>; compose SelectTrigger>SelectValue and SelectContent>SelectItem. This is the filter/select pattern the app uses.\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled selected value.\" },\n { name: \"defaultValue\", type: \"string\", description: \"Uncontrolled initial value.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Called when the user picks an item.\" },\n { name: \"disabled\", type: \"boolean\", defaultValue: \"false\", description: \"Disable the trigger.\" },\n ],\n example: `import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@godxjp/ui/data-entry\";\n\n<Select value={status} onValueChange={setStatus}>\n <SelectTrigger><SelectValue placeholder=\"全ステータス\" /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">全ステータス</SelectItem>\n <SelectItem value=\"active\">公開中</SelectItem>\n <SelectItem value=\"draft\">下書き</SelectItem>\n </SelectContent>\n</Select>`,\n storyPath: \"data-entry/Select.stories.tsx\",\n rules: [23],\n },\n {\n name: \"Switch\",\n group: \"data-entry\",\n tagline: \"Radix toggle switch (bare). For a labelled row with a hidden form input use SwitchField.\",\n props: [\n { name: \"checked\", type: \"boolean\", description: \"Controlled checked state.\" },\n { name: \"onCheckedChange\", type: \"(checked: boolean) => void\", description: \"Fires when toggled.\" },\n { name: \"id\", type: \"string\", description: \"Links to a <Label htmlFor>.\" },\n { name: \"disabled\", type: \"boolean\", defaultValue: \"false\", description: \"Disable the toggle.\" },\n ],\n example: `import { Switch, Label } from \"@godxjp/ui/data-entry\";\n\n<div className=\"flex items-center gap-2\">\n <Switch id=\"stackable\" checked={stackable} onCheckedChange={setStackable} />\n <Label htmlFor=\"stackable\">他クーポンとの併用を許可</Label>\n</div>`,\n storyPath: \"data-entry/Switch.stories.tsx\",\n rules: [],\n },\n {\n name: \"Textarea\",\n group: \"data-entry\",\n tagline: \"Styled wrapper around native <textarea>. Pair with FormField for labelled fields.\",\n props: [\n { name: \"id\", type: \"string\", description: \"Associates with a <Label htmlFor>.\" },\n { name: \"rows\", type: \"number\", description: \"Visible text rows.\" },\n { name: \"value\", type: \"string\", description: \"Controlled value.\" },\n { name: \"onChange\", type: \"React.ChangeEventHandler<HTMLTextAreaElement>\", description: \"Change handler.\" },\n ],\n example: `import { Textarea } from \"@godxjp/ui/data-entry\";\n\n<Textarea id=\"notes\" rows={4} placeholder=\"自由記述\" value={notes} onChange={(e) => setNotes(e.target.value)} />`,\n storyPath: \"data-entry/Textarea.stories.tsx\",\n rules: [],\n },\n {\n name: \"Label\",\n group: \"data-entry\",\n tagline: \"Styled Radix Label; use htmlFor to associate with a control.\",\n props: [\n { name: \"htmlFor\", type: \"string\", description: \"Id of the associated control.\" },\n { name: \"children\", type: \"ReactNode\", description: \"Label content.\" },\n ],\n example: `import { Label } from \"@godxjp/ui/data-entry\";\n\n<Label htmlFor=\"stackable\">併用を許可</Label>`,\n storyPath: \"data-entry/Label.stories.tsx\",\n rules: [],\n },\n {\n name: \"Checkbox\",\n group: \"data-entry\",\n tagline: \"Radix checkbox; standalone or via CheckboxGroup with an options array.\",\n props: [\n { name: \"checked\", type: \"boolean | 'indeterminate'\", description: \"Controlled checked state.\" },\n { name: \"onCheckedChange\", type: \"(checked) => void\", description: \"Fires when checked state changes.\" },\n { name: \"id\", type: \"string\", description: \"Links to a <Label htmlFor>.\" },\n ],\n example: `import { Checkbox, Label } from \"@godxjp/ui/data-entry\";\n\n<div className=\"flex items-center gap-2\">\n <Checkbox id=\"agree\" checked={agreed} onCheckedChange={(v) => setAgreed(!!v)} />\n <Label htmlFor=\"agree\">利用規約に同意する</Label>\n</div>`,\n storyPath: \"data-entry/Checkbox.stories.tsx\",\n rules: [],\n },\n {\n name: \"RadioGroup\",\n group: \"data-entry\",\n tagline: \"Radio group accepting an options array or RadioItem children.\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled selected value.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Fires on selection change.\" },\n { name: \"options\", type: \"ChoiceOptionProp[]\", description: \"Declarative list: { label, value, disabled?, description? }.\" },\n { name: \"orientation\", type: '\"horizontal\" | \"vertical\"', defaultValue: '\"vertical\"', description: \"Layout direction.\" },\n ],\n example: `import { RadioGroup } from \"@godxjp/ui/data-entry\";\n\n<RadioGroup value={trigger} onValueChange={setTrigger} orientation=\"horizontal\" options={[\n { label: \"初回購入\", value: \"first_purchase\" },\n { label: \"誕生日\", value: \"birthday\" },\n]} />`,\n storyPath: \"data-entry/RadioGroup.stories.tsx\",\n rules: [23],\n },\n {\n name: \"DatePicker\",\n group: \"data-entry\",\n tagline: \"Calendar popover for a single date; controlled via value (Date) + onChange.\",\n props: [\n { name: \"value\", type: \"Date\", description: \"Controlled selected date.\" },\n { name: \"onChange\", type: \"(date: Date | undefined) => void\", description: \"Fires when picked/cleared.\" },\n { name: \"placeholder\", type: \"string\", description: \"Trigger label when empty.\" },\n ],\n example: `import { DatePicker, FormField } from \"@godxjp/ui/data-entry\";\n\n<FormField id=\"valid-from\" label=\"有効開始日\">\n <DatePicker id=\"valid-from\" value={validFrom} onChange={setValidFrom} placeholder=\"日付を選択\" />\n</FormField>`,\n storyPath: \"data-entry/DatePicker.stories.tsx\",\n rules: [],\n },\n\n // ─── feedback ───────────────────────────────────────────────────────────\n {\n name: \"Dialog\",\n group: \"feedback\",\n tagline: \"Compound modal. Controlled via open + onOpenChange. Parts available flat (DialogTrigger/DialogContent/…) or as Dialog.Trigger/Dialog.Content. mode=\\\"confirm\\\" switches to alertdialog.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n { name: \"mode\", type: '\"form\" | \"confirm\"', defaultValue: '\"form\"', description: \"form = Radix Dialog (× close); confirm = AlertDialog (no ×).\" },\n ],\n example: `import { useState } from \"react\";\nimport { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from \"@godxjp/ui/feedback\";\nimport { Button } from \"@godxjp/ui/general\";\n\nfunction CreateDialog() {\n const [open, setOpen] = useState(false);\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild><Button size=\"sm\">新規作成</Button></DialogTrigger>\n <DialogContent className=\"max-w-lg\">\n <DialogHeader>\n <DialogTitle>新規クーポン作成</DialogTitle>\n <DialogDescription>クーポン情報を入力してください。</DialogDescription>\n </DialogHeader>\n {/* fields */}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>キャンセル</Button>\n <Button onClick={() => setOpen(false)}>保存</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}`,\n storyPath: \"feedback/Dialog.stories.tsx\",\n rules: [23, 3],\n },\n {\n name: \"Sheet\",\n group: \"feedback\",\n tagline: \"Side-panel drawer (Radix Dialog). Parts: Sheet/SheetTrigger/SheetContent(side=right|left|top|bottom)/SheetHeader/SheetTitle/SheetFooter.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n ],\n example: `import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle } from \"@godxjp/ui/feedback\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild><Button variant=\"outline\" size=\"sm\">絞り込み</Button></SheetTrigger>\n <SheetContent side=\"right\">\n <SheetHeader><SheetTitle>フィルター設定</SheetTitle></SheetHeader>\n {/* filter fields */}\n </SheetContent>\n</Sheet>`,\n storyPath: \"feedback/Sheet.stories.tsx\",\n rules: [3],\n },\n {\n name: \"Alert\",\n group: \"feedback\",\n tagline: \"Inline alert banner with variant-aware icon + optional dismiss. Parts: Alert/AlertTitle/AlertDescription/AlertActions/AlertQueryError.\",\n props: [\n { name: \"variant\", type: '\"default\" | \"destructive\" | \"warning\" | \"success\"', defaultValue: '\"default\"', description: \"Colour scheme + default icon.\" },\n { name: \"onDismiss\", type: \"() => void\", description: \"Renders an × dismiss button when provided.\" },\n { name: \"icon\", type: \"LucideIcon | false\", description: \"Override or hide (false) the icon.\" },\n ],\n example: `import { Alert, AlertTitle, AlertDescription } from \"@godxjp/ui/feedback\";\n\n<Alert variant=\"warning\">\n <AlertTitle>3 件の打刻漏れがあります</AlertTitle>\n <AlertDescription>本日中に確認してください。</AlertDescription>\n</Alert>`,\n storyPath: \"feedback/Alert.stories.tsx\",\n rules: [],\n },\n {\n name: \"SkeletonTable\",\n group: \"feedback\",\n tagline: \"Loading placeholder matching the DataTable layout (header + N rows). Drop-in while data loads (deferred props).\",\n props: [\n { name: \"rows\", type: \"number\", defaultValue: \"8\", description: \"Body skeleton rows.\" },\n { name: \"columns\", type: \"number\", defaultValue: \"5\", description: \"Columns in header + body.\" },\n ],\n example: `import { SkeletonTable } from \"@godxjp/ui/feedback\";\n\n{!coupons ? <SkeletonTable rows={10} columns={6} /> : <DataTable data={coupons} columns={columns} />}`,\n storyPath: \"feedback/Skeleton.stories.tsx\",\n rules: [],\n },\n {\n name: \"SkeletonCard\",\n group: \"feedback\",\n tagline: \"Loading placeholder shaped like a CardStat tile. Use inside a ResponsiveGrid while KPIs load.\",\n props: [],\n example: `import { SkeletonCard } from \"@godxjp/ui/feedback\";\nimport { ResponsiveGrid } from \"@godxjp/ui/layout\";\n\n<ResponsiveGrid columns={4}><SkeletonCard /><SkeletonCard /><SkeletonCard /><SkeletonCard /></ResponsiveGrid>`,\n storyPath: \"feedback/Skeleton.stories.tsx\",\n rules: [],\n },\n {\n name: \"Toaster\",\n group: \"feedback\",\n tagline: \"Mount once at app root to enable toasts. IMPORTANT: trigger toasts via `import { toast } from \\\"sonner\\\"` — NOT from @godxjp/ui.\",\n props: [\n { name: \"position\", type: '\"top-right\" | \"top-center\" | \"bottom-right\" | \"…\"', defaultValue: '\"bottom-right\"', description: \"Toast stack anchor.\" },\n { name: \"richColors\", type: \"boolean\", description: \"Enable Sonner rich variant colours.\" },\n ],\n example: `// app root — mount once\nimport { Toaster } from \"@godxjp/ui/feedback\";\n<>{children}<Toaster richColors /></>\n\n// anywhere — import toast from \"sonner\"\nimport { toast } from \"sonner\";\ntoast.success(\"クーポンを公開しました\");\ntoast.error(\"保存に失敗しました\");`,\n storyPath: \"feedback/Toaster.stories.tsx\",\n rules: [],\n },\n\n // ─── navigation ─────────────────────────────────────────────────────────\n {\n name: \"Tabs\",\n group: \"navigation\",\n tagline: \"Radix tab container. Compose Tabs/TabsList/TabsTrigger/TabsContent. Controlled (value/onValueChange) or uncontrolled (defaultValue).\",\n props: [\n { name: \"value\", type: \"string\", description: \"Controlled active tab key.\" },\n { name: \"defaultValue\", type: \"string\", description: \"Uncontrolled initial tab key.\" },\n { name: \"onValueChange\", type: \"(value: string) => void\", description: \"Active-tab change handler.\" },\n ],\n example: `import { Tabs, TabsList, TabsTrigger, TabsContent } from \"@godxjp/ui/navigation\";\n\n<Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">概要</TabsTrigger>\n <TabsTrigger value=\"history\">履歴</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">概要コンテンツ</TabsContent>\n <TabsContent value=\"history\">履歴コンテンツ</TabsContent>\n</Tabs>`,\n storyPath: \"navigation/Tabs.stories.tsx\",\n rules: [],\n },\n {\n name: \"FilterBar\",\n group: \"navigation\",\n tagline: \"Standard list-page filter strip. Place ABOVE the table Card — NEVER inside CardContent flush (it strips padding). Compose with FilterGroup + SearchInput + Select.\",\n props: [\n { name: \"children\", type: \"ReactNode\", required: true, description: \"Filter controls + FilterGroup wrappers.\" },\n { name: \"hasActiveFilters\", type: \"boolean\", description: \"Shows a clear-all button when true.\" },\n { name: \"onClear\", type: \"() => void\", description: \"Clear-all handler.\" },\n ],\n example: `import { FilterBar, FilterGroup } from \"@godxjp/ui/navigation\";\nimport { SearchInput, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"@godxjp/ui/data-entry\";\n\n<FilterBar hasActiveFilters={search !== \"\"} onClear={() => setSearch(\"\")}>\n <SearchInput placeholder=\"名前で検索\" value={search} onSearch={setSearch} />\n <FilterGroup label=\"ステータス\">\n <Select value={status} onValueChange={setStatus}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">すべて</SelectItem>\n <SelectItem value=\"active\">有効</SelectItem>\n </SelectContent>\n </Select>\n </FilterGroup>\n</FilterBar>`,\n storyPath: \"navigation/FilterBar.stories.tsx\",\n rules: [38, 40],\n },\n {\n name: \"FilterGroup\",\n group: \"navigation\",\n tagline: \"Labelled filter slot inside FilterBar — wraps a single Select/DatePicker.\",\n props: [\n { name: \"label\", type: \"ReactNode\", required: true, description: \"Label shown with the child control.\" },\n { name: \"children\", type: \"ReactNode\", required: true, description: \"The filter control.\" },\n ],\n example: `import { FilterGroup } from \"@godxjp/ui/navigation\";\n\n<FilterGroup label=\"スコープ\"><Select>{/* ... */}</Select></FilterGroup>`,\n storyPath: \"navigation/FilterBar.stories.tsx\",\n rules: [38],\n },\n {\n name: \"Pagination\",\n group: \"navigation\",\n tagline: \"Offset/page-based pagination bar. Sits below a table card.\",\n props: [\n { name: \"current\", type: \"number\", defaultValue: \"1\", description: \"Current page (1-indexed).\" },\n { name: \"total\", type: \"number\", description: \"Total number of items.\" },\n { name: \"pageSize\", type: \"number\", defaultValue: \"10\", description: \"Items per page.\" },\n { name: \"showTotal\", type: \"boolean | (total, range) => ReactNode\", description: \"Show total count, or a custom label fn.\" },\n { name: \"onChange\", type: \"(page: number, pageSize: number) => void\", description: \"Page / page-size change handler.\" },\n ],\n example: `import { Pagination } from \"@godxjp/ui/navigation\";\n\n<Pagination current={page} total={filtered.length} pageSize={10} showTotal onChange={(p) => setPage(p)} />`,\n storyPath: \"navigation/Pagination.stories.tsx\",\n rules: [40],\n },\n {\n name: \"DropdownMenu\",\n group: \"navigation\",\n tagline: \"Radix dropdown menu. Compose DropdownMenu/DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/DropdownMenuSeparator.\",\n props: [\n { name: \"open\", type: \"boolean\", description: \"Controlled open state.\" },\n { name: \"onOpenChange\", type: \"(open: boolean) => void\", description: \"Open-state change handler.\" },\n ],\n example: `import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from \"@godxjp/ui/navigation\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<DropdownMenu>\n <DropdownMenuTrigger asChild><Button variant=\"outline\" size=\"sm\">操作</Button></DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem>編集</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem variant=\"destructive\">削除</DropdownMenuItem>\n </DropdownMenuContent>\n</DropdownMenu>`,\n storyPath: \"navigation/DropdownMenu.stories.tsx\",\n rules: [],\n },\n {\n name: \"Steps\",\n group: \"navigation\",\n tagline: \"Multi-step progress indicator — horizontal or vertical, default or dot style.\",\n props: [\n { name: \"items\", type: \"StepItemProp[]\", description: \"Array of { title, subTitle?, description?, icon?, status? }.\" },\n { name: \"current\", type: \"number\", defaultValue: \"0\", description: \"Active step index (0-based).\" },\n { name: \"orientation\", type: '\"horizontal\" | \"vertical\"', defaultValue: '\"horizontal\"', description: \"Layout direction.\" },\n ],\n example: `import { Steps } from \"@godxjp/ui/navigation\";\n\n<Steps current={1} items={[{ title: \"申請\" }, { title: \"審査中\" }, { title: \"完了\" }]} />`,\n storyPath: \"navigation/Steps.stories.tsx\",\n rules: [],\n },\n\n // ─── providers / datetime ───────────────────────────────────────────────\n {\n name: \"AppProvider\",\n group: \"providers\",\n tagline: \"Root locale/timezone/date-time context — wrap the app ONCE. All pickers + formatDate read from it. Import from @godxjp/ui/app.\",\n props: [\n { name: \"defaultLocale\", type: '\"ja\" | \"en\" | \"vi\"', defaultValue: '\"vi\"', description: \"Initial locale.\" },\n { name: \"defaultTimezone\", type: 'string | \"browser\" | \"system\"', defaultValue: '\"browser\"', description: \"Initial IANA timezone.\" },\n { name: \"defaultDateFormat\", type: '\"iso\" | \"dmy\" | \"mdy\" | \"locale\"', defaultValue: '\"locale\"', description: \"Initial date display format.\" },\n { name: \"defaultTimeFormat\", type: '\"24h\" | \"12h\" | \"locale\"', defaultValue: '\"locale\"', description: \"Initial clock format.\" },\n ],\n example: `import { AppProvider } from \"@godxjp/ui/app\";\n\n<AppProvider defaultLocale=\"ja\" defaultTimezone=\"Asia/Tokyo\" defaultDateFormat=\"iso\" defaultTimeFormat=\"24h\">\n {children}\n</AppProvider>`,\n storyPath: \"app/AppProvider.stories.tsx\",\n rules: [5],\n },\n {\n name: \"formatDate\",\n group: \"providers\",\n tagline: \"MANDATORY for all date/time display. Auto-detects ISO date / HH:mm / instant; reads AppProvider context. Import from @godxjp/ui/datetime.\",\n props: [\n { name: \"value\", type: \"string | Date | null | undefined\", required: true, description: \"ISO date, ISO datetime, HH:mm, or Date.\" },\n { name: \"options.kind\", type: '\"auto\" | \"date\" | \"datetime\" | \"time\" | \"long\" | \"relative\"', defaultValue: '\"auto\"', description: \"Output preset; auto infers from the value.\" },\n ],\n example: `import { formatDate } from \"@godxjp/ui/datetime\";\n\nformatDate(coupon.validFrom); // \"2026-05-01\"\nformatDate(order.createdAt, { kind: \"relative\" }); // \"3日前\"`,\n storyPath: \"app/formatDate.stories.tsx\",\n rules: [5],\n },\n];\n\nexport function findComponent(name: string): ComponentEntry | undefined {\n const normalized = name.trim().toLowerCase();\n return COMPONENTS.find((c) => c.name.toLowerCase() === normalized);\n}\n\nexport function componentsByGroup(group: ComponentGroup): ComponentEntry[] {\n return COMPONENTS.filter((c) => c.group === group);\n}\n\nexport function searchComponents(query: string): ComponentEntry[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") {\n return COMPONENTS;\n }\n return COMPONENTS.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.group.includes(q) ||\n c.tagline.toLowerCase().includes(q) ||\n c.props.some((p) => p.name.toLowerCase().includes(q)),\n );\n}\n","/**\n * Shared prop-vocabulary catalog — mirrors `src/props/` in the\n * framework. Consumers reach for this to know the canonical value\n * unions before authoring a new primitive or a wrapper.\n *\n * See also: `docs/specs/04-prop-vocabulary.md` (the rule) +\n * `docs/specs/06-prop-vocabulary-audit.md` (the audit findings).\n */\n\nexport interface PropVocabEntry {\n /** Canonical type name (matches `src/props/{file}.ts`). */\n name: string;\n /** Concept the union represents. */\n concept: string;\n /** Literal values. */\n values: string[];\n /** Primitives that use this exact vocabulary (or alias to it). */\n usedBy: string[];\n /** Optional notes (subtypes, related aliases, gotchas). */\n notes?: string;\n}\n\nexport const PROP_VOCABULARY: PropVocabEntry[] = [\n {\n name: \"SizeProp\",\n concept: \"Dimensional scale for most primitives.\",\n values: [\"small\", \"default\", \"large\"],\n usedBy: [\n \"InputSize\", \"CheckboxGroupSize\", \"ColorPickerSize\", \"MediaUploadSize\",\n \"ProgressSize\", \"RadioGroupSize\", \"RateSize\", \"TransferSize\",\n \"SegmentedControlSize (subset)\", \"SpaceSize (+ number)\",\n \"FlexGap (+ number)\", \"GridGap (+ number)\", \"MasonryGap (+ number)\",\n ],\n },\n {\n name: \"SizeWithXSProp\",\n concept: 'Extension of `SizeProp` with `\"x-small\"` for compact icon-bar / table-row contexts.',\n values: [\"x-small\", \"small\", \"default\", \"large\"],\n usedBy: [\"ButtonSize\"],\n },\n {\n name: \"IconSizeProp\",\n concept: \"Icon-symbol shaped primitives (visual axis = glyph size, not height).\",\n values: [\"sm\", \"md\", \"lg\"],\n usedBy: [\"SpinnerSize\", \"IconButtonSize\"],\n },\n {\n name: \"StatusProp\",\n concept: \"Form-field validation state.\",\n values: [\"default\", \"error\", \"warning\", \"success\"],\n usedBy: [\"InputStatus\"],\n notes: 'Form errors use `\"error\"` (not `\"destructive\"`) — different concern from destructive actions.',\n },\n {\n name: \"ToneProp\",\n concept: \"Same values as StatusProp — name chosen when describing surface colouring rather than validation.\",\n values: [\"default\", \"error\", \"warning\", \"success\"],\n usedBy: [\"(alias of StatusProp)\"],\n },\n {\n name: \"HelpToneProp\",\n concept: \"Help-line / Alert colour ladder. Adds `info` + `warn` to StatusProp.\",\n values: [\"default\", \"info\", \"warn\", \"error\", \"success\"],\n usedBy: [\"FieldHelpTone\"],\n },\n {\n name: \"OrientationProp\",\n concept: \"Layout axis.\",\n values: [\"horizontal\", \"vertical\"],\n usedBy: [\n \"AnchorOrientation\", \"MenuOrientation\", \"RadioGroupOrientation\",\n \"CheckboxGroupOrientation\", \"SegmentedControlOrientation\",\n \"StepsOrientation\", \"TabsOrientation\",\n ],\n },\n {\n name: \"DensityProp\",\n concept: \"Internal row-height / padding scale (distinct from SizeProp — density rescales chrome, size rescales the primitive's own visual axis).\",\n values: [\"compact\", \"default\", \"comfortable\"],\n usedBy: [\"TreeDensity\", \"TableDensity\"],\n },\n {\n name: \"SideProp\",\n concept: \"Edge a floating panel docks against.\",\n values: [\"top\", \"right\", \"bottom\", \"left\"],\n usedBy: [\"SheetSide\", \"TabsPlacement\", \"TableStickySide (subset)\"],\n },\n {\n name: \"PlacementProp\",\n concept: \"Extension of SideProp with a centred anchor (Tabs placement, Tour spotlight).\",\n values: [\"top\", \"right\", \"bottom\", \"left\", \"center\"],\n usedBy: [\"TourPlacement\"],\n },\n {\n name: \"PaddingProp\",\n concept: \"Outer gutter scale for surface containers.\",\n values: [\"tight\", \"default\", \"cozy\", \"none\"],\n usedBy: [\"CardPadding\", \"PageHeaderPadding\", \"PageContentPadding\"],\n },\n {\n name: \"AlignProp\",\n concept: \"CSS-flexbox cross-axis alignment ladder.\",\n values: [\"start\", \"end\", \"center\", \"stretch\", \"baseline\"],\n usedBy: [\"FlexAlign\"],\n },\n {\n name: \"ColorProp\",\n concept: \"Full semantic palette — every CSS variable slot.\",\n values: [\"default\", \"info\", \"success\", \"warning\", \"destructive\", \"attention\", \"primary\", \"secondary\"],\n usedBy: [\"TagPresetColor (− secondary)\", \"TimelineColor (− secondary)\", \"SpinnerTone (+ muted)\"],\n notes:\n 'Each value maps 1:1 to a CSS variable (`--info`, `--success`, `--warning`, `--destructive`, `--attention`, `--primary`, `--secondary`). The `data-accent` axis rebinds `--primary`\\'s hue without renaming the slot.',\n },\n {\n name: \"FeedbackColorProp\",\n concept: \"Subset of ColorProp accepted by feedback primitives (no brand `primary` since they are themselves informational).\",\n values: [\"default\", \"info\", \"success\", \"warning\", \"destructive\"],\n usedBy: [\"AlertColor\", \"ResultColor\", \"ProgressColor\"],\n },\n {\n name: \"LoadingProp\",\n concept: \"Loading-state union — shared across Form / FormField / data-entry primitives.\",\n values: [\"true\", \"false\", '{ kind: \"spinner\" }', '{ kind: \"skeleton\" }', '{ kind, label }'],\n usedBy: [\"FormProps.loading\", \"FormFieldProps.loading\"],\n notes:\n 'Cascade: `<Form loading>` sets a default for every nested `<FormField>`. Per-field `loading` overrides Form\\'s. `true` → spinner (default). `{ kind: \"skeleton\" }` → use for INITIAL fetch state. UX nuance: skeleton on init, spinner on save.',\n },\n];\n\nexport function findVocab(name: string): PropVocabEntry | undefined {\n const normalized = name.trim().toLowerCase().replace(/prop$/i, \"\");\n return PROP_VOCABULARY.find(\n (v) => v.name.toLowerCase().replace(/prop$/i, \"\") === normalized,\n );\n}\n","/**\n * Design tokens catalog — mirrors `src/tokens/tailwind.css` +\n * `src/styles/theme.css` in the framework. CSS variable name +\n * the slot's role + (for fixed values) the literal value.\n *\n * Token values that change per `data-theme` / `data-accent` /\n * `data-density` / `data-font-size` axis are NOT listed with a\n * literal — only the slot name + axis name. Consumers read the\n * runtime value via `getComputedStyle(:root).getPropertyValue(...)`.\n */\n\nexport type TokenCategory =\n | \"color\"\n | \"spacing\"\n | \"typography\"\n | \"radius\"\n | \"shadow\"\n | \"motion\"\n | \"breakpoint\"\n | \"density\"\n | \"z-index\";\n\nexport interface TokenEntry {\n name: string;\n category: TokenCategory;\n role: string;\n /** Fixed value if non-axis. Otherwise omitted. */\n value?: string;\n /** Axis the token re-binds against, if any. */\n axis?: \"data-theme\" | \"data-accent\" | \"data-density\" | \"data-font-size\";\n}\n\nexport const TOKENS: TokenEntry[] = [\n // Color — semantic slots (rebound by `data-theme` + `data-accent`)\n { name: \"--background\", category: \"color\", role: \"Base surface\", axis: \"data-theme\" },\n { name: \"--foreground\", category: \"color\", role: \"Base text\", axis: \"data-theme\" },\n { name: \"--card\", category: \"color\", role: \"Card surface\", axis: \"data-theme\" },\n { name: \"--popover\", category: \"color\", role: \"Popover / dropdown surface\", axis: \"data-theme\" },\n { name: \"--popover-foreground\", category: \"color\", role: \"Popover text\", axis: \"data-theme\" },\n { name: \"--primary\", category: \"color\", role: \"Brand accent (Buttons, links)\", axis: \"data-accent\" },\n { name: \"--primary-foreground\", category: \"color\", role: \"Text on primary surface\", axis: \"data-accent\" },\n { name: \"--secondary\", category: \"color\", role: \"Secondary surface / text dimming\", axis: \"data-theme\" },\n { name: \"--accent\", category: \"color\", role: \"Hover / focus tint\" },\n { name: \"--muted\", category: \"color\", role: \"Muted surface\" },\n { name: \"--muted-foreground\", category: \"color\", role: \"Muted text\" },\n { name: \"--border\", category: \"color\", role: \"Default border color\", axis: \"data-theme\" },\n { name: \"--input\", category: \"color\", role: \"Input field border\" },\n { name: \"--ring\", category: \"color\", role: \"Focus ring\", axis: \"data-accent\" },\n { name: \"--success\", category: \"color\", role: \"Success semantic slot\" },\n { name: \"--warning\", category: \"color\", role: \"Warning semantic slot\" },\n { name: \"--destructive\", category: \"color\", role: \"Danger / destructive action slot\" },\n { name: \"--info\", category: \"color\", role: \"Info / neutral notice slot\" },\n { name: \"--attention\", category: \"color\", role: \"Attention / non-destructive alert slot\" },\n\n // Spacing — fixed scale\n { name: \"--spacing-1\", category: \"spacing\", role: \"4px\", value: \"0.25rem\" },\n { name: \"--spacing-2\", category: \"spacing\", role: \"8px\", value: \"0.5rem\" },\n { name: \"--spacing-3\", category: \"spacing\", role: \"12px\", value: \"0.75rem\" },\n { name: \"--spacing-4\", category: \"spacing\", role: \"16px\", value: \"1rem\" },\n { name: \"--spacing-5\", category: \"spacing\", role: \"20px\", value: \"1.25rem\" },\n { name: \"--spacing-6\", category: \"spacing\", role: \"24px\", value: \"1.5rem\" },\n { name: \"--spacing-8\", category: \"spacing\", role: \"32px\", value: \"2rem\" },\n\n // Typography — fixed scale\n { name: \"--text-2xs\", category: \"typography\", role: \"10px\", value: \"0.625rem\" },\n { name: \"--text-xs\", category: \"typography\", role: \"12px\", value: \"0.75rem\" },\n { name: \"--text-sm\", category: \"typography\", role: \"14px\", value: \"0.875rem\" },\n { name: \"--text-base\", category: \"typography\", role: \"16px\", value: \"1rem\" },\n { name: \"--text-lg\", category: \"typography\", role: \"18px\", value: \"1.125rem\" },\n { name: \"--text-xl\", category: \"typography\", role: \"20px\", value: \"1.25rem\" },\n { name: \"--text-2xl\", category: \"typography\", role: \"24px\", value: \"1.5rem\" },\n { name: \"--font-mono\", category: \"typography\", role: \"Monospace stack\" },\n\n // Radius — fixed scale\n { name: \"--radius-sm\", category: \"radius\", role: \"Small (chips, inputs)\", value: \"0.25rem\" },\n { name: \"--radius-md\", category: \"radius\", role: \"Medium (cards)\", value: \"0.5rem\" },\n { name: \"--radius-lg\", category: \"radius\", role: \"Large (dialogs)\", value: \"0.75rem\" },\n { name: \"--radius-full\", category: \"radius\", role: \"Pill / circle\", value: \"9999px\" },\n\n // Breakpoints — mobile-first min-widths\n { name: \"--breakpoint-xs\", category: \"breakpoint\", role: \"Mobile-first base (≥0px)\", value: \"0\" },\n { name: \"--breakpoint-sm\", category: \"breakpoint\", role: \"Phone landscape / tablet portrait\", value: \"640px\" },\n { name: \"--breakpoint-md\", category: \"breakpoint\", role: \"Tablet landscape\", value: \"768px\" },\n { name: \"--breakpoint-lg\", category: \"breakpoint\", role: \"Laptop\", value: \"1024px\" },\n { name: \"--breakpoint-xl\", category: \"breakpoint\", role: \"Desktop\", value: \"1280px\" },\n { name: \"--breakpoint-xxl\", category: \"breakpoint\", role: \"Wide desktop\", value: \"1536px\" },\n\n // Density — rebound by `data-density`\n { name: \"--density-element\", category: \"density\", role: \"Element height (Input/Button)\", axis: \"data-density\" },\n { name: \"--density-element-sm\", category: \"density\", role: \"Small element\", axis: \"data-density\" },\n { name: \"--density-element-lg\", category: \"density\", role: \"Large element\", axis: \"data-density\" },\n { name: \"--density-card\", category: \"density\", role: \"Card padding\", axis: \"data-density\" },\n { name: \"--density-page\", category: \"density\", role: \"Page (PageContent) padding\", axis: \"data-density\" },\n { name: \"--density-section\", category: \"density\", role: \"Section padding (cozy variant)\", axis: \"data-density\" },\n { name: \"--header-height\", category: \"density\", role: \"Topbar height\", axis: \"data-density\" },\n { name: \"--sidebar-width\", category: \"density\", role: \"Sidebar width (expanded)\", axis: \"data-density\" },\n { name: \"--sidebar-width-collapsed\", category: \"density\", role: \"Sidebar icon-only width\", axis: \"data-density\" },\n { name: \"--touch-target-min\", category: \"density\", role: \"Mobile touch target (does NOT scale)\", value: \"44px\" },\n\n // Motion — fixed timings\n { name: \"--transition-base\", category: \"motion\", role: \"Standard transition duration\", value: \"200ms\" },\n { name: \"--ease-out\", category: \"motion\", role: \"Out easing curve\", value: \"cubic-bezier(0, 0, 0.2, 1)\" },\n { name: \"--ease-in-out\", category: \"motion\", role: \"In-out easing\", value: \"cubic-bezier(0.4, 0, 0.2, 1)\" },\n];\n\nexport function tokensByCategory(category: TokenCategory): TokenEntry[] {\n return TOKENS.filter((t) => t.category === category);\n}\n","/**\n * Cardinal rules — mirrors the cardinal rules in `CLAUDE.md`. The MCP\n * server exposes them via `get_cardinal_rules` so consumer agents\n * can quote them when reviewing PRs or authoring new primitives.\n */\n\nexport interface CardinalRule {\n number: number;\n title: string;\n body: string;\n}\n\nexport const CARDINAL_RULES: CardinalRule[] = [\n { number: 1, title: \"Storybook is mandatory\", body: \"Every primitive / shell / composite has a paired story under `src/stories/<group>/<Name>.stories.tsx` covering every variant + state on light + dark.\" },\n { number: 2, title: \"Tokens, not utilities\", body: \"Visual values come from CSS custom properties in `src/tokens/` + `src/styles/theme.css`. Token-named Tailwind utilities (`bg-background`) are fine; raw value utilities (`bg-blue-500`) are forbidden. (ADR-0003)\" },\n { number: 3, title: \"Radix for interactive primitives\", body: \"Anything with keyboard / ARIA / portal wraps the relevant Radix primitive. (ADR-0001)\" },\n { number: 4, title: \"shadcn-style ownership\", body: \"Primitives are thin wrappers; consumers can fork the source in place. (ADR-0002)\" },\n { number: 5, title: \"One i18next singleton\", body: \"`initI18n()` in `src/i18n/index.ts` is THE instance; consumers extend via `addResourceBundle`. (ADR-0004)\" },\n { number: 6, title: \"WCAG 2.1 AA baseline\", body: \"Every interactive primitive passes axe-core (keyboard nav, ARIA, focus-visible, 4.5:1 contrast, `prefers-reduced-motion`). Stories double as a11y test surfaces.\" },\n { number: 7, title: \"SemVer 2.0 + Keep a Changelog 1.1\", body: \"Every release-worthy change updates `CHANGELOG.md` under `## Unreleased` in the same PR.\" },\n { number: 8, title: \"Inclusive naming\", body: \"`allowlist` / `denylist`, `main` / `primary` / `replica` / `secondary`, `they/them`. Never `whitelist` / `blacklist` / `master` / `slave`. Lint-enforced.\" },\n { number: 9, title: \"No marketing speak\", body: 'Banned: \"powerful\", \"robust\", \"blazing fast\", \"best-in-class\", \"seamless\", \"enterprise-grade\". State what it does.' },\n { number: 10, title: \"English is canonical for docs\", body: \"Localised docs at `docs/i18n/<bcp47>/`; front-matter tracks staleness.\" },\n { number: 11, title: \"Submodule discipline\", body: \"Two-PR workflow: (1) submodule PR → `main`, (2) umbrella PR → bump pin. Never push a pin to a SHA not on the submodule remote.\" },\n { number: 12, title: \"Branch + PR workflow\", body: \"`feat/<scope>` / `fix/<scope>` → submodule `main`. CI green + squash-merge. No direct push to `main`. `--no-verify` forbidden.\" },\n { number: 13, title: \"TypeScript strict\", body: \"Explicit types on every export. `forwardRef` for components; `ComponentPropsWithoutRef` for extension. No `any`. No `@ts-ignore` without comment + issue link.\" },\n { number: 14, title: \"Every third-party library is shadcn / Radix-recommended\", body: \"Locked stack: Radix UI, cmdk, sonner, lucide-react, react-aria-components + `@internationalized/date`, i18next + react-i18next, class-variance-authority + clsx + tailwind-merge. New peer → ADR documenting why it's the canonical choice.\" },\n { number: 15, title: \"No `@apply` re-encoding tokens\", body: \"Inside a primitive `.tsx`, don't `@apply` a Tailwind utility that re-encodes a token — reference the canonical CSS class from `tokens.css` instead. Composite token-named utilities remain fine.\" },\n { number: 16, title: \"CSS source-of-truth is `src/tokens/` + `src/styles/theme.css`\", body: \"A primitive that needs a new color / spacing / radius adds it there FIRST, then references it.\" },\n { number: 17, title: \"`src/stories/` ↔ `src/components/` parity\", body: \"Story set matches primitive set under each group. CI-checked via `scripts/check-stories-parity.mjs`.\" },\n { number: 18, title: \"`docs/reference/<group>/` ↔ `src/components/<group>/` parity\", body: \"Every primitive has a reference page; every page maps to a primitive. CI-checked via `scripts/check-docs-parity.mjs`.\" },\n { number: 19, title: \"No service-specific anything\", body: \"`me-service`, `forge-service`, `admin-service` never appear in source / comments / prop names. Per-deployment brand color lives at `[data-accent=\\\"<palette>\\\"]`.\" },\n { number: 20, title: \"No \\\"platform-only\\\" exports\", body: \"Every primitive ships via `package.json::exports`. Internal-only helpers stay un-exported.\" },\n { number: 21, title: \"Every component honours every theme axis\", body: \"`data-theme` (light / dark), `data-accent` (6 palettes), `data-density` (compact / default / comfortable), `data-font-size` (sm / base / lg / xl). Read from tokens, never hardcode values. Verify every PR via the Storybook toolbar sweep.\" },\n { number: 22, title: \"100% match to the design canon\", body: 'Every visual literal comes from `design-handoff/ui-system/<latest-bundle>/`. Token-pin canon literals; never substitute \"close enough\". If the bundle doesn\\'t cover a case — STOP, ask the user to mock it.' },\n { number: 23, title: \"Concept-first prop API\", body: \"One concept per prop. Reuse shared vocabulary (`size`, `variant`, `color`, `tone`, `accent`, `padding`, `density`, `orientation`, `placement`, `current`, `value` / `defaultValue` / `onValueChange`, `open` / `defaultOpen` / `onOpenChange`, `justify`, `sticky`, `offset`). Before adding a new prop or token: grep for an existing one.\" },\n { number: 24, title: \"Mobile-first\", body: \"Defaults target `xs` (≥0px); progressive enhancement via `sm:` / `md:` / `lg:` / `xl:` / `2xl:`. Touch targets ≥ 44 × 44 px (`--touch-target-min`, does NOT scale with density). Runtime viewport via `useBreakpoint`, never `window.innerWidth`. Stories render at narrow viewport first.\" },\n { number: 25, title: \"Stories are docs; UI is the primitive\", body: \"When a story looks wrong, fix the primitive / CSS / token. Never paper over with a story tweak. Story-only diff without a paired primitive / CSS / token diff is rejected.\" },\n { number: 26, title: \"Library isolation\", body: \"`dist/` ships only the consumer surface. Storybook, tests, scripts, design-handoff, `dev-probe/` stay out of npm. Every `dependencies` entry is `external` in `tsup`. Verification via `pnpm pack` + grep of `dist/`.\" },\n { number: 27, title: \"Per-group folder structure\", body: \"Primitives at `src/components/<group>/<Name>.tsx`; six canonical groups (general, layout, data-display, data-entry, feedback, navigation). Barrel = `src/components/primitives.ts` (single file). Stories + reference docs mirror the same group hierarchy.\" },\n { number: 28, title: \"`src/` folder taxonomy\", body: \"Three classes: consumer surface (matched by `tsup` entry + `package.json::exports`), Storybook-only (`src/stories/`), build-input-only (`cn.ts`, per-group sources consumed via the barrel). No `src/lib/`, `src/utils/`, `src/internal/`, `src/clients/`, `src/screens/`. Service clients live with the composite that uses them.\" },\n { number: 29, title: \"Stories consume framework primitives only\", body: \"No raw `<button>` / `<input>` / hand-rolled chips when a primitive exists. HTML semantics (`<section>`, `<article>`, …) for structure are fine. Inline `style={{}}` limited to layout / positioning; no colour / radius / typography overrides.\" },\n { number: 30, title: \"Story `render` returns JSX directly\", body: \"No opaque `<XyzDemo />` wrapper components, no zero-arg `Demo` helpers. Use `render: function StoryName() { … }` so Storybook's source panel shows runnable JSX, not `<XyzDemo />`.\" },\n { number: 31, title: \"No nested wrapper / convenience primitives\", body: \"One Radix base = one framework primitive. `<SimpleX>` over `<X>` is forbidden; add a prop to `<X>` instead. Composites under `src/components/composites/` that combine multiple primitives are NOT wrappers.\" },\n { number: 32, title: \"No redundant props\", body: \"Before adding a prop / item field / variant, grep the existing surface; if a field already covers the concept, use it. Top-level prop that re-expresses an item field (Timeline `pending` ↔ `items[i].animate`) is rejected.\" },\n { number: 33, title: \"Stories / source / docs name-synchronized\", body: \"No two names for the same export across the framework surface; no legacy aliases in stories / docs (source may keep an alias for a deprecation cycle, but the marketing surfaces use the canonical name only). Rename PR runs `grep -rn '<oldName>' src docs` and clears it.\" },\n { number: 34, title: \"Storybook source panel = real, copy-paste-ready code\", body: \"Storybook's react-docgen serializer strips every function value (`cell: ({row}) => <JSX/>`, `render: ({field}) => <Input/>`, `rowClassName`, `renderItem`, …) to `() => {}`. Any story whose `render` passes a function-valued prop, references a module-level helper (`StatusBadge`, `EMPLOYEE_COLUMNS`, etc.), or uses a render-prop pattern MUST override `parameters.docs.source.code` with the literal copy-paste-ready snippet — type aliases, helper functions spelled out, column definitions with cell JSX visible, inline data array. The `render()` callback stays as-is (module-level constants are fine for runtime performance); `source.code` is the marketing surface. Skip ONLY for stories whose JSX is purely static primitives Storybook can serialize verbatim (`<Button variant=\\\"primary\\\">Click</Button>`). The exemplar is `Table.Default` in `src/stories/data-display/Table.stories.tsx`.\" },\n { number: 35, title: \"Status chips never wrap\", body: \"A `StatusBadge` / `Badge` reads as one atomic unit. Its label must never break across lines — pin `white-space: nowrap` on the chip (done in `badge-layout.css`), especially inside narrow `DataTable` cells (スコープ / ステータス columns). If a cell is too tight, widen the column or shorten the label; never let the chip wrap.\" },\n { number: 36, title: \"StatusBadge tone/icon are the colour escape hatch\", body: \"`StatusBadge` auto-maps a fixed set of English lifecycle keys (active, draft, pending, scheduled, cancelled, failed, …) to tone + icon. For ANY other value — localized labels (公開中, アクティブ) or categorical tiers (会員ランク, 契約プラン) — pass `tone` explicitly (success | warning | destructive | info | neutral) and, for non-lifecycle tiers, `icon={null}` to drop the misleading glyph. Don't let domain labels fall back to neutral grey + ○. Map domain→tone in the CONSUMER layer; the framework only provides the props.\" },\n { number: 37, title: \"DataTable is full-width — never inside a narrow grid column\", body: \"A multi-column `DataTable` occupies its OWN row at the page's full width: `<Card><CardContent flush><DataTable …/></CardContent></Card>`. Never nest it in a `lg:col-span-2` of a `ResponsiveGrid columns={3}` beside a chart — the columns get squeezed until CJK text collapses to one character per line. Charts / KPI cards go in their own row ABOVE the table. (See the `inertia-list-page` pattern.)\" },\n { number: 38, title: \"FilterBar stays OUT of CardContent flush\", body: \"`CardContent flush` strips horizontal padding for edge-to-edge tables. A `FilterBar` placed inside it loses all padding and sticks to the card edge. Render `FilterBar` as a STANDALONE block above the table card; wrap ONLY the `DataTable` / `EmptyState` in the `Card` + `CardContent flush`. Order on a list page: KPIs → FilterBar → table card.\" },\n { number: 39, title: \"Long text columns get an explicit width\", body: \"For columns whose value can be long (name / title / segment / address), set `col.width` to a Tailwind width class (e.g. `w-64`, `w-48`) so the column reserves space instead of shrinking and wrapping to many lines; leave numeric / status columns auto. Table cells default to `white-space: nowrap`, so an over-tight table scrolls horizontally rather than crushing — give the important columns real widths so the default layout reads well before any scroll.\" },\n { number: 40, title: \"Pages are mobile-first\", body: \"Author and verify every page at 320–390px FIRST. Spacing comes only from `Stack` / `Inline` `gap` + `ResponsiveGrid columns={2|3|4}` (which collapse to a single column on narrow screens) — never raw `p-*` / `gap-*` / `space-*` utilities for page layout. Wide tables scroll horizontally on small screens (don't force-fit them); dialogs and sheets are full-height on mobile. Touch targets ≥ 44×44px.\" },\n];\n\nexport function findRule(num: number): CardinalRule | undefined {\n return CARDINAL_RULES.find((r) => r.number === num);\n}\n","/**\n * Canonical code patterns for common consumer scenarios. The MCP\n * server returns one of these whenever a consumer asks \"how do I X\n * with @godxjp/ui?\" — saves the LLM from synthesising from primitive\n * docs over and over.\n *\n * Every pattern is copy-paste-ready: imports listed at top, types\n * spelled out, inline JSX with no opaque helpers.\n */\n\nexport interface PatternEntry {\n /** URL-safe slug. */\n name: string;\n /** One-line elevator pitch. */\n tagline: string;\n /** Categories — used for search. */\n tags: string[];\n /** Full snippet. */\n code: string;\n}\n\nexport const PATTERNS: PatternEntry[] = [\n {\n name: \"common-fixes\",\n tagline: \"Fix the most common @godxjp/ui consumer mistakes & visual bugs (CardStat double-border, grey StatusBadge, crushed/empty table headers, washed-out sidebar footer, Inertia layout crash, SSR hydration). Before → after.\",\n tags: [\"fixes\", \"migration\", \"bug\", \"cardstat\", \"statusbadge\", \"datatable\", \"sidebar\", \"gotcha\", \"review\"],\n code: `// ───────────────────────────────────────────────────────────────────────\n// 0) ★ MOST COMMON: <Card> body has NO padding (content is flush against the edges)\n// Cause: the bare <Card> has ZERO inner padding — it MUST contain <CardContent>.\n// Don't hand-roll padding with className=\"p-4\" on the Card either.\n// ❌ <Card><Stack gap=\"md\">…fields…</Stack></Card> // flush, no padding\n// ❌ <Card className=\"p-4\">…fields…</Card> // hand-rolled padding\n// ✅ <Card><CardContent><Stack gap=\"md\">…fields…</Stack></CardContent></Card>\n// Titles → <CardHeader><CardTitle>. Only go flush deliberately for a full-bleed table:\n// ✅ <Card><CardContent flush><DataTable/></CardContent></Card>\n// GENERAL RULE — compose godx-ui primitives FULLY; never hand-roll what one ships:\n// padding → CardContent (not p-4) · controls → Input/Select/Button (not raw <input>/<select>/<button>)\n// empty rows → DataTable's built-in empty / <EmptyState> (not a custom data.length===0 guard).\n// If a primitive exists, USE it — don't reinvent it.\n\n// 1) CardStat shows a DOUBLE border (too thick)\n// Cause: CardStat IS already a bordered Card. Don't wrap it.\n// ❌ <Card><CardContent><CardStat label=\"x\" value=\"1\" /></CardContent></Card>\n// ✅ <ResponsiveGrid columns={4}><CardStat label=\"x\" value=\"1\" /></ResponsiveGrid>\n// Need a section title? Use a heading, NOT a Card:\n// ✅ <Stack gap=\"sm\"><div className=\"text-sm font-medium\">KPI</div>\n// <ResponsiveGrid columns={4}><CardStat .../></ResponsiveGrid></Stack>\n\n// 2) StatusBadge renders grey with a ○ (no colour) for localized/tier labels\n// Cause: it auto-maps only English lifecycle keys. (@godxjp/ui >= 6.1)\n// ❌ <StatusBadge status=\"プレミアム\" />\n// ✅ <StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} /> // tier → pill, no icon\n// ✅ <StatusBadge status=\"active\" label=\"公開中\" /> // lifecycle → keep icon\n\n// 3) Table text collapses to one char per line, or a chip wraps\n// Cause: pre-6.1.2. (@godxjp/ui >= 6.1.2 → cells + chips are nowrap)\n// ✅ npm i @godxjp/ui@^6.2.0\n// ✅ give long columns a width: { key: \"name\", header: \"氏名\", width: \"w-64\" }\n\n// 4) Empty (icon/action) column header shows a blank grey block\n// (@godxjp/ui >= 6.2.0 auto-hides it: [data-slot=table-head][data-empty] → transparent)\n// ✅ npm i @godxjp/ui@^6.2.0 // header: \"\" now renders a transparent cell\n\n// 5) DataTable columns are crushed / squeezed\n// Cause: the table is nested in a narrow grid column.\n// ❌ <ResponsiveGrid columns={3}><div className=\"lg:col-span-2\"><Card><DataTable/></Card></div></ResponsiveGrid>\n// ✅ Table gets its OWN full-width row: <Card><CardContent flush><DataTable/></CardContent></Card>\n\n// 6) FilterBar has no padding (sticks to the edge)\n// Cause: it's inside CardContent flush (flush strips padding — that's for tables).\n// ❌ <Card><CardContent flush><FilterBar/><DataTable/></CardContent></Card>\n// ✅ <FilterBar/> then <Card><CardContent flush><DataTable/></CardContent></Card>\n\n// 7) Sidebar footer looks washed-out / off-design\n// Cause: raw opacity-*/text-[11px]. Use semantic tokens.\n// ✅ <div className=\"text-muted-foreground text-xs\">\n// <div className=\"text-foreground font-medium\">{name}</div><div>{role}</div></div>\n\n// 8) Inertia: \"Objects are not valid as a React child {errors, auth, …}\"\n// Cause: persistent layout passed as a render fn. Use the ARRAY form.\n// ❌ Page.layout = (page) => <Layout>{page}</Layout>\n// ✅ Page.layout = [Layout] // Layout is ({children}) => ...\n\n// 9) Inertia v3 hydration mismatch (\"server rendered text didn't match the client\")\n// Cause: Math.random()/argless new Date() during render (SSR ≠ client).\n// ✅ seed deterministically by index, or compute in an event handler.\n\n// 10) Hide a column on mobile / sign-aware KPI delta (@godxjp/ui >= 6.2.0)\n// ✅ columns: [{ key: \"email\", header: \"メール\", hiddenOnMobile: true }]\n// ✅ <CardStat label=\"売上\" value=\"¥8.2M\" delta=\"+12%\" /> // + green / - red; inverse flips`,\n },\n\n {\n name: \"signup-form\",\n tagline: \"Card-wrapped sign-up form using react-hook-form + zod with FormField/Input and a CardFooter action bar (real @godxjp/ui API).\",\n tags: [\"form\", \"auth\", \"sign-up\", \"zod\", \"validation\", \"react-hook-form\"],\n code: `import { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport { Card, CardHeader, CardTitle, CardContent, CardFooter } from \"@godxjp/ui/data-display\";\nimport { FormField, Input } from \"@godxjp/ui/data-entry\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { Stack } from \"@godxjp/ui/layout\";\n\nconst schema = z.object({\n name: z.string().min(1, \"氏名は必須です\"),\n email: z.string().email(\"有効なメールアドレスを入力してください\"),\n});\ntype Values = z.infer<typeof schema>;\n\nexport function SignUpCard() {\n const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm<Values>({ resolver: zodResolver(schema) });\n const onSubmit = handleSubmit(async (v) => {\n await fetch(\"/api/signup\", { method: \"POST\", body: JSON.stringify(v) });\n });\n return (\n <Card>\n <CardHeader><CardTitle>アカウント作成</CardTitle></CardHeader>\n <CardContent>\n <form id=\"signup\" onSubmit={onSubmit}>\n <Stack gap=\"md\">\n <FormField id=\"name\" label=\"氏名\" required error={errors.name?.message}>\n <Input id=\"name\" {...register(\"name\")} />\n </FormField>\n <FormField id=\"email\" label=\"メールアドレス\" required error={errors.email?.message}>\n <Input id=\"email\" type=\"email\" {...register(\"email\")} />\n </FormField>\n </Stack>\n </form>\n </CardContent>\n <CardFooter separated>\n <Button type=\"submit\" form=\"signup\" disabled={isSubmitting}>アカウントを作成</Button>\n </CardFooter>\n </Card>\n );\n}`,\n },\n\n {\n name: \"settings-tabs\",\n tagline: \"Sectioned settings inside a Card with Tabs + FormField + Select + Switch (real @godxjp/ui API).\",\n tags: [\"settings\", \"form\", \"tabs\", \"admin\"],\n code: `import { Card, CardContent } from \"@godxjp/ui/data-display\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"@godxjp/ui/navigation\";\nimport { FormField, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Switch, Label } from \"@godxjp/ui/data-entry\";\nimport { Stack } from \"@godxjp/ui/layout\";\n\nexport function WorkspaceSettings() {\n return (\n <Card>\n <CardContent>\n <Tabs defaultValue=\"general\">\n <TabsList>\n <TabsTrigger value=\"general\">基本情報</TabsTrigger>\n <TabsTrigger value=\"notify\">通知</TabsTrigger>\n </TabsList>\n <TabsContent value=\"general\">\n <Stack gap=\"md\">\n <FormField id=\"ws-name\" label=\"名前\" required><Input id=\"ws-name\" /></FormField>\n <FormField id=\"visibility\" label=\"公開範囲\">\n <Select defaultValue=\"internal\">\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"private\">プライベート</SelectItem>\n <SelectItem value=\"internal\">社内公開</SelectItem>\n <SelectItem value=\"public\">公開</SelectItem>\n </SelectContent>\n </Select>\n </FormField>\n </Stack>\n </TabsContent>\n <TabsContent value=\"notify\">\n <div className=\"flex items-center gap-2\">\n <Switch id=\"notify-comment\" defaultChecked />\n <Label htmlFor=\"notify-comment\">コメント通知を受け取る</Label>\n </div>\n </TabsContent>\n </Tabs>\n </CardContent>\n </Card>\n );\n}`,\n },\n\n {\n name: \"confirm-destructive\",\n tagline: \"Type-to-confirm destructive dialog — Dialog mode=\\\"confirm\\\" + Input gate + toast (real @godxjp/ui API).\",\n tags: [\"dialog\", \"confirm\", \"destructive\", \"delete\"],\n code: `import { useState } from \"react\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from \"@godxjp/ui/feedback\";\nimport { Input } from \"@godxjp/ui/data-entry\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { Stack } from \"@godxjp/ui/layout\";\nimport { toast } from \"sonner\";\n\nexport function DeleteProjectDialog({ open, onOpenChange, slug }: { open: boolean; onOpenChange: (v: boolean) => void; slug: string }) {\n const [confirm, setConfirm] = useState(\"\");\n return (\n <Dialog open={open} onOpenChange={onOpenChange} mode=\"confirm\">\n <DialogContent>\n <DialogHeader>\n <DialogTitle>プロジェクトを削除</DialogTitle>\n <DialogDescription>この操作は取り消せません。確認のためプロジェクト名 \"{slug}\" と入力してください。</DialogDescription>\n </DialogHeader>\n <Stack gap=\"md\">\n <Input value={confirm} onChange={(e) => setConfirm(e.target.value)} placeholder={slug} />\n </Stack>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>キャンセル</Button>\n <Button variant=\"destructive\" disabled={confirm !== slug} onClick={() => { toast.success(\"削除しました\"); onOpenChange(false); }}>完全に削除</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}`,\n },\n\n {\n name: \"deferred-loading\",\n tagline: \"Inertia deferred props with a Skeleton fallback — SkeletonTable while data loads, then DataTable (real @godxjp/ui API).\",\n tags: [\"loading\", \"skeleton\", \"deferred\", \"inertia\", \"table\"],\n code: `// Server (Laravel): defer the heavy prop\n// Inertia::render('crm/coupons/index', [\n// 'coupons' => Inertia::defer(fn () => Coupon::all()),\n// ]);\nimport { Card, CardContent, DataTable } from \"@godxjp/ui/data-display\";\nimport type { ColumnDef } from \"@godxjp/ui/data-display\";\nimport { SkeletonTable } from \"@godxjp/ui/feedback\";\n\ntype Coupon = { id: string; name: string };\nconst columns: ColumnDef<Coupon>[] = [{ key: \"name\", header: \"クーポン名\" }];\n\n// coupons is undefined until the deferred request resolves\nexport default function Coupons({ coupons }: { coupons?: Coupon[] }) {\n return (\n <Card>\n <CardContent flush>\n {!coupons\n ? <SkeletonTable rows={10} columns={6} />\n : <DataTable data={coupons} columns={columns} getRowId={(c) => c.id} />}\n </CardContent>\n </Card>\n );\n}`,\n },\n\n {\n name: \"inertia-list-page\",\n tagline: \"Inertia + @godxjp/ui list page — PageContainer + FilterBar + DataTable + StatusBadge + Pagination (current primitive API).\",\n tags: [\"inertia\", \"list\", \"table\", \"page\", \"filter\", \"pagination\", \"datatable\", \"crm\"],\n code: `import { Head, router } from \"@inertiajs/react\"\nimport { useMemo, useState } from \"react\"\nimport { PageContainer, ResponsiveGrid, Stack } from \"@godxjp/ui/layout\"\nimport { Card, CardContent, CardStat, DataTable, EmptyState, StatusBadge, type ColumnDef } from \"@godxjp/ui/data-display\"\nimport { SearchInput, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@godxjp/ui/data-entry\"\nimport { FilterBar, FilterGroup, Pagination } from \"@godxjp/ui/navigation\"\nimport { formatDate } from \"@godxjp/ui/datetime\"\nimport { withCrmLayout } from \"@/layouts/crm-layout\" // see \"inertia-persistent-layout\"\n\ntype Coupon = { id: string; name: string; status: string; scope: string; validFrom: string; validTo: string; usage: number }\nconst PAGE_SIZE = 10\n\nfunction Coupons({ coupons }: { coupons: Coupon[] }) {\n const [q, setQ] = useState(\"\")\n const [status, setStatus] = useState(\"all\")\n const [page, setPage] = useState(1)\n\n const filtered = useMemo(() => coupons.filter((c) => {\n if (q && !c.name.toLowerCase().includes(q.toLowerCase())) return false\n if (status !== \"all\" && c.status !== status) return false\n return true\n }), [coupons, q, status])\n const paged = filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE)\n\n // ColumnDef = { key, header, render?, align?: \"left\"|\"center\"|\"right\", sortable?, width? }\n const columns: ColumnDef<Coupon>[] = [\n { key: \"name\", header: \"クーポン名\", render: (c) => <span className=\"font-medium\">{c.name}</span> },\n { key: \"scope\", header: \"スコープ\", render: (c) => <StatusBadge status={c.scope} tone=\"info\" icon={null} /> },\n { key: \"status\", header: \"ステータス\", render: (c) => <StatusBadge status={c.status} /> },\n { key: \"valid\", header: \"有効期間\", render: (c) => \\`\\${formatDate(c.validFrom)} 〜 \\${formatDate(c.validTo)}\\` },\n { key: \"usage\", header: \"利用数\", align: \"right\", render: (c) => c.usage.toLocaleString() },\n ]\n\n return (\n <>\n <Head title=\"クーポン管理\" />\n {/* RULE: every page wraps in PageContainer; spacing via Stack/ResponsiveGrid, never p-*/gap-* */}\n <PageContainer title=\"クーポン管理\" subtitle=\"配信中のクーポン一覧\">\n <Stack gap=\"lg\">\n <ResponsiveGrid columns={3}>\n <CardStat label=\"公開中\" value={coupons.filter((c) => c.status === \"公開中\").length} />\n <CardStat label=\"総利用数\" value={coupons.reduce((s, c) => s + c.usage, 0).toLocaleString()} />\n <CardStat label=\"件数\" value={coupons.length} />\n </ResponsiveGrid>\n\n <FilterBar hasActiveFilters={q !== \"\" || status !== \"all\"} onClear={() => { setQ(\"\"); setStatus(\"all\"); setPage(1) }}>\n {/* SearchInput is value + onSearch(v) — NOT onChange */}\n <SearchInput placeholder=\"クーポン名で検索\" value={q} onSearch={(v) => { setQ(v); setPage(1) }} />\n <FilterGroup label=\"ステータス\">\n <Select value={status} onValueChange={(v) => { setStatus(v); setPage(1) }}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">全ステータス</SelectItem>\n <SelectItem value=\"公開中\">公開中</SelectItem>\n <SelectItem value=\"下書き\">下書き</SelectItem>\n </SelectContent>\n </Select>\n </FilterGroup>\n </FilterBar>\n\n <Card>\n <CardContent flush>\n {filtered.length === 0\n ? <EmptyState title=\"該当するクーポンがありません\" description=\"検索条件を変更してください。\" />\n : <DataTable data={paged} columns={columns} getRowId={(c) => c.id} onRowClick={(c) => router.visit(\\`/coupons/\\${c.id}\\`)} />}\n </CardContent>\n </Card>\n\n {filtered.length > PAGE_SIZE && (\n <Pagination current={page} total={filtered.length} pageSize={PAGE_SIZE} showTotal onChange={(p) => setPage(p)} />\n )}\n </Stack>\n </PageContainer>\n </>\n )\n}\n\nCoupons.layout = withCrmLayout\nexport default Coupons`,\n },\n\n {\n name: \"inertia-detail-page\",\n tagline: \"Inertia detail page — receives {id} prop, KeyValueGrid (compound) + CardStat + EmptyState fallback.\",\n tags: [\"inertia\", \"detail\", \"show\", \"page\", \"keyvaluegrid\", \"crm\"],\n code: `import { Head, router } from \"@inertiajs/react\"\nimport { PageContainer, ResponsiveGrid, Stack } from \"@godxjp/ui/layout\"\nimport { Card, CardContent, CardStat, EmptyState, KeyValueGrid, StatusBadge } from \"@godxjp/ui/data-display\"\nimport { Button } from \"@godxjp/ui/general\"\nimport { formatDate } from \"@godxjp/ui/datetime\"\nimport { ArrowLeft } from \"lucide-react\"\nimport { withCrmLayout } from \"@/layouts/crm-layout\"\n\n// Detail routes pass the param as an Inertia prop:\n// Route::get('/members/{id}', fn ($id) => Inertia::render('crm/members/show', ['id' => $id]))\nfunction MemberShow({ id }: { id: string }) {\n const member = MEMBERS.find((m) => m.id === id)\n\n if (!member) {\n return (\n <>\n <Head title=\"会員詳細\" />\n <PageContainer title=\"会員詳細\" subtitle=\"会員が見つかりません\">\n <EmptyState title=\"会員が見つかりません\" description={\\`ID「\\${id}」は存在しません。\\`} />\n <Button variant=\"outline\" onClick={() => router.visit(\"/members\")}><ArrowLeft className=\"size-4\" />一覧へ戻る</Button>\n </PageContainer>\n </>\n )\n }\n\n return (\n <>\n <Head title={member.name} />\n <PageContainer title={member.name} subtitle={\\`\\${member.id} / \\${member.rank}\\`}>\n <Stack gap=\"lg\">\n <ResponsiveGrid columns={4}>\n <CardStat label=\"累計購入額\" value={\\`¥\\${member.total.toLocaleString()}\\`} />\n <CardStat label=\"来店回数\" value={member.visits} />\n <CardStat label=\"ポイント\" value={member.points.toLocaleString()} />\n <CardStat label=\"LTV\" value={\\`¥\\${member.ltv.toLocaleString()}\\`} />\n </ResponsiveGrid>\n <Card>\n <CardContent>\n {/* KeyValueGrid is COMPOUND — value goes in children, not a prop */}\n <KeyValueGrid columns={2}>\n <KeyValueGrid.Item label=\"氏名\">{member.name}</KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"ランク\"><StatusBadge status={member.rank} tone=\"info\" icon={null} /></KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"ステータス\"><StatusBadge status={member.status} /></KeyValueGrid.Item>\n <KeyValueGrid.Item label=\"登録日\">{formatDate(member.registeredAt)}</KeyValueGrid.Item>\n </KeyValueGrid>\n </CardContent>\n </Card>\n </Stack>\n </PageContainer>\n </>\n )\n}\n\nMemberShow.layout = withCrmLayout\nexport default MemberShow`,\n },\n\n {\n name: \"inertia-persistent-layout\",\n tagline: \"Inertia persistent layout (AppShell+Sidebar) — the array-form gotcha + the SSR/Math.random gotcha.\",\n tags: [\"inertia\", \"layout\", \"appshell\", \"sidebar\", \"ssr\", \"hydration\", \"gotcha\"],\n code: `// resources/js/layouts/crm-layout.tsx\nimport { router, usePage } from \"@inertiajs/react\"\nimport { AppShell, Sidebar } from \"@godxjp/ui/layout\"\nimport { LayoutDashboard } from \"lucide-react\"\nimport type { ReactNode } from \"react\"\n\nexport function CrmLayout({ children }: { children: ReactNode }) {\n const { url } = usePage()\n const sections = [{ label: \"メイン\", items: [{ id: \"/dashboard\", label: \"ダッシュボード\", icon: LayoutDashboard }] }]\n return (\n <AppShell sidebar={<Sidebar activeId={url} onSelect={(id) => router.visit(id)} sections={sections} product={{ name: \"JOVY CRM\" }} />}>\n {children}\n </AppShell>\n )\n}\n\n// ⚠️ GOTCHA 1 — persistent layout MUST be the ARRAY form.\n// A render fn \\`(page) => <CrmLayout>{page}</CrmLayout>\\` is indistinguishable from a\n// component; Inertia React calls it with the page-PROPS object and renders that\n// object as a child → \"Objects are not valid as a React child {errors, auth, …}\".\nexport const withCrmLayout = [CrmLayout] // ✅ array → Inertia passes the page as children\n// page usage: Dashboard.layout = withCrmLayout\n\n// ⚠️ GOTCHA 2 — Inertia v3 SSRs even in \\`npm run dev\\`. NEVER call Math.random() or\n// argless new Date() during render (e.g. fabricating chart/demo numbers) → React\n// hydration mismatch (\"server rendered text didn't match the client\"). Seed\n// deterministically by index, or compute inside an event handler:\nconst seeded = (n: number) => { const x = Math.sin((n + 1) * 99.71) * 1e4; return x - Math.floor(x) }`,\n },\n\n {\n name: \"status-badge-coloring\",\n tagline: \"Colour a StatusBadge for localized labels and tiers via tone + icon (escape-hatch props, @godxjp/ui ≥ 6.1).\",\n tags: [\"statusbadge\", \"badge\", \"tone\", \"color\", \"status\", \"tier\", \"table\"],\n code: `import { StatusBadge } from \"@godxjp/ui/data-display\"\n\n// StatusBadge auto-colours a fixed set of English LIFECYCLE keys:\n// active/completed (success ✓) · draft (neutral ○) · pending/temporary (warning ⏱)\n// scheduled/sending (info) · cancelled (neutral) · failed/deleted/bounced (destructive ✕)\n// Anything else (localized labels, tiers) falls back to neutral grey ○ unless you override.\n\n// 1) Lifecycle with localized text — map to the key, keep JP via \\`label\\` (icon stays):\n<StatusBadge status=\"active\" label=\"公開中\" /> // green ✓ 公開中\n\n// 2) Unknown label — set tone explicitly (no icon, since the key is unknown):\n<StatusBadge status=\"公開中\" tone=\"success\" />\n\n// 3) Tier / category — coloured pill, drop the misleading glyph with icon={null}:\n<StatusBadge status=\"プレミアム\" tone=\"success\" icon={null} />\n<StatusBadge status=\"ゴールド\" tone=\"warning\" icon={null} />\n<StatusBadge status=\"法人共通\" tone=\"info\" icon={null} />\n\n// tone: \"success\" | \"warning\" | \"destructive\" | \"info\" | \"neutral\" (import type StatusBadgeTone)\n// RULE: a chip never wraps — it is pinned white-space: nowrap, so it stays one line in\n// narrow table cells. Centralize the domain→tone map in ONE small consumer wrapper and\n// import that instead of the raw StatusBadge across pages.`,\n },\n];\n\nexport function findPattern(name: string): PatternEntry | undefined {\n const slug = name.trim().toLowerCase();\n return PATTERNS.find((p) => p.name === slug);\n}\n\nexport function searchPatterns(query: string): PatternEntry[] {\n const q = query.trim().toLowerCase();\n if (q === \"\") return PATTERNS;\n return PATTERNS.filter(\n (p) =>\n p.name.includes(q) ||\n p.tagline.toLowerCase().includes(q) ||\n p.tags.some((t) => t.includes(q)),\n );\n}\n","/**\n * Skills index — TOKEN-EFFICIENT registry of every taste / design\n * skill the MCP exposes. The agent uses `list_skills` to discover\n * (returns just id + name + tagline + section list) then\n * `get_skill_section` to drill into one section.\n *\n * Sources synthesised from Leonxlnx/taste-skill + framework-native\n * design knowledge. Body strings are stored separately in their\n * existing data files (design-thinking.ts, anti-ai-tells.ts, etc.)\n * to avoid duplication.\n */\n\nexport interface SkillSection {\n /** URL-safe section id. */\n id: string;\n /** Display title. */\n title: string;\n /** One-line tagline of what this section covers. */\n tagline: string;\n /** Body — Markdown. */\n body: string;\n}\n\nexport interface Skill {\n id: string;\n name: string;\n /** When to reach for this skill — written so the router can match a task to it. */\n whenToUse: string;\n /** Source attribution. */\n source: string;\n sections: SkillSection[];\n}\n\nexport const SKILLS: Skill[] = [\n // ── taste (foundational) ───────────────────────────────────────\n {\n id: \"taste\",\n name: \"Taste baseline — Senior UI/UX engineering\",\n whenToUse:\n \"Default for any production app screen. Metric-based rules, strict component architecture, CSS hardware acceleration, balanced design engineering.\",\n source: \"Leonxlnx/taste-skill (root) + @godxjp/ui design-thinking.ts\",\n sections: [\n {\n id: \"mobile-first\",\n title: \"Mobile-first non-negotiable\",\n tagline:\n \"Defaults target xs (≥0px); enhance via sm: / md: / lg: / xl: / 2xl:\",\n body: `Cardinal rule 24. Touch targets ≥ 44×44 px. NEVER read\nwindow.innerWidth — use useBreakpoint(). Stories render at narrow\nviewport first. Multi-column layouts: grid grid-cols-1 sm:grid-cols-N.\nEXCEPTION: name pairs (姓+名) use grid-cols-2 always.`,\n },\n {\n id: \"one-intent-per-screen\",\n title: \"One intent per screen\",\n tagline: \"Pick the ONE primary question this page answers. 60-80% visual weight to it.\",\n body: `Wall-of-cards dashboards are AI slop. Show 1-2 hero metrics\n+ ONE primary list + contextual actions. Tertiary content lives in\nSheet / DropdownMenu / next page. The 8-stat-card grid pattern is a\nRED FLAG — it means \"I couldn't decide what mattered\".`,\n },\n {\n id: \"type-hierarchy\",\n title: \"Type does the hierarchy work\",\n tagline: \"Weight + size + color, NOT colored background blocks.\",\n body: `Typography.Title size={1..5} is the canonical scale. h2 → h3 → h4\neach ~75% of previous. Don't skip levels. Body = Typography.Paragraph.\nMetadata = Typography.Text color=\"secondary\". Type contrast alone IS\nthe hierarchy — colored background blocks for every section is AI\nslop. Reserve colored bg for genuinely different surfaces (Card vs\npage, Alert vs body).`,\n },\n {\n id: \"whitespace-is-content\",\n title: \"Whitespace IS content\",\n tagline: \"Use the smallest spacing step that visually separates concepts.\",\n body: `Spacing ladder: --spacing-1 (4px) for tight groups, -2 (8) for\ncontrol pairs, -3 (12) for related controls in form, -4 (16) for\nsections, -6 (24) for cards in grid, -8 (32) for page rhythm.\n\"Premium via excess padding\" (everything spacing-6 to feel premium)\nis wrong — undersized content lost in oceans of grey. Premium = VARIED\nspacing — tight where related, generous where not.`,\n },\n {\n id: \"two-accents\",\n title: \"Two accents do real work — not eight\",\n tagline: \"ONE brand color for action + ONE semantic color contextually. Not a rainbow.\",\n body: `Use --primary for actions (Button, link, focus ring) + ONE\nsemantic (destructive for delete confirm, warning for deadline alert,\nsuccess for completed state). NEVER a rainbow tag wall. Tag variety\nvia appearance (soft/solid/outline) of the SAME hue, not different\nhues.`,\n },\n {\n id: \"form-discipline\",\n title: \"Form discipline — label, help, error always\",\n tagline: \"Every input has explicit label + help + error wired via FormField.\",\n body: `Never placeholder-as-label (disappears on focus). Use\n<FormField label description /> — it wires the Radix Label, the\ndescription text, and the error via aria-describedby + role=\"alert\"\nautomatically. Server errors as inline near the field, NOT as toasts\n(SR can't announce a disappearing toast).`,\n },\n {\n id: \"loading-states\",\n title: \"Skeleton for INIT, Spinner for ACTIVE work\",\n tagline: \"Different states for different moments — never mix.\",\n body: `<Form loading={{ kind: \"skeleton\" }}> while fetching existing\nvalues (no data yet — maintain layout, prevent flash). <Form loading>\n(boolean true) while saving (data is there, you're transforming).\nSkeleton during save is wrong (user sees structure they already saw —\nbroken). Spinner during init is wrong (nothing to spin over).`,\n },\n ],\n },\n\n // ── soft (Awwwards / premium agency) ───────────────────────────\n {\n id: \"soft\",\n name: \"Awwwards-tier — $150k agency build\",\n whenToUse:\n \"Premium agency brief — marketing site, hero pages, product showcase. NOT every internal SaaS screen. Apply when the brief asks for 'Linear-tier', 'Apple-esque', 'Awwwards-style'.\",\n source: \"Leonxlnx/taste-skill/soft-skill\",\n sections: [\n {\n id: \"absolute-zero\",\n title: \"Absolute Zero — banned defaults\",\n tagline: \"Inter / Roboto / Lucide / shadow-md / 3-col Bootstrap / linear easing — banned.\",\n body: `BANNED FONTS: Inter, Roboto, Arial, Open Sans, Helvetica → use Geist\n/ Clash Display / PP Editorial New / Plus Jakarta Sans.\nBANNED ICONS: standard thick Lucide / Material → use Phosphor Light /\nRemix Line.\nBANNED BORDERS: generic 1px solid gray → hairline rings (ring-1\nring-black/5), tinted borders, OR whitespace as separator.\nBANNED SHADOWS: shadow-md, rgba(0,0,0,0.3) → ultra-diffuse low-opacity\n(<0.05), TINTED to background.\nBANNED LAYOUTS: edge-to-edge sticky navbars, symmetric 3-col → floating\nglass nav pills, asymmetric bento grids.\nBANNED MOTION: linear / ease-in-out / instant → custom cubic-bezier\n(0.32, 0.72, 0, 1), spring physics, scroll interpolation.`,\n },\n {\n id: \"vibe-archetypes\",\n title: \"3 Vibe Archetypes (pick 1)\",\n tagline: \"Ethereal Glass (SaaS/AI) | Editorial Luxury (Lifestyle/Agency) | Soft Structuralism (Consumer/Health)\",\n body: `1. ETHEREAL GLASS (SaaS / AI / Tech): OLED black #050505, radial\n mesh gradients (purple/emerald orbs), Vantablack cards with heavy\n backdrop-blur-2xl, white/10 hairlines. Wide geometric Grotesk.\n2. EDITORIAL LUXURY (Lifestyle / Real Estate / Agency): Warm creams\n #FDFBF7, muted sage, deep espresso. High-contrast Variable Serif\n for massive headings. CSS noise overlay opacity-0.03 for paper.\n3. SOFT STRUCTURALISM (Consumer / Health / Portfolio): Silver-grey\n or pure white. Massive bold Grotesk typography. Airy floating\n components, unbelievably soft diffused ambient shadows\n (shadow-[0_30px_60px_-30px_rgba(0,0,0,0.06)]).`,\n },\n {\n id: \"layout-archetypes\",\n title: \"3 Layout Archetypes (pick 1)\",\n tagline: \"Asymmetric Bento | Z-Axis Cascade | Editorial Split — ALL collapse to single-col on mobile.\",\n body: `1. ASYMMETRIC BENTO: Masonry CSS Grid varying card sizes\n (col-span-8 row-span-2 next to stacked col-span-4). Mobile:\n grid-cols-1, gap-6, all col-span reset to 1.\n2. Z-AXIS CASCADE: Elements stacked like physical cards, slightly\n overlapping with varying depth + -2deg/3deg rotations. Mobile:\n REMOVE rotations + negative-margin overlaps below 768px (touch\n conflicts), stack vertically.\n3. EDITORIAL SPLIT: Massive typography w-1/2 left, interactive\n scrollable content right. Mobile: full-width vertical stack,\n typography on top, content below with horizontal scroll preserved.\n\nUNIVERSAL MOBILE OVERRIDE: w-full, px-4, py-8 below 768px. NEVER\nh-screen — always min-h-[100dvh] (iOS Safari viewport jump fix).`,\n },\n {\n id: \"double-bezel\",\n title: \"Double-Bezel / Doppelrand architecture\",\n tagline: \"Cards nested like physical hardware — glass plate in aluminum tray.\",\n body: `Never flat. Wrap every premium card in two nested enclosures:\n\nOUTER SHELL: subtle bg (bg-black/5 or bg-white/5), hairline outer\nborder (ring-1 ring-black/5 or border border-white/10), padding\np-1.5 / p-2, large outer radius (rounded-[2rem]).\n\nINNER CORE: distinct background, inner highlight\n(shadow-[inset_0_1px_1px_rgba(255,255,255,0.15)]), mathematically\nsmaller radius (rounded-[calc(2rem-0.375rem)]) for concentric curves.\n\nThe math gives \"machined hardware\" look. Concentric curves = human\neye reads \"precision\".`,\n },\n {\n id: \"button-in-button\",\n title: \"Button-in-Button trailing icon\",\n tagline: \"Trailing arrow lives in its OWN nested pill — not naked next to text.\",\n body: `Primary buttons: rounded-full, px-6 py-3 generous padding. Trailing\narrow/icon NEVER sits naked next to text. Nests in its own circular\nwrapper: w-8 h-8 rounded-full bg-black/5 flex items-center justify-\ncenter, flush with main button's right inner padding. On hover, inner\nicon translates diagonally + scales up — internal kinetic tension.`,\n },\n {\n id: \"magnetic-hover\",\n title: \"Magnetic button hover physics\",\n tagline: \"Custom cubic-bezier, scale on press, internal translate on hover. NO linear easing.\",\n body: `Use group utility. Hover ≠ background color change. On hover:\nnested inner icon circle translates diagonally (group-hover:translate-\nx-1 group-hover:-translate-y-[1px]) AND scales up (scale-105). On\npress: scale entire button down slightly (active:scale-[0.98]) —\nsimulates physical click. Custom cubic-bezier on ALL transitions\n(NEVER linear / ease-in-out).`,\n },\n {\n id: \"scroll-entry\",\n title: \"Scroll-interpolation entry animations\",\n tagline: \"Elements never appear statically — gentle fade-up from below with blur.\",\n body: `As elements enter viewport: translate-y-16 blur-md opacity-0 →\ntranslate-y-0 blur-0 opacity-100 over 800ms+. Use IntersectionObserver\nor Framer Motion's whileInView. NEVER window.addEventListener(\"scroll\")\n— continuous reflows kill mobile perf.`,\n },\n {\n id: \"performance-guardrails\",\n title: \"Performance guardrails\",\n tagline: \"GPU-safe transforms, blur only on fixed/sticky, noise on pointer-events-none.\",\n body: `- Animate transform + opacity ONLY. NEVER top/left/width/height\n (layout reflow). will-change: transform sparingly.\n- backdrop-blur only on FIXED/STICKY elements. NEVER on scrolling\n containers — continuous GPU repaints, severe mobile frame drops.\n- grain/noise: FIXED pointer-events-none pseudo-element (position:\n fixed; inset: 0; z-index: 50). Never on scrolling containers.\n- Z-index discipline: no arbitrary z-50 or z-[9999]. Reserve for\n systemic layers (sticky nav, modals, overlays, tooltips).`,\n },\n ],\n },\n\n // ── minimalist (editorial workspace) ───────────────────────────\n {\n id: \"minimalist\",\n name: \"Minimalist — editorial workspace\",\n whenToUse:\n \"Document-style apps (Notion-clone, knowledge base, blog admin). Warm monochrome + spot pastels. Bento grids. Editorial serif headings + sans body + monospace for data.\",\n source: \"Leonxlnx/taste-skill/minimalist-skill\",\n sections: [\n {\n id: \"negative-constraints\",\n title: \"Banned defaults\",\n tagline: \"Inter / Roboto / Lucide / shadow-md / pill containers / emojis / Acme — banned.\",\n body: `BANNED: Inter / Roboto / Open Sans fonts. Lucide / Feather / Heroicons\ndefault icons. Tailwind heavy shadows (md/lg/xl). Primary-colored hero\nbackgrounds. Gradients, neon, full glassmorphism. rounded-full on\nlarge containers. Emojis anywhere in markup. Generic names (John Doe,\nAcme, Lorem Ipsum). AI clichés (Elevate, Seamless, Unleash, Next-Gen).`,\n },\n {\n id: \"typography\",\n title: \"Editorial typography\",\n tagline: \"Serif heading + character sans body + mono data. Off-black for body, never pure.\",\n body: `Pair: editorial serif (Lyon Text / Newsreader / Playfair / Instrument\nSerif) for headings WITH character sans (SF Pro Display / Geist Sans /\nSwitzer) body WITH monospace (Geist Mono / JetBrains Mono / SF Mono)\nfor data + keystrokes.\n\nTight tracking on serif headings (-0.02em to -0.04em). Tight\nline-height (1.1). Body line-height 1.6. Body color: off-black\n#111111 or #2F3437 — NEVER pure #000. Secondary text: muted gray\n#787774.`,\n },\n {\n id: \"palette\",\n title: \"Warm monochrome + spot pastels\",\n tagline: \"Canvas warm bone #F7F6F3. Accents from 4 desaturated pastels only.\",\n body: `Canvas: #FFFFFF or warm bone #F7F6F3 / #FBFBFA.\nCards: #FFFFFF or #F9F9F8.\nBorders: ultra-light #EAEAEA or rgba(0,0,0,0.06).\n\nAccents EXCLUSIVELY from 4 muted pastels:\n- Pale Red: bg #FDEBEC | text #9F2F2D\n- Pale Blue: bg #E1F3FE | text #1F6C9F\n- Pale Green: bg #EDF3EC | text #346538\n- Pale Yellow: bg #FBF3DB | text #956400`,\n },\n {\n id: \"bento-grids\",\n title: \"Asymmetric bento grids\",\n tagline: \"Cards: 1px solid #EAEAEA, 8-12px radius MAX, 24-40px padding, NO shadow.\",\n body: `Asymmetric CSS Grid layouts (1x1, 1x2, 2x1, 2x2). Cards:\nborder: 1px solid #EAEAEA, border-radius 8px or 12px MAX (never larger),\ngenerous internal padding (24-40px), no box-shadow. Use raw CSS Grid\nwith gridColumn/gridRow span for the bento layout.`,\n },\n {\n id: \"components\",\n title: \"Component refinements\",\n tagline: \"Primary CTA: solid black bg, 4-6px radius. Tags: pill + uppercase + 0.05em tracking + pastel.\",\n body: `PRIMARY CTA: solid #111 bg, white text, 4-6px radius (NOT full pill),\nno shadow. Hover: shift to #333 or active:scale(0.98).\nTAGS/BADGES: pill (border-radius 9999px), text-xs UPPERCASE,\nletter-spacing 0.05em. Background = muted pastel. Deep text color.\nACCORDIONS (FAQ): strip ALL container chrome. Items separated by\nborder-bottom: 1px solid #EAEAEA only. Toggle: sharp + / − icons.\nKBD: <kbd> as physical key — 1px solid #EAEAEA, 4px radius, #F7F6F3\nbg, monospace.\nFAUX-OS chrome (for product previews): white top bar + 3 small light-\ngray circles (macOS replica).`,\n },\n {\n id: \"motion\",\n title: \"Subtle invisible motion\",\n tagline: \"Scroll-entry fade-up 600ms cubic-bezier(.16,1,.3,1). Card hover lift via shadow shift only.\",\n body: `Scroll entry: translateY(12px) + opacity(0) → 0/1 over 600ms with\ncubic-bezier(0.16, 1, 0.3, 1). IntersectionObserver, never raw scroll.\nHover lift: box-shadow 0 → 0 2px 8px rgba(0,0,0,0.04) over 200ms.\nButtons: scale(0.98) on :active. Staggered list reveals: animation-\ndelay calc(var(--index) * 80ms). Background ambient: optional slow\nradial gradient blob, 20s+ duration, opacity 0.02-0.04, on\nposition:fixed pointer-events-none layer.`,\n },\n ],\n },\n\n // ── brutalist ──────────────────────────────────────────────────\n {\n id: \"brutalist\",\n name: \"Brutalist — Swiss print + military terminal\",\n whenToUse:\n \"Data-heavy dashboards, declassified-blueprint feel, portfolios needing raw mechanical aesthetic. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects.\",\n source: \"Leonxlnx/taste-skill/brutalist-skill\",\n sections: [\n {\n id: \"principles\",\n title: \"Brutalist principles\",\n tagline: \"Raw mechanical interfaces — rigid grids, extreme type contrast, utilitarian color, analog degradation.\",\n body: `Rejects ornament. Embraces structure as aesthetic. Grids are visible\n(via borders or rules). Type scale is dramatically contrasted (massive\ndisplay heading next to small tabular body). Color is utilitarian —\nblack, off-white, single signal color (red, amber, terminal green).\nAnalog effects (printer-bleed, halftone, screenprint registration\nerrors) add character without becoming kitsch. Best for: dev tools,\ndeclassified-data presentations, raw-fact dashboards, technical\nportfolios.`,\n },\n ],\n },\n\n // ── gpt-tasteskill ─────────────────────────────────────────────\n {\n id: \"gpt-tasteskill\",\n name: \"GPT taste — editorial + advanced GSAP motion\",\n whenToUse:\n \"Long-scroll marketing pages with cinematic scroll choreography. Pins, stacks, scrubbed timelines. AIDA structure. Wide editorial typography. Bans 6-line wraps. Gapless bento grids.\",\n source: \"Leonxlnx/taste-skill/gpt-tasteskill\",\n sections: [\n {\n id: \"principles\",\n title: \"GSAP motion + AIDA structure\",\n tagline: \"Python-driven layout randomization, strict ScrollTrigger choreography, wide editorial typography.\",\n body: `AIDA (Attention/Interest/Desire/Action) page spine. Wide editorial\ntypography — bans 6-line wraps (line lengths cap at ~5). Gapless bento\ngrids (cards flush against each other, no gutter — outline borders\ndo the separation). Inline micro-images (small contextual photos\nwithin a section, not just hero). Massive section spacing (180-240px\nbetween sections, not 80). GSAP ScrollTriggers: pinning (section\nlocks while sub-content scrolls), stacking (next section slides\nover current), scrubbing (animation tied to scroll progress).`,\n },\n ],\n },\n\n // ── redesign ───────────────────────────────────────────────────\n {\n id: \"redesign\",\n name: \"Redesign — audit + upgrade existing UI\",\n whenToUse:\n \"Working on an existing project (not greenfield). Find generic patterns, weak points, missing states. Apply fixes in priority order — font swap first, palette cleanup second, etc.\",\n source: \"Leonxlnx/taste-skill/redesign-skill + redesign-audit.ts\",\n sections: [\n {\n id: \"fix-priority\",\n title: \"Fix priority order\",\n tagline: \"Font → palette → states → layout → components → loading/empty/error → typography polish.\",\n body: `Apply in THIS order for max visual impact at min risk:\n\n1. FONT SWAP — biggest instant improvement, lowest risk.\n2. COLOR PALETTE CLEANUP — remove clashing / oversaturated colors.\n3. HOVER + ACTIVE STATES — makes interface feel alive.\n4. LAYOUT + SPACING — proper grid, max-width, consistent padding.\n5. REPLACE GENERIC COMPONENTS — cliche → modern alternatives.\n6. LOADING / EMPTY / ERROR STATES — makes it feel finished.\n7. TYPOGRAPHY SCALE + SPACING POLISH — premium final touch.\n\nRules: work with existing stack, don't migrate frameworks, don't break\nfunctionality, test after every change. Small targeted improvements\nover big rewrites.`,\n },\n {\n id: \"audit-checklist\",\n title: \"Audit checklist (8 categories)\",\n tagline: \"Typography / color / layout / interactivity / content / components / iconography / code / omissions.\",\n body: `See redesign-audit.ts (50+ checks). Common findings:\n\nTYPOGRAPHY: Inter everywhere, weak headlines, full-width paragraphs,\nonly 400/700 weights, proportional numbers in data, Title Case On\nEvery Header.\nCOLOR: pure #000, oversaturated accents, multiple competing accents,\npurple/blue AI gradient, generic black shadows, empty flat sections.\nLAYOUT: 3-equal-card columns (most generic AI pattern), height:100vh\niOS jump, no max-width container, dashboard always left sidebar.\nINTERACTIVITY: no hover, no active feedback, no focus ring, generic\nspinners, no empty states, alert() for errors, dead links.\nCONTENT: John Doe / Acme / Lorem Ipsum, AI clichés, exclamation marks\nin success, passive voice errors.\nOMISSIONS: no legal links, no back nav, no 404, no form validation,\nno skip-to-content.`,\n },\n ],\n },\n\n // ── output (full-output enforcement) ───────────────────────────\n {\n id: \"output\",\n name: \"Full-output enforcement\",\n whenToUse:\n \"Always. Bans the // ... / // TODO / 'I'll leave this as an exercise' patterns. Treat every task as production-critical.\",\n source: \"Leonxlnx/taste-skill/output-skill + output-quality.ts\",\n sections: [\n {\n id: \"banned\",\n title: \"Banned patterns\",\n tagline: \"// ... / // TODO / 'for brevity' / 'rest follows pattern' — HARD FAILURES.\",\n body: `In code: // ..., // rest of code, // implement here, // TODO,\n/* ... */, // similar to above, // continue pattern, // add more\nas needed, bare ... standing for omitted code.\n\nIn prose: \"Let me know if you want me to continue\", \"for brevity\",\n\"the rest follows the same pattern\", \"similarly for the remaining\",\n\"and so on\" (replacing actual content), \"I'll leave that as an\nexercise\".\n\nStructural: skeleton when full implementation was requested, first +\nlast section skipping middle, describing what code should do instead\nof writing it.`,\n },\n {\n id: \"long-output-protocol\",\n title: \"Long-output protocol\",\n tagline: \"Write at full quality to clean breakpoint, then [PAUSED] marker, never compress.\",\n body: `When response approaches token limit:\n- Do NOT compress remaining sections.\n- Write at FULL QUALITY up to clean breakpoint (end of function /\n file / section).\n- End with: [PAUSED — X of Y complete. Send \"continue\" to resume\n from: <section name>]\n- On \"continue\": pick up EXACTLY where stopped. No recap, no\n repetition.`,\n },\n ],\n },\n\n // ── brandkit ───────────────────────────────────────────────────\n {\n id: \"brandkit\",\n name: \"Brandkit — identity guidelines boards\",\n whenToUse:\n \"Designing a brand identity board first (before screens). Logo system, color palette, typography lockup, icon system, photography direction, brand voice.\",\n source: \"Leonxlnx/taste-skill/brandkit\",\n sections: [\n {\n id: \"principles\",\n title: \"Brandkit principles\",\n tagline: \"Premium brand-guidelines boards — minimalist / cinematic / editorial / dark-tech / luxury / cultural variants.\",\n body: `Compositions for brand identity decks. Minimalist (workspace),\ncinematic (entertainment), editorial (publishing), dark-tech (SaaS),\nluxury (lifestyle), cultural (heritage), security (defense / fintech),\ngaming, developer-tool, consumer-app. Logo concepts with intentional\nsymbolic meaning. Refined composition (asymmetric grid, generous\nbreathing). Sparse typography. Premium mockups. Art-directed\nimagery. Flexible grid layouts.`,\n },\n ],\n },\n\n // ── stitch ─────────────────────────────────────────────────────\n {\n id: \"stitch\",\n name: \"Stitch — semantic DESIGN.md for Google Stitch\",\n whenToUse:\n \"Pairing with Google Stitch (or similar AI UI generator). Generate DESIGN.md files that enforce premium standards — strict typography, calibrated color, asymmetric layouts, perpetual micro-motion.\",\n source: \"Leonxlnx/taste-skill/stitch-skill\",\n sections: [\n {\n id: \"principles\",\n title: \"Stitch DESIGN.md principles\",\n tagline: \"Agent-friendly design specs — strict type, calibrated color, asymmetric layout, micro-motion, hardware acceleration.\",\n body: `DESIGN.md = instruction set for downstream AI UI generators.\nEnforces: strict typography (no Inter, specific fonts named),\ncalibrated color (specific hex, not \"blue\"), asymmetric layouts\n(specific grid template strings), perpetual micro-motion (specific\ntiming functions), hardware-accelerated performance (transform/\nopacity only). Output is consumable by AI agents — explicit beats\nexpressive.`,\n },\n ],\n },\n\n // ── imagegen-mobile ────────────────────────────────────────────\n {\n id: \"imagegen-mobile\",\n name: \"Imagegen mobile — app screen reference images\",\n whenToUse:\n \"Pre-code phase. Generate mobile screen mockups before implementing. Onboarding flows, auth, home dashboards, profile, settings, chat, ecommerce, fintech, health, productivity.\",\n source: \"Leonxlnx/taste-skill/imagegen-frontend-mobile\",\n sections: [\n {\n id: \"principles\",\n title: \"Mobile image direction principles\",\n tagline: \"App-native, premium, readable, flow-aware, platform-aware. Wrap in subtle premium phone mockup. Multi-screen consistency.\",\n body: `Generate premium app-native mobile screen images + flow images\n(NOT generic AI mockups, NOT phone-shaped websites). Default mockup\npresence: subtle premium iPhone frame with visible chrome, focus\nstays on app content. Generate 3-5 screens per flow (onboarding,\nauth, home, detail, settings). Logical flow (each screen continues\nthe user's task). First-screen cleanliness (don't dump every feature\non the entry screen). Safe-area awareness (status bar + home\nindicator preserved). Mobile anti-tells: no purple-blue fintech\ngradients, no random glass cards, no ambient blobs, no fake neon, no\ndribbble floating widgets, no oversized corner radii on everything,\nno rainbow chip walls, no fake chart dashboard spam, no cloned\nscreens in flows.`,\n },\n ],\n },\n\n // ── imagegen-web ───────────────────────────────────────────────\n {\n id: \"imagegen-web\",\n name: \"Imagegen web — landing page section images\",\n whenToUse:\n \"Pre-code phase for landing / marketing sites. Generate ONE image per section (8 sections → 8 images). Hero composition variety (NOT always left-text/right-image).\",\n source: \"Leonxlnx/taste-skill/imagegen-frontend-web\",\n sections: [\n {\n id: \"hard-output-rule\",\n title: \"Hard output rule — one image per section\",\n tagline: \"8 sections requested → 8 separate images. NEVER combine sections.\",\n body: `Each image = one section, own image call. NEVER combine multiple\nsections into one frame. NEVER return a single tall image with the\nwhole page. Default to 6 sections if \"landing page\" with no count.\n8 sections for \"full website template\". Announce each (\"Section 1\nof 8: Hero\", \"Section 2 of 8: Trust bar\").`,\n },\n {\n id: \"hero-composition-bias\",\n title: \"Hero composition variety\",\n tagline: \"Left-text / right-image hero is the most overused AI pattern. Pick from 10 alternatives first.\",\n body: `Before reaching for left-text/right-image hero, consider:\n- centered over background image\n- bottom-left over image\n- bottom-right over image\n- top-left lead\n- stacked center\n- image-as-canvas\n- off-grid editorial\n- mini minimalist\n- right-text / left-image (inverted classic)\nUse left-text/right-image ONLY when genuinely the strongest choice\nfor the brand.`,\n },\n ],\n },\n\n // ── image-to-code ──────────────────────────────────────────────\n {\n id: \"image-to-code\",\n name: \"Image-to-code — generate design first, then implement\",\n whenToUse:\n \"Visual-first brief in Codex. First generate the design image yourself, deeply analyze, THEN implement code matching it.\",\n source: \"Leonxlnx/taste-skill/image-to-code-skill\",\n sections: [\n {\n id: \"workflow\",\n title: \"Image-to-code workflow\",\n tagline: \"Generate design image → analyze → implement. Prefer large readable section-specific images.\",\n body: `Workflow:\n1. Generate the design image FIRST (one per section, large + readable).\n2. Deeply analyze: composition, hierarchy, palette, typography, motion.\n3. Implement React/HTML/CSS matching as closely as possible.\n\nPrefer LARGE, readable, section-specific images over tiny compressed\nboards. Generate fresh standalone images for sections / detail views\ninstead of cropping old. Avoid lazy under-generation. Avoid cards-\ninside-cards-inside-cards UI. Keep the hero clean, spacious, readable,\nvisible on a small laptop.`,\n },\n ],\n },\n];\n\nexport function findSkill(id: string): Skill | undefined {\n return SKILLS.find((s) => s.id === id);\n}\n\nexport function findSection(skillId: string, sectionId: string): SkillSection | undefined {\n return findSkill(skillId)?.sections.find((s) => s.id === sectionId);\n}\n\n/**\n * Naïve task router — keyword match. Replace with embedding-based\n * matcher in v2 if it proves useful.\n */\nexport interface RouteResult {\n skill: string;\n section: string | \"<see whenToUse>\";\n why: string;\n alsoSee?: string[];\n}\n\nexport function routeTask(task: string): RouteResult[] {\n const q = task.toLowerCase();\n const matches: RouteResult[] = [];\n\n const route = (\n kw: string[],\n skill: string,\n section: string | \"<see whenToUse>\",\n why: string,\n alsoSee?: string[],\n ) => {\n if (kw.some((k) => q.includes(k))) matches.push({ skill, section, why, alsoSee });\n };\n\n // Premium / agency / Awwwards\n route([\"premium\", \"awwwards\", \"agency\", \"linear\", \"apple\", \"high-end\", \"luxury\"],\n \"soft\", \"vibe-archetypes\",\n \"Premium tier — pick a Vibe + Layout archetype + apply Double-Bezel.\",\n [\"soft/double-bezel\", \"soft/magnetic-hover\"]);\n\n // Marketing / landing\n route([\"landing page\", \"marketing\", \"hero\", \"long scroll\"],\n \"imagegen-web\", \"hero-composition-bias\",\n \"Landing pages benefit from hero composition variety + per-section image generation.\",\n [\"gpt-tasteskill/principles\", \"soft/layout-archetypes\"]);\n\n // Mobile app screens\n route([\"mobile app\", \"ios\", \"android\", \"phone screen\", \"onboarding flow\"],\n \"imagegen-mobile\", \"principles\",\n \"Mobile app design — generate screens first, avoid phone-shaped-website.\",\n [\"taste/mobile-first\"]);\n\n // Workspace / Notion-like\n route([\"workspace\", \"notion\", \"document\", \"editorial\", \"knowledge base\"],\n \"minimalist\", \"palette\",\n \"Editorial workspace = warm monochrome + spot pastels + serif headings.\",\n [\"minimalist/typography\", \"minimalist/bento-grids\"]);\n\n // Data dashboard\n route([\"dashboard\", \"data heavy\", \"tabular\", \"ops table\"],\n \"brutalist\", \"principles\",\n \"Data-heavy dashboards work with Brutalist (rigid grids, utilitarian color).\",\n [\"taste/one-intent-per-screen\"]);\n\n // Brand work\n route([\"brand\", \"identity\", \"logo\", \"guidelines\"],\n \"brandkit\", \"principles\",\n \"Brand identity work — boards before screens.\");\n\n // Existing project upgrade\n route([\"refactor\", \"redesign\", \"upgrade existing\", \"audit\"],\n \"redesign\", \"fix-priority\",\n \"Existing project = run audit first, fix in priority order (font → palette → states → ...).\",\n [\"redesign/audit-checklist\"]);\n\n // Form work\n route([\"form\", \"validation\", \"submit\", \"sign up\", \"registration\"],\n \"taste\", \"form-discipline\",\n \"Form must have explicit label + help + error wired via FormField (rule 34).\");\n\n // Loading / saving\n route([\"loading\", \"saving\", \"skeleton\", \"spinner\"],\n \"taste\", \"loading-states\",\n \"Skeleton for INIT fetch, Spinner for active work. Never mix.\");\n\n // Mobile-first concerns\n route([\"mobile first\", \"responsive\", \"breakpoint\"],\n \"taste\", \"mobile-first\",\n \"Default styles target xs. Touch targets ≥ 44px. Use useBreakpoint().\");\n\n // Output quality\n route([\"complete code\", \"full implementation\", \"no placeholder\"],\n \"output\", \"banned\",\n \"Banned: // ..., // TODO, 'for brevity'. Ship complete runnable code.\");\n\n // GSAP motion\n route([\"gsap\", \"scrolltrigger\", \"scroll choreography\", \"pinning\"],\n \"gpt-tasteskill\", \"principles\",\n \"GSAP ScrollTrigger — pinning, stacking, scrubbing.\");\n\n // Image-first / design-first\n route([\"from image\", \"image to code\", \"design first\"],\n \"image-to-code\", \"workflow\",\n \"Generate design image first → analyze → implement.\");\n\n if (matches.length === 0) {\n return [{\n skill: \"taste\",\n section: \"<see whenToUse>\",\n why: `No keyword match for \"${task}\". Default to the \"taste\" baseline — see whenToUse for sections.`,\n }];\n }\n\n return matches;\n}\n","/**\n * Anti-AI-tells catalog — specific patterns that signal \"this UI was\n * synthesised by an LLM without taste\". Adapted from the taste-skill\n * SKILL.md (mobile + web) and the @godxjp/ui review log. The MCP\n * exposes this so consumer agents can self-audit BEFORE shipping.\n */\n\nexport interface AiTell {\n /** The pattern, by category. */\n category: \"visual\" | \"layout\" | \"copy\" | \"interaction\" | \"imagery\" | \"structure\";\n /** Short name. */\n name: string;\n /** What it looks like + why it's a tell. */\n body: string;\n /** What to do instead — concrete fix. */\n fix: string;\n}\n\nexport const ANTI_AI_TELLS: AiTell[] = [\n // ── visual ─────────────────────────────────────────────────────\n {\n category: \"visual\",\n name: \"Purple-blue gradient hero\",\n body: `The default LLM color palette — purple → blue → cyan radial /\nlinear gradient as hero background. Looks like every AI-generated\nSaaS landing page from 2023.`,\n fix: `Use the framework's accent palette (\\`data-accent=\"blue\"\\` /\n\"violet\" / \"cyan\" / \"green\" / \"orange\" / \"rose\"). Solid surface\ncolors with semantic meaning. If you want depth, use a SINGLE\nsubtle gradient that supports brand (not decoration).`,\n },\n {\n category: \"visual\",\n name: \"Glassmorphism without purpose\",\n body: `Frosted-glass cards stacked on a colorful blurry background.\nLooked novel in 2020 — now a tell that the designer reached for\ntrend instead of solving a problem.`,\n fix: `Solid surface tiers (Card on background, Popover on Card,\nDialog on backdrop). The framework's elevation system already\nencodes 3 surface tiers — use them.`,\n },\n {\n category: \"visual\",\n name: \"Ambient blobs / floating shapes\",\n body: `Random gradient blobs floating behind content with no narrative\npurpose. The \"creative space-filler\" AI pattern. Reads as\ndistracting noise.`,\n fix: `If the page needs visual interest, use a REAL image (product\nphoto, founder photo, branded illustration). If you need\n\"breathing room\", use whitespace. Never use shapes as filler.`,\n },\n {\n category: \"visual\",\n name: \"Oversized border-radius on everything\",\n body: `Every Card / Button / Input with \\`border-radius: 24px\\`. Reads\nas \"I picked one radius and applied it globally\". Premium design\nuses ROLES — small radius on inputs (4-6px), medium on cards\n(8-12px), pill on chips (full).`,\n fix: `Use the framework's radius scale (\\`--radius-sm | -md | -lg | -full\\`).\nEach primitive defaults to the right role; only override when the\ndesign canon specifically calls for it.`,\n },\n {\n category: \"visual\",\n name: \"Rainbow chip wall\",\n body: `Row of Tags / Badges each in a different color (red, orange,\nyellow, green, blue, purple) — usually navigation or filter\ncategories. Reads as chaos; eye can't anchor.`,\n fix: `Pick ONE accent for the tag row. Use \\`appearance\\` (\"soft\" vs\n\"solid\" vs \"outline\") for variety within the same hue. Reserve\nnon-neutral colors (success / warning / destructive) for tags\nthat genuinely carry that meaning.`,\n },\n\n // ── layout ─────────────────────────────────────────────────────\n {\n category: \"layout\",\n name: \"8-card stat dashboard\",\n body: `Homepage with a 4x2 grid of \"stat cards\" — each with an icon, a\nnumber, a sparkline, a delta. None of them relate to a real\nbusiness question; they were chosen because \"more cards = more\ndata\". Classic AI dashboard slop.`,\n fix: `Show 1-2 hero metrics (the ones executives ASK about), then the\ntop action list (orders waiting, tasks due, alerts). If the user\nneeds more analytics, link to a dedicated Reports page.`,\n },\n {\n category: \"layout\",\n name: \"Phone-shaped website\",\n body: `Mobile screen rendered as a vertical strip with the same density\n+ same layout as desktop — just narrower. Cramped tap targets,\nhorizontal scrolling for overflow, no system bar awareness.`,\n fix: `Mobile is its OWN design. Use full-width inputs (\\`block\\` Button),\nstacked layout, larger tap targets, Sheet/Drawer for secondary\ncontent, system-bar safe area. The framework's \\`useBreakpoint\\`\n+ Tailwind \\`sm:\\` variants give you the canvas.`,\n },\n {\n category: \"layout\",\n name: \"Wall-of-tabs navigation\",\n body: `10+ tabs at the top of a screen, no priority. User has to read all\nof them to find the right one. AI default: \"more tabs = more\nfeatures = better\".`,\n fix: `2-4 tabs max. If you have more categories, use a sidebar (Menu),\nor a Cascader / Tree picker. Tabs are for switching between PEERS\n(2-4 mutually exclusive views of the same data).`,\n },\n {\n category: \"layout\",\n name: \"Identical clone screens\",\n body: `5 onboarding steps where every screen has the same headline +\nillustration + 2 buttons layout. Reads as \"I copy-pasted the\ntemplate\" — and devalues the user's time at each step.`,\n fix: `Each step has a distinct visual + interactive feel. Step 1 might\nbe a centered question, step 2 a side-by-side comparison, step 3\na multi-field form, step 4 a single yes/no card. Same palette +\ntype system for coherence; different composition for engagement.`,\n },\n\n // ── copy ───────────────────────────────────────────────────────\n {\n category: \"copy\",\n name: \"Filler corporate phrases\",\n body: `\"Elevate your potential\", \"unlock seamless productivity\",\n\"transform your workflow\", \"next-generation experience\". Reads as\nnothing because it MEANS nothing.`,\n fix: `Write what the feature DOES, specifically. \"Sync 1,000 rows in 2\nseconds\" beats \"Lightning-fast performance\". \"Replaces 3 manual\nsteps\" beats \"Streamline your workflow\".`,\n },\n {\n category: \"copy\",\n name: \"Generic brand placeholders\",\n body: `Acme, NovaCore, Flowbit, Quantix, VeloPay, Lumen, Apex — the\ngo-to AI brand names that scream \"I couldn't think of one\".`,\n fix: `Use believable real-sounding names: 株式会社ABC商事, Tanaka\nTrading, Yokohama Coffee Roasters, Mountain View Bakery. Or use\nyour actual project's brand if known.`,\n },\n {\n category: \"copy\",\n name: \"Vague empty-state copy\",\n body: `\"Get started\", \"Begin your journey\", \"No items yet\" — without\nsaying WHAT to do or WHY there's nothing.`,\n fix: `Be specific + actionable: \"まだ注文がありません。商品を追加して\n最初の注文を作成しましょう。\" + a clear next-action Button.\nEmpty states are TEACHING MOMENTS — use them to onboard.`,\n },\n {\n category: \"copy\",\n name: \"Apologetic / passive-voice error messages\",\n body: `\"Sorry, something went wrong\" / \"An error has occurred\" — no\ninformation about WHAT, no recovery action.`,\n fix: `Specific + actionable: \"メールアドレスの形式が正しくありません\n(例: name@example.com)\". For server errors: \"通信エラー\n(再試行 ボタン)\". Never apologise if you can't say what failed\nor what to do.`,\n },\n\n // ── interaction ────────────────────────────────────────────────\n {\n category: \"interaction\",\n name: \"Hover-only affordances\",\n body: `Action buttons that only appear on hover (table row actions\nhidden until mouseover). Breaks on mobile (no hover), inaccessible\n(keyboard users can't discover).`,\n fix: `Show actions inline or in a kebab menu (DropdownMenu) that's\nALWAYS visible. If you must hide on desktop for density, ensure\nthe same actions are reachable via keyboard (Tab to row, Enter to\nexpand a row-actions DropdownMenu).`,\n },\n {\n category: \"interaction\",\n name: \"Auto-advancing carousel\",\n body: `Hero carousel that rotates every 3 seconds. Users haven't\nfinished reading slide 1; now slide 2 is gone. Accessibility\nnightmare (cognitive load, motion-sensitive).`,\n fix: `Carousel ONLY rotates on explicit user action (arrow click,\ndot click, swipe). \\`<Carousel autoplay={false}>\\` is the default\nin the framework for this reason.`,\n },\n {\n category: \"interaction\",\n name: \"Drag-without-handle\",\n body: `Cards / list items reorderable by long-press anywhere — no\nvisual indicator that they ARE draggable. Users discover it by\naccident or never.`,\n fix: `Show a drag handle icon (\\`<GripVertical>\\`) on the left of the\nrow. Users see it, understand \"this row is draggable\", reach for\nit deliberately.`,\n },\n {\n category: \"interaction\",\n name: \"Disappearing focus ring\",\n body: `\\`outline: none\\` on focus to \"look cleaner\". Keyboard users\ncan't see where they are; total navigation failure.`,\n fix: `Use \\`:focus-visible\\` (Radix primitives do automatically) so the\nring shows on keyboard focus, hides on mouse-click. Don't strip.`,\n },\n\n // ── imagery ────────────────────────────────────────────────────\n {\n category: \"imagery\",\n name: \"Stock photo of generic smiling team\",\n body: `Empty state / About page with a photo of a \"diverse team in an\nopen office laughing at a laptop\". Reads as 2010 corporate stock.\nNo relationship to your product.`,\n fix: `Real photos of YOUR team / users (with consent), product\nscreenshots, branded illustrations. Avatar's INITIALS fallback is\nbetter than a generic stock person.`,\n },\n {\n category: \"imagery\",\n name: \"Floating 3D crypto icon\",\n body: `Empty state with a chrome / pastel 3D icon (coin, key, shield)\nfloating in the center. Looks like every NFT marketplace from\n2021.`,\n fix: `Simple lucide-react line icon (\\`<Inbox size={48} />\\`) +\ndescriptive title. Or a flat illustration matching the brand\npalette. Skip the 3D entirely unless your brand IS 3D.`,\n },\n {\n category: \"imagery\",\n name: \"Decorative gradient mesh background\",\n body: `Page sections with a colorful gradient mesh (\"Stripe-style\")\nbehind text. Looks \"premium\" until you realize every AI design\nuses it. Often hurts text contrast.`,\n fix: `Solid background (\\`--background\\`). If you need depth, use a\nsubtle 1px border + \\`--card\\` background tint. Reserve high-effort\nbackgrounds for pages where they matter (marketing hero, product\nshowcase) — not every internal screen.`,\n },\n\n // ── structure ──────────────────────────────────────────────────\n {\n category: \"structure\",\n name: \"Settings as one long form\",\n body: `Settings page with 40 form fields in a single scroll. User\nloses their place, can't find the field they came for.`,\n fix: `Section the form with \\`<Typography.Title size={5}>\\` subheaders\n+ \\`<Separator />\\`. Group by concern (基本情報 / 公開範囲 / 通知 /\nセキュリティ). If 40 fields is still too many, split into Tabs\nor a Sidebar-driven multi-page settings flow.`,\n },\n {\n category: \"structure\",\n name: \"Modal-in-modal-in-modal\",\n body: `Click a Button → Dialog opens → click \"Edit\" → another Dialog\nopens → click \"Confirm\" → AlertDialog opens. Triple stack;\nuser loses context.`,\n fix: `Use Sheet for the FIRST level (side panel), Dialog for the\nconfirm. Or, redesign the flow so the edit is INLINE in the\nfirst Dialog (no second Dialog needed). AlertDialog for confirm\nis correct — but ONE deep, not three.`,\n },\n {\n category: \"structure\",\n name: \"Spinner-only loading state\",\n body: `Page-level spinner while data loads. User stares at an empty\nshell with a centered spinner. Layout shifts when content\narrives.`,\n fix: `Use Skeleton placeholders matching the eventual content shape.\nThe framework's \\`<Form loading={{ kind: \"skeleton\" }}>\\` cascades\nto every field; \\`<Skeleton className=\"h-9 w-full rounded-md\" />\\`\nfor individual blocks. Layout stays stable, perceived speed\nimproves.`,\n },\n];\n\nexport function aiTellsByCategory(cat: AiTell[\"category\"]): AiTell[] {\n return ANTI_AI_TELLS.filter((t) => t.category === cat);\n}\n","/**\n * Redesign audit checklist — for upgrading an existing project (or\n * critiquing a new design before shipping). Adapted from\n * Leonxlnx/taste-skill `redesign-existing-projects` SKILL. The MCP\n * exposes this so consumer agents can run a structured audit on a\n * page they're working on.\n *\n * Fix priority is ordered for MAXIMUM visual impact at MINIMUM\n * risk — agents should apply in this order.\n */\n\nexport interface AuditCheck {\n category:\n | \"typography\"\n | \"color-surface\"\n | \"layout\"\n | \"interactivity\"\n | \"content\"\n | \"components\"\n | \"iconography\"\n | \"code-quality\"\n | \"omissions\";\n /** What to look for. */\n symptom: string;\n /** Concrete fix. */\n fix: string;\n /** @godxjp/ui-specific notes if applicable. */\n uiNote?: string;\n}\n\nexport const REDESIGN_CHECKS: AuditCheck[] = [\n // ── typography ─────────────────────────────────────────────────\n {\n category: \"typography\",\n symptom: \"Inter / Roboto / Open Sans everywhere — the AI default.\",\n fix: \"Pick a font with character: Geist, Outfit, Cabinet Grotesk, Satoshi for sans. For editorial / creative — pair a serif heading (Newsreader, Lyon, Playfair) with a sans body.\",\n uiNote: \"Override --font-sans + --font-serif at the consumer's root CSS. Framework reads from these tokens.\",\n },\n {\n category: \"typography\",\n symptom: \"Headlines lack presence — small + thin + default tracking.\",\n fix: \"Increase display size, tighten letter-spacing (-0.02em to -0.04em), reduce line-height (1.1). Headlines should feel HEAVY and INTENTIONAL.\",\n uiNote: \"Typography.Title size={1} for hero; override fontFamily + letterSpacing inline.\",\n },\n {\n category: \"typography\",\n symptom: \"Body paragraphs full-width — hard to read.\",\n fix: \"Limit paragraph max-width to ~65ch. Increase line-height to 1.6+.\",\n uiNote: \"Wrap Typography.Paragraph in `<div style={{ maxWidth: '65ch' }}>`.\",\n },\n {\n category: \"typography\",\n symptom: \"Only Regular (400) + Bold (700) weights — flat hierarchy.\",\n fix: \"Introduce Medium (500) + SemiBold (600) for subtle weight contrasts.\",\n },\n {\n category: \"typography\",\n symptom: \"Numbers in proportional font — columns jitter in tables.\",\n fix: \"`font-variant-numeric: tabular-nums` for data, or a monospace font like Geist Mono.\",\n uiNote: \"Table primitive already uses `tabular-nums` on `.num` cells. For ad-hoc numeric labels, add the CSS prop manually.\",\n },\n {\n category: \"typography\",\n symptom: \"Orphaned words — single word on the last line of a heading.\",\n fix: \"`text-wrap: balance` (h1/h2/h3) or `text-wrap: pretty` (body).\",\n },\n {\n category: \"typography\",\n symptom: \"Title Case On Every Header.\",\n fix: \"Use sentence case instead. More modern, easier to read.\",\n },\n\n // ── color / surface ────────────────────────────────────────────\n {\n category: \"color-surface\",\n symptom: \"Pure #000000 background.\",\n fix: \"Replace with off-black (#0A0A0A) / dark charcoal (#121212) / tinted dark (deep navy).\",\n uiNote: \"Framework dark theme already uses tinted dark values — verify the consumer's override didn't force pure black.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Oversaturated accent colors.\",\n fix: \"Keep saturation below 80%. Desaturate so accents BLEND with neutrals rather than scream.\",\n },\n {\n category: \"color-surface\",\n symptom: \"More than one accent color competing.\",\n fix: \"Pick ONE. Remove the rest. Consistency beats variety in palette.\",\n uiNote: \"Set ONE `data-accent` at `<html>` root. Use semantic colors (success / warning / destructive) only for genuinely semantic content.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Purple/blue 'AI gradient' aesthetic — most common AI fingerprint.\",\n fix: \"Replace with neutral base + ONE considered accent. Drop the gradient entirely if it has no narrative purpose.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Generic black `box-shadow` everywhere.\",\n fix: \"Tint shadow to match background hue (e.g. cool gray bg → cool gray shadow). Colored shadows over pure black.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Random dark section breaking an otherwise light page.\",\n fix: \"Either commit to full dark mode OR keep light consistently. If contrast needed, use a SLIGHTLY darker shade of the same palette — not a sudden jump to #111.\",\n },\n {\n category: \"color-surface\",\n symptom: \"Empty flat sections with no visual depth.\",\n fix: \"Add subtle background imagery at low opacity (`/picsum.photos/seed/{name}/1920/1080`) OR ambient gradient at 0.02-0.05 opacity. Empty flat = unfinished.\",\n },\n\n // ── layout ─────────────────────────────────────────────────────\n {\n category: \"layout\",\n symptom: \"Everything centered + symmetric.\",\n fix: \"Break symmetry: offset margins, mixed aspect ratios, left-aligned header over centered body.\",\n },\n {\n category: \"layout\",\n symptom: \"Three equal card columns as feature row — the most generic AI layout.\",\n fix: \"Replace with 2-column zig-zag, asymmetric grid, horizontal scroll, or masonry. The 3-equal-cols pattern is RED FLAG #1.\",\n uiNote: \"Use Bento Grid (custom CSS grid with `gridColumn: 'span N'`) instead of `<Grid cols={3}>` for hero sections.\",\n },\n {\n category: \"layout\",\n symptom: \"`height: 100vh` causing iOS Safari jump.\",\n fix: \"Use `min-height: 100dvh` (dynamic viewport) instead.\",\n },\n {\n category: \"layout\",\n symptom: \"No max-width container — content stretches edge-to-edge.\",\n fix: \"Add a container constraint (1200-1440px) with `margin: auto`. Or use `max-w-4xl / max-w-5xl` for content-heavy pages.\",\n uiNote: \"Framework's PageContent constrains via `var(--container-max-width)`. Consumer may override.\",\n },\n {\n category: \"layout\",\n symptom: \"Cards forced to same height by flexbox.\",\n fix: \"Allow variable heights or use masonry when content varies.\",\n uiNote: \"Use Masonry primitive — handles variable heights without flexbox stretch.\",\n },\n {\n category: \"layout\",\n symptom: \"Buttons at random vertical positions in card rows.\",\n fix: \"Pin CTAs to card bottom — same Y-position across the row regardless of content above.\",\n uiNote: \"Card's `actions` footer slot bottom-aligns automatically.\",\n },\n {\n category: \"layout\",\n symptom: \"Feature lists starting at different vertical positions in pricing tables.\",\n fix: \"Fixed-height title/price block + consistent spacing above the feature list. Cards align across columns.\",\n },\n {\n category: \"layout\",\n symptom: \"Dashboard ALWAYS has a left sidebar.\",\n fix: \"Consider top navigation, floating command menu, or collapsible panel. Sidebar isn't the only chrome.\",\n uiNote: \"Framework supports both — AppShell with sidebar slot is optional; can use Topbar-only for some flows.\",\n },\n\n // ── interactivity ──────────────────────────────────────────────\n {\n category: \"interactivity\",\n symptom: \"No hover states on buttons.\",\n fix: \"Background shift, scale, or translate on hover — 150-200ms ease.\",\n uiNote: \"Framework Button has built-in hover. If overridden — restore.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No active/pressed feedback.\",\n fix: \"`scale(0.98)` or `translateY(1px)` on `:active`. Simulates a physical click.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No focus ring (`outline: none`).\",\n fix: \"Restore visible `:focus-visible` ring. Accessibility requirement, not optional.\",\n },\n {\n category: \"interactivity\",\n symptom: \"Generic circular spinner for page-level loading.\",\n fix: \"Replace with Skeleton placeholders matching the eventual content shape.\",\n uiNote: \"Framework Skeleton + Form `loading={{ kind: 'skeleton' }}` handles cascading initial-fetch state.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No empty states — empty dashboard shows nothing.\",\n fix: \"Design a composed 'getting started' view: Empty primitive with title + description + next-action button.\",\n },\n {\n category: \"interactivity\",\n symptom: \"`window.alert()` for errors.\",\n fix: \"Inline error in the relevant Field, OR toast for non-form errors, OR Dialog for blocking errors.\",\n },\n {\n category: \"interactivity\",\n symptom: \"Dead links (`href='#'`).\",\n fix: \"Either link to real destinations or visually disable the button.\",\n },\n {\n category: \"interactivity\",\n symptom: \"No indication of current page in navigation.\",\n fix: \"Style the active nav link distinctly.\",\n uiNote: \"Sidebar handles via `activeId` — pass it.\",\n },\n\n // ── content ────────────────────────────────────────────────────\n {\n category: \"content\",\n symptom: \"Generic names — 'John Doe', 'Jane Smith'.\",\n fix: \"Diverse, realistic names. For Japanese apps: 田中 太郎, 佐藤 美咲, Nguyễn Lan, Maria Cruz.\",\n },\n {\n category: \"content\",\n symptom: \"Fake round numbers — '99.99%', '50%', '$100.00'.\",\n fix: \"Organic data: '47.2%', '$99.00', '+1 (312) 847-1928'.\",\n },\n {\n category: \"content\",\n symptom: \"Placeholder brand names — Acme, Nexus, SmartFlow.\",\n fix: \"Invent contextual believable brands or use the consumer's real brand.\",\n },\n {\n category: \"content\",\n symptom: \"AI copy clichés — 'elevate', 'seamless', 'unleash', 'next-gen', 'game-changer', 'delve', 'tapestry', 'in the world of'.\",\n fix: \"Plain specific language. Numbers, nouns, verbs.\",\n uiNote: \"Framework's cardinal rule 9 bans this in framework docs; same discipline applies to consumer copy.\",\n },\n {\n category: \"content\",\n symptom: \"Exclamation marks in success messages.\",\n fix: \"Remove. Be confident, not loud.\",\n },\n {\n category: \"content\",\n symptom: \"'Oops!' or apologetic error messages.\",\n fix: \"Direct + specific: 'Connection failed. Please try again.' / 'メールアドレスの形式が正しくありません'.\",\n },\n {\n category: \"content\",\n symptom: \"Lorem Ipsum.\",\n fix: \"Real draft copy. Even rough placeholder beats Latin.\",\n },\n\n // ── components ─────────────────────────────────────────────────\n {\n category: \"components\",\n symptom: \"Generic card look (border + shadow + white).\",\n fix: \"Remove border OR shadow OR background — keep ONE. Cards exist only when elevation communicates hierarchy.\",\n },\n {\n category: \"components\",\n symptom: \"Always one filled + one ghost button.\",\n fix: \"Add text links / tertiary styles for variety.\",\n uiNote: \"Button has `variant='link'` for tertiary actions.\",\n },\n {\n category: \"components\",\n symptom: \"3-card carousel testimonials with dots.\",\n fix: \"Replace with masonry wall of quotes, embedded social posts, or single rotating quote.\",\n },\n {\n category: \"components\",\n symptom: \"Pricing table with 3 equal towers.\",\n fix: \"Highlight recommended tier with COLOR and emphasis, not just extra height.\",\n },\n {\n category: \"components\",\n symptom: \"Modals for everything.\",\n fix: \"Use inline editing, Sheet (slide-over), or expandable Collapse for simple actions. Reserve Dialog for true blocking decisions.\",\n },\n {\n category: \"components\",\n symptom: \"Footer link farm with 4 columns.\",\n fix: \"Simplify. Main nav paths + legally required links. No marketing kitchen sink.\",\n },\n\n // ── iconography ────────────────────────────────────────────────\n {\n category: \"iconography\",\n symptom: \"Lucide or Feather icons exclusively.\",\n fix: \"Use Phosphor (Bold / Fill), Heroicons, or a custom set. AI default tell.\",\n uiNote: \"Framework ships with lucide as locked dependency (rule 14). For editorial differentiation, layer Phosphor on top.\",\n },\n {\n category: \"iconography\",\n symptom: \"Cliche icon metaphors — rocketship 'launch', shield 'security'.\",\n fix: \"Less obvious: bolt, fingerprint, spark, vault, gem.\",\n },\n {\n category: \"iconography\",\n symptom: \"Stock 'diverse team in office' photo.\",\n fix: \"Real team photos, candid shots, or a consistent illustration style. Avatar initials fallback > generic stock person.\",\n },\n\n // ── code quality ───────────────────────────────────────────────\n {\n category: \"code-quality\",\n symptom: \"Div soup — no semantic HTML.\",\n fix: \"`<nav>`, `<main>`, `<article>`, `<aside>`, `<section>` for landmarks.\",\n uiNote: \"AppShell renders the canonical landmark structure automatically.\",\n },\n {\n category: \"code-quality\",\n symptom: \"Inline styles mixed with CSS classes haphazardly.\",\n fix: \"Move styling into the project's system. Inline `style={{}}` only for layout / positioning (rule 29).\",\n },\n {\n category: \"code-quality\",\n symptom: \"Missing alt text on images.\",\n fix: \"Describe content for SR. Never leave `alt=''` or `alt='image'` on meaningful images.\",\n },\n {\n category: \"code-quality\",\n symptom: \"Arbitrary z-index values like `9999`.\",\n fix: \"Establish a clean z-index scale in CSS variables.\",\n },\n\n // ── strategic omissions ────────────────────────────────────────\n {\n category: \"omissions\",\n symptom: \"No legal links in footer.\",\n fix: \"Add Privacy Policy + Terms of Service.\",\n },\n {\n category: \"omissions\",\n symptom: \"Dead ends in user flows — no 'back'.\",\n fix: \"Every page has a way back. Breadcrumb, back button, OR clear nav state.\",\n },\n {\n category: \"omissions\",\n symptom: \"No custom 404 page.\",\n fix: \"Design a helpful branded 404 with a way home and search.\",\n },\n {\n category: \"omissions\",\n symptom: \"No form validation.\",\n fix: \"Client-side validation via zod schema. Framework's Form + FormField handle field-level errors automatically.\",\n },\n {\n category: \"omissions\",\n symptom: \"No 'skip to content' link.\",\n fix: \"Hidden skip-link, first focusable element. Essential for keyboard users.\",\n uiNote: \"AppShell renders one automatically.\",\n },\n];\n\nexport const FIX_PRIORITY = [\n \"1. Font swap — biggest instant improvement, lowest risk\",\n \"2. Color palette cleanup — remove clashing / oversaturated colors\",\n \"3. Hover + active states — makes the interface feel alive\",\n \"4. Layout + spacing — proper grid, max-width, consistent padding\",\n \"5. Replace generic components — swap cliche patterns for modern alternatives\",\n \"6. Add loading, empty, error states — makes it feel finished\",\n \"7. Polish typography scale + spacing — the premium final touch\",\n];\n\nexport const REDESIGN_RULES = [\n \"Work with the existing tech stack. Do NOT migrate frameworks or styling libraries.\",\n \"Do NOT break existing functionality. Test after every change.\",\n \"Before importing any new library, check `package.json` first.\",\n \"Keep changes reviewable + focused. Small targeted improvements over big rewrites.\",\n \"Run the audit before fixing — listing issues first prevents accidental scope creep.\",\n];\n\nexport function checksByCategory(cat: AuditCheck[\"category\"]): AuditCheck[] {\n return REDESIGN_CHECKS.filter((c) => c.category === cat);\n}\n","/**\n * Tool registry — declares MCP tool schemas + dispatches calls.\n *\n * Token-efficient design (per PLAN.md):\n * - `list_*` returns SMALL metadata (1-line each).\n * - `get_*` / `get_*_section` returns ONE focused unit.\n * - `route_task` returns a SMALL pointer to skill+section.\n *\n * The agent walks: list → narrow → drill into one section. Avoids\n * dumping 50KB blobs.\n */\n\nimport {\n COMPONENTS,\n componentsByGroup,\n findComponent,\n type ComponentGroup,\n} from \"../data/components.js\";\nimport { PROP_VOCABULARY, findVocab } from \"../data/prop-vocabulary.js\";\nimport { TOKENS, tokensByCategory, type TokenCategory } from \"../data/tokens.js\";\nimport { CARDINAL_RULES, findRule } from \"../data/rules.js\";\nimport { PATTERNS, findPattern, searchPatterns } from \"../data/patterns.js\";\nimport { SKILLS, findSkill, findSection, routeTask } from \"../data/skills-index.js\";\nimport { ANTI_AI_TELLS, aiTellsByCategory, type AiTell } from \"../data/anti-ai-tells.js\";\nimport { REDESIGN_CHECKS, FIX_PRIORITY, REDESIGN_RULES, checksByCategory, type AuditCheck } from \"../data/redesign-audit.js\";\n\nexport const TOOL_DEFINITIONS = [\n // ── DISCOVERY (small responses) ────────────────────────────────\n {\n name: \"list_skills\",\n description:\n \"List every design / taste skill bundled by this MCP (taste / soft / minimalist / brutalist / gpt-tasteskill / redesign / output / brandkit / stitch / imagegen-mobile / imagegen-web / image-to-code). Returns id + name + whenToUse + section ids. ~1KB. Use FIRST to discover what skills exist; then `get_skill_section` to drill in.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_primitives\",\n description:\n \"List every @godxjp/ui primitive / composite / shell. Returns group + tagline per entry. ~3KB. Optionally filter by group.\",\n inputSchema: {\n type: \"object\",\n properties: {\n group: {\n type: \"string\",\n enum: [\"general\", \"layout\", \"data-display\", \"data-entry\", \"feedback\", \"navigation\", \"composites\", \"shell\", \"providers\"],\n },\n },\n },\n },\n {\n name: \"list_patterns\",\n description: \"List every canonical code pattern (registration-form / settings-page / data-table / confirm-destructive / app-shell / filter-bar / loading-states). ~500 bytes. Use before `get_pattern`.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"list_anti_ai_tells\",\n description:\n \"List every AI-tell pattern to AVOID (organised by category: visual / layout / copy / interaction / imagery / structure). ~2KB. Use to self-audit a design before shipping.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"visual\", \"layout\", \"copy\", \"interaction\", \"imagery\", \"structure\"] },\n },\n },\n },\n {\n name: \"list_redesign_checks\",\n description:\n \"List the redesign audit checklist (50+ checks across 9 categories: typography / color-surface / layout / interactivity / content / components / iconography / code-quality / omissions). ~5KB. Use when auditing an existing project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"typography\", \"color-surface\", \"layout\", \"interactivity\", \"content\", \"components\", \"iconography\", \"code-quality\", \"omissions\"] },\n },\n },\n },\n\n // ── DRILL-DOWN (medium responses) ──────────────────────────────\n {\n name: \"get_anti_ai_tell\",\n description: \"Fetch ONE anti-AI-tell — full body + concrete fix. Use after `list_anti_ai_tells`.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Exact tell name from list_anti_ai_tells.\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_redesign_check\",\n description: \"Fetch redesign check(s) matching a symptom snippet. Returns full fix + UI note. Use after `list_redesign_checks`.\",\n inputSchema: {\n type: \"object\",\n properties: { symptom: { type: \"string\", description: \"Fragment of the symptom text (e.g. 'Inter everywhere' / '100vh').\" } },\n required: [\"symptom\"],\n },\n },\n {\n name: \"get_skill_section\",\n description:\n \"Fetch ONE section of ONE skill — token-efficient. E.g. `skill='soft', section='double-bezel'`. Use after `list_skills` narrowed the relevant skill + section.\",\n inputSchema: {\n type: \"object\",\n properties: {\n skill: { type: \"string\", description: \"Skill id (e.g. 'soft', 'minimalist', 'taste').\" },\n section: { type: \"string\", description: \"Section id within that skill.\" },\n },\n required: [\"skill\", \"section\"],\n },\n },\n {\n name: \"get_component\",\n description: \"Full API for one @godxjp/ui component — props, types, default, example, story + doc paths, cardinal rules. ~2KB.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Component name (e.g. 'Button', 'DataTable').\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_pattern\",\n description: \"Full code snippet for one canonical pattern — copy-paste-ready.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Pattern slug (use list_patterns first).\" } },\n required: [\"name\"],\n },\n },\n {\n name: \"get_rule\",\n description: \"Read one cardinal rule from CLAUDE.md (by number) OR all if no number.\",\n inputSchema: {\n type: \"object\",\n properties: { number: { type: \"number\", description: \"Rule number (1-N).\" } },\n },\n },\n {\n name: \"get_vocab\",\n description: \"Read shared prop-vocabulary type (`SizeProp`, `StatusProp`, `ColorProp`, `LoadingProp`, etc.) OR all if no name.\",\n inputSchema: {\n type: \"object\",\n properties: { name: { type: \"string\", description: \"Vocab type name.\" } },\n },\n },\n {\n name: \"get_tokens\",\n description: \"Read design tokens, optionally filtered by category.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: { type: \"string\", enum: [\"color\", \"spacing\", \"typography\", \"radius\", \"shadow\", \"motion\", \"breakpoint\", \"density\", \"z-index\"] },\n },\n },\n },\n\n // ── TASK ROUTING (smallest response — pointer) ─────────────────\n {\n name: \"route_task\",\n description:\n \"Natural-language task → skill+section pointer. ~300 bytes. E.g. 'I want to design a premium agency hero' → `{skill:'soft', section:'vibe-archetypes', why:'...'}`. Use FIRST when you don't know which skill applies.\",\n inputSchema: {\n type: \"object\",\n properties: { task: { type: \"string\", description: \"Describe what you want to build.\" } },\n required: [\"task\"],\n },\n },\n {\n name: \"suggest_primitive\",\n description:\n \"Use case → primitive recommendation. E.g. 'confirm a destructive delete' → DangerZone pattern + Dialog suggestion.\",\n inputSchema: {\n type: \"object\",\n properties: { use_case: { type: \"string\" } },\n required: [\"use_case\"],\n },\n },\n {\n name: \"search_components\",\n description: \"Fuzzy-search primitives by name / tagline / prop. Returns ranked matches.\",\n inputSchema: {\n type: \"object\",\n properties: { query: { type: \"string\" } },\n required: [\"query\"],\n },\n },\n\n // ── LINT / AUDIT (one-shot critique) ───────────────────────────\n {\n name: \"lint_jsx\",\n description:\n \"Heuristic check of a JSX snippet for common violations — raw `<button>` / `<input>`, `color='error'` on Tag/Badge, missing aria-label, missing source.code override on stories with cell renderers (rule 34), etc.\",\n inputSchema: {\n type: \"object\",\n properties: { jsx: { type: \"string\" } },\n required: [\"jsx\"],\n },\n },\n];\n\nexport async function dispatchTool(\n name: string,\n args: Record<string, unknown>,\n): Promise<string> {\n switch (name) {\n // Discovery\n case \"list_skills\": return listSkills();\n case \"list_primitives\": return listPrimitives(args.group as ComponentGroup | undefined);\n case \"list_patterns\": return listPatterns();\n case \"list_anti_ai_tells\": return listAntiAiTells(args.category as AiTell[\"category\"] | undefined);\n case \"list_redesign_checks\": return listRedesignChecks(args.category as AuditCheck[\"category\"] | undefined);\n case \"get_anti_ai_tell\": return getAntiAiTell(String(args.name ?? \"\"));\n case \"get_redesign_check\": return getRedesignCheck(String(args.symptom ?? \"\"));\n // Drill-down\n case \"get_skill_section\": return getSkillSection(String(args.skill ?? \"\"), String(args.section ?? \"\"));\n case \"get_component\": return getComponent(String(args.name ?? \"\"));\n case \"get_pattern\": return getPattern(String(args.name ?? \"\"));\n case \"get_rule\": return getRule(typeof args.number === \"number\" ? args.number : undefined);\n case \"get_vocab\": return getVocab(args.name as string | undefined);\n case \"get_tokens\": return getTokens(args.category as TokenCategory | undefined);\n // Task routing\n case \"route_task\": return routeTaskTool(String(args.task ?? \"\"));\n case \"suggest_primitive\": return suggestPrimitive(String(args.use_case ?? \"\"));\n case \"search_components\": return searchComponents(String(args.query ?? \"\"));\n // Lint\n case \"lint_jsx\": return lintJsx(String(args.jsx ?? \"\"));\n default: return `Unknown tool: ${name}`;\n }\n}\n\n// ── implementations ───────────────────────────────────────────────\n\nfunction listSkills(): string {\n let out = `# Available skills (${SKILLS.length})\\n\\n`;\n out += `Use \\`get_skill_section skill=\"...\" section=\"...\"\\` to drill in.\\n\\n`;\n for (const s of SKILLS) {\n out += `## ${s.id} — ${s.name}\\n`;\n out += `**When to use:** ${s.whenToUse}\\n\\n`;\n out += `**Sections:** ${s.sections.map((sec) => `\\`${sec.id}\\``).join(\", \")}\\n\\n`;\n }\n out += `\\n_Source: ${SKILLS.map((s) => s.source).filter((v, i, a) => a.indexOf(v) === i).slice(0, 3).join(\"; \")}, …_`;\n return out;\n}\n\nfunction listPrimitives(group?: ComponentGroup): string {\n const list = group ? componentsByGroup(group) : COMPONENTS;\n if (list.length === 0) return `No components${group ? ` in group \"${group}\"` : \"\"}.`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, c) => {\n (acc[c.group] ??= []).push(c);\n return acc;\n }, {});\n let out = `# @godxjp/ui primitives${group ? ` — ${group}` : \"\"}\\n\\n${list.length} components.\\n\\n`;\n for (const [g, items] of Object.entries(grouped)) {\n out += `## ${g}\\n\\n`;\n for (const c of items) out += `- **${c.name}** — ${c.tagline}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction listPatterns(): string {\n let out = `# Canonical patterns (${PATTERNS.length})\\n\\n`;\n for (const p of PATTERNS) {\n out += `- **${p.name}** — ${p.tagline} \\n _tags: ${p.tags.join(\", \")}_\\n`;\n }\n return out;\n}\n\nfunction listAntiAiTells(cat?: AiTell[\"category\"]): string {\n const list = cat ? aiTellsByCategory(cat) : ANTI_AI_TELLS;\n // Compact list — names only. Use `get_anti_ai_tell` for full body + fix.\n let out = `# AI tells to AVOID${cat ? ` — ${cat}` : \"\"} (${list.length})\\n\\n`;\n out += `_Compact list. Use \\`get_anti_ai_tell name=\"<name>\"\\` for the full body + fix._\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, t) => {\n (acc[t.category] ??= []).push(t);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n`;\n for (const t of items) out += `- ${t.name}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction getAntiAiTell(name: string): string {\n const t = ANTI_AI_TELLS.find((x) => x.name.toLowerCase() === name.trim().toLowerCase());\n if (!t) {\n let out = `Anti-AI-tell \"${name}\" not found. Use \\`list_anti_ai_tells\\` to discover. Closest:\\n\\n`;\n for (const x of ANTI_AI_TELLS.slice(0, 8)) out += `- ${x.name} (${x.category})\\n`;\n return out;\n }\n return `# ${t.name}\\n\\n**Category:** ${t.category}\\n\\n## Symptom\\n\\n${t.body}\\n\\n## Fix\\n\\n${t.fix}\\n`;\n}\n\nfunction listRedesignChecks(cat?: AuditCheck[\"category\"]): string {\n const list = cat ? checksByCategory(cat) : REDESIGN_CHECKS;\n // Compact list — symptoms only. Use `get_redesign_check` for the full fix + ui-note.\n let out = `# Redesign audit${cat ? ` — ${cat}` : \"\"} (${list.length} checks)\\n\\n`;\n if (!cat) {\n out += `## Fix priority\\n${FIX_PRIORITY.map((p) => p).join(\"\\n\")}\\n\\n`;\n out += `## Rules\\n${REDESIGN_RULES.map((r) => `- ${r}`).join(\"\\n\")}\\n\\n`;\n }\n out += `_Compact list of symptoms. Use \\`get_redesign_check symptom=\"<text snippet>\"\\` for the full fix + UI note._\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, c) => {\n (acc[c.category] ??= []).push(c);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n`;\n for (const item of items) out += `- ${item.symptom}\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction getRedesignCheck(snippet: string): string {\n const q = snippet.trim().toLowerCase();\n if (!q) return \"Pass `symptom` — a fragment matching the audit check symptom (e.g. 'Inter everywhere' / '100vh' / 'Acme').\";\n const matches = REDESIGN_CHECKS.filter(\n (c) => c.symptom.toLowerCase().includes(q) || c.fix.toLowerCase().includes(q),\n );\n if (!matches.length) {\n return `No redesign check matches \"${snippet}\". Use \\`list_redesign_checks\\` to see all.`;\n }\n let out = `# Redesign checks matching \"${snippet}\" (${matches.length})\\n\\n`;\n for (const c of matches) {\n out += `## ${c.category}\\n\\n**Symptom:** ${c.symptom}\\n\\n**Fix:** ${c.fix}\\n${c.uiNote ? `\\n_UI note:_ ${c.uiNote}\\n` : \"\"}\\n`;\n }\n return out;\n}\n\nfunction getSkillSection(skillId: string, sectionId: string): string {\n const skill = findSkill(skillId);\n if (!skill) return `Skill \"${skillId}\" not found. Use \\`list_skills\\` for available ids.`;\n if (!sectionId) {\n let out = `# ${skill.name}\\n\\n${skill.whenToUse}\\n\\n## Sections\\n`;\n for (const sec of skill.sections) out += `- \\`${sec.id}\\` — ${sec.tagline}\\n`;\n return out;\n }\n const section = findSection(skillId, sectionId);\n if (!section) {\n let out = `Section \"${sectionId}\" not in skill \"${skillId}\". Available:\\n`;\n for (const sec of skill.sections) out += `- \\`${sec.id}\\` — ${sec.tagline}\\n`;\n return out;\n }\n return `# ${skill.name} → ${section.title}\\n\\n${section.tagline}\\n\\n${section.body}\\n\\n_Source: ${skill.source}_`;\n}\n\nfunction getComponent(name: string): string {\n const c = findComponent(name);\n if (!c) return `Component \"${name}\" not found. Use \\`list_primitives\\` to discover.`;\n let out = `# ${c.name}\\n\\n**Group:** ${c.group}\\n\\n${c.tagline}\\n\\n## Props\\n\\n`;\n out += `| Name | Type | Required | Default | Description |\\n|---|---|---|---|---|\\n`;\n for (const p of c.props) {\n out += `| \\`${p.name}\\` | \\`${p.type}\\` | ${p.required ? \"✓\" : \"\"} | ${p.defaultValue ? `\\`${p.defaultValue}\\`` : \"\"} | ${p.description} |\\n`;\n }\n out += `\\n## Example\\n\\n\\`\\`\\`tsx\\n${c.example}\\n\\`\\`\\`\\n\\n`;\n if (c.docPath) out += `**Reference doc:** \\`docs/reference/${c.docPath}\\`\\n\\n`;\n out += `**Storybook:** \\`src/stories/${c.storyPath}\\`\\n\\n`;\n out += `**Cardinal rules:** ${c.rules.map((n) => `#${n}`).join(\", \")}\\n`;\n return out;\n}\n\nfunction getPattern(name: string): string {\n const p = findPattern(name);\n if (!p) {\n const candidates = searchPatterns(name);\n if (candidates.length === 0) return `Pattern \"${name}\" not found.`;\n let out = `Pattern \"${name}\" not found. Closest:\\n`;\n for (const c of candidates) out += `- ${c.name} — ${c.tagline}\\n`;\n return out;\n }\n return `# Pattern: ${p.name}\\n\\n${p.tagline}\\n\\n**Tags:** ${p.tags.join(\", \")}\\n\\n\\`\\`\\`tsx\\n${p.code}\\n\\`\\`\\`\\n`;\n}\n\nfunction getRule(num?: number): string {\n if (num !== undefined) {\n const r = findRule(num);\n if (!r) return `Rule ${num} not found. Valid: 1-${CARDINAL_RULES.length}.`;\n return `# Rule ${r.number} — ${r.title}\\n\\n${r.body}\\n`;\n }\n let out = `# Cardinal rules (${CARDINAL_RULES.length})\\n\\n`;\n for (const r of CARDINAL_RULES) out += `## ${r.number}. ${r.title}\\n\\n${r.body}\\n\\n`;\n return out;\n}\n\nfunction getVocab(name?: string): string {\n if (name) {\n const v = findVocab(name);\n if (!v) return `Vocab \"${name}\" not found.`;\n let out = `# ${v.name}\\n\\n${v.concept}\\n\\n`;\n out += `**Values:** ${v.values.map((x) => `\\`${x}\\``).join(\" | \")}\\n\\n`;\n out += `**Used by:** ${v.usedBy.map((x) => `\\`${x}\\``).join(\", \")}\\n\\n`;\n if (v.notes) out += `**Notes:** ${v.notes}\\n`;\n return out;\n }\n let out = `# Prop vocabulary\\n\\n${PROP_VOCABULARY.length} shared types.\\n\\n`;\n for (const v of PROP_VOCABULARY) {\n out += `## ${v.name}\\n${v.concept}\\n\\nValues: ${v.values.map((x) => `\\`${x}\\``).join(\" | \")}\\n\\n`;\n }\n return out;\n}\n\nfunction getTokens(cat?: TokenCategory): string {\n const list = cat ? tokensByCategory(cat) : TOKENS;\n if (list.length === 0) return `No tokens${cat ? ` in \"${cat}\"` : \"\"}.`;\n let out = `# Design tokens${cat ? ` — ${cat}` : \"\"}\\n\\n`;\n const grouped = list.reduce<Record<string, typeof list>>((acc, t) => {\n (acc[t.category] ??= []).push(t);\n return acc;\n }, {});\n for (const [c, items] of Object.entries(grouped)) {\n out += `## ${c}\\n\\n| Name | Role | Value | Axis |\\n|---|---|---|---|\\n`;\n for (const t of items) out += `| \\`${t.name}\\` | ${t.role} | ${t.value ?? \"—\"} | ${t.axis ?? \"—\"} |\\n`;\n out += \"\\n\";\n }\n return out;\n}\n\nfunction routeTaskTool(task: string): string {\n if (!task.trim()) return \"Describe the task (e.g. 'design a premium agency hero', 'audit existing settings page').\";\n const results = routeTask(task);\n let out = `# Routing \"${task}\"\\n\\n`;\n for (const r of results) {\n out += `- **skill:** \\`${r.skill}\\`, **section:** \\`${r.section}\\` \\n ${r.why}\\n`;\n if (r.alsoSee?.length) out += ` _Also see:_ ${r.alsoSee.map((s) => `\\`${s}\\``).join(\", \")}\\n`;\n }\n out += `\\nFetch with: \\`get_skill_section skill=\"X\" section=\"Y\"\\``;\n return out;\n}\n\nfunction suggestPrimitive(useCase: string): string {\n const q = useCase.trim().toLowerCase();\n if (!q) return \"Describe your use case.\";\n const suggestions: Array<{ component: string; rationale: string; score: number }> = [];\n const check = (kw: string[], component: string, rationale: string, weight = 2) => {\n if (kw.some((k) => q.includes(k))) suggestions.push({ component, rationale, score: weight });\n };\n check([\"form\", \"submit\", \"validation\", \"register\", \"sign up\"], \"Form + FormField\", \"RHF + zod composition.\", 5);\n check([\"table\", \"rows\", \"columns\"], \"DataTable / Table\", \"DataTable for chrome (toolbar+pagination+batch). Table for slim primitive.\", 5);\n check([\"modal\", \"dialog\", \"confirm\"], \"Dialog / AlertDialog\", \"Radix Dialog. AlertDialog for destructive.\", 4);\n check([\"drawer\", \"side panel\", \"sheet\"], \"Sheet\", \"Side panel for filters/settings.\", 4);\n check([\"toast\", \"notification\"], \"toast / Toaster\", \"Sonner-backed.\", 4);\n check([\"loading\", \"saving\", \"spinner\"], \"Spinner / Form loading prop\", \"Spinner=active work, Skeleton=init fetch.\", 3);\n check([\"alert\", \"banner\"], \"Alert\", \"5 semantic colors × outlined/banner.\", 3);\n check([\"select\", \"dropdown\"], \"Select / AutoComplete\", \"Select=discrete options, AutoComplete=free-text+suggestions.\", 3);\n check([\"filter\"], \"Form layout='inline' + pattern 'filter-bar'\", \"Inline form above table.\", 4);\n check([\"delete\", \"destructive\"], \"Pattern 'confirm-destructive'\", \"Card accent='destructive' + typed-name confirm.\", 4);\n if (!suggestions.length) return `No direct match for \"${useCase}\". Try \\`list_primitives\\` or \\`search_components\\`.`;\n suggestions.sort((a, b) => b.score - a.score);\n let out = `# Suggestions for \"${useCase}\"\\n\\n`;\n for (const s of suggestions) out += `- **${s.component}** — ${s.rationale}\\n`;\n return out;\n}\n\nfunction searchComponents(query: string): string {\n const q = query.trim().toLowerCase();\n if (!q) return listPrimitives();\n const matches = COMPONENTS.map((c) => {\n let score = 0;\n if (c.name.toLowerCase().includes(q)) score += 5;\n if (c.tagline.toLowerCase().includes(q)) score += 2;\n if (c.props.some((p) => p.name.toLowerCase().includes(q))) score += 1;\n return { c, score };\n })\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 12);\n if (!matches.length) return `No matches for \"${query}\".`;\n let out = `# Search \"${query}\" — ${matches.length} matches\\n\\n`;\n for (const { c, score } of matches) out += `- **${c.name}** (${c.group}, ${score}) — ${c.tagline}\\n`;\n return out;\n}\n\nfunction lintJsx(jsx: string): string {\n const issues: string[] = [];\n const check = (regex: RegExp, msg: string) => { if (regex.test(jsx)) issues.push(msg); };\n // Lowercase HTML tags only — React PascalCase (Button) MUST NOT match.\n check(/<button[\\s>]/, \"Use `<Button>` instead of raw `<button>` (rule 29).\");\n check(/<input[\\s>]/, \"Use `<Input>` instead of raw `<input>` (rule 29).\");\n check(/<select[\\s>]/, \"Use `<Select>` instead of raw `<select>` (rule 29).\");\n check(/<textarea[\\s>]/, \"Use `<Textarea>` instead of raw `<textarea>` (rule 29).\");\n check(/bg-(red|blue|green|yellow|gray|slate|zinc|neutral|stone|orange|amber|lime|emerald|teal|cyan|sky|indigo|violet|purple|fuchsia|pink|rose)-\\d{2,3}\\b/, \"Use semantic token utilities (`bg-primary`/`bg-destructive`) not raw color scales (rule 2).\");\n check(/<Tag[\\s\\S]*?color=[\"']error[\"']/i, 'Tag `color=\"error\"` → `\"destructive\"` (v5.0, PR #60).');\n check(/<Badge[\\s\\S]*?variant=[\"']error[\"']/i, 'Badge `variant=\"error\"` → `\"destructive\"` (v5.0, PR #63).');\n check(/(Flex|Space|Grid|Masonry)[\\s\\S]*?(gap|size)=[\"']middle[\"']/i, '`\"middle\"` → `\"default\"` for Flex/Space/Grid/Masonry (v5.0).');\n check(/<IconButton[\\s\\S]*?size=[\"']default[\"']/i, 'IconButton `size=\"default\"` → `\"md\"` (v5.0).');\n check(/<SegmentedControl[\\s\\S]*?size=[\"']sm[\"']/i, 'SegmentedControl `size=\"sm\"` → `\"small\"` (v5.0).');\n check(/<PageContent[\\s\\S]*?padding=[\"'](compact|comfortable)[\"']/i, 'PageContent `padding=\"compact\"/\"comfortable\"` → `\"tight\"/\"cozy\"` (v5.0).');\n check(/<Pagination[\\s\\S]*?justify=[\"']between[\"']/i, 'Pagination `justify=\"between\"` → `\"space-between\"` (v5.0).');\n if (/<IconButton(?![^>]*aria-label)/i.test(jsx) && !/asChild/i.test(jsx)) {\n issues.push(\"`<IconButton>` should have `aria-label` (rule 6 — WCAG).\");\n }\n if (/cell:\\s*\\(\\{?\\s*row\\s*\\}?\\)\\s*=>/i.test(jsx) && /export\\s+const\\s+\\w+\\s*:\\s*Story/i.test(jsx)) {\n if (!/parameters[\\s\\S]{0,200}source[\\s\\S]{0,100}code:/i.test(jsx)) {\n issues.push(\"Stories with function-valued cell renderers MUST override `parameters.docs.source.code` (rule 34).\");\n }\n }\n // Anti-AI tells\n if (/text-(red|blue|green|yellow)-\\d{2,3}\\b/.test(jsx)) issues.push(\"Hard-coded color scales — use semantic tokens. Tells AI-slop palette (rule 2 + anti-AI-tells.visual.rainbow-chip-wall).\");\n if (/h-\\[?100vh\\]?/.test(jsx)) issues.push(\"`100vh` causes iOS Safari viewport jump — use `min-h-[100dvh]` (redesign.layout / soft.absolute-zero).\");\n if (/className=[\"'][^\"']*(?:shadow-md|shadow-lg|shadow-xl)[\"']/.test(jsx)) issues.push(\"Tailwind heavy shadows are an AI tell — use ultra-diffuse low-opacity (< 0.05) or tinted shadows (soft.absolute-zero, minimalist).\");\n if (/Inter|Roboto|Helvetica|Open\\s*Sans/i.test(jsx)) issues.push(\"Banned default fonts (Inter/Roboto/Helvetica/Open Sans). Use Geist/Clash Display/PP Editorial New (soft.absolute-zero, minimalist.negative-constraints).\");\n if (/Acme|NovaCore|Flowbit|Quantix|VeloPay|John\\s+Doe|Jane\\s+Smith|Lorem\\s+Ipsum/i.test(jsx)) issues.push(\"Generic placeholder content (Acme/NovaCore/John Doe/Lorem Ipsum). Use believable real-sounding names (anti-AI-tells.copy).\");\n if (issues.length === 0) return \"✅ No issues found against the heuristic checks.\";\n let out = `# Lint findings — ${issues.length} issue${issues.length === 1 ? \"\" : \"s\"}\\n\\n`;\n for (const i of issues) out += `- ${i}\\n`;\n out += `\\nNote: heuristic only — not a substitute for the full CI gate.\\n`;\n return out;\n}\n","/**\n * Resource registry — exposes catalogs as MCP resources so agents\n * can discover + browse them without invoking tools.\n *\n * godx-ui://components — full component catalog (JSON)\n * godx-ui://components/{name} — single component (Markdown)\n * godx-ui://prop-vocabulary — full vocab (JSON)\n * godx-ui://tokens — all tokens (JSON)\n * godx-ui://tokens/{category} — tokens in category (JSON)\n * godx-ui://rules — all cardinal rules (Markdown)\n * godx-ui://rules/{number} — single rule (Markdown)\n * godx-ui://patterns — pattern catalog (JSON)\n * godx-ui://patterns/{name} — single pattern (Markdown)\n */\n\nimport { COMPONENTS, findComponent } from \"../data/components.js\";\nimport { PROP_VOCABULARY } from \"../data/prop-vocabulary.js\";\nimport { TOKENS, tokensByCategory, type TokenCategory } from \"../data/tokens.js\";\nimport { CARDINAL_RULES, findRule } from \"../data/rules.js\";\nimport { PATTERNS, findPattern } from \"../data/patterns.js\";\n\nexport const RESOURCE_DEFINITIONS = [\n {\n uri: \"godx-ui://components\",\n name: \"All components\",\n description: \"Full component catalog as JSON — name, group, tagline, props, example, rules.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://prop-vocabulary\",\n name: \"Shared prop vocabulary\",\n description: \"Cross-cutting prop types (SizeProp, StatusProp, ColorProp, LoadingProp, …) as JSON.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://tokens\",\n name: \"All design tokens\",\n description: \"Every CSS variable + role + value + axis as JSON.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"godx-ui://rules\",\n name: \"Cardinal rules (34)\",\n description: \"The 34 binding rules from CLAUDE.md as Markdown.\",\n mimeType: \"text/markdown\",\n },\n {\n uri: \"godx-ui://patterns\",\n name: \"Code patterns\",\n description: \"Canonical pattern catalog (registration-form, settings-page, data-table, …) as JSON.\",\n mimeType: \"application/json\",\n },\n];\n\nexport async function readResource(uri: string): Promise<string> {\n // godx-ui://components\n if (uri === \"godx-ui://components\") {\n return JSON.stringify(COMPONENTS, null, 2);\n }\n // godx-ui://components/{name}\n if (uri.startsWith(\"godx-ui://components/\")) {\n const name = uri.slice(\"godx-ui://components/\".length);\n const c = findComponent(name);\n if (!c) throw new Error(`Component not found: ${name}`);\n return formatComponentMarkdown(c);\n }\n\n if (uri === \"godx-ui://prop-vocabulary\") {\n return JSON.stringify(PROP_VOCABULARY, null, 2);\n }\n\n if (uri === \"godx-ui://tokens\") {\n return JSON.stringify(TOKENS, null, 2);\n }\n if (uri.startsWith(\"godx-ui://tokens/\")) {\n const cat = uri.slice(\"godx-ui://tokens/\".length) as TokenCategory;\n return JSON.stringify(tokensByCategory(cat), null, 2);\n }\n\n if (uri === \"godx-ui://rules\") {\n let out = `# Cardinal rules (${CARDINAL_RULES.length})\\n\\n`;\n for (const r of CARDINAL_RULES) {\n out += `## ${r.number}. ${r.title}\\n\\n${r.body}\\n\\n`;\n }\n return out;\n }\n if (uri.startsWith(\"godx-ui://rules/\")) {\n const num = Number(uri.slice(\"godx-ui://rules/\".length));\n const r = findRule(num);\n if (!r) throw new Error(`Rule not found: ${num}`);\n return `# Rule ${r.number} — ${r.title}\\n\\n${r.body}\\n`;\n }\n\n if (uri === \"godx-ui://patterns\") {\n return JSON.stringify(PATTERNS.map(({ name, tagline, tags }) => ({ name, tagline, tags })), null, 2);\n }\n if (uri.startsWith(\"godx-ui://patterns/\")) {\n const name = uri.slice(\"godx-ui://patterns/\".length);\n const p = findPattern(name);\n if (!p) throw new Error(`Pattern not found: ${name}`);\n return `# ${p.name}\\n\\n${p.tagline}\\n\\n**Tags:** ${p.tags.join(\", \")}\\n\\n\\`\\`\\`tsx\\n${p.code}\\n\\`\\`\\`\\n`;\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n}\n\nfunction formatComponentMarkdown(c: ReturnType<typeof findComponent> & object): string {\n let out = `# ${c.name}\\n\\n**Group:** ${c.group}\\n\\n${c.tagline}\\n\\n`;\n out += `## Props\\n\\n`;\n out += `| Name | Type | Required | Default | Description |\\n|---|---|---|---|---|\\n`;\n for (const p of c.props) {\n out += `| \\`${p.name}\\` | \\`${p.type}\\` | ${p.required ? \"✓\" : \"\"} | ${p.defaultValue ? `\\`${p.defaultValue}\\`` : \"\"} | ${p.description} |\\n`;\n }\n out += `\\n## Example\\n\\n\\`\\`\\`tsx\\n${c.example}\\n\\`\\`\\`\\n`;\n return out;\n}\n"],"mappings":"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","names":["out"]}
|