popeye-cli 1.5.0 → 1.7.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.
Files changed (195) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +184 -31
  3. package/dist/cli/commands/create.d.ts.map +1 -1
  4. package/dist/cli/commands/create.js +54 -4
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/cli/interactive.d.ts +29 -0
  7. package/dist/cli/interactive.d.ts.map +1 -1
  8. package/dist/cli/interactive.js +90 -7
  9. package/dist/cli/interactive.js.map +1 -1
  10. package/dist/generators/all.d.ts +4 -1
  11. package/dist/generators/all.d.ts.map +1 -1
  12. package/dist/generators/all.js +36 -316
  13. package/dist/generators/all.js.map +1 -1
  14. package/dist/generators/doc-parser.d.ts +18 -3
  15. package/dist/generators/doc-parser.d.ts.map +1 -1
  16. package/dist/generators/doc-parser.js +81 -10
  17. package/dist/generators/doc-parser.js.map +1 -1
  18. package/dist/generators/frontend-design-analyzer.d.ts +30 -0
  19. package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
  20. package/dist/generators/frontend-design-analyzer.js +208 -0
  21. package/dist/generators/frontend-design-analyzer.js.map +1 -0
  22. package/dist/generators/shared-packages.d.ts +45 -0
  23. package/dist/generators/shared-packages.d.ts.map +1 -0
  24. package/dist/generators/shared-packages.js +456 -0
  25. package/dist/generators/shared-packages.js.map +1 -0
  26. package/dist/generators/templates/index.d.ts +4 -0
  27. package/dist/generators/templates/index.d.ts.map +1 -1
  28. package/dist/generators/templates/index.js +4 -0
  29. package/dist/generators/templates/index.js.map +1 -1
  30. package/dist/generators/templates/website-components.d.ts.map +1 -1
  31. package/dist/generators/templates/website-components.js +36 -11
  32. package/dist/generators/templates/website-components.js.map +1 -1
  33. package/dist/generators/templates/website-config.d.ts +15 -1
  34. package/dist/generators/templates/website-config.d.ts.map +1 -1
  35. package/dist/generators/templates/website-config.js +155 -13
  36. package/dist/generators/templates/website-config.js.map +1 -1
  37. package/dist/generators/templates/website-landing.d.ts +24 -0
  38. package/dist/generators/templates/website-landing.d.ts.map +1 -0
  39. package/dist/generators/templates/website-landing.js +276 -0
  40. package/dist/generators/templates/website-landing.js.map +1 -0
  41. package/dist/generators/templates/website-layout.d.ts +42 -0
  42. package/dist/generators/templates/website-layout.d.ts.map +1 -0
  43. package/dist/generators/templates/website-layout.js +408 -0
  44. package/dist/generators/templates/website-layout.js.map +1 -0
  45. package/dist/generators/templates/website-pricing.d.ts +11 -0
  46. package/dist/generators/templates/website-pricing.d.ts.map +1 -0
  47. package/dist/generators/templates/website-pricing.js +313 -0
  48. package/dist/generators/templates/website-pricing.js.map +1 -0
  49. package/dist/generators/templates/website-sections.d.ts +102 -0
  50. package/dist/generators/templates/website-sections.d.ts.map +1 -0
  51. package/dist/generators/templates/website-sections.js +444 -0
  52. package/dist/generators/templates/website-sections.js.map +1 -0
  53. package/dist/generators/templates/website.d.ts +10 -50
  54. package/dist/generators/templates/website.d.ts.map +1 -1
  55. package/dist/generators/templates/website.js +12 -788
  56. package/dist/generators/templates/website.js.map +1 -1
  57. package/dist/generators/website-content-scanner.d.ts +37 -0
  58. package/dist/generators/website-content-scanner.d.ts.map +1 -0
  59. package/dist/generators/website-content-scanner.js +165 -0
  60. package/dist/generators/website-content-scanner.js.map +1 -0
  61. package/dist/generators/website-context.d.ts +38 -2
  62. package/dist/generators/website-context.d.ts.map +1 -1
  63. package/dist/generators/website-context.js +179 -19
  64. package/dist/generators/website-context.js.map +1 -1
  65. package/dist/generators/website-debug.d.ts +68 -0
  66. package/dist/generators/website-debug.d.ts.map +1 -0
  67. package/dist/generators/website-debug.js +93 -0
  68. package/dist/generators/website-debug.js.map +1 -0
  69. package/dist/generators/website.d.ts +2 -0
  70. package/dist/generators/website.d.ts.map +1 -1
  71. package/dist/generators/website.js +66 -4
  72. package/dist/generators/website.js.map +1 -1
  73. package/dist/generators/workspace-root.d.ts +27 -0
  74. package/dist/generators/workspace-root.d.ts.map +1 -0
  75. package/dist/generators/workspace-root.js +100 -0
  76. package/dist/generators/workspace-root.js.map +1 -0
  77. package/dist/state/index.d.ts +8 -0
  78. package/dist/state/index.d.ts.map +1 -1
  79. package/dist/state/index.js +11 -0
  80. package/dist/state/index.js.map +1 -1
  81. package/dist/types/consensus.d.ts +3 -0
  82. package/dist/types/consensus.d.ts.map +1 -1
  83. package/dist/types/consensus.js +1 -0
  84. package/dist/types/consensus.js.map +1 -1
  85. package/dist/types/index.d.ts +1 -0
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/index.js +2 -0
  88. package/dist/types/index.js.map +1 -1
  89. package/dist/types/tester.d.ts +138 -0
  90. package/dist/types/tester.d.ts.map +1 -0
  91. package/dist/types/tester.js +110 -0
  92. package/dist/types/tester.js.map +1 -0
  93. package/dist/types/workflow.d.ts +151 -0
  94. package/dist/types/workflow.d.ts.map +1 -1
  95. package/dist/types/workflow.js +14 -0
  96. package/dist/types/workflow.js.map +1 -1
  97. package/dist/upgrade/handlers.d.ts +15 -0
  98. package/dist/upgrade/handlers.d.ts.map +1 -1
  99. package/dist/upgrade/handlers.js +52 -0
  100. package/dist/upgrade/handlers.js.map +1 -1
  101. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  102. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  103. package/dist/workflow/auto-fix-bundler.js +320 -0
  104. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  105. package/dist/workflow/auto-fix.d.ts.map +1 -1
  106. package/dist/workflow/auto-fix.js +10 -3
  107. package/dist/workflow/auto-fix.js.map +1 -1
  108. package/dist/workflow/execution-mode.js +2 -2
  109. package/dist/workflow/execution-mode.js.map +1 -1
  110. package/dist/workflow/index.d.ts +2 -0
  111. package/dist/workflow/index.d.ts.map +1 -1
  112. package/dist/workflow/index.js +13 -0
  113. package/dist/workflow/index.js.map +1 -1
  114. package/dist/workflow/overview.d.ts.map +1 -1
  115. package/dist/workflow/overview.js +4 -0
  116. package/dist/workflow/overview.js.map +1 -1
  117. package/dist/workflow/plan-mode.d.ts +4 -3
  118. package/dist/workflow/plan-mode.d.ts.map +1 -1
  119. package/dist/workflow/plan-mode.js +69 -5
  120. package/dist/workflow/plan-mode.js.map +1 -1
  121. package/dist/workflow/task-workflow.d.ts +5 -0
  122. package/dist/workflow/task-workflow.d.ts.map +1 -1
  123. package/dist/workflow/task-workflow.js +172 -6
  124. package/dist/workflow/task-workflow.js.map +1 -1
  125. package/dist/workflow/tester.d.ts +120 -0
  126. package/dist/workflow/tester.d.ts.map +1 -0
  127. package/dist/workflow/tester.js +589 -0
  128. package/dist/workflow/tester.js.map +1 -0
  129. package/dist/workflow/website-strategy.d.ts +9 -0
  130. package/dist/workflow/website-strategy.d.ts.map +1 -1
  131. package/dist/workflow/website-strategy.js +73 -1
  132. package/dist/workflow/website-strategy.js.map +1 -1
  133. package/dist/workflow/website-updater.d.ts.map +1 -1
  134. package/dist/workflow/website-updater.js +15 -4
  135. package/dist/workflow/website-updater.js.map +1 -1
  136. package/dist/workflow/workflow-logger.d.ts +1 -1
  137. package/dist/workflow/workflow-logger.d.ts.map +1 -1
  138. package/dist/workflow/workflow-logger.js.map +1 -1
  139. package/package.json +1 -1
  140. package/src/cli/commands/create.ts +58 -4
  141. package/src/cli/interactive.ts +96 -7
  142. package/src/generators/all.ts +44 -332
  143. package/src/generators/doc-parser.ts +87 -10
  144. package/src/generators/frontend-design-analyzer.ts +261 -0
  145. package/src/generators/shared-packages.ts +500 -0
  146. package/src/generators/templates/index.ts +4 -0
  147. package/src/generators/templates/website-components.ts +36 -11
  148. package/src/generators/templates/website-config.ts +166 -13
  149. package/src/generators/templates/website-landing.ts +331 -0
  150. package/src/generators/templates/website-layout.ts +443 -0
  151. package/src/generators/templates/website-pricing.ts +330 -0
  152. package/src/generators/templates/website-sections.ts +541 -0
  153. package/src/generators/templates/website.ts +38 -851
  154. package/src/generators/website-content-scanner.ts +208 -0
  155. package/src/generators/website-context.ts +248 -20
  156. package/src/generators/website-debug.ts +130 -0
  157. package/src/generators/website.ts +71 -3
  158. package/src/generators/workspace-root.ts +113 -0
  159. package/src/state/index.ts +15 -0
  160. package/src/types/consensus.ts +3 -0
  161. package/src/types/index.ts +21 -0
  162. package/src/types/tester.ts +136 -0
  163. package/src/types/workflow.ts +32 -0
  164. package/src/upgrade/handlers.ts +65 -0
  165. package/src/workflow/auto-fix-bundler.ts +392 -0
  166. package/src/workflow/auto-fix.ts +11 -3
  167. package/src/workflow/execution-mode.ts +2 -2
  168. package/src/workflow/index.ts +13 -0
  169. package/src/workflow/overview.ts +6 -0
  170. package/src/workflow/plan-mode.ts +81 -7
  171. package/src/workflow/task-workflow.ts +227 -5
  172. package/src/workflow/tester.ts +723 -0
  173. package/src/workflow/website-strategy.ts +75 -1
  174. package/src/workflow/website-updater.ts +17 -6
  175. package/src/workflow/workflow-logger.ts +2 -0
  176. package/tests/cli/project-naming.test.ts +136 -0
  177. package/tests/generators/doc-parser.test.ts +121 -0
  178. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  179. package/tests/generators/quality-gate.test.ts +183 -0
  180. package/tests/generators/shared-packages.test.ts +83 -0
  181. package/tests/generators/website-components.test.ts +1 -1
  182. package/tests/generators/website-config.test.ts +84 -0
  183. package/tests/generators/website-content-scanner.test.ts +181 -0
  184. package/tests/generators/website-context.test.ts +109 -0
  185. package/tests/generators/website-debug.test.ts +77 -0
  186. package/tests/generators/website-landing.test.ts +188 -0
  187. package/tests/generators/website-pricing.test.ts +98 -0
  188. package/tests/generators/website-sections.test.ts +245 -0
  189. package/tests/generators/workspace-root.test.ts +105 -0
  190. package/tests/types/tester.test.ts +174 -0
  191. package/tests/upgrade/handlers.test.ts +162 -0
  192. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  193. package/tests/workflow/plan-mode.test.ts +111 -1
  194. package/tests/workflow/tester.test.ts +401 -0
  195. package/tests/workflow/website-strategy.test.ts +55 -0
@@ -0,0 +1,408 @@
1
+ /**
2
+ * Website layout and utility page generators
3
+ * Layout, globals CSS, sitemap, robots, docs, blog, readme, spec, test
4
+ */
5
+ /**
6
+ * Escape a string for safe use inside JSX template literals
7
+ */
8
+ function escapeJsx(str) {
9
+ return str
10
+ .replace(/\\/g, '\\\\')
11
+ .replace(/'/g, "\\'")
12
+ .replace(/`/g, '\\`')
13
+ .replace(/\$/g, '\\$');
14
+ }
15
+ /**
16
+ * Convert hex color to HSL string for CSS custom properties
17
+ * Returns format: "H S% L%"
18
+ */
19
+ function hexToHslString(hex) {
20
+ const h = hex.replace('#', '');
21
+ const r = parseInt(h.substring(0, 2), 16) / 255;
22
+ const g = parseInt(h.substring(2, 4), 16) / 255;
23
+ const b = parseInt(h.substring(4, 6), 16) / 255;
24
+ const max = Math.max(r, g, b);
25
+ const min = Math.min(r, g, b);
26
+ const l = (max + min) / 2;
27
+ if (max === min) {
28
+ return `0 0% ${Math.round(l * 100)}%`;
29
+ }
30
+ const d = max - min;
31
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
32
+ let hue = 0;
33
+ if (max === r) {
34
+ hue = ((g - b) / d + (g < b ? 6 : 0)) / 6;
35
+ }
36
+ else if (max === g) {
37
+ hue = ((b - r) / d + 2) / 6;
38
+ }
39
+ else {
40
+ hue = ((r - g) / d + 4) / 6;
41
+ }
42
+ return `${Math.round(hue * 360)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;
43
+ }
44
+ /**
45
+ * Generate root layout.tsx with metadata
46
+ */
47
+ export function generateWebsiteLayout(projectName, context) {
48
+ const title = projectName
49
+ .split('-')
50
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
51
+ .join(' ');
52
+ const strategy = context?.strategy;
53
+ const displayName = context?.productName || title;
54
+ const desc = strategy?.messaging.longDescription
55
+ || context?.description
56
+ || `${displayName} - Your modern web application`;
57
+ const keywords = strategy?.seoStrategy.primaryKeywords
58
+ ? strategy.seoStrategy.primaryKeywords.map(k => `'${escapeJsx(k)}'`).join(', ')
59
+ : `'${projectName}', 'web app', 'nextjs'`;
60
+ return `import type { Metadata } from 'next';
61
+ import { Inter } from 'next/font/google';
62
+ import './globals.css';
63
+
64
+ const inter = Inter({
65
+ subsets: ['latin'],
66
+ variable: '--font-inter',
67
+ });
68
+
69
+ const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
70
+
71
+ export const metadata: Metadata = {
72
+ metadataBase: new URL(BASE_URL),
73
+ title: {
74
+ default: '${escapeJsx(displayName)}',
75
+ template: '%s | ${escapeJsx(displayName)}',
76
+ },
77
+ description: '${escapeJsx(desc)}',
78
+ keywords: [${keywords}],
79
+ authors: [{ name: '${escapeJsx(displayName)} Team' }],
80
+ creator: '${escapeJsx(displayName)}',
81
+ openGraph: {
82
+ type: 'website',
83
+ locale: 'en_US',
84
+ url: BASE_URL,
85
+ siteName: '${escapeJsx(displayName)}',
86
+ title: '${escapeJsx(displayName)}',
87
+ description: '${escapeJsx(desc)}',
88
+ },
89
+ twitter: {
90
+ card: 'summary_large_image',
91
+ title: '${escapeJsx(displayName)}',
92
+ description: '${escapeJsx(desc)}',
93
+ },
94
+ robots: {
95
+ index: true,
96
+ follow: true,
97
+ },
98
+ };
99
+
100
+ export default function RootLayout({
101
+ children,
102
+ }: {
103
+ children: React.ReactNode;
104
+ }) {
105
+ return (
106
+ <html lang="en" className={inter.variable}>
107
+ <body className="min-h-screen bg-background text-foreground antialiased">
108
+ {children}
109
+ </body>
110
+ </html>
111
+ );
112
+ }
113
+ `;
114
+ }
115
+ /**
116
+ * Generate globals.css with full CSS variable set
117
+ */
118
+ export function generateWebsiteGlobalsCss(context) {
119
+ const primaryHsl = context?.brand?.primaryColor
120
+ ? hexToHslString(context.brand.primaryColor)
121
+ : '199 89% 48%';
122
+ return `@tailwind base;
123
+ @tailwind components;
124
+ @tailwind utilities;
125
+
126
+ @layer base {
127
+ :root {
128
+ --background: 0 0% 100%;
129
+ --foreground: 222.2 84% 4.9%;
130
+ --primary: ${primaryHsl};
131
+ --primary-foreground: 210 40% 98%;
132
+ --muted: 210 40% 96%;
133
+ --muted-foreground: 215 16% 47%;
134
+ --accent: 210 40% 96%;
135
+ --accent-foreground: 222.2 47% 11%;
136
+ --card: 0 0% 100%;
137
+ --card-foreground: 222.2 84% 4.9%;
138
+ --border: 214 32% 91%;
139
+ --ring: ${primaryHsl};
140
+ --radius: 0.5rem;
141
+ }
142
+
143
+ body {
144
+ @apply bg-background text-foreground;
145
+ }
146
+ }
147
+
148
+ html {
149
+ scroll-behavior: smooth;
150
+ }
151
+
152
+ @layer components {
153
+ .container {
154
+ @apply mx-auto max-w-7xl px-4 sm:px-6 lg:px-8;
155
+ }
156
+ }
157
+ `;
158
+ }
159
+ /**
160
+ * Generate sitemap.ts
161
+ */
162
+ export function generateWebsiteSitemap(projectName) {
163
+ return `import { MetadataRoute } from 'next';
164
+
165
+ export default function sitemap(): MetadataRoute.Sitemap {
166
+ const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
167
+
168
+ return [
169
+ {
170
+ url: baseUrl,
171
+ lastModified: new Date(),
172
+ changeFrequency: 'weekly',
173
+ priority: 1,
174
+ },
175
+ {
176
+ url: \`\${baseUrl}/pricing\`,
177
+ lastModified: new Date(),
178
+ changeFrequency: 'monthly',
179
+ priority: 0.8,
180
+ },
181
+ {
182
+ url: \`\${baseUrl}/docs\`,
183
+ lastModified: new Date(),
184
+ changeFrequency: 'weekly',
185
+ priority: 0.8,
186
+ },
187
+ {
188
+ url: \`\${baseUrl}/blog\`,
189
+ lastModified: new Date(),
190
+ changeFrequency: 'daily',
191
+ priority: 0.7,
192
+ },
193
+ ];
194
+ }
195
+ `;
196
+ }
197
+ /**
198
+ * Generate robots.ts
199
+ */
200
+ export function generateWebsiteRobots(projectName) {
201
+ return `import { MetadataRoute } from 'next';
202
+
203
+ export default function robots(): MetadataRoute.Robots {
204
+ const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
205
+
206
+ return {
207
+ rules: [
208
+ {
209
+ userAgent: '*',
210
+ allow: '/',
211
+ disallow: ['/api/', '/admin/'],
212
+ },
213
+ ],
214
+ sitemap: \`\${baseUrl}/sitemap.xml\`,
215
+ };
216
+ }
217
+ `;
218
+ }
219
+ /**
220
+ * Generate website README
221
+ */
222
+ export function generateWebsiteReadme(projectName) {
223
+ const title = projectName
224
+ .split('-')
225
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
226
+ .join(' ');
227
+ return `# ${title} Website
228
+
229
+ Next.js marketing website with SEO optimization.
230
+
231
+ ## Getting Started
232
+
233
+ \`\`\`bash
234
+ # Install dependencies
235
+ npm install
236
+
237
+ # Run development server (port 3001)
238
+ npm run dev
239
+
240
+ # Build for production
241
+ npm run build
242
+
243
+ # Run production server
244
+ npm start
245
+ \`\`\`
246
+
247
+ ## SEO Features
248
+
249
+ - Server-side rendering (SSR)
250
+ - Auto-generated sitemap
251
+ - robots.txt configuration
252
+ - OpenGraph and Twitter meta tags
253
+ - Structured data support (Organization + SoftwareApplication + FAQ)
254
+
255
+ ## Project Structure
256
+
257
+ \`\`\`
258
+ src/
259
+ app/
260
+ layout.tsx # Root layout with metadata
261
+ page.tsx # Landing page (10 sections)
262
+ pricing/ # Pricing page with comparison
263
+ docs/ # Documentation
264
+ blog/ # Blog
265
+ sitemap.ts # Auto-generated sitemap
266
+ robots.ts # robots.txt config
267
+ components/ # UI components (Header, Footer, JsonLd)
268
+ lib/ # Utilities
269
+ content/
270
+ blog/ # MDX blog posts
271
+ docs/ # MDX documentation
272
+ \`\`\`
273
+
274
+ ## Development
275
+
276
+ - Port: 3001 (to avoid conflicts with frontend on 5173)
277
+ - API URL: Configure via NEXT_PUBLIC_APP_URL
278
+ `;
279
+ }
280
+ /**
281
+ * Generate website spec JSON with optional context
282
+ */
283
+ export function generateWebsiteSpec(projectName, context) {
284
+ const title = projectName
285
+ .split('-')
286
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
287
+ .join(' ');
288
+ const displayName = context?.productName || title;
289
+ const tagline = context?.tagline || context?.description || 'Build something amazing';
290
+ const primaryColor = context?.brand?.primaryColor || '#0ea5e9';
291
+ return JSON.stringify({
292
+ version: '1.0',
293
+ brand: {
294
+ name: displayName,
295
+ tagline,
296
+ colors: {
297
+ primary: primaryColor,
298
+ secondary: '#64748b',
299
+ accent: '#f59e0b',
300
+ background: '#ffffff',
301
+ foreground: '#0f172a',
302
+ },
303
+ typography: {
304
+ headingFont: 'Inter',
305
+ bodyFont: 'Inter',
306
+ },
307
+ },
308
+ seo: {
309
+ title: displayName,
310
+ description: context?.description || `${displayName} - Your modern web application`,
311
+ keywords: [projectName, 'web app', 'nextjs', 'saas'],
312
+ locale: 'en_US',
313
+ },
314
+ pages: [
315
+ { name: 'Home', path: '/', type: 'landing' },
316
+ { name: 'Pricing', path: '/pricing', type: 'pricing' },
317
+ { name: 'Documentation', path: '/docs', type: 'docs' },
318
+ { name: 'Blog', path: '/blog', type: 'blog' },
319
+ ],
320
+ cta: {
321
+ primary: { text: 'Get Started', href: '/pricing' },
322
+ secondary: { text: 'Learn More', href: '/docs' },
323
+ },
324
+ features: {
325
+ analytics: true,
326
+ newsletter: false,
327
+ mdxBlog: true,
328
+ docsSearch: false,
329
+ },
330
+ }, null, 2);
331
+ }
332
+ /**
333
+ * Generate sample test for website
334
+ */
335
+ export function generateWebsiteTest(projectName) {
336
+ const title = projectName
337
+ .split('-')
338
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
339
+ .join(' ');
340
+ return `import { describe, it, expect } from 'vitest';
341
+ import { render, screen } from '@testing-library/react';
342
+ import HomePage from '@/app/page';
343
+
344
+ describe('HomePage', () => {
345
+ it('renders the title', () => {
346
+ render(<HomePage />);
347
+ expect(screen.getByRole('heading', { level: 1 })).toHaveTextContent('${title}');
348
+ });
349
+
350
+ it('renders the call-to-action buttons', () => {
351
+ render(<HomePage />);
352
+ expect(screen.getByRole('link', { name: /get started/i })).toBeInTheDocument();
353
+ expect(screen.getByRole('link', { name: /learn more/i })).toBeInTheDocument();
354
+ });
355
+ });
356
+ `;
357
+ }
358
+ /**
359
+ * Generate docs page placeholder
360
+ */
361
+ export function generateWebsiteDocsPage() {
362
+ return `import type { Metadata } from 'next';
363
+
364
+ export const metadata: Metadata = {
365
+ title: 'Documentation',
366
+ description: 'Learn how to use our platform with comprehensive documentation.',
367
+ };
368
+
369
+ export default function DocsPage() {
370
+ return (
371
+ <main className="py-20">
372
+ <div className="container">
373
+ <h1 className="text-4xl font-bold text-foreground">Documentation</h1>
374
+ <p className="mt-4 text-lg text-muted-foreground">
375
+ Documentation coming soon...
376
+ </p>
377
+ </div>
378
+ </main>
379
+ );
380
+ }
381
+ `;
382
+ }
383
+ /**
384
+ * Generate blog listing page placeholder
385
+ */
386
+ export function generateWebsiteBlogPage() {
387
+ return `import type { Metadata } from 'next';
388
+
389
+ export const metadata: Metadata = {
390
+ title: 'Blog',
391
+ description: 'Latest news, updates, and insights from our team.',
392
+ };
393
+
394
+ export default function BlogPage() {
395
+ return (
396
+ <main className="py-20">
397
+ <div className="container">
398
+ <h1 className="text-4xl font-bold text-foreground">Blog</h1>
399
+ <p className="mt-4 text-lg text-muted-foreground">
400
+ Blog posts coming soon...
401
+ </p>
402
+ </div>
403
+ </main>
404
+ );
405
+ }
406
+ `;
407
+ }
408
+ //# sourceMappingURL=website-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-layout.js","sourceRoot":"","sources":["../../../src/generators/templates/website-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Pricing page generator with monthly/annual toggle, feature comparison,
3
+ * pricing FAQ, and enterprise CTA section
4
+ */
5
+ import type { WebsiteContentContext } from '../website-context.js';
6
+ /**
7
+ * Generate pricing page with optional context-driven tiers, comparison, and FAQ
8
+ * Rendered as client component for monthly/annual toggle
9
+ */
10
+ export declare function generateWebsitePricingPage(_projectName: string, context?: WebsiteContentContext): string;
11
+ //# sourceMappingURL=website-pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-pricing.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/website-pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAanE;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAgQR"}