@mozole/cli 2.0.0 → 2.1.1

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.
Files changed (96) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +109 -15
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts +7 -0
  5. package/dist/commands/add.d.ts.map +1 -0
  6. package/dist/commands/add.js +87 -0
  7. package/dist/commands/add.js.map +1 -0
  8. package/dist/commands/adopt.d.ts +2 -0
  9. package/dist/commands/adopt.d.ts.map +1 -1
  10. package/dist/commands/adopt.js +243 -45
  11. package/dist/commands/adopt.js.map +1 -1
  12. package/dist/commands/assets.d.ts +28 -0
  13. package/dist/commands/assets.d.ts.map +1 -0
  14. package/dist/commands/assets.js +176 -0
  15. package/dist/commands/assets.js.map +1 -0
  16. package/dist/commands/backend.d.ts +5 -0
  17. package/dist/commands/backend.d.ts.map +1 -0
  18. package/dist/commands/backend.js +68 -0
  19. package/dist/commands/backend.js.map +1 -0
  20. package/dist/commands/new.d.ts +1 -1
  21. package/dist/commands/new.d.ts.map +1 -1
  22. package/dist/commands/new.js +13 -5
  23. package/dist/commands/new.js.map +1 -1
  24. package/dist/commands/prototype.d.ts.map +1 -1
  25. package/dist/commands/prototype.js +68 -20
  26. package/dist/commands/prototype.js.map +1 -1
  27. package/dist/commands/release.d.ts +10 -0
  28. package/dist/commands/release.d.ts.map +1 -0
  29. package/dist/commands/release.js +181 -0
  30. package/dist/commands/release.js.map +1 -0
  31. package/dist/commands/ui.d.ts +5 -0
  32. package/dist/commands/ui.d.ts.map +1 -1
  33. package/dist/commands/ui.js +49 -0
  34. package/dist/commands/ui.js.map +1 -1
  35. package/dist/scaffold/agents.d.ts.map +1 -1
  36. package/dist/scaffold/agents.js +40 -6
  37. package/dist/scaffold/agents.js.map +1 -1
  38. package/dist/scaffold/backend.d.ts +1 -1
  39. package/dist/scaffold/backend.d.ts.map +1 -1
  40. package/dist/scaffold/backend.js +63 -31
  41. package/dist/scaffold/backend.js.map +1 -1
  42. package/dist/scaffold/components.d.ts +8 -0
  43. package/dist/scaffold/components.d.ts.map +1 -0
  44. package/dist/scaffold/components.js +305 -0
  45. package/dist/scaffold/components.js.map +1 -0
  46. package/dist/scaffold/design.d.ts.map +1 -1
  47. package/dist/scaffold/design.js +47 -25
  48. package/dist/scaffold/design.js.map +1 -1
  49. package/dist/scaffold/flagship.d.ts +5 -0
  50. package/dist/scaffold/flagship.d.ts.map +1 -1
  51. package/dist/scaffold/flagship.js +161 -102
  52. package/dist/scaffold/flagship.js.map +1 -1
  53. package/dist/scaffold/index.d.ts +1 -1
  54. package/dist/scaffold/index.d.ts.map +1 -1
  55. package/dist/scaffold/index.js +22 -7
  56. package/dist/scaffold/index.js.map +1 -1
  57. package/dist/scaffold/library.d.ts +3 -0
  58. package/dist/scaffold/library.d.ts.map +1 -0
  59. package/dist/scaffold/library.js +98 -0
  60. package/dist/scaffold/library.js.map +1 -0
  61. package/dist/scaffold/phases.d.ts.map +1 -1
  62. package/dist/scaffold/phases.js +19 -14
  63. package/dist/scaffold/phases.js.map +1 -1
  64. package/dist/scaffold/repomap.d.ts +3 -3
  65. package/dist/scaffold/repomap.d.ts.map +1 -1
  66. package/dist/scaffold/repomap.js +22 -10
  67. package/dist/scaffold/repomap.js.map +1 -1
  68. package/dist/scaffold/standard.d.ts.map +1 -1
  69. package/dist/scaffold/standard.js +3 -2
  70. package/dist/scaffold/standard.js.map +1 -1
  71. package/dist/scaffold/tools-guide.d.ts +3 -0
  72. package/dist/scaffold/tools-guide.d.ts.map +1 -0
  73. package/dist/scaffold/tools-guide.js +117 -0
  74. package/dist/scaffold/tools-guide.js.map +1 -0
  75. package/dist/scaffold/workflow.d.ts +5 -0
  76. package/dist/scaffold/workflow.d.ts.map +1 -0
  77. package/dist/scaffold/workflow.js +221 -0
  78. package/dist/scaffold/workflow.js.map +1 -0
  79. package/dist/ui/CockpitApp.d.ts +2 -2
  80. package/dist/ui/CockpitApp.d.ts.map +1 -1
  81. package/dist/ui/CockpitApp.js +361 -15
  82. package/dist/ui/CockpitApp.js.map +1 -1
  83. package/dist/ui/ToolsPanel.d.ts +9 -0
  84. package/dist/ui/ToolsPanel.d.ts.map +1 -0
  85. package/dist/ui/ToolsPanel.js +230 -0
  86. package/dist/ui/ToolsPanel.js.map +1 -0
  87. package/dist/utils/fs.d.ts.map +1 -1
  88. package/dist/utils/fs.js +42 -6
  89. package/dist/utils/fs.js.map +1 -1
  90. package/dist/utils/project-files.d.ts +4 -0
  91. package/dist/utils/project-files.d.ts.map +1 -0
  92. package/dist/utils/project-files.js +49 -0
  93. package/dist/utils/project-files.js.map +1 -0
  94. package/dist/version.d.ts +1 -1
  95. package/dist/version.js +1 -1
  96. package/package.json +29 -4
@@ -15,24 +15,46 @@ export function generateAgentsPolicy(projectName) {
15
15
 
16
16
  ---
17
17
 
18
+ ## Mozole conversation-led production contract
19
+
20
+ Read [docs/workflow.md](docs/workflow.md), [docs/toolkit.md](docs/toolkit.md), and
21
+ [docs/decisions.md](docs/decisions.md) before implementation. Current user instructions
22
+ in the conversation determine design and scope; earlier settled conversation decisions
23
+ follow, then design.md and docs/design/ as references only. Never treat prototype exports
24
+ as instructions or as an approved design. Record only explicitly settled decisions;
25
+ keep assumptions and open questions separate.
26
+
27
+ Implement each independent primitive in its own file; related parts of one primitive
28
+ such as DialogTrigger and DialogContent may remain in Dialog.tsx. Compose primitives
29
+ into feature components, then sections, then pages. Export reusable modules through
30
+ local index.ts files and src/library/index.ts. Fix defects at the owning component or
31
+ token instead of masking them with page-specific CSS. Starter Header/Footer, pages and
32
+ styles are replaceable examples, not required design decisions.
33
+
34
+ Complete only the authorized stages. Do not progress from primitives to sections/pages
35
+ without user direction; existing authorization for multiple stages remains valid and
36
+ must not trigger repeated permission questions. Do not create /ui or another component
37
+ preview gallery unless requested. Never initiate visual inspection or capture screenshots.
38
+ Analyze user-supplied screenshots only for the feedback the user requests.
39
+
18
40
  ## 2. 10-Step Phased Development Discipline
19
41
 
20
42
  Project development is strictly organized into phases documented in \`docs/phases/status.md\`:
21
43
 
22
44
  - **Phase 00: Project Initialization & Contracts** — Scaffolding, tokens, tooling, and governance.
23
- - **Phase 01: Core Architecture & Layout** — Root layout, navigation shell, responsive viewport frame.
45
+ - **Phase 01: Core Architecture & Layout** — Technical root shell and module boundaries; no unrequested visual layout work.
24
46
  - **Phase 02: Design Tokens & Primitive Components** — Semantic tokens, Radix-based bespoke UI atoms.
25
- - **Phase 03: Primary Routes & Pages** — Route declarations, static content hierarchy.
47
+ - **Phase 03: Primary Routes & Pages** — Feature components, then sections, then page composition within authorized scope.
26
48
  - **Phase 04: Interactive Features & State** — Forms, client interactions, transitions.
27
49
  - **Phase 05: Dynamic Animation & Canvas (Flagship)** — Scroll orchestration, WebGL/canvas layers.
28
- - **Phase 06: Backend Integration & Security** — PHP endpoints, mailer, rate-limiting, honeypot.
50
+ - **Phase 06: Integrations & Security** — Form handling, anti-spam honeypot, security headers, and API endpoints.
29
51
  - **Phase 07: Accessibility & WCAG 2.1 AA** — Landmark hierarchy, keyboard traps, screen reader fidelity.
30
52
  - **Phase 08: Performance & Core Web Vitals** — Fluid typography, asset optimization, zero layout shift.
31
53
  - **Phase 09: Browser & Breakpoint QA** — Headless DOM geometry audit across all media query boundaries.
32
54
  - **Phase 10: Production Readiness & Launch** — Static build verification, SSG export, deployment readiness.
33
55
 
34
56
  ### Execution Rules
35
- 1. **Initial Development:** Must advance sequentially. Run \`mozole phase next\` to advance upon completing all phase deliverables and passing \`mozole verify\`.
57
+ 1. **Initial Development:** Track engineering progress sequentially; follow the conversation-led production order in docs/workflow.md. Phase numbers never authorize extra design work. Run \`mozole phase next\` to advance upon completing applicable phase deliverables and requested checks. The command does not run verification and may create a Git commit.
36
58
  2. **Post-Launch Maintenance:** After Phase 10 is reached, bug fixes and routine maintenance tasks do not require reopening completed phases, provided changes adhere to established design tokens and architectural contracts. If a change introduces major architectural divergence or new sub-systems, reopen the relevant phase with \`mozole phase reopen <number>\`.
37
59
 
38
60
  ---
@@ -42,14 +64,26 @@ Project development is strictly organized into phases documented in \`docs/phase
42
64
  - **Canonical Token Source:** The sole authoritative design token repository is \`src/styles/tokens.css\`, declared directly via Tailwind v4 \`@theme\` syntax. Do not duplicate or maintain parallel token definitions.
43
65
  - **Zero Literal Values:** Never use hardcoded hex/rgb/hsl color literals or magic pixel offsets in components or style declarations. Consume tokens via utility classes or \`var(--...)\`.
44
66
  - **Zero Code Cannibalization:** UI primitives must be bespoke application code living in \`src/components/ui/\`, using unstyled Radix primitives for accessibility; no generic pre-styled template dumping.
67
+ - **Project-owned Library:** Export UI, layout, motion and behavior through local barrel files and \`src/library/index.ts\`. Build pages by composing these independent modules. Never import implementation code or tokens from a sibling project or a workspace-level shared library. Prototype workspaces share npm dependencies only.
68
+ - **Profiles & Backend:** Standard uses Vite, React, Tailwind and React Router; Flagship uses Wouter, Motion and Lenis. Backend is opt-in (PHP or Node) and separate from the frontend profile.
45
69
  - **Performance & Motion:** \`transition: all\` is strictly prohibited. Declare explicit transition targets. Always respect \`@media (prefers-reduced-motion: reduce)\`.
46
70
 
47
71
  ---
48
72
 
73
+ ## Component, asset and release commands
74
+
75
+ Read docs/tools.md for the catalog and options. Use \`mozole add <component>\` to add
76
+ project-owned foundations; adapt them to conversation-directed design and preserve existing
77
+ custom components. Use \`mozole assets\` to encode source images, then consume their manifest
78
+ through ResponsiveImage with appropriate sizes and priority. This is file processing, not
79
+ visual inspection. Use \`mozole release\` for local static/PHP packaging when requested;
80
+ it runs the build unless --skip-build is set, preserves existing releases, and never uploads.
81
+ The same operations are available in the terminal cockpit under [6] TOOLS.
82
+
49
83
  ## 4. Quality Kit & Verification
50
84
 
51
- - **Automated Verification:** Run \`mozole verify\` before completing any task.
52
- - **Headless & Screenshot-Free:** Routine automated QA (\`mozole qa\` or \`mozole test\`) must never capture, diff, or inspect raster screenshots. Visual quality is verified headlessly through static AST contract auditing and live DOM geometry probing.
85
+ - **Automated Verification:** Run \`mozole verify\` when validation is authorized. If the user says not to test, do not run verification or probes; provide the commands and state they were not run.
86
+ - **Headless & Screenshot-Free:** Automated QA (\`mozole verify\` or \`mozole test\`) must never capture, diff, or inspect raster screenshots. Do not initiate visual review of the app or reference exports. Static contract auditing and headless DOM geometry are technical checks, not visual approval. User-supplied screenshots can be analyzed only within the requested correction.
53
87
  - **Pre-existing / Environmental Failure Exception:** If a failure is proven pre-existing, caused by broken external tooling, or due to a missing environmental dependency (e.g. system PHP runtime absent in a pure frontend workspace), the agent may conclude the task provided:
54
88
  1. The agent's own changes introduced zero regressions.
55
89
  2. The pre-existing/environmental failure is clearly documented in the completion report with actionable evidence.
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/scaffold/agents.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDxB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;;CAER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,wBAAwB,EAAE,CAAC;IAE9C,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEjE,wDAAwD;IACxD,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvF,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/scaffold/agents.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFxB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;;CAER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,wBAAwB,EAAE,CAAC;IAE9C,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEjE,wDAAwD;IACxD,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvF,CAAC"}
@@ -3,5 +3,5 @@ export declare function generatePhpMailer(): string;
3
3
  export declare function generatePhpIndex(): string;
4
4
  export declare function generatePhpSecurityHtaccess(): string;
5
5
  export declare function generateNodeBackend(): string;
6
- export declare function scaffoldBackend(projectRoot: string, type?: "php" | "node"): Promise<void>;
6
+ export declare function scaffoldBackend(projectRoot: string, type?: "php" | "node" | "none"): Promise<void>;
7
7
  //# sourceMappingURL=backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/scaffold/backend.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,IAAI,MAAM,CA+B1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAmC1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA8LzC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAcpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAoD5C;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,KAAK,GAAG,MAAc,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/scaffold/backend.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,IAAI,MAAM,CA+B1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAmC1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA8LzC;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAiBpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAuC5C;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,KAAK,GAAG,MAAM,GAAG,MAAe,GACrC,OAAO,CAAC,IAAI,CAAC,CAqDf"}
@@ -1,5 +1,6 @@
1
+ import { readFile } from "node:fs/promises";
1
2
  import path from "node:path";
2
- import { atomicWrite } from "../utils/fs.js";
3
+ import { atomicWrite, exists, writeFiles } from "../utils/fs.js";
3
4
  export function generatePhpConfig() {
4
5
  return `<?php
5
6
  /**
@@ -263,12 +264,15 @@ export function generatePhpSecurityHtaccess() {
263
264
  return `# Mozole Studio - Shared Hosting Security
264
265
  # Blocks direct access to sensitive PHP files and enforces strict methods
265
266
 
266
- <FilesMatch "^config\\.php$">
267
+ <FilesMatch "^(config|mailer|router)\\.php$">
267
268
  Require all denied
268
269
  </FilesMatch>
269
270
 
270
271
  Options -Indexes -MultiViews
271
272
 
273
+ RewriteEngine On
274
+ RewriteRule ^(health|contact)$ index.php [L]
275
+
272
276
  <LimitExcept GET POST OPTIONS>
273
277
  Require all denied
274
278
  </LimitExcept>
@@ -281,7 +285,7 @@ const PORT = Number(process.env.PORT || 3001);
281
285
 
282
286
  const server = createServer(async (req, res) => {
283
287
  res.setHeader("Content-Type", "application/json");
284
- res.setHeader("Access-Control-Allow-Origin", "*");
288
+ res.setHeader("X-Content-Type-Options", "nosniff");
285
289
  res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
286
290
  res.setHeader("Access-Control-Allow-Headers", "Content-Type");
287
291
 
@@ -298,23 +302,8 @@ const server = createServer(async (req, res) => {
298
302
  }
299
303
 
300
304
  if (req.method === "POST" && req.url === "/api/contact") {
301
- let body = "";
302
- req.on("data", (chunk) => (body += chunk));
303
- req.on("end", () => {
304
- try {
305
- const data = JSON.parse(body);
306
- if (data._honey) {
307
- res.writeHead(200);
308
- res.end(JSON.stringify({ success: true }));
309
- return;
310
- }
311
- res.writeHead(200);
312
- res.end(JSON.stringify({ success: true, message: "Message received." }));
313
- } catch {
314
- res.writeHead(400);
315
- res.end(JSON.stringify({ error: "Invalid JSON" }));
316
- }
317
- });
305
+ res.writeHead(501);
306
+ res.end(JSON.stringify({ error: "Configure a project contact delivery adapter before accepting messages." }));
318
307
  return;
319
308
  }
320
309
 
@@ -322,22 +311,65 @@ const server = createServer(async (req, res) => {
322
311
  res.end(JSON.stringify({ error: "Not found" }));
323
312
  });
324
313
 
325
- server.listen(PORT, () => {
314
+ server.requestTimeout = 15_000;
315
+ server.headersTimeout = 10_000;
316
+ server.listen(PORT, process.env.HOST || "127.0.0.1", () => {
326
317
  console.log(\`Backend API running on http://localhost:\${PORT}\`);
327
318
  });
328
319
  `;
329
320
  }
330
- export async function scaffoldBackend(projectRoot, type = "php") {
331
- if (type === "php") {
332
- const apiDir = path.join(projectRoot, "api");
333
- await atomicWrite(path.join(apiDir, "config.php"), generatePhpConfig());
334
- await atomicWrite(path.join(apiDir, "mailer.php"), generatePhpMailer());
335
- await atomicWrite(path.join(apiDir, "index.php"), generatePhpIndex());
336
- await atomicWrite(path.join(apiDir, ".htaccess"), generatePhpSecurityHtaccess());
321
+ export async function scaffoldBackend(projectRoot, type = "none") {
322
+ if (type === "none")
323
+ return;
324
+ if (type !== "php" && type !== "node")
325
+ throw new Error("Backend must be php or node.");
326
+ const pkgPath = path.join(projectRoot, "package.json");
327
+ const pkg = (await exists(pkgPath)) ? JSON.parse(await readFile(pkgPath, "utf8")) : null;
328
+ const command = type === "php" ? "php -S 127.0.0.1:3001 -t api api/router.php" : "node server/index.mjs";
329
+ if (pkg?.scripts?.["dev:backend"] && pkg.scripts["dev:backend"] !== command) {
330
+ throw new Error("Existing dev:backend script conflicts with the selected runtime.");
337
331
  }
338
- else {
339
- const serverDir = path.join(projectRoot, "server");
340
- await atomicWrite(path.join(serverDir, "index.mjs"), generateNodeBackend());
332
+ const files = type === "php"
333
+ ? {
334
+ "api/config.php": generatePhpConfig(),
335
+ "api/mailer.php": generatePhpMailer(),
336
+ "api/index.php": generatePhpIndex(),
337
+ "api/.htaccess": generatePhpSecurityHtaccess(),
338
+ "api/router.php": `<?php
339
+ $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
340
+ if (!in_array($path, ['/api/health', '/api/contact', '/api/index.php'], true)) {
341
+ http_response_code(404);
342
+ header('Content-Type: application/json');
343
+ echo json_encode(['error' => 'Not found']);
344
+ exit;
345
+ }
346
+ require __DIR__ . '/index.php';
347
+ `,
348
+ }
349
+ : { "server/index.mjs": generateNodeBackend() };
350
+ const entries = Object.entries(files);
351
+ for (const [file] of entries) {
352
+ if (await exists(path.join(projectRoot, file))) {
353
+ throw new Error(`Backend file already exists; preserving it: ${file}`);
354
+ }
355
+ }
356
+ await writeFiles(projectRoot, Object.fromEntries(entries));
357
+ await writeFiles(projectRoot, {
358
+ "docs/backend.md": `# Backend: ${type}
359
+
360
+ Run npm run dev:backend in one terminal and npm run dev in another.
361
+ The frontend uses relative /api URLs; Vite proxies them to 127.0.0.1:3001.
362
+ Production hosting must route /api to this runtime separately from static assets.
363
+ ${type === "php" ? "Requires PHP 8.1+. Configure api/config.php with the customer's recipients and origins. Mail delivery requires a configured server mail transport. For Apache, route /api/health and /api/contact to api/index.php; block access to configuration files." : "Requires Node.js 20+. GET /api/health is ready. POST /api/contact returns 501 until a project-owned delivery or storage adapter is implemented."}
364
+
365
+ This module provides the API foundation. Add project-owned authentication, authorization,
366
+ persistence and admin routes for customer menu management. It does not create a ready CMS.
367
+ Never expose an unauthenticated content mutation endpoint.
368
+ `,
369
+ });
370
+ if (pkg) {
371
+ pkg.scripts = { ...pkg.scripts, "dev:backend": command };
372
+ await atomicWrite(pkgPath, JSON.stringify(pkg, null, 2));
341
373
  }
342
374
  }
343
375
  //# sourceMappingURL=backend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/scaffold/backend.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4LR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDR,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,OAAuB,KAAK;IAE5B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACxE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACxE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACtE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/scaffold/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface ComponentDefinition {
2
+ file: string;
3
+ source: string;
4
+ dependencies: Record<string, string>;
5
+ description: string;
6
+ }
7
+ export declare const COMPONENTS: Record<string, ComponentDefinition>;
8
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/scaffold/components.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;CACrB;AAwFD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CA0U1D,CAAC"}
@@ -0,0 +1,305 @@
1
+ import { generateDialog } from "./library.js";
2
+ import { generateBespokeButton, generateBespokeInput } from "./standard.js";
3
+ const control = "rounded-[var(--radius-sm)] border border-[var(--color-border)] bg-[var(--color-surface)] px-3 py-2 text-[var(--color-foreground)] focus-visible:outline-2 focus-visible:outline-[var(--color-primary)] disabled:opacity-50 disabled:pointer-events-none";
4
+ const panel = "rounded-[var(--radius-sm)] border border-[var(--color-border)] bg-[var(--color-surface)] p-4 text-[var(--color-foreground)]";
5
+ const overlay = "fixed inset-0 z-50 bg-[var(--color-background)]/80";
6
+ const floating = `${panel} z-50 max-h-[var(--radix-popper-available-height)] overflow-auto`;
7
+ function native(name, tag, classes = panel, defaults = "") {
8
+ const d = defaults ? ` ${defaults}` : "";
9
+ return `export function ${name}({ className = "", ...props }: ComponentProps<"${tag}">) {
10
+ return <${tag}${d} className={\`${classes} \${className}\`} {...props} />;
11
+ }
12
+ `;
13
+ }
14
+ function wrap(name, part, classes = control, defaults = "") {
15
+ const d = defaults ? ` ${defaults}` : "";
16
+ return `export function ${name}({ className = "", ...props }: ComponentProps<typeof Primitive.${part}>) {
17
+ return <Primitive.${part}${d} className={\`${classes} \${className}\`} {...props} />;
18
+ }
19
+ `;
20
+ }
21
+ function family(name, exports, wrappers = [], extra = "") {
22
+ const source = `import { ${name} as Primitive } from "radix-ui";
23
+ ${wrappers.length || extra ? 'import type { ComponentProps } from "react";\n' : ""}
24
+ ${exports.map((part) => `export const ${name}${part === "Root" ? "" : part} = Primitive.${part};`).join("\n")}
25
+ ${wrappers.map(([suffix, part, classes]) => wrap(`${name}${suffix}`, part, classes)).join("\n")}
26
+ ${extra}`;
27
+ return {
28
+ file: name,
29
+ source,
30
+ dependencies: { "radix-ui": "^1.6.7" },
31
+ description: `${name}: project-owned Radix foundation`,
32
+ };
33
+ }
34
+ function html(file, definitions) {
35
+ return {
36
+ file,
37
+ dependencies: {},
38
+ description: `${file}: semantic project-owned foundation`,
39
+ source: `import type { ComponentProps } from "react";\n\n${definitions.map(([name, tag, classes, defaults]) => native(name, tag, classes, defaults)).join("\n")}`,
40
+ };
41
+ }
42
+ function portalContent(name, bodyClass = floating) {
43
+ return `export function ${name}Content({ className = "", ...props }: ComponentProps<typeof Primitive.Content>) {
44
+ return <Primitive.Portal><Primitive.Content className={\`${bodyClass} \${className}\`} {...props} /></Primitive.Portal>;
45
+ }
46
+ `;
47
+ }
48
+ function slidingPanel(name, position) {
49
+ return {
50
+ file: name,
51
+ dependencies: { "@radix-ui/react-dialog": "^1.1.6" },
52
+ description: `${name}: accessible ${name === "Drawer" ? "bottom panel (no drag gesture)" : "side panel"}`,
53
+ source: `import * as Primitive from "@radix-ui/react-dialog";
54
+ import type { ComponentProps } from "react";
55
+ export const ${name} = Primitive.Root;
56
+ export const ${name}Trigger = Primitive.Trigger;
57
+ export const ${name}Close = Primitive.Close;
58
+ export const ${name}Title = Primitive.Title;
59
+ export const ${name}Description = Primitive.Description;
60
+ export function ${name}Content({ className = "", children, ...props }: ComponentProps<typeof Primitive.Content>) {
61
+ return <Primitive.Portal>
62
+ <Primitive.Overlay className="${overlay}" />
63
+ <Primitive.Content className={\`fixed z-50 overflow-y-auto ${position} ${panel} \${className}\`} {...props}>
64
+ {children}
65
+ <Primitive.Close className="${control} mt-4">Close</Primitive.Close>
66
+ </Primitive.Content>
67
+ </Primitive.Portal>;
68
+ }
69
+ `,
70
+ };
71
+ }
72
+ export const COMPONENTS = {
73
+ button: {
74
+ file: "Button",
75
+ source: generateBespokeButton(),
76
+ dependencies: { "@radix-ui/react-slot": "^1.1.2" },
77
+ description: "Button with variants and asChild composition",
78
+ },
79
+ input: {
80
+ file: "Input",
81
+ source: generateBespokeInput(),
82
+ dependencies: {},
83
+ description: "Input with accessible error state",
84
+ },
85
+ dialog: {
86
+ file: "Dialog",
87
+ source: generateDialog(),
88
+ dependencies: { "@radix-ui/react-dialog": "^1.1.6" },
89
+ description: "Accessible modal dialog",
90
+ },
91
+ accordion: family("Accordion", ["Root"], [
92
+ ["Item", "Item", "border-b border-[var(--color-border)]"],
93
+ ["Content", "Content", "py-3"],
94
+ ], `export function AccordionTrigger({ className = "", children, ...props }: ComponentProps<typeof Primitive.Trigger>) {
95
+ return <Primitive.Header><Primitive.Trigger className={\`w-full text-left ${control} \${className}\`} {...props}>{children}</Primitive.Trigger></Primitive.Header>;
96
+ }`),
97
+ "alert-dialog": family("AlertDialog", ["Root", "Trigger", "Title", "Description"], [
98
+ ["Action", "Action"],
99
+ ["Cancel", "Cancel"],
100
+ ], `export function AlertDialogContent({ className = "", ...props }: ComponentProps<typeof Primitive.Content>) {
101
+ return <Primitive.Portal><Primitive.Overlay className="${overlay}" /><Primitive.Content className={\`fixed left-1/2 top-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 ${panel} \${className}\`} {...props} /></Primitive.Portal>;
102
+ }`),
103
+ "aspect-ratio": family("AspectRatio", ["Root"]),
104
+ avatar: family("Avatar", [], [
105
+ ["", "Root", "relative inline-flex size-10 shrink-0 overflow-hidden rounded-full"],
106
+ ["Image", "Image", "size-full object-cover"],
107
+ [
108
+ "Fallback",
109
+ "Fallback",
110
+ "flex size-full items-center justify-center bg-[var(--color-surface)]",
111
+ ],
112
+ ]),
113
+ checkbox: family("Checkbox", ["Indicator"], [], `export function Checkbox({ className = "", children, ...props }: ComponentProps<typeof Primitive.Root>) {
114
+ return <Primitive.Root className={\`inline-flex size-6 items-center justify-center ${control} p-0 \${className}\`} {...props}>{children ?? <Primitive.Indicator aria-hidden="true">✓</Primitive.Indicator>}</Primitive.Root>;
115
+ }`),
116
+ collapsible: family("Collapsible", ["Root", "Trigger", "Content"]),
117
+ "context-menu": family("ContextMenu", ["Root", "Trigger", "Group", "RadioGroup", "Sub", "SubTrigger", "SubContent", "ItemIndicator"], [
118
+ ["Item", "Item"],
119
+ ["CheckboxItem", "CheckboxItem"],
120
+ ["RadioItem", "RadioItem"],
121
+ ["Label", "Label", "px-3 py-1 font-medium"],
122
+ ["Separator", "Separator", "h-px bg-[var(--color-border)]"],
123
+ ], portalContent("ContextMenu")),
124
+ "dropdown-menu": family("DropdownMenu", ["Root", "Trigger", "Group", "RadioGroup", "Sub", "SubTrigger", "SubContent", "ItemIndicator"], [
125
+ ["Item", "Item"],
126
+ ["CheckboxItem", "CheckboxItem"],
127
+ ["RadioItem", "RadioItem"],
128
+ ["Label", "Label", "px-3 py-1 font-medium"],
129
+ ["Separator", "Separator", "h-px bg-[var(--color-border)]"],
130
+ ], portalContent("DropdownMenu")),
131
+ "hover-card": family("HoverCard", ["Root", "Trigger", "Arrow"], [], portalContent("HoverCard")),
132
+ label: family("Label", [], [["", "Root", "text-sm font-medium"]]),
133
+ menubar: family("Menubar", ["Menu", "Group", "Sub", "SubTrigger", "SubContent", "RadioGroup", "ItemIndicator"], [
134
+ ["", "Root", `flex gap-1 ${panel}`],
135
+ ["Trigger", "Trigger"],
136
+ ["Item", "Item"],
137
+ ["CheckboxItem", "CheckboxItem"],
138
+ ["RadioItem", "RadioItem"],
139
+ ["Label", "Label", "font-medium"],
140
+ ["Separator", "Separator", "h-px bg-[var(--color-border)]"],
141
+ ], portalContent("Menubar")),
142
+ "navigation-menu": family("NavigationMenu", ["Root", "Item", "Indicator", "Viewport"], [
143
+ ["List", "List", "flex flex-wrap gap-2"],
144
+ ["Trigger", "Trigger"],
145
+ ["Link", "Link"],
146
+ ["Content", "Content", panel],
147
+ ]),
148
+ popover: family("Popover", ["Root", "Trigger", "Anchor", "Close", "Arrow"], [], portalContent("Popover")),
149
+ progress: family("Progress", [], [], `export function Progress({ value = 0, max = 100, className = "", ...props }: ComponentProps<typeof Primitive.Root>) {
150
+ const percent = value === null ? 0 : Math.min(100, Math.max(0, value / max * 100));
151
+ return <Primitive.Root value={value} max={max} className={\`h-2 overflow-hidden rounded-full bg-[var(--color-surface)] \${className}\`} {...props}>
152
+ <Primitive.Indicator className="h-full bg-[var(--color-primary)]" style={{ width: value === null ? "100%" : percent + "%" }} />
153
+ </Primitive.Root>;
154
+ }`),
155
+ "radio-group": family("RadioGroup", ["Root"], [], `export function RadioGroupItem({ className = "", children, ...props }: ComponentProps<typeof Primitive.Item>) {
156
+ return <Primitive.Item className={\`size-6 rounded-full border border-[var(--color-border)] ${control} p-0 \${className}\`} {...props}>{children ?? <Primitive.Indicator className="block size-3 mx-auto rounded-full bg-[var(--color-primary)]" />}</Primitive.Item>;
157
+ }`),
158
+ "scroll-area": family("ScrollArea", [], [], `export function ScrollArea({ className = "", children, ...props }: ComponentProps<typeof Primitive.Root>) {
159
+ return <Primitive.Root className={\`relative overflow-hidden \${className}\`} {...props}>
160
+ <Primitive.Viewport className="size-full rounded-[inherit]">{children}</Primitive.Viewport>
161
+ <Primitive.Scrollbar orientation="vertical" className="flex w-2"><Primitive.Thumb className="relative flex-1 rounded-full bg-[var(--color-border)]" /></Primitive.Scrollbar>
162
+ <Primitive.Scrollbar orientation="horizontal" className="flex h-2"><Primitive.Thumb className="relative flex-1 rounded-full bg-[var(--color-border)]" /></Primitive.Scrollbar>
163
+ <Primitive.Corner />
164
+ </Primitive.Root>;
165
+ }`),
166
+ select: family("Select", ["Root", "Value", "Group", "Label", "Separator"], [["Trigger", "Trigger", `inline-flex items-center gap-2 ${control}`]], `export function SelectContent({ className = "", children, ...props }: ComponentProps<typeof Primitive.Content>) {
167
+ return <Primitive.Portal><Primitive.Content position="popper" className={\`${floating} \${className}\`} {...props}>
168
+ <Primitive.ScrollUpButton aria-label="Scroll up">▲</Primitive.ScrollUpButton>
169
+ <Primitive.Viewport>{children}</Primitive.Viewport><Primitive.ScrollDownButton aria-label="Scroll down">▼</Primitive.ScrollDownButton>
170
+ </Primitive.Content></Primitive.Portal>;
171
+ }
172
+ export function SelectItem({ className = "", children, ...props }: ComponentProps<typeof Primitive.Item>) {
173
+ return <Primitive.Item className={\`${control} \${className}\`} {...props}><Primitive.ItemText>{children}</Primitive.ItemText><Primitive.ItemIndicator aria-hidden="true">✓</Primitive.ItemIndicator></Primitive.Item>;
174
+ }`),
175
+ separator: family("Separator", [], [
176
+ [
177
+ "",
178
+ "Root",
179
+ "bg-[var(--color-border)] data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:h-full",
180
+ ],
181
+ ]),
182
+ slider: family("Slider", [], [], `export function Slider({ className = "", value, defaultValue = [50], thumbLabels = ["Value"], ...props }: ComponentProps<typeof Primitive.Root> & { thumbLabels?: string[] }) {
183
+ return <Primitive.Root value={value} defaultValue={defaultValue} className={\`relative flex h-6 w-full touch-none items-center data-[orientation=vertical]:h-48 data-[orientation=vertical]:w-6 data-[orientation=vertical]:flex-col \${className}\`} {...props}>
184
+ <Primitive.Track className="relative grow h-2 data-[orientation=vertical]:w-2 rounded-full bg-[var(--color-surface)]"><Primitive.Range className="absolute h-full data-[orientation=vertical]:w-full bg-[var(--color-primary)]" /></Primitive.Track>
185
+ {(value ?? defaultValue).map((_, index) => <Primitive.Thumb key={index} aria-label={thumbLabels[index] ?? "Value " + (index + 1)} className="block size-6 rounded-full bg-[var(--color-primary)] focus-visible:outline-2 focus-visible:outline-offset-2" />)}
186
+ </Primitive.Root>;
187
+ }`),
188
+ switch: family("Switch", [], [], `export function Switch({ className = "", children, ...props }: ComponentProps<typeof Primitive.Root>) {
189
+ return <Primitive.Root className={\`inline-flex h-6 w-11 items-center rounded-full bg-[var(--color-border)] data-[state=checked]:bg-[var(--color-primary)] focus-visible:outline-2 focus-visible:outline-offset-2 disabled:opacity-50 \${className}\`} {...props}>{children ?? <Primitive.Thumb className="block size-5 translate-x-0.5 rounded-full bg-[var(--color-foreground)] data-[state=checked]:translate-x-5" />}</Primitive.Root>;
190
+ }`),
191
+ tabs: family("Tabs", ["Root"], [
192
+ ["List", "List", "flex gap-2 border-b border-[var(--color-border)]"],
193
+ [
194
+ "Trigger",
195
+ "Trigger",
196
+ `${control} data-[state=active]:bg-[var(--color-primary)] data-[state=active]:text-[var(--color-primary-foreground)]`,
197
+ ],
198
+ ["Content", "Content", "py-4"],
199
+ ]),
200
+ toast: family("Toast", ["Provider", "Title", "Description", "Action", "Close"], [
201
+ ["", "Root", panel],
202
+ ["Viewport", "Viewport", "fixed bottom-4 right-4 z-50 flex max-w-sm flex-col gap-2"],
203
+ ]),
204
+ toggle: family("Toggle", [], [
205
+ [
206
+ "",
207
+ "Root",
208
+ `${control} data-[state=on]:bg-[var(--color-primary)] data-[state=on]:text-[var(--color-primary-foreground)]`,
209
+ ],
210
+ ]),
211
+ "toggle-group": family("ToggleGroup", ["Root"], [
212
+ [
213
+ "Item",
214
+ "Item",
215
+ `${control} data-[state=on]:bg-[var(--color-primary)] data-[state=on]:text-[var(--color-primary-foreground)]`,
216
+ ],
217
+ ]),
218
+ tooltip: family("Tooltip", ["Provider", "Root", "Trigger", "Arrow"], [], portalContent("Tooltip")),
219
+ sheet: slidingPanel("Sheet", "inset-y-0 right-0 w-full max-w-md"),
220
+ drawer: slidingPanel("Drawer", "inset-x-0 bottom-0 max-h-[85dvh] rounded-t-[var(--radius-sm)]"),
221
+ card: html("Card", [
222
+ ["Card", "div"],
223
+ ["CardHeader", "div", "mb-4"],
224
+ ["CardTitle", "h3", "text-lg font-semibold"],
225
+ ["CardDescription", "p", "text-[var(--color-muted-foreground)]"],
226
+ ["CardContent", "div", ""],
227
+ ["CardFooter", "div", "mt-4 flex items-center gap-2"],
228
+ ]),
229
+ badge: html("Badge", [
230
+ [
231
+ "Badge",
232
+ "span",
233
+ "inline-flex rounded-full border border-[var(--color-border)] px-2 py-0.5 text-xs",
234
+ ],
235
+ ]),
236
+ textarea: html("Textarea", [["Textarea", "textarea", `${control} min-h-24 w-full text-base`]]),
237
+ table: html("Table", [
238
+ ["Table", "table", "w-full text-sm"],
239
+ ["TableHeader", "thead", "border-b border-[var(--color-border)]"],
240
+ ["TableBody", "tbody", ""],
241
+ ["TableFooter", "tfoot", "border-t border-[var(--color-border)]"],
242
+ ["TableRow", "tr", "border-b border-[var(--color-border)]"],
243
+ ["TableHead", "th", "p-3 text-left font-medium", 'scope="col"'],
244
+ ["TableCell", "td", "p-3"],
245
+ ["TableCaption", "caption", "p-3 text-[var(--color-muted-foreground)]"],
246
+ ]),
247
+ skeleton: html("Skeleton", [
248
+ [
249
+ "Skeleton",
250
+ "div",
251
+ "rounded-[var(--radius-sm)] bg-[var(--color-border)] motion-safe:animate-pulse",
252
+ 'aria-hidden="true"',
253
+ ],
254
+ ]),
255
+ alert: html("Alert", [
256
+ ["Alert", "div", panel, 'role="alert"'],
257
+ ["AlertTitle", "h4", "font-medium"],
258
+ ["AlertDescription", "div", "text-sm text-[var(--color-muted-foreground)]"],
259
+ ]),
260
+ breadcrumb: html("Breadcrumb", [
261
+ ["Breadcrumb", "nav", "", 'aria-label="Breadcrumb"'],
262
+ ["BreadcrumbList", "ol", "flex flex-wrap items-center gap-2"],
263
+ ["BreadcrumbItem", "li", "inline-flex gap-2"],
264
+ ["BreadcrumbLink", "a", "underline-offset-4 hover:underline"],
265
+ ["BreadcrumbPage", "span", "font-medium", 'aria-current="page"'],
266
+ ["BreadcrumbSeparator", "li", "", 'aria-hidden="true"'],
267
+ ]),
268
+ pagination: html("Pagination", [
269
+ ["Pagination", "nav", "", 'aria-label="Pagination"'],
270
+ ["PaginationContent", "ul", "flex items-center gap-2"],
271
+ ["PaginationItem", "li", ""],
272
+ ["PaginationLink", "a", control],
273
+ ]),
274
+ spinner: html("Spinner", [
275
+ [
276
+ "Spinner",
277
+ "span",
278
+ "inline-block size-5 rounded-full border-2 border-[var(--color-border)] border-t-[var(--color-primary)] motion-safe:animate-spin",
279
+ 'role="status" aria-label="Loading"',
280
+ ],
281
+ ]),
282
+ "native-select": html("NativeSelect", [
283
+ ["NativeSelect", "select", control],
284
+ ["NativeSelectOption", "option", ""],
285
+ ["NativeSelectGroup", "optgroup", ""],
286
+ ]),
287
+ field: html("Field", [
288
+ ["Field", "fieldset", "flex flex-col gap-2"],
289
+ ["FieldLegend", "legend", "font-medium"],
290
+ ["FieldLabel", "label", "text-sm font-medium"],
291
+ ["FieldDescription", "p", "text-sm text-[var(--color-muted-foreground)]"],
292
+ ["FieldError", "p", "text-sm text-[var(--color-danger)]", 'role="alert"'],
293
+ ]),
294
+ "button-group": html("ButtonGroup", [
295
+ ["ButtonGroup", "div", "inline-flex flex-wrap gap-1", 'role="group"'],
296
+ ]),
297
+ kbd: html("Kbd", [
298
+ [
299
+ "Kbd",
300
+ "kbd",
301
+ "rounded-[var(--radius-sm)] border border-[var(--color-border)] px-1 text-xs font-mono",
302
+ ],
303
+ ]),
304
+ };
305
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/scaffold/components.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/scaffold/design.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5F"}
1
+ {"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/scaffold/design.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,IAAI,MAAM,CAoB7C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY3D;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5F"}