astro-component-kit 0.4.1 → 0.5.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/README.md CHANGED
@@ -13,6 +13,7 @@
13
13
 
14
14
  ## ✨ Features
15
15
 
16
+ - 🤖 **Official MCP Server & AI development** — connect Cursor, Claude, Codex, Lovable, or any MCP client (`https://mcp.astrocomponents.dev/sse` or `npx astro-component-kit mcp install <client>`)
16
17
  - 🛍️ **Multi-page production templates** — 3 complete templates (E-commerce Store, Editorial Boutique, SaaS Hotel) with state management, cart persistence, and live previews
17
18
  - 🎨 **Dark & Light theme** — dark mode first with official `[data-theme="light"]` support, adaptive tokens, and glassmorphism
18
19
  - ⚡ **Full-page sections** — 41+ production-ready landing sections (Heroes, Bento Grids, Pricing Matrices, Testimonials, CTAs, FAQs, Teams, Footers)
@@ -106,6 +107,39 @@ Open [http://localhost:4321](http://localhost:4321) to browse components locally
106
107
 
107
108
  ---
108
109
 
110
+ ## 🤖 Build with AI via MCP (Model Context Protocol)
111
+
112
+ Astro Components Kit provides an official **Model Context Protocol (MCP)** server. Connect it to **Cursor, Claude Desktop, Windsurf, or Antigravity** so your AI assistant can discover components, check TypeScript props, and generate production Astro code directly in your project.
113
+
114
+ ### Remote SSE Connection (Recommended — Zero install)
115
+
116
+ Add this endpoint to your editor's MCP settings (`claude_desktop_config.json`, Cursor Settings -> Features -> MCP, etc.):
117
+
118
+ ```json
119
+ {
120
+ "mcpServers": {
121
+ "astro-components": {
122
+ "url": "https://mcp.astrocomponents.dev/sse"
123
+ }
124
+ }
125
+ }
126
+ ```
127
+
128
+ ### Available MCP Tools
129
+
130
+ | Tool | Purpose |
131
+ |------|---------|
132
+ | `search_components` | Search by keyword, category, or tag (e.g. `"buy box"`, `"kpi chart"`, `"pricing"`) |
133
+ | `get_component` | Detailed component metadata, TypeScript `Props`, import statements, and usage code |
134
+ | `get_component_code` | Raw `.astro` source code ready to inject into your project |
135
+ | `list_categories` | Overview of all 13 component categories with item counts |
136
+ | `list_templates` | Overview of the 3 multi-page production templates (Nova Store, Forma Studio, The Lobby) |
137
+ | `get_template` | Complete template architecture, pages, store configuration, and routing guide |
138
+ | `get_design_tokens` | CSS tokens, color variables, spacing scale, and dark/light theme setup |
139
+ | `get_library_info` | High-level overview, active version, total counts, and quickstart guide |
140
+
141
+ ---
142
+
109
143
  ## 📚 Component & Section Library
110
144
 
111
145
  **320+ components & full-page sections** across 13 categories plus 3 complete templates:
@@ -241,7 +275,7 @@ import { MinimalFooterGrid } from 'astro-component-kit/layout';
241
275
 
242
276
  <!-- 2. Hero Header -->
243
277
  <HeroGradient
244
- badge="New Release v0.4.1"
278
+ badge="New Release v0.5.0"
245
279
  title="Build Production Websites at Lightning Speed"
246
280
  subtitle="Zero client JavaScript runtime, accessible UI, and modern dark glassmorphism."
247
281
  />
package/bin/cli.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ // bin/cli.js
3
+ // Direct CLI runner for astro-component-kit.
4
+ import { spawn } from 'node:child_process';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { installMcpForClient } from './installer.js';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const rootDir = path.resolve(__dirname, '..');
12
+
13
+ const args = process.argv.slice(2);
14
+ const first = args[0]?.toLowerCase();
15
+
16
+ async function main() {
17
+ // 1. Fast-path: 1-click install command runs natively in pure Node.js
18
+ if (first === 'install' || (first === 'mcp' && args[1]?.toLowerCase() === 'install')) {
19
+ const client = first === 'install' ? args[1] : args[2];
20
+ if (!client) {
21
+ console.log(`\n🚀 Astro Components Kit — 1-Click MCP Installer\n`);
22
+ console.log(`Usage:`);
23
+ console.log(` npx astro-component-kit mcp install <cursor|claude|codex|lovable|mcp>\n`);
24
+ console.log(`Example:`);
25
+ console.log(` npx astro-component-kit mcp install cursor\n`);
26
+ process.exit(1);
27
+ }
28
+
29
+ const success = await installMcpForClient(client);
30
+ process.exit(success ? 0 : 1);
31
+ }
32
+
33
+ // 2. Help command
34
+ if (!first || first === 'help' || first === '--help' || first === '-h') {
35
+ console.log(`
36
+ 🚀 Astro Components Kit (astro-component-kit)
37
+
38
+ Usage:
39
+ npx astro-component-kit mcp install <cursor|claude|codex|lovable|mcp>
40
+ → Automatically configure your AI editor/agent to connect to the MCP server
41
+
42
+ npx astro-component-kit mcp serve
43
+ → Start local HTTP/SSE MCP server (default port 3000)
44
+
45
+ npx astro-component-kit mcp --stdio
46
+ → Run in stdio mode for local MCP integrations
47
+
48
+ Remote SSE Endpoint:
49
+ https://mcp.astrocomponents.dev/sse
50
+ `);
51
+ process.exit(0);
52
+ }
53
+
54
+ // 3. For serve / stdio modes, invoke MCP runner
55
+ const tsxPath = path.resolve(rootDir, 'node_modules/.bin/tsx');
56
+ const mcpEntry = path.resolve(rootDir, 'src/mcp/index.ts');
57
+ const proc = spawn(process.execPath, [tsxPath, mcpEntry, ...args], {
58
+ stdio: 'inherit',
59
+ cwd: process.cwd(),
60
+ });
61
+ proc.on('exit', (code) => process.exit(code || 0));
62
+ }
63
+
64
+ main().catch((err) => {
65
+ console.error('[cli] Error:', err);
66
+ process.exit(1);
67
+ });
@@ -0,0 +1,179 @@
1
+ // bin/installer.js
2
+ // Pure Node.js automated 1-click CLI installer with zero dependencies.
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+
7
+ const MCP_SERVER_URL = 'https://mcp.astrocomponents.dev/sse';
8
+
9
+ const SERVER_CONFIG = {
10
+ url: MCP_SERVER_URL,
11
+ };
12
+
13
+ function getHomeDir() {
14
+ return os.homedir();
15
+ }
16
+
17
+ export function normalizeClient(input) {
18
+ if (!input || typeof input !== 'string') return null;
19
+ const c = input.toLowerCase().trim();
20
+ if (c === 'cursor' || c === 'cursos') return 'cursor';
21
+ if (c === 'claude' || c === 'claude-desktop' || c === 'claude-code') return 'claude';
22
+ if (c === 'codex' || c === 'openai-codex' || c === 'copilot') return 'codex';
23
+ if (c === 'lovable' || c === 'lovable-dev') return 'lovable';
24
+ if (c === 'mcp' || c === 'universal' || c === 'generic') return 'mcp';
25
+ if (c === 'windsurf') return 'windsurf';
26
+ if (c === 'cline') return 'cline';
27
+ return null;
28
+ }
29
+
30
+ /**
31
+ * Returns the candidate configuration paths for each supported client.
32
+ */
33
+ function getClientConfigPaths(client) {
34
+ const home = getHomeDir();
35
+ const platform = os.platform();
36
+
37
+ switch (client) {
38
+ case 'cursor': {
39
+ const localCursor = path.resolve(process.cwd(), '.cursor/mcp.json');
40
+ const globalCursor = path.resolve(home, '.cursor/mcp.json');
41
+ return { primary: localCursor, fallback: globalCursor };
42
+ }
43
+ case 'claude': {
44
+ if (platform === 'darwin') {
45
+ return { primary: path.resolve(home, 'Library/Application Support/Claude/claude_desktop_config.json') };
46
+ }
47
+ if (platform === 'win32') {
48
+ const appData = process.env.APPDATA || path.resolve(home, 'AppData/Roaming');
49
+ return { primary: path.resolve(appData, 'Claude/claude_desktop_config.json') };
50
+ }
51
+ return { primary: path.resolve(home, '.config/Claude/claude_desktop_config.json') };
52
+ }
53
+ case 'codex': {
54
+ const localCodex = path.resolve(process.cwd(), '.codex/mcp.json');
55
+ const globalCodex = path.resolve(home, '.codex/config.json');
56
+ return { primary: localCodex, fallback: globalCodex };
57
+ }
58
+ case 'lovable': {
59
+ const localLovable = path.resolve(process.cwd(), '.lovable/mcp.json');
60
+ const globalLovable = path.resolve(home, '.lovable/config.json');
61
+ return { primary: localLovable, fallback: globalLovable };
62
+ }
63
+ case 'mcp': {
64
+ const localMcp = path.resolve(process.cwd(), 'mcp.json');
65
+ const globalMcp = path.resolve(home, '.mcp/config.json');
66
+ return { primary: localMcp, fallback: globalMcp };
67
+ }
68
+ case 'windsurf': {
69
+ return { primary: path.resolve(home, '.codeium/windsurf/mcp_config.json') };
70
+ }
71
+ case 'cline': {
72
+ if (platform === 'darwin') {
73
+ return {
74
+ primary: path.resolve(
75
+ home,
76
+ 'Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json'
77
+ ),
78
+ };
79
+ }
80
+ if (platform === 'win32') {
81
+ const appData = process.env.APPDATA || path.resolve(home, 'AppData/Roaming');
82
+ return {
83
+ primary: path.resolve(
84
+ appData,
85
+ 'Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json'
86
+ ),
87
+ };
88
+ }
89
+ return {
90
+ primary: path.resolve(
91
+ home,
92
+ '.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json'
93
+ ),
94
+ };
95
+ }
96
+ default:
97
+ return { primary: path.resolve(process.cwd(), 'mcp.json') };
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Installs or updates the astro-components MCP server in the target client's configuration.
103
+ */
104
+ export async function installMcpForClient(targetClient) {
105
+ const client = normalizeClient(targetClient);
106
+ const validClients = ['cursor', 'claude', 'codex', 'lovable', 'mcp', 'windsurf', 'cline'];
107
+
108
+ if (!client) {
109
+ console.error(`\n❌ Unknown client "${targetClient}".`);
110
+ console.log(` Supported clients: ${validClients.join(', ')}`);
111
+ console.log(`\nExamples:`);
112
+ console.log(` npx astro-component-kit mcp install cursor`);
113
+ console.log(` npx astro-component-kit mcp install claude`);
114
+ console.log(` npx astro-component-kit mcp install codex`);
115
+ console.log(` npx astro-component-kit mcp install lovable`);
116
+ console.log(` npx astro-component-kit mcp install mcp\n`);
117
+ return false;
118
+ }
119
+
120
+ const { primary } = getClientConfigPaths(client);
121
+ const targetDir = path.dirname(primary);
122
+
123
+ console.log(`\n📦 Configuring Astro Components Kit MCP for [${client}]...`);
124
+ console.log(` Target config: ${primary}`);
125
+
126
+ try {
127
+ if (!fs.existsSync(targetDir)) {
128
+ fs.mkdirSync(targetDir, { recursive: true });
129
+ }
130
+
131
+ let config = {};
132
+ if (fs.existsSync(primary)) {
133
+ try {
134
+ const raw = fs.readFileSync(primary, 'utf8');
135
+ config = JSON.parse(raw);
136
+ } catch {
137
+ config = {};
138
+ }
139
+ }
140
+
141
+ if (!config || typeof config !== 'object') {
142
+ config = {};
143
+ }
144
+
145
+ if (!config.mcpServers || typeof config.mcpServers !== 'object') {
146
+ config.mcpServers = {};
147
+ }
148
+
149
+ // Add or update astro-components server
150
+ config.mcpServers['astro-components'] = SERVER_CONFIG;
151
+
152
+ fs.writeFileSync(primary, JSON.stringify(config, null, 2) + '\n', 'utf8');
153
+
154
+ console.log(`\n✅ Successfully installed!`);
155
+ console.log(` Server name: "astro-components"`);
156
+ console.log(` Endpoint: ${MCP_SERVER_URL}`);
157
+ console.log(`\n💡 What to do next:`);
158
+ console.log(` Restart ${client.toUpperCase()} (or reload MCP servers), then prompt your AI:`);
159
+ console.log(` > "Search astro-components for ecommerce cards and buy box"`);
160
+ console.log(` > "Insert a KPI stat tile chart from astro-components"\n`);
161
+ return true;
162
+ } catch (err) {
163
+ console.error(`\n❌ Failed to write configuration: ${err?.message || err}`);
164
+ console.log(`\nYou can configure it manually by adding this JSON:`);
165
+ console.log(
166
+ JSON.stringify(
167
+ {
168
+ mcpServers: {
169
+ 'astro-components': SERVER_CONFIG,
170
+ },
171
+ },
172
+ null,
173
+ 2
174
+ )
175
+ );
176
+ return false;
177
+ }
178
+ }
179
+
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "astro-component-kit",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "A free, open-source accessible UI component library for Astro",
5
5
  "type": "module",
6
6
  "main": "./src/components/index.ts",
7
7
  "module": "./src/components/index.ts",
8
8
  "types": "./src/components/types.d.ts",
9
+ "bin": {
10
+ "astro-component-kit": "./bin/cli.js"
11
+ },
9
12
  "exports": {
10
13
  ".": "./src/components/index.ts",
11
14
  "./buttons": "./src/components/lib/buttons/index.ts",
@@ -27,10 +30,13 @@
27
30
  "./global.css": "./src/styles/global.css"
28
31
  },
29
32
  "files": [
33
+ "bin/",
30
34
  "src/components/lib/",
31
35
  "src/components/index.ts",
32
36
  "src/components/types.d.ts",
33
37
  "src/styles/global.css",
38
+ "src/mcp/",
39
+ "src/data/registry/",
34
40
  "LICENSE",
35
41
  "README.md"
36
42
  ],
@@ -40,10 +46,13 @@
40
46
  "build": "astro build",
41
47
  "preview": "astro preview",
42
48
  "astro": "astro",
43
- "typecheck": "astro check",
49
+ "typecheck": "ASTRO_TELEMETRY_DISABLED=1 astro check",
44
50
  "registry:generate": "node scripts/generate-registry.mjs",
45
- "prepublishOnly": "astro check",
46
- "indexnow:dry": "node scripts/indexnow.mjs --dry-run"
51
+ "prepublishOnly": "ASTRO_TELEMETRY_DISABLED=1 astro check",
52
+ "indexnow:dry": "node scripts/indexnow.mjs --dry-run",
53
+ "mcp:start": "tsx src/mcp/index.ts",
54
+ "mcp:dev": "tsx watch src/mcp/index.ts",
55
+ "mcp:stdio": "tsx src/mcp/index.ts --stdio"
47
56
  },
48
57
  "keywords": [
49
58
  "astro",
@@ -93,10 +102,18 @@
93
102
  "node": ">=22.12.0"
94
103
  },
95
104
  "dependencies": {
96
- "@astrojs/sitemap": "^3.7.2"
105
+ "@astrojs/sitemap": "^3.7.2",
106
+ "@modelcontextprotocol/sdk": "^1.32.2",
107
+ "cors": "^2.8.6",
108
+ "express": "^5.3.0",
109
+ "express-rate-limit": "^8.7.3",
110
+ "tsx": "^4.23.15",
111
+ "zod": "^4.6.7"
97
112
  },
98
113
  "devDependencies": {
99
114
  "@astrojs/check": "^0.9.10",
115
+ "@types/cors": "^2.8.19",
116
+ "@types/express": "^5.0.6",
100
117
  "@types/three": "^0.184.0",
101
118
  "apexcharts": "^3.45.1",
102
119
  "astro": ">=5.0.0",
@@ -27,6 +27,12 @@ const {
27
27
  title = 'Changelog',
28
28
  subtitle = 'New components, improvements and fixes, shipped every week.',
29
29
  releases = [
30
+ { version: 'v0.5.0', date: '2026-11-04', title: 'Official MCP Server & 1-Click AI Integrations', changes: [
31
+ { type: 'new', text: 'Official remote SSE MCP server (mcp.astrocomponents.dev) and local stdio mode.' },
32
+ { type: 'new', text: '1-click CLI installer (`npx astro-component-kit mcp install <client>`) for Cursor, Claude, Codex, Lovable and universal MCP.' },
33
+ { type: 'new', text: 'Dedicated 21st.dev-style /mcp interactive landing page with client tabs and tools catalog.' },
34
+ { type: 'new', text: '8 built-in AI tools with real-time discovery of 340+ components, templates, and design tokens.' },
35
+ ] },
30
36
  { version: 'v0.4.1', date: '2026-11-04', title: 'Multi-page templates & e-commerce suite', changes: [
31
37
  { type: 'new', text: 'Three complete production templates: Nova Store, Forma Studio & The Lobby.' },
32
38
  { type: 'new', text: '17 e-commerce components with persistent cart, filters and checkout.' },
@@ -0,0 +1,93 @@
1
+ // src/data/registry/app.ts
2
+ // App & Dashboard components (SaaS shells, tables, boards, settings). Source via `source()`.
3
+ import type { ComponentDoc } from './types';
4
+ import { source } from './sources';
5
+
6
+ interface Meta { slug: string; name: string; file: string; description: string; tags: string[]; featured?: boolean; usage: string }
7
+
8
+ function item(meta: Meta): ComponentDoc {
9
+ const component = meta.file.replace('.astro', '');
10
+ return {
11
+ slug: meta.slug,
12
+ name: meta.name,
13
+ description: meta.description,
14
+ category: 'app',
15
+ tags: ['app', 'dashboard', 'saas', ...meta.tags],
16
+ featured: meta.featured ?? false,
17
+ code: source(`app/${meta.file}`),
18
+ usage: `---
19
+ import { ${component} } from 'astro-component-kit/app';
20
+ ---
21
+
22
+ ${meta.usage.trim()}`,
23
+ installation: {
24
+ manual: [
25
+ 'Zero runtime dependencies — server-rendered HTML with a small progressive script.',
26
+ 'Copy app-icons.ts (icons, initials and avatar hues) into src/components/app/.',
27
+ `Copy ${meta.file} next to it.`,
28
+ 'Set --app-accent (and optionally the light/dark tokens) to match your brand.',
29
+ ].map((s, i) => `${i + 1}. ${s}`).join('\n'),
30
+ },
31
+ };
32
+ }
33
+
34
+ export const app: ComponentDoc[] = [
35
+ item({ slug: 'app-sidebar', name: 'App Sidebar', file: 'AppSidebar.astro', featured: true,
36
+ description: 'SaaS sidebar with workspace switcher, grouped nav with icons and badges, collapsible icon rail and plan card.',
37
+ tags: ['sidebar', 'navigation', 'shell'],
38
+ usage: `<AppSidebar currentHref="/app/" groups={[{ items: [{ label: 'Dashboard', href: '/app/', icon: 'dashboard' }, { label: 'Reservations', href: '/app/reservations/', icon: 'calendar', badge: 4 }] }]} />` }),
39
+ item({ slug: 'app-topbar', name: 'App Topbar', file: 'AppTopbar.astro', featured: true,
40
+ description: 'App top bar with ⌘K search, notifications dropdown with unread count, theme toggle and user menu.',
41
+ tags: ['topbar', 'header', 'notifications', 'user-menu'],
42
+ usage: `<AppTopbar user={{ name: 'Lucía Ortega', role: 'General manager' }} />` }),
43
+ item({ slug: 'page-header', name: 'Page Header', file: 'PageHeader.astro',
44
+ description: 'App page heading with breadcrumb, description, period switcher, action buttons and underline tabs.',
45
+ tags: ['header', 'toolbar', 'tabs'],
46
+ usage: `<PageHeader title="Reports" periods={['7d', '30d', 'Year']} actions={[{ label: 'Export', icon: 'download' }]} />` }),
47
+ item({ slug: 'data-table', name: 'Data Table', file: 'DataTable.astro', featured: true,
48
+ description: 'Client-side table with search, status chips, sortable columns, row selection, bulk bar, pagination and typed cells.',
49
+ tags: ['table', 'data', 'sort', 'pagination', 'filter'],
50
+ usage: `<DataTable title="Customers" rows={rows} columns={[
51
+ { key: 'name', label: 'Name', type: 'person', sortable: true },
52
+ { key: 'status', label: 'Status', type: 'status' },
53
+ { key: 'total', label: 'Total', type: 'money', align: 'right', sortable: true },
54
+ ]} />` }),
55
+ item({ slug: 'room-rack', name: 'Room Rack', file: 'RoomRack.astro', featured: true,
56
+ description: 'Booking timeline (tape chart): rooms by days with status-coloured reservation bars, today marker and detail panel.',
57
+ tags: ['timeline', 'calendar', 'booking', 'gantt', 'hotel'],
58
+ usage: `<RoomRack days={['Mon 3', 'Tue 4', 'Wed 5']} rooms={[{ id: '101', name: '101', type: 'Standard' }]} bookings={[{ room: '101', guest: 'Elena', start: 0, nights: 2, status: 'confirmed' }]} />` }),
59
+ item({ slug: 'housekeeping-board', name: 'Housekeeping Board', file: 'HousekeepingBoard.astro',
60
+ description: 'Room status board by floor — clean, dirty, inspecting, occupied, out of order — with filters and quick status changes.',
61
+ tags: ['status', 'board', 'grid', 'hotel', 'operations'],
62
+ usage: `<HousekeepingBoard rooms={[{ number: '101', floor: 'Floor 1', status: 'dirty', assignee: 'Rosa' }]} />` }),
63
+ item({ slug: 'arrivals-board', name: 'Arrivals Board', file: 'ArrivalsBoard.astro',
64
+ description: 'Front-desk list with arrivals, departures and in-house tabs plus one-click check-in / check-out.',
65
+ tags: ['list', 'tabs', 'check-in', 'hotel'],
66
+ usage: `<ArrivalsBoard arrivals={[{ guest: 'Elena Duarte', room: '204', time: '14:00', vip: true }]} />` }),
67
+ item({ slug: 'guest-profile-card', name: 'Guest Profile Card', file: 'GuestProfileCard.astro',
68
+ description: 'CRM profile with avatar, loyalty tier, contact links, lifetime stats, preferences, upcoming stay and staff notes.',
69
+ tags: ['profile', 'crm', 'customer', 'card'],
70
+ usage: `<GuestProfileCard guest={{ name: 'Elena Duarte', email: 'elena@mail.com' }} tier="Gold" />` }),
71
+ item({ slug: 'settings-section', name: 'Settings Section', file: 'SettingsSection.astro',
72
+ description: 'Settings block with title and help text beside a fields card with Save / Cancel and a saved confirmation.',
73
+ tags: ['settings', 'form', 'account'],
74
+ usage: `<SettingsSection title="Notifications" description="Choose what reaches you.">
75
+ <SwitchRow name="bookings" label="New bookings" />
76
+ </SettingsSection>` }),
77
+ item({ slug: 'switch-row', name: 'Switch Row', file: 'SwitchRow.astro',
78
+ description: 'Settings row with label, description and an accessible on/off switch.',
79
+ tags: ['switch', 'toggle', 'settings', 'form'],
80
+ usage: `<SwitchRow name="weekly" label="Weekly report" description="Every Monday at 9:00." checked />` }),
81
+ item({ slug: 'team-members', name: 'Team Members', file: 'TeamMembers.astro',
82
+ description: 'Team management with roles, status, invite form and two-step remove.',
83
+ tags: ['team', 'users', 'roles', 'invite'],
84
+ usage: `<TeamMembers seats={10} members={[{ name: 'Lucía Ortega', email: 'lucia@hotel.com', role: 'Owner', you: true }]} />` }),
85
+ item({ slug: 'plan-usage-card', name: 'Plan Usage Card', file: 'PlanUsageCard.astro',
86
+ description: 'Billing summary with plan, renewal, usage meters with thresholds, payment method and upgrade action.',
87
+ tags: ['billing', 'plan', 'usage', 'meter'],
88
+ usage: `<PlanUsageCard plan="Pro" usage={[{ label: 'Rooms', used: 42, limit: 50 }]} />` }),
89
+ item({ slug: 'auth-card', name: 'Auth Card', file: 'AuthCard.astro', featured: true,
90
+ description: 'Split-screen sign-in / sign-up with SSO buttons, show-password toggle, validation and a brand panel.',
91
+ tags: ['auth', 'login', 'sign-in', 'form'],
92
+ usage: `<AuthCard mode="signin" brand="Lobby" successHref="/app/" />` }),
93
+ ];