popeye-cli 1.5.0 → 1.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.
Files changed (161) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +50 -8
  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 +10 -0
  80. package/dist/state/index.js.map +1 -1
  81. package/dist/types/workflow.d.ts +6 -0
  82. package/dist/types/workflow.d.ts.map +1 -1
  83. package/dist/types/workflow.js +2 -0
  84. package/dist/types/workflow.js.map +1 -1
  85. package/dist/upgrade/handlers.d.ts +15 -0
  86. package/dist/upgrade/handlers.d.ts.map +1 -1
  87. package/dist/upgrade/handlers.js +52 -0
  88. package/dist/upgrade/handlers.js.map +1 -1
  89. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  90. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  91. package/dist/workflow/auto-fix-bundler.js +320 -0
  92. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  93. package/dist/workflow/auto-fix.d.ts.map +1 -1
  94. package/dist/workflow/auto-fix.js +10 -3
  95. package/dist/workflow/auto-fix.js.map +1 -1
  96. package/dist/workflow/index.d.ts +1 -0
  97. package/dist/workflow/index.d.ts.map +1 -1
  98. package/dist/workflow/index.js +12 -0
  99. package/dist/workflow/index.js.map +1 -1
  100. package/dist/workflow/overview.d.ts.map +1 -1
  101. package/dist/workflow/overview.js +4 -0
  102. package/dist/workflow/overview.js.map +1 -1
  103. package/dist/workflow/plan-mode.d.ts +4 -3
  104. package/dist/workflow/plan-mode.d.ts.map +1 -1
  105. package/dist/workflow/plan-mode.js +69 -5
  106. package/dist/workflow/plan-mode.js.map +1 -1
  107. package/dist/workflow/website-strategy.d.ts +9 -0
  108. package/dist/workflow/website-strategy.d.ts.map +1 -1
  109. package/dist/workflow/website-strategy.js +73 -1
  110. package/dist/workflow/website-strategy.js.map +1 -1
  111. package/dist/workflow/website-updater.d.ts.map +1 -1
  112. package/dist/workflow/website-updater.js +15 -4
  113. package/dist/workflow/website-updater.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/cli/commands/create.ts +58 -4
  116. package/src/cli/interactive.ts +96 -7
  117. package/src/generators/all.ts +44 -332
  118. package/src/generators/doc-parser.ts +87 -10
  119. package/src/generators/frontend-design-analyzer.ts +261 -0
  120. package/src/generators/shared-packages.ts +500 -0
  121. package/src/generators/templates/index.ts +4 -0
  122. package/src/generators/templates/website-components.ts +36 -11
  123. package/src/generators/templates/website-config.ts +166 -13
  124. package/src/generators/templates/website-landing.ts +331 -0
  125. package/src/generators/templates/website-layout.ts +443 -0
  126. package/src/generators/templates/website-pricing.ts +330 -0
  127. package/src/generators/templates/website-sections.ts +541 -0
  128. package/src/generators/templates/website.ts +38 -851
  129. package/src/generators/website-content-scanner.ts +208 -0
  130. package/src/generators/website-context.ts +248 -20
  131. package/src/generators/website-debug.ts +130 -0
  132. package/src/generators/website.ts +71 -3
  133. package/src/generators/workspace-root.ts +113 -0
  134. package/src/state/index.ts +14 -0
  135. package/src/types/workflow.ts +6 -0
  136. package/src/upgrade/handlers.ts +65 -0
  137. package/src/workflow/auto-fix-bundler.ts +392 -0
  138. package/src/workflow/auto-fix.ts +11 -3
  139. package/src/workflow/index.ts +12 -0
  140. package/src/workflow/overview.ts +6 -0
  141. package/src/workflow/plan-mode.ts +81 -7
  142. package/src/workflow/website-strategy.ts +75 -1
  143. package/src/workflow/website-updater.ts +17 -6
  144. package/tests/cli/project-naming.test.ts +136 -0
  145. package/tests/generators/doc-parser.test.ts +121 -0
  146. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  147. package/tests/generators/quality-gate.test.ts +183 -0
  148. package/tests/generators/shared-packages.test.ts +83 -0
  149. package/tests/generators/website-components.test.ts +1 -1
  150. package/tests/generators/website-config.test.ts +84 -0
  151. package/tests/generators/website-content-scanner.test.ts +181 -0
  152. package/tests/generators/website-context.test.ts +109 -0
  153. package/tests/generators/website-debug.test.ts +77 -0
  154. package/tests/generators/website-landing.test.ts +188 -0
  155. package/tests/generators/website-pricing.test.ts +98 -0
  156. package/tests/generators/website-sections.test.ts +245 -0
  157. package/tests/generators/workspace-root.test.ts +105 -0
  158. package/tests/upgrade/handlers.test.ts +162 -0
  159. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  160. package/tests/workflow/plan-mode.test.ts +111 -1
  161. package/tests/workflow/website-strategy.test.ts +55 -0
@@ -122,12 +122,24 @@ export function generateWebsiteTsconfig() {
122
122
  }
123
123
  /**
124
124
  * Generate Tailwind config for website
125
+ *
126
+ * @param options - Optional configuration for brand colors and workspace mode
127
+ * @returns Tailwind config source code
125
128
  */
126
- export function generateWebsiteTailwindConfig() {
129
+ export function generateWebsiteTailwindConfig(options) {
130
+ const colorScale = options?.primaryColor
131
+ ? generateInlineColorScale(options.primaryColor)
132
+ : defaultColorScale();
133
+ const presetImport = options?.workspaceMode && options?.projectName
134
+ ? `import designPreset from '@${options.projectName}/design-tokens/tailwind';\n`
135
+ : '';
136
+ const presetsBlock = options?.workspaceMode && options?.projectName
137
+ ? ` presets: [designPreset],\n`
138
+ : '';
127
139
  return `import type { Config } from 'tailwindcss';
128
-
140
+ ${presetImport}
129
141
  const config: Config = {
130
- content: [
142
+ ${presetsBlock} content: [
131
143
  './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
132
144
  './src/components/**/*.{js,ts,jsx,tsx,mdx}',
133
145
  './src/app/**/*.{js,ts,jsx,tsx,mdx}',
@@ -136,21 +148,50 @@ const config: Config = {
136
148
  extend: {
137
149
  colors: {
138
150
  primary: {
139
- 50: '#f0f9ff',
140
- 100: '#e0f2fe',
141
- 200: '#bae6fd',
142
- 300: '#7dd3fc',
143
- 400: '#38bdf8',
144
- 500: '#0ea5e9',
145
- 600: '#0284c7',
146
- 700: '#0369a1',
147
- 800: '#075985',
148
- 900: '#0c4a6e',
151
+ ${colorScale}
152
+ },
153
+ background: 'hsl(var(--background))',
154
+ foreground: 'hsl(var(--foreground))',
155
+ muted: {
156
+ DEFAULT: 'hsl(var(--muted))',
157
+ foreground: 'hsl(var(--muted-foreground))',
149
158
  },
159
+ accent: {
160
+ DEFAULT: 'hsl(var(--accent))',
161
+ foreground: 'hsl(var(--accent-foreground))',
162
+ },
163
+ card: {
164
+ DEFAULT: 'hsl(var(--card))',
165
+ foreground: 'hsl(var(--card-foreground))',
166
+ },
167
+ border: 'hsl(var(--border))',
168
+ ring: 'hsl(var(--ring))',
150
169
  },
151
170
  fontFamily: {
152
171
  sans: ['var(--font-inter)', 'system-ui', 'sans-serif'],
153
172
  },
173
+ borderColor: {
174
+ DEFAULT: 'hsl(var(--border))',
175
+ },
176
+ borderRadius: {
177
+ lg: 'var(--radius)',
178
+ md: 'calc(var(--radius) - 2px)',
179
+ sm: 'calc(var(--radius) - 4px)',
180
+ },
181
+ keyframes: {
182
+ fadeIn: {
183
+ '0%': { opacity: '0' },
184
+ '100%': { opacity: '1' },
185
+ },
186
+ slideUp: {
187
+ '0%': { opacity: '0', transform: 'translateY(20px)' },
188
+ '100%': { opacity: '1', transform: 'translateY(0)' },
189
+ },
190
+ },
191
+ animation: {
192
+ fadeIn: 'fadeIn 0.5s ease-out',
193
+ slideUp: 'slideUp 0.5s ease-out',
194
+ },
154
195
  },
155
196
  },
156
197
  plugins: [],
@@ -159,6 +200,107 @@ const config: Config = {
159
200
  export default config;
160
201
  `;
161
202
  }
203
+ /**
204
+ * Generate inline color scale entries from a hex color
205
+ */
206
+ function generateInlineColorScale(hex) {
207
+ const rgb = hexToRgb(hex);
208
+ if (!rgb)
209
+ return defaultColorScale();
210
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
211
+ const stops = [
212
+ { key: '50', lightness: 0.95 },
213
+ { key: '100', lightness: 0.90 },
214
+ { key: '200', lightness: 0.80 },
215
+ { key: '300', lightness: 0.68 },
216
+ { key: '400', lightness: 0.56 },
217
+ { key: '500', lightness: 0.48 },
218
+ { key: '600', lightness: 0.40 },
219
+ { key: '700', lightness: 0.32 },
220
+ { key: '800', lightness: 0.24 },
221
+ { key: '900', lightness: 0.15 },
222
+ ];
223
+ return stops
224
+ .map(stop => ` ${stop.key}: '${hslToHex(hsl.h, hsl.s, stop.lightness)}',`)
225
+ .join('\n');
226
+ }
227
+ function defaultColorScale() {
228
+ return ` 50: '#f0f9ff',
229
+ 100: '#e0f2fe',
230
+ 200: '#bae6fd',
231
+ 300: '#7dd3fc',
232
+ 400: '#38bdf8',
233
+ 500: '#0ea5e9',
234
+ 600: '#0284c7',
235
+ 700: '#0369a1',
236
+ 800: '#075985',
237
+ 900: '#0c4a6e',`;
238
+ }
239
+ // --- Color conversion helpers (inline to avoid circular deps) ---
240
+ function hexToRgb(hex) {
241
+ const cleaned = hex.replace(/^#/, '');
242
+ if (cleaned.length !== 6)
243
+ return null;
244
+ const r = parseInt(cleaned.substring(0, 2), 16);
245
+ const g = parseInt(cleaned.substring(2, 4), 16);
246
+ const b = parseInt(cleaned.substring(4, 6), 16);
247
+ if (isNaN(r) || isNaN(g) || isNaN(b))
248
+ return null;
249
+ return { r, g, b };
250
+ }
251
+ function rgbToHsl(r, g, b) {
252
+ const rn = r / 255;
253
+ const gn = g / 255;
254
+ const bn = b / 255;
255
+ const max = Math.max(rn, gn, bn);
256
+ const min = Math.min(rn, gn, bn);
257
+ const l = (max + min) / 2;
258
+ let h = 0;
259
+ let s = 0;
260
+ if (max !== min) {
261
+ const d = max - min;
262
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
263
+ if (max === rn)
264
+ h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;
265
+ else if (max === gn)
266
+ h = ((bn - rn) / d + 2) / 6;
267
+ else
268
+ h = ((rn - gn) / d + 4) / 6;
269
+ }
270
+ return { h, s, l };
271
+ }
272
+ function hslToHex(h, s, l) {
273
+ const hue2rgb = (p, q, t) => {
274
+ let tn = t;
275
+ if (tn < 0)
276
+ tn += 1;
277
+ if (tn > 1)
278
+ tn -= 1;
279
+ if (tn < 1 / 6)
280
+ return p + (q - p) * 6 * tn;
281
+ if (tn < 1 / 2)
282
+ return q;
283
+ if (tn < 2 / 3)
284
+ return p + (q - p) * (2 / 3 - tn) * 6;
285
+ return p;
286
+ };
287
+ let r, g, b;
288
+ if (s === 0) {
289
+ r = g = b = l;
290
+ }
291
+ else {
292
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
293
+ const p = 2 * l - q;
294
+ r = hue2rgb(p, q, h + 1 / 3);
295
+ g = hue2rgb(p, q, h);
296
+ b = hue2rgb(p, q, h - 1 / 3);
297
+ }
298
+ const toHex = (n) => {
299
+ const val = Math.round(n * 255).toString(16);
300
+ return val.length === 1 ? '0' + val : val;
301
+ };
302
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
303
+ }
162
304
  /**
163
305
  * Generate PostCSS config for website
164
306
  */
@@ -1 +1 @@
1
- {"version":3,"file":"website-config.js","sourceRoot":"","sources":["../../../src/generators/templates/website-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,OAAO;aACI,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCvB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;CAKR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"website-config.js","sourceRoot":"","sources":["../../../src/generators/templates/website-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Landing page generator with 10 data-driven sections
3
+ * Each section: strategy data -> fallback -> graceful skip
4
+ */
5
+ import type { WebsiteContentContext } from '../website-context.js';
6
+ import { type SectionRenderInfo } from './website-sections.js';
7
+ /**
8
+ * Result of landing page generation with section metadata for tracing
9
+ */
10
+ export interface LandingPageResult {
11
+ code: string;
12
+ sections: SectionRenderInfo[];
13
+ }
14
+ /**
15
+ * Generate landing page.tsx with 10 data-driven sections
16
+ * Sections: Hero, PainPoints, Differentiators, Features, HowItWorks,
17
+ * Stats, SocialProof, PricingTeaser, FAQ, FinalCTA
18
+ */
19
+ export declare function generateWebsiteLandingPage(projectName: string, context?: WebsiteContentContext): string;
20
+ /**
21
+ * Generate landing page with section render info for debug tracing
22
+ */
23
+ export declare function generateWebsiteLandingPageWithInfo(projectName: string, context?: WebsiteContentContext): LandingPageResult;
24
+ //# sourceMappingURL=website-landing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-landing.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/website-landing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAYL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAa/B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,iBAAiB,CA+QnB"}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Landing page generator with 10 data-driven sections
3
+ * Each section: strategy data -> fallback -> graceful skip
4
+ */
5
+ import { mapFeatureIcon, generatePainPointsSection, generateDifferentiatorsSection, generateHowItWorksSection, generateStatsSection, generateSocialProofSection, generatePricingTeaserSection, generateFaqSection, buildFaqItemsDeclaration, generateFaqItemComponent, buildFaqSchema, } from './website-sections.js';
6
+ /**
7
+ * Escape a string for safe use inside JSX template literals
8
+ */
9
+ function escapeJsx(str) {
10
+ return str
11
+ .replace(/\\/g, '\\\\')
12
+ .replace(/'/g, "\\'")
13
+ .replace(/`/g, '\\`')
14
+ .replace(/\$/g, '\\$');
15
+ }
16
+ /**
17
+ * Generate landing page.tsx with 10 data-driven sections
18
+ * Sections: Hero, PainPoints, Differentiators, Features, HowItWorks,
19
+ * Stats, SocialProof, PricingTeaser, FAQ, FinalCTA
20
+ */
21
+ export function generateWebsiteLandingPage(projectName, context) {
22
+ const result = generateWebsiteLandingPageWithInfo(projectName, context);
23
+ return result.code;
24
+ }
25
+ /**
26
+ * Generate landing page with section render info for debug tracing
27
+ */
28
+ export function generateWebsiteLandingPageWithInfo(projectName, context) {
29
+ const title = projectName
30
+ .split('-')
31
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
32
+ .join(' ');
33
+ const strategy = context?.strategy;
34
+ const displayName = context?.productName || title;
35
+ const sections = [];
36
+ // --- Hero data ---
37
+ const headline = strategy?.messaging.headline || displayName;
38
+ const subheadline = strategy?.messaging.subheadline || '';
39
+ const eyebrow = strategy?.positioning.category || '';
40
+ const heroText = strategy?.messaging.longDescription
41
+ ? escapeJsx(strategy.messaging.longDescription)
42
+ : context?.description
43
+ ? escapeJsx(context.description)
44
+ : null;
45
+ const primaryCtaText = strategy?.conversionStrategy.primaryCta.text || 'Get started';
46
+ const primaryCtaHref = strategy?.conversionStrategy.primaryCta.href || '/pricing';
47
+ const secondaryCtaText = strategy?.conversionStrategy.secondaryCta.text || 'Learn more';
48
+ const secondaryCtaHref = strategy?.conversionStrategy.secondaryCta.href || '/docs';
49
+ sections.push({
50
+ name: 'Hero',
51
+ dataSource: strategy?.messaging ? 'strategy' : heroText ? 'docs' : 'defaults',
52
+ itemCount: 1,
53
+ });
54
+ // --- Features data ---
55
+ const features = context?.features && context.features.length > 0
56
+ ? context.features.slice(0, 6)
57
+ : null;
58
+ const featuresHeading = strategy?.positioning.valueProposition || 'Everything you need';
59
+ const featuresSubtitle = context?.description
60
+ ? escapeJsx(context.description).slice(0, 120)
61
+ : '';
62
+ sections.push({
63
+ name: 'Features',
64
+ dataSource: features ? 'docs' : 'defaults',
65
+ itemCount: features?.length || 0,
66
+ });
67
+ // --- Build features block ---
68
+ const featuresBlock = features
69
+ ? features.map((f) => {
70
+ const icon = mapFeatureIcon(f.title);
71
+ return ` {
72
+ title: '${escapeJsx(f.title)}',
73
+ description: '${escapeJsx(f.description)}',
74
+ icon: '${icon}',
75
+ }`;
76
+ }).join(',\n')
77
+ : '';
78
+ // --- Trust signals ---
79
+ const trustSignals = strategy?.conversionStrategy.trustSignals || [];
80
+ // --- Generate conditional sections ---
81
+ const painPoints = generatePainPointsSection(strategy);
82
+ sections.push(painPoints.info);
83
+ const differentiators = generateDifferentiatorsSection(strategy);
84
+ sections.push(differentiators.info);
85
+ const howItWorks = generateHowItWorksSection(strategy);
86
+ sections.push(howItWorks.info);
87
+ const stats = generateStatsSection(strategy);
88
+ sections.push(stats.info);
89
+ const socialProof = generateSocialProofSection(strategy);
90
+ sections.push(socialProof.info);
91
+ const pricingTeaser = generatePricingTeaserSection(context);
92
+ sections.push(pricingTeaser.info);
93
+ const faq = generateFaqSection(strategy);
94
+ sections.push(faq.info);
95
+ // Final CTA section
96
+ sections.push({
97
+ name: 'FinalCTA',
98
+ dataSource: strategy?.messaging ? 'strategy' : 'defaults',
99
+ itemCount: 1,
100
+ });
101
+ // Determine which lucide icons are needed
102
+ const iconSet = new Set();
103
+ if (features) {
104
+ features.forEach((f) => iconSet.add(mapFeatureIcon(f.title)));
105
+ }
106
+ // Pain points icons
107
+ if (painPoints.jsx) {
108
+ iconSet.add('AlertTriangle');
109
+ iconSet.add('XCircle');
110
+ iconSet.add('AlertOctagon');
111
+ }
112
+ // Differentiators
113
+ if (differentiators.jsx) {
114
+ iconSet.add('CheckCircle');
115
+ }
116
+ // Stats
117
+ if (stats.jsx) {
118
+ iconSet.add('CheckCircle');
119
+ }
120
+ // FAQ
121
+ if (faq.jsx) {
122
+ iconSet.add('ChevronDown');
123
+ }
124
+ // Always useful
125
+ iconSet.add('ArrowRight');
126
+ const iconImports = Array.from(iconSet).sort().join(', ');
127
+ // SEO metadata
128
+ const metaTitle = strategy?.seoStrategy.titleTemplates?.home || 'Welcome';
129
+ const metaDesc = strategy?.seoStrategy.metaDescriptions?.home || `Welcome to ${displayName}`;
130
+ // FAQ data declarations
131
+ const faqItemsDecl = buildFaqItemsDeclaration(strategy);
132
+ const faqItemComponent = faq.needsClientDirective ? generateFaqItemComponent() : '';
133
+ const faqSchemaDecl = buildFaqSchema(strategy);
134
+ // Build icon mapping for features
135
+ const iconComponentMap = features
136
+ ? `const ICON_MAP: Record<string, React.ElementType> = {\n${Array.from(new Set(features.map(f => mapFeatureIcon(f.title)))).map(icon => ` ${icon},`).join('\n')}\n};\n`
137
+ : '';
138
+ const code = `${faq.needsClientDirective ? "'use client';\n\nimport { useState } from 'react';\n" : ''}import type { Metadata } from 'next';
139
+ import Link from 'next/link';
140
+ import { ${iconImports} } from 'lucide-react';
141
+ import Header from '@/components/Header';
142
+ import Footer from '@/components/Footer';
143
+ import JsonLd from '@/components/JsonLd';
144
+
145
+ export const metadata: Metadata = {
146
+ title: '${escapeJsx(metaTitle)}',
147
+ description: '${escapeJsx(metaDesc)}',
148
+ };
149
+
150
+ const ORG_SCHEMA = {
151
+ '@context': 'https://schema.org',
152
+ '@type': 'Organization',
153
+ name: '${escapeJsx(displayName)}',
154
+ url: process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com',
155
+ };
156
+
157
+ const PRODUCT_SCHEMA = {
158
+ '@context': 'https://schema.org',
159
+ '@type': 'SoftwareApplication',
160
+ name: '${escapeJsx(displayName)}',
161
+ applicationCategory: 'BusinessApplication',
162
+ operatingSystem: 'Web',
163
+ };
164
+
165
+ ${faqSchemaDecl ? faqSchemaDecl + '\n' : ''}${faqItemsDecl ? '\n' + faqItemsDecl : ''}${iconComponentMap ? '\n' + iconComponentMap : ''}${features ? `\nconst features = [\n${featuresBlock}\n];\n` : ''}
166
+ ${faqItemComponent ? '\n' + faqItemComponent + '\n' : ''}
167
+ export default function HomePage() {
168
+ return (
169
+ <>
170
+ <Header />
171
+ <JsonLd schema={ORG_SCHEMA} />
172
+ <JsonLd schema={PRODUCT_SCHEMA} />
173
+ ${faqSchemaDecl ? ' <JsonLd schema={FAQ_SCHEMA} />\n' : ''} <main className="flex min-h-screen flex-col">
174
+ {/* Hero Section */}
175
+ <section className="relative overflow-hidden bg-gradient-to-br from-primary-50 via-white to-primary-50/30 py-24 sm:py-36">
176
+ <div className="container">
177
+ <div className="mx-auto max-w-3xl text-center">
178
+ ${eyebrow ? ` <p className="mb-4 inline-block rounded-full bg-primary-100 px-4 py-1.5 text-sm font-medium text-primary-700">\n ${escapeJsx(eyebrow)}\n </p>\n` : ''} <h1 className="text-4xl font-bold tracking-tight text-foreground sm:text-6xl lg:text-7xl">
179
+ ${escapeJsx(headline)}
180
+ </h1>
181
+ ${subheadline ? ` <p className="mt-4 text-xl font-medium text-primary-600">\n ${escapeJsx(subheadline)}\n </p>` : ''}
182
+ <p className="mt-6 text-lg leading-8 text-muted-foreground">
183
+ ${heroText || ''}
184
+ </p>
185
+ <div className="mt-10 flex items-center justify-center gap-x-4">
186
+ <Link
187
+ href="${escapeJsx(primaryCtaHref)}"
188
+ className="rounded-lg bg-primary-600 px-6 py-3 text-sm font-semibold text-white shadow-lg shadow-primary-600/25 hover:bg-primary-500 transition-all hover:shadow-primary-600/40 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600"
189
+ >
190
+ ${escapeJsx(primaryCtaText)}
191
+ </Link>
192
+ <Link
193
+ href="${escapeJsx(secondaryCtaHref)}"
194
+ className="group flex items-center gap-1 text-sm font-semibold text-foreground hover:text-primary-600 transition-colors"
195
+ >
196
+ ${escapeJsx(secondaryCtaText)}
197
+ <ArrowRight className="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
198
+ </Link>
199
+ </div>
200
+ ${trustSignals.length > 0 ? ` <div className="mt-10 flex flex-wrap items-center justify-center gap-x-8 gap-y-2">
201
+ ${trustSignals.map(s => ` <p className="text-sm font-medium text-muted-foreground">${escapeJsx(s)}</p>`).join('\n')}
202
+ </div>` : ''}
203
+ </div>
204
+ </div>
205
+ </section>
206
+ ${painPoints.jsx}${differentiators.jsx}
207
+ {/* Features Section */}
208
+ ${features ? ` <section id="features" className="py-20 sm:py-28">
209
+ <div className="container">
210
+ <div className="mx-auto max-w-2xl text-center">
211
+ <h2 className="text-3xl font-bold tracking-tight text-foreground sm:text-4xl">
212
+ ${escapeJsx(featuresHeading)}
213
+ </h2>
214
+ ${featuresSubtitle ? ` <p className="mt-4 text-lg text-muted-foreground">\n ${featuresSubtitle}\n </p>` : ''}
215
+ </div>
216
+ <div className="mx-auto mt-16 max-w-5xl">
217
+ <div className="grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
218
+ {features.map((feature) => {
219
+ const Icon = ICON_MAP[feature.icon] || Star;
220
+ return (
221
+ <div
222
+ key={feature.title}
223
+ className="group rounded-2xl border border-border bg-card p-8 transition-all hover:shadow-lg hover:-translate-y-1"
224
+ >
225
+ <div className="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-primary-100">
226
+ <Icon className="h-5 w-5 text-primary-600" />
227
+ </div>
228
+ <h3 className="text-lg font-semibold text-foreground">
229
+ {feature.title}
230
+ </h3>
231
+ <p className="mt-2 text-muted-foreground">{feature.description}</p>
232
+ </div>
233
+ );
234
+ })}
235
+ </div>
236
+ </div>
237
+ </div>
238
+ </section>` : ''}
239
+ ${howItWorks.jsx}${stats.jsx}${socialProof.jsx}${pricingTeaser.jsx}${faq.jsx}
240
+ {/* Final CTA Section */}
241
+ <section className="bg-gradient-to-br from-primary-600 to-primary-700 py-20 sm:py-28">
242
+ <div className="container text-center">
243
+ <h2 className="text-3xl font-bold tracking-tight text-white sm:text-4xl">
244
+ ${strategy?.messaging.elevatorPitch ? escapeJsx(strategy.messaging.elevatorPitch) : 'Ready to get started?'}
245
+ </h2>
246
+ <p className="mt-4 text-lg text-primary-100">
247
+ ${strategy?.messaging.subheadline ? escapeJsx(strategy.messaging.subheadline) : 'Start building today.'}
248
+ </p>
249
+ <div className="mt-8 flex items-center justify-center gap-x-4">
250
+ <Link
251
+ href="${escapeJsx(primaryCtaHref)}"
252
+ className="rounded-lg bg-white px-6 py-3 text-sm font-semibold text-primary-600 shadow-lg hover:bg-primary-50 transition-colors"
253
+ >
254
+ ${escapeJsx(primaryCtaText)}
255
+ </Link>
256
+ <Link
257
+ href="${escapeJsx(secondaryCtaHref)}"
258
+ className="rounded-lg border border-primary-300 px-6 py-3 text-sm font-semibold text-white hover:bg-primary-500 transition-colors"
259
+ >
260
+ ${escapeJsx(secondaryCtaText)}
261
+ </Link>
262
+ </div>
263
+ ${trustSignals.length > 0 ? ` <div className="mt-8 flex flex-wrap items-center justify-center gap-x-6 gap-y-2">
264
+ ${trustSignals.map(s => ` <p className="text-sm text-primary-200">${escapeJsx(s)}</p>`).join('\n')}
265
+ </div>` : ''}
266
+ </div>
267
+ </section>
268
+ </main>
269
+ <Footer />
270
+ </>
271
+ );
272
+ }
273
+ `;
274
+ return { code, sections };
275
+ }
276
+ //# sourceMappingURL=website-landing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-landing.js","sourceRoot":"","sources":["../../../src/generators/templates/website-landing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Website layout and utility page generators
3
+ * Layout, globals CSS, sitemap, robots, docs, blog, readme, spec, test
4
+ */
5
+ import type { WebsiteContentContext } from '../website-context.js';
6
+ /**
7
+ * Generate root layout.tsx with metadata
8
+ */
9
+ export declare function generateWebsiteLayout(projectName: string, context?: WebsiteContentContext): string;
10
+ /**
11
+ * Generate globals.css with full CSS variable set
12
+ */
13
+ export declare function generateWebsiteGlobalsCss(context?: WebsiteContentContext): string;
14
+ /**
15
+ * Generate sitemap.ts
16
+ */
17
+ export declare function generateWebsiteSitemap(projectName: string): string;
18
+ /**
19
+ * Generate robots.ts
20
+ */
21
+ export declare function generateWebsiteRobots(projectName: string): string;
22
+ /**
23
+ * Generate website README
24
+ */
25
+ export declare function generateWebsiteReadme(projectName: string): string;
26
+ /**
27
+ * Generate website spec JSON with optional context
28
+ */
29
+ export declare function generateWebsiteSpec(projectName: string, context?: WebsiteContentContext): string;
30
+ /**
31
+ * Generate sample test for website
32
+ */
33
+ export declare function generateWebsiteTest(projectName: string): string;
34
+ /**
35
+ * Generate docs page placeholder
36
+ */
37
+ export declare function generateWebsiteDocsPage(): string;
38
+ /**
39
+ * Generate blog listing page placeholder
40
+ */
41
+ export declare function generateWebsiteBlogPage(): string;
42
+ //# sourceMappingURL=website-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-layout.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/website-layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AA8CnE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAsER;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAyCR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkClE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0DjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAsDR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAuB/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAqBhD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAqBhD"}