kofi-stack-template-generator 2.1.59 → 2.1.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +6 -6
- package/dist/index.js +1126 -23
- package/package.json +2 -2
- package/src/templates.generated.ts +23 -7
- package/templates/marketing/nextjs/components.json.hbs +44 -0
- package/templates/marketing/nextjs/package.json.hbs +2 -1
- package/templates/marketing/nextjs/src/app/about/page.tsx +155 -0
- package/templates/marketing/nextjs/src/app/blog/[slug]/page.tsx +181 -0
- package/templates/marketing/nextjs/src/app/features/analytics/page.tsx +140 -0
- package/templates/marketing/nextjs/src/app/features/automation/page.tsx +171 -0
- package/templates/marketing/nextjs/src/app/features/dashboard/page.tsx +140 -0
- package/templates/marketing/nextjs/src/app/features/integrations/page.tsx +174 -0
- package/templates/marketing/nextjs/src/app/features/security/page.tsx +150 -0
- package/templates/marketing/nextjs/src/app/features/workflows/page.tsx +140 -0
- package/templates/marketing/nextjs/src/app/use-cases/marketing/page.tsx +154 -0
- package/templates/marketing/nextjs/src/app/use-cases/operations/page.tsx +154 -0
- package/templates/marketing/nextjs/src/app/use-cases/product/page.tsx +154 -0
- package/templates/marketing/nextjs/src/app/use-cases/sales/page.tsx +154 -0
- package/templates/marketing/nextjs/src/components/Header/index.tsx +52 -2
- package/templates/marketing/nextjs/src/components/blocks/FAQAccordion.tsx +119 -0
- package/templates/marketing/nextjs/src/components/blocks/HowItWorks.tsx +95 -0
- package/templates/marketing/nextjs/src/components/blocks/index.ts +2 -0
- package/templates/marketing/payload/components.json.hbs +44 -0
- package/templates/web/components.json.hbs +6 -0
- package/templates/web/src/app/globals.css.hbs +460 -14
package/dist/index.js
CHANGED
|
@@ -2667,9 +2667,348 @@ import FinalCTA from "../components/blocks/FinalCTA.astro"
|
|
|
2667
2667
|
"marketing/astro/src/pages/terms.astro": '---\nimport Layout from "../layouts/Layout.astro"\nimport Header from "../components/Header.astro"\nimport Footer from "../components/Footer.astro"\n---\n\n<Layout title="Terms of Service - SaaSify" description="Terms and conditions for using SaaSify.">\n <div class="min-h-screen flex flex-col">\n <Header />\n\n <main class="flex-1">\n <article class="py-16 md:py-24">\n <div class="container mx-auto px-4 max-w-3xl">\n <h1 class="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Terms of Service\n </h1>\n <p class="text-muted-foreground mb-8">\n Last updated: January 1, 2025\n </p>\n\n <div class="prose prose-neutral dark:prose-invert max-w-none">\n <h2 class="text-2xl font-semibold mt-8 mb-4">Agreement to Terms</h2>\n <p class="text-muted-foreground mb-4">\n By accessing or using SaaSify, you agree to be bound by these Terms of Service. If you disagree with any part of the terms, you may not access the service.\n </p>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">Use License</h2>\n <p class="text-muted-foreground mb-4">\n Subject to your compliance with these Terms, we grant you a limited, non-exclusive, non-transferable license to access and use our service for your internal business purposes.\n </p>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">User Accounts</h2>\n <p class="text-muted-foreground mb-4">\n When you create an account with us, you must provide accurate, complete, and current information. You are responsible for safeguarding your account credentials and for all activities that occur under your account.\n </p>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">Prohibited Uses</h2>\n <p class="text-muted-foreground mb-4">\n You may not use our service:\n </p>\n <ul class="list-disc pl-6 text-muted-foreground mb-4 space-y-2">\n <li>For any unlawful purpose or to promote illegal activities</li>\n <li>To violate any applicable laws or regulations</li>\n <li>To infringe upon the rights of others</li>\n <li>To interfere with or disrupt the service or servers</li>\n </ul>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">Payment Terms</h2>\n <p class="text-muted-foreground mb-4">\n Paid subscriptions are billed in advance on a monthly or annual basis. You agree to pay all fees associated with your subscription plan.\n </p>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">Limitation of Liability</h2>\n <p class="text-muted-foreground mb-4">\n In no event shall SaaSify be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of the service.\n </p>\n\n <h2 class="text-2xl font-semibold mt-8 mb-4">Contact Us</h2>\n <p class="text-muted-foreground mb-4">\n If you have any questions about these Terms, please contact us at legal@saasify.com.\n </p>\n </div>\n </div>\n </article>\n </main>\n\n <Footer />\n </div>\n</Layout>\n',
|
|
2668
2668
|
"marketing/astro/src/styles/globals.css.hbs": '@import "tailwindcss";\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n{{#if (eq shadcn.font "inter")}}\n --font-sans: "Inter", system-ui, sans-serif;\n{{else if (eq shadcn.font "noto-sans")}}\n --font-sans: "Noto Sans", system-ui, sans-serif;\n{{else if (eq shadcn.font "nunito-sans")}}\n --font-sans: "Nunito Sans", system-ui, sans-serif;\n{{else if (eq shadcn.font "figtree")}}\n --font-sans: "Figtree", system-ui, sans-serif;\n{{else if (eq shadcn.font "roboto")}}\n --font-sans: "Roboto", system-ui, sans-serif;\n{{else if (eq shadcn.font "raleway")}}\n --font-sans: "Raleway", system-ui, sans-serif;\n{{else if (eq shadcn.font "dm-sans")}}\n --font-sans: "DM Sans", system-ui, sans-serif;\n{{else if (eq shadcn.font "public-sans")}}\n --font-sans: "Public Sans", system-ui, sans-serif;\n{{else if (eq shadcn.font "outfit")}}\n --font-sans: "Outfit", system-ui, sans-serif;\n{{else if (eq shadcn.font "jetbrains-mono")}}\n --font-sans: "JetBrains Mono", monospace;\n{{else}}\n --font-sans: "Inter", system-ui, sans-serif;\n{{/if}}\n --font-mono: monospace;\n}\n\n:root {\n /* Border Radius */\n{{#if (eq shadcn.radius "none")}}\n --radius: 0;\n{{else if (eq shadcn.radius "small")}}\n --radius: 0.25rem;\n{{else if (eq shadcn.radius "medium")}}\n --radius: 0.5rem;\n{{else if (eq shadcn.radius "large")}}\n --radius: 1rem;\n{{else}}\n --radius: 0.625rem;\n{{/if}}\n\n /* Base Colors - Light Mode */\n{{#if (eq shadcn.baseColor "stone")}}\n --background: oklch(1 0 60);\n --foreground: oklch(0.147 0.004 49.25);\n --card: oklch(1 0 60);\n --card-foreground: oklch(0.147 0.004 49.25);\n --popover: oklch(1 0 60);\n --popover-foreground: oklch(0.147 0.004 49.25);\n --secondary: oklch(0.97 0.001 67.54);\n --secondary-foreground: oklch(0.216 0.006 56.04);\n --muted: oklch(0.97 0.001 67.54);\n --muted-foreground: oklch(0.553 0.013 58.07);\n --accent: oklch(0.97 0.001 67.54);\n --accent-foreground: oklch(0.216 0.006 56.04);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.923 0.003 73.14);\n --input: oklch(0.923 0.003 73.14);\n{{else if (eq shadcn.baseColor "zinc")}}\n --background: oklch(1 0 0);\n --foreground: oklch(0.141 0.005 285.82);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.141 0.005 285.82);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.141 0.005 285.82);\n --secondary: oklch(0.967 0.001 286.38);\n --secondary-foreground: oklch(0.21 0.006 285.89);\n --muted: oklch(0.967 0.001 286.38);\n --muted-foreground: oklch(0.553 0.016 286.07);\n --accent: oklch(0.967 0.001 286.38);\n --accent-foreground: oklch(0.21 0.006 285.89);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.92 0.004 286.32);\n --input: oklch(0.92 0.004 286.32);\n{{else if (eq shadcn.baseColor "gray")}}\n --background: oklch(1 0 0);\n --foreground: oklch(0.13 0.028 261.69);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.13 0.028 261.69);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.13 0.028 261.69);\n --secondary: oklch(0.968 0.007 247.86);\n --secondary-foreground: oklch(0.21 0.034 264.53);\n --muted: oklch(0.968 0.007 247.86);\n --muted-foreground: oklch(0.551 0.027 264.36);\n --accent: oklch(0.968 0.007 247.86);\n --accent-foreground: oklch(0.21 0.034 264.53);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.918 0.011 249.42);\n --input: oklch(0.918 0.011 249.42);\n{{else}}\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n{{/if}}\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.546 0.245 262.881);\n --primary-foreground: oklch(0.985 0.002 247.858);\n --ring: oklch(0.546 0.245 262.881);\n --chart-1: oklch(0.546 0.245 262.881);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.596 0.145 163.225);\n --primary-foreground: oklch(0.982 0.018 155.826);\n --ring: oklch(0.596 0.145 163.225);\n --chart-1: oklch(0.596 0.145 163.225);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.627 0.265 303.9);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.627 0.265 303.9);\n --chart-1: oklch(0.627 0.265 303.9);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.637 0.237 25.331);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.637 0.237 25.331);\n --chart-1: oklch(0.637 0.237 25.331);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.705 0.191 47.604);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.705 0.191 47.604);\n --chart-1: oklch(0.705 0.191 47.604);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.769 0.188 70.08);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.769 0.188 70.08);\n --chart-1: oklch(0.769 0.188 70.08);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.646 0.222 41.116);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.715 0.143 215.221);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.715 0.143 215.221);\n --chart-1: oklch(0.715 0.143 215.221);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.696 0.17 162.48);\n --chart-1: oklch(0.696 0.17 162.48);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.667 0.295 322.15);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.667 0.295 322.15);\n --chart-1: oklch(0.667 0.295 322.15);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.585 0.233 277.117);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.585 0.233 277.117);\n --chart-1: oklch(0.585 0.233 277.117);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.768 0.233 130.85);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.768 0.233 130.85);\n --chart-1: oklch(0.768 0.233 130.85);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.718 0.202 349.761);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.718 0.202 349.761);\n --chart-1: oklch(0.718 0.202 349.761);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.645 0.246 16.439);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.645 0.246 16.439);\n --chart-1: oklch(0.645 0.246 16.439);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.685 0.169 237.323);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.685 0.169 237.323);\n --chart-1: oklch(0.685 0.169 237.323);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.704 0.14 182.503);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.704 0.14 182.503);\n --chart-1: oklch(0.704 0.14 182.503);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.606 0.25 292.717);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.606 0.25 292.717);\n --chart-1: oklch(0.606 0.25 292.717);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.795 0.184 86.047);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.795 0.184 86.047);\n --chart-1: oklch(0.795 0.184 86.047);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.646 0.222 41.116);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{/if}}\n}\n\n[data-theme="dark"] {\n /* Base Colors - Dark Mode */\n{{#if (eq shadcn.baseColor "stone")}}\n --background: oklch(0.147 0.004 49.25);\n --foreground: oklch(0.97 0.001 67.54);\n --card: oklch(0.216 0.006 56.04);\n --card-foreground: oklch(0.97 0.001 67.54);\n --popover: oklch(0.269 0.007 34.26);\n --popover-foreground: oklch(0.97 0.001 67.54);\n --secondary: oklch(0.269 0.007 34.26);\n --secondary-foreground: oklch(0.97 0.001 67.54);\n --muted: oklch(0.269 0.007 34.26);\n --muted-foreground: oklch(0.709 0.01 56.26);\n --accent: oklch(0.371 0.01 50.64);\n --accent-foreground: oklch(0.97 0.001 67.54);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n{{else if (eq shadcn.baseColor "zinc")}}\n --background: oklch(0.141 0.005 285.82);\n --foreground: oklch(0.985 0.002 247.86);\n --card: oklch(0.21 0.006 285.89);\n --card-foreground: oklch(0.985 0.002 247.86);\n --popover: oklch(0.274 0.006 286.03);\n --popover-foreground: oklch(0.985 0.002 247.86);\n --secondary: oklch(0.274 0.006 286.03);\n --secondary-foreground: oklch(0.985 0.002 247.86);\n --muted: oklch(0.274 0.006 286.03);\n --muted-foreground: oklch(0.705 0.015 286.07);\n --accent: oklch(0.37 0.013 285.81);\n --accent-foreground: oklch(0.985 0.002 247.86);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n{{else if (eq shadcn.baseColor "gray")}}\n --background: oklch(0.13 0.028 261.69);\n --foreground: oklch(0.985 0.002 247.86);\n --card: oklch(0.21 0.034 264.53);\n --card-foreground: oklch(0.985 0.002 247.86);\n --popover: oklch(0.274 0.029 256.85);\n --popover-foreground: oklch(0.985 0.002 247.86);\n --secondary: oklch(0.274 0.029 256.85);\n --secondary-foreground: oklch(0.985 0.002 247.86);\n --muted: oklch(0.274 0.029 256.85);\n --muted-foreground: oklch(0.704 0.022 261.32);\n --accent: oklch(0.37 0.033 259.73);\n --accent-foreground: oklch(0.985 0.002 247.86);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n{{else}}\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.269 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.371 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n{{/if}}\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.623 0.214 262.881);\n --primary-foreground: oklch(0.273 0.033 256.848);\n --ring: oklch(0.623 0.214 262.881);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.696 0.17 162.48);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.714 0.203 305.504);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.714 0.203 305.504);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.704 0.191 22.216);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.704 0.191 22.216);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.792 0.17 52.615);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.792 0.17 52.615);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.828 0.189 84.429);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.828 0.189 84.429);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.789 0.154 211.53);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.789 0.154 211.53);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.765 0.166 160.391);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.765 0.166 160.391);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.74 0.238 322.16);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.74 0.238 322.16);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.673 0.182 276.935);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.673 0.182 276.935);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.841 0.238 128.85);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.841 0.238 128.85);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.775 0.181 349.761);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.775 0.181 349.761);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.712 0.194 13.428);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.712 0.194 13.428);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.756 0.143 232.661);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.756 0.143 232.661);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.777 0.152 181.912);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.777 0.152 181.912);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.702 0.183 293.541);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.702 0.183 293.541);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.852 0.199 91.936);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.852 0.199 91.936);\n{{else}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n{{/if}}\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n\n.container {\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: 1rem;\n padding-right: 1rem;\n max-width: 96rem;\n}\n\n@media (min-width: 640px) {\n .container {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: 2rem;\n padding-right: 2rem;\n }\n}\n\n/* ========================================\n HERO TYPOGRAPHY\n ======================================== */\n\n.hero-content h1 {\n font-size: 2.25rem !important;\n line-height: 2.5rem !important;\n font-weight: 700 !important;\n letter-spacing: -0.025em !important;\n margin-bottom: 1.5rem !important;\n color: var(--color-foreground) !important;\n}\n\n.hero-content p {\n font-size: 1.25rem !important;\n line-height: 1.75rem !important;\n color: var(--color-muted-foreground) !important;\n max-width: 42rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 2rem !important;\n}\n\n.hero-content--dark h1 {\n color: white !important;\n}\n\n.hero-content--dark p {\n color: rgba(255, 255, 255, 0.8) !important;\n}\n\n@media (min-width: 768px) {\n .hero-content h1 {\n font-size: 3.75rem !important;\n line-height: 1 !important;\n }\n}\n\n/* Left-aligned hero content */\n.hero-content--left h1 {\n text-align: left !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.hero-content--left p {\n text-align: left !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n/* ========================================\n PRODUCT SHOWCASE HERO STYLES\n ======================================== */\n\n.hero-showcase {\n position: relative;\n border-radius: 1rem;\n overflow: hidden;\n height: 25rem;\n width: 100%;\n background: linear-gradient(135deg, var(--primary) 0%, color-mix(in oklch, var(--primary) 70%, black) 100%);\n}\n\n@media (min-width: 768px) {\n .hero-showcase {\n height: 31.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .hero-showcase {\n height: 37.5rem;\n }\n}\n\n.hero-bg-image {\n position: absolute;\n inset: 0;\n z-index: 0;\n opacity: 0.1;\n}\n\n.hero-bg-image img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: center;\n}\n\n.hero-mockup-centered {\n position: relative;\n z-index: 10;\n padding: 2rem;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n}\n\n@media (min-width: 768px) {\n .hero-mockup-centered {\n padding: 3rem;\n }\n}\n\n.mockup-wrapper {\n background: var(--color-background);\n border-radius: 12px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 12px 24px -8px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n animation: mockup-entrance 0.8s ease-out;\n width: 100%;\n}\n\n.mockup-wrapper img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n@keyframes mockup-entrance {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Browser chrome */\n.mockup-chrome {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n background: var(--color-muted);\n border-bottom: 1px solid var(--color-border);\n}\n\n.mockup-chrome-dots {\n display: flex;\n gap: 6px;\n}\n\n.mockup-chrome-dots .dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n}\n\n.mockup-chrome-dots .dot-red {\n background: #ff5f56;\n}\n.mockup-chrome-dots .dot-yellow {\n background: #ffbd2e;\n}\n.mockup-chrome-dots .dot-green {\n background: #27ca40;\n}\n\n.mockup-chrome-title {\n flex: 1;\n text-align: center;\n font-size: 13px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n}\n\n.mockup-chrome-actions {\n width: 60px;\n}\n\n/* App content layout */\n.mockup-content {\n display: flex;\n min-height: 400px;\n}\n\n.mockup-sidebar {\n width: 220px;\n background: var(--color-card);\n border-right: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n\n.sidebar-header {\n padding: 16px;\n border-bottom: 1px solid var(--color-border);\n}\n\n.sidebar-logo {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.logo-icon {\n width: 28px;\n height: 28px;\n background: var(--color-primary);\n color: white;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 14px;\n}\n\n.logo-text {\n font-weight: 600;\n font-size: 14px;\n color: var(--color-foreground);\n}\n\n.sidebar-nav {\n padding: 8px;\n}\n\n.sidebar-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 6px;\n font-size: 13px;\n color: var(--color-muted-foreground);\n transition: all 0.15s ease;\n cursor: pointer;\n}\n\n.sidebar-item:hover {\n background: var(--color-accent);\n color: var(--color-accent-foreground);\n}\n\n.sidebar-item--active {\n background: oklch(from var(--color-primary) l c h / 0.12);\n color: var(--color-primary);\n}\n\n.sidebar-icon {\n font-size: 16px;\n}\n\n.sidebar-label {\n flex: 1;\n}\n\n.sidebar-badge {\n background: var(--color-primary);\n color: var(--color-primary-foreground);\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 10px;\n font-weight: 500;\n}\n\n/* Main content area */\n.mockup-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--color-background);\n}\n\n.main-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--color-border);\n}\n\n.header-title {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.header-title h2 {\n font-size: 16px;\n font-weight: 600;\n margin: 0;\n color: var(--color-foreground);\n}\n\n.header-breadcrumb {\n font-size: 12px;\n color: var(--color-muted-foreground);\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn {\n padding: 8px 16px;\n background: var(--color-primary);\n color: var(--color-primary-foreground);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.action-btn--success {\n background: #27ca40;\n}\n\n.action-btn--featured {\n background: var(--color-primary);\n}\n\n/* Split view */\n.main-split {\n display: flex;\n flex: 1;\n}\n\n.editor-panel {\n flex: 1;\n padding: 20px;\n border-right: 1px solid var(--color-border);\n}\n\n.editor-section {\n margin-bottom: 20px;\n}\n\n.editor-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n margin-bottom: 6px;\n}\n\n.editor-input {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n display: flex;\n align-items: center;\n}\n\n.input-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.input-cursor {\n width: 2px;\n height: 18px;\n background: var(--color-primary);\n animation: blink 1s infinite;\n margin-left: 2px;\n}\n\n@keyframes blink {\n 0%,\n 50% {\n opacity: 1;\n }\n 51%,\n 100% {\n opacity: 0;\n }\n}\n\n.editor-select {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.select-arrow {\n font-size: 10px;\n color: var(--color-muted-foreground);\n}\n\n.editor-textarea {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n min-height: 80px;\n}\n\n.textarea-text {\n transition: all 0.5s ease;\n}\n\n.textarea-text--complete {\n color: var(--color-foreground);\n}\n\n/* Preview panel */\n.preview-panel {\n width: 320px;\n padding: 20px;\n background: oklch(from var(--color-muted) l c h / 0.5);\n}\n\n.preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.preview-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n}\n\n.preview-url {\n font-size: 11px;\n color: var(--color-muted-foreground);\n font-family: monospace;\n}\n\n.preview-card {\n background: var(--color-card);\n border: 1px solid var(--color-border);\n border-radius: 10px;\n overflow: hidden;\n position: relative;\n transition: all 0.3s ease;\n}\n\n.preview-badge {\n position: absolute;\n top: 10px;\n right: 10px;\n background: var(--color-primary);\n color: white;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n animation: badge-pop 0.3s ease;\n}\n\n@keyframes badge-pop {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.preview-image {\n height: 120px;\n background: linear-gradient(135deg, var(--color-muted) 0%, var(--color-accent) 100%);\n}\n\n.preview-image-placeholder {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 40px;\n}\n\n.preview-content {\n padding: 16px;\n}\n\n.preview-category-tag {\n display: inline-block;\n font-size: 11px;\n color: var(--color-primary);\n font-weight: 500;\n margin-bottom: 8px;\n}\n\n.preview-title {\n font-size: 16px;\n font-weight: 600;\n margin: 0 0 8px;\n color: var(--color-foreground);\n}\n\n.preview-description {\n font-size: 13px;\n color: var(--color-muted-foreground);\n line-height: 1.5;\n margin: 0 0 12px;\n}\n\n.preview-meta {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.meta-rating {\n color: #ffc24a;\n}\n\n.meta-reviews {\n color: var(--color-muted-foreground);\n}\n\n/* State indicators */\n.mockup-indicators {\n display: flex;\n justify-content: center;\n gap: 24px;\n padding: 16px;\n border-top: 1px solid var(--color-border);\n}\n\n.indicator {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 20px;\n transition: all 0.2s ease;\n}\n\n.indicator:hover {\n background: var(--color-accent);\n}\n\n.indicator--active {\n background: oklch(from var(--color-primary) l c h / 0.12);\n}\n\n.indicator-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--color-muted-foreground);\n transition: all 0.2s ease;\n}\n\n.indicator--active .indicator-dot {\n background: var(--color-primary);\n box-shadow: 0 0 0 3px oklch(from var(--color-primary) l c h / 0.2);\n}\n\n.indicator-label {\n font-size: 12px;\n color: var(--color-muted-foreground);\n}\n\n.indicator--active .indicator-label {\n color: var(--color-foreground);\n font-weight: 500;\n}\n\n/* ========================================\n LOGO BANNER STYLES\n ======================================== */\n\n.logo-scroll-container {\n overflow: hidden;\n mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);\n}\n\n.logo-scroll-track {\n display: flex;\n animation: logo-scroll 30s linear infinite;\n}\n\n.logo-scroll-track:hover {\n animation-play-state: paused;\n}\n\n@keyframes logo-scroll {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-50%);\n }\n}\n\n.logo-item {\n flex-shrink: 0;\n min-width: 150px;\n}\n\n/* ========================================\n RESPONSIVE ADJUSTMENTS\n ======================================== */\n\n@media (max-width: 768px) {\n .mockup-content {\n flex-direction: column;\n }\n\n .mockup-sidebar {\n width: 100%;\n border-right: none;\n border-bottom: 1px solid var(--color-border);\n }\n\n .sidebar-nav {\n display: flex;\n overflow-x: auto;\n padding: 8px;\n gap: 4px;\n }\n\n .sidebar-item {\n white-space: nowrap;\n }\n\n .main-split {\n flex-direction: column;\n }\n\n .editor-panel {\n border-right: none;\n border-bottom: 1px solid var(--color-border);\n }\n\n .preview-panel {\n width: 100%;\n }\n\n .mockup-indicators {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .indicator-label {\n display: none;\n }\n}\n\n/* ========================================\n ANIMATION STYLES\n ======================================== */\n\n/* Industry Tabs Animation */\n.industry-tab-content {\n animation: tab-fade-in 0.3s ease-out;\n}\n\n@keyframes tab-fade-in {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Feature Showcase Entrance Animation */\n@keyframes feature-slide-in {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.feature-showcase-content {\n animation: feature-slide-in 0.5s ease-out;\n}\n\n/* Testimonial Card Hover Effects */\n.testimonial-card {\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.testimonial-card:hover {\n transform: translateY(-4px);\n box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.15);\n}\n\n/* Stat Number Animation */\n@keyframes stat-count-up {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.stat-number {\n animation: stat-count-up 0.6s ease-out;\n}\n\n/* Trust Column Icon Animation */\n.trust-icon {\n transition: transform 0.2s ease, background-color 0.2s ease;\n}\n\n.trust-icon:hover {\n transform: scale(1.1);\n}\n\n/* Final CTA Background Animation */\n@keyframes subtle-float {\n 0%,\n 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-10px);\n }\n}\n\n.cta-decorative {\n animation: subtle-float 6s ease-in-out infinite;\n}\n\n/* Feature Grid Card Entrance */\n@keyframes card-entrance {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.feature-card {\n animation: card-entrance 0.4s ease-out;\n animation-fill-mode: both;\n}\n\n.feature-card:nth-child(1) {\n animation-delay: 0.1s;\n}\n.feature-card:nth-child(2) {\n animation-delay: 0.2s;\n}\n.feature-card:nth-child(3) {\n animation-delay: 0.3s;\n}\n.feature-card:nth-child(4) {\n animation-delay: 0.4s;\n}\n.feature-card:nth-child(5) {\n animation-delay: 0.5s;\n}\n.feature-card:nth-child(6) {\n animation-delay: 0.6s;\n}\n\n/* Smooth Section Transitions */\nsection {\n scroll-margin-top: 80px;\n}\n\n/* Button Hover Enhancement */\n.cta-button {\n position: relative;\n overflow: hidden;\n}\n\n.cta-button::after {\n content: "";\n position: absolute;\n inset: 0;\n background: linear-gradient(rgba(255, 255, 255, 0.1), transparent);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.cta-button:hover::after {\n opacity: 1;\n}\n\n/* Responsive Image Container */\n.feature-image-container {\n position: relative;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.feature-image-container:hover {\n transform: translateY(-4px);\n box-shadow: 0 30px 60px -15px rgba(0, 0, 0, 0.2);\n}\n',
|
|
2669
2669
|
"marketing/astro/tsconfig.json.hbs": '{\n "extends": "astro/tsconfigs/strict",\n "compilerOptions": {\n "baseUrl": ".",\n "paths": {\n "@/*": ["./src/*"]\n }\n },\n "include": ["src/**/*", ".astro/types.d.ts"],\n "exclude": ["node_modules", "dist"]\n}\n',
|
|
2670
|
+
"marketing/nextjs/components.json.hbs": '{\n "$schema": "https://ui.shadcn.com/schema.json",\n{{#if (eq shadcn.style "nova")}}\n "style": "new-york",\n{{else if (eq shadcn.style "vega")}}\n "style": "default",\n{{else if (eq shadcn.style "maia")}}\n "style": "new-york",\n{{else if (eq shadcn.style "lyra")}}\n "style": "new-york",\n{{else if (eq shadcn.style "mira")}}\n "style": "default",\n{{else}}\n "style": "new-york",\n{{/if}}\n "rsc": true,\n "tsx": true,\n "tailwind": {\n "config": "",\n "css": "src/app/globals.css",\n "baseColor": "{{shadcn.baseColor}}",\n "cssVariables": true,\n "prefix": ""\n },\n{{#if (eq shadcn.iconLibrary "lucide")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "hugeicons")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "tabler")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "phosphor")}}\n "iconLibrary": "lucide",\n{{else}}\n "iconLibrary": "lucide",\n{{/if}}\n "aliases": {\n "components": "@/components",\n "utils": "@/lib/utils",\n "ui": "@/components/ui",\n "lib": "@/lib",\n "hooks": "@/hooks"\n },\n "registries": {}\n}\n',
|
|
2670
2671
|
"marketing/nextjs/next.config.ts.hbs": "import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n}\n\nexport default nextConfig\n",
|
|
2671
|
-
"marketing/nextjs/package.json.hbs": '{\n "name": "@repo/marketing",\n "version": "0.1.0",\n "private": true,\n "scripts": {\n "dev": "next dev --turbopack --port 3000",\n "build": "next build",\n "start": "next start",\n "lint": "biome check .",\n "lint:fix": "biome check --write .",\n "typecheck": "tsc --noEmit"\n },\n "dependencies": {\n "next": "^16.0.0",\n "react": "^19.0.0",\n "react-dom": "^19.0.0",\n "@repo/ui": "workspace:*",\n "lucide-react": "^0.468.0",\n "next-themes": "^0.4.4",\n "clsx": "^2.1.1",\n "tailwind-merge": "^2.6.0",\n "class-variance-authority": "^0.7.1"\n },\n "devDependencies": {\n "@repo/config-typescript": "workspace:*",\n "@types/node": "^20.0.0",\n "@types/react": "^19.0.0",\n "@types/react-dom": "^19.0.0",\n "tailwindcss": "^4.0.0",\n "@tailwindcss/postcss": "^4.0.0",\n "postcss": "^8.4.0",\n "typescript": "^5.0.0"\n }\n}\n',
|
|
2672
|
+
"marketing/nextjs/package.json.hbs": '{\n "name": "@repo/marketing",\n "version": "0.1.0",\n "private": true,\n "scripts": {\n "dev": "next dev --turbopack --port 3000",\n "build": "next build",\n "start": "next start",\n "lint": "biome check .",\n "lint:fix": "biome check --write .",\n "typecheck": "tsc --noEmit"\n },\n "dependencies": {\n "next": "^16.0.0",\n "react": "^19.0.0",\n "react-dom": "^19.0.0",\n "@repo/ui": "workspace:*",\n "lucide-react": "^0.468.0",\n "next-themes": "^0.4.4",\n "clsx": "^2.1.1",\n "tailwind-merge": "^2.6.0",\n "class-variance-authority": "^0.7.1",\n "tw-animate-css": "^1.3.0"\n },\n "devDependencies": {\n "@repo/config-typescript": "workspace:*",\n "@types/node": "^20.0.0",\n "@types/react": "^19.0.0",\n "@types/react-dom": "^19.0.0",\n "tailwindcss": "^4.0.0",\n "@tailwindcss/postcss": "^4.0.0",\n "postcss": "^8.4.0",\n "typescript": "^5.0.0"\n }\n}\n',
|
|
2672
2673
|
"marketing/nextjs/postcss.config.mjs.hbs": "export default {\n plugins: {\n '@tailwindcss/postcss': {},\n },\n}\n",
|
|
2674
|
+
"marketing/nextjs/src/app/about/page.tsx": `import { Header } from "@/components/Header"
|
|
2675
|
+
import { Footer } from "@/components/Footer"
|
|
2676
|
+
import { LogoBanner, FinalCTA } from "@/components/blocks"
|
|
2677
|
+
import { Users, Target, Heart, Zap } from "lucide-react"
|
|
2678
|
+
|
|
2679
|
+
const values = [
|
|
2680
|
+
{
|
|
2681
|
+
icon: <Users className="h-6 w-6" />,
|
|
2682
|
+
title: "Customer First",
|
|
2683
|
+
description:
|
|
2684
|
+
"Every decision we make starts with our customers. Their success is our success.",
|
|
2685
|
+
},
|
|
2686
|
+
{
|
|
2687
|
+
icon: <Target className="h-6 w-6" />,
|
|
2688
|
+
title: "Simplicity Wins",
|
|
2689
|
+
description:
|
|
2690
|
+
"We believe powerful software doesn't have to be complicated. We obsess over making things simple.",
|
|
2691
|
+
},
|
|
2692
|
+
{
|
|
2693
|
+
icon: <Heart className="h-6 w-6" />,
|
|
2694
|
+
title: "Built with Care",
|
|
2695
|
+
description:
|
|
2696
|
+
"We sweat the details because we know they matter. Quality is never an accident.",
|
|
2697
|
+
},
|
|
2698
|
+
{
|
|
2699
|
+
icon: <Zap className="h-6 w-6" />,
|
|
2700
|
+
title: "Move Fast",
|
|
2701
|
+
description:
|
|
2702
|
+
"We ship early and often. Progress beats perfection when you're learning from real users.",
|
|
2703
|
+
},
|
|
2704
|
+
]
|
|
2705
|
+
|
|
2706
|
+
const stats = [
|
|
2707
|
+
{ value: "50K+", label: "Teams worldwide" },
|
|
2708
|
+
{ value: "180+", label: "Countries" },
|
|
2709
|
+
{ value: "99.9%", label: "Uptime" },
|
|
2710
|
+
{ value: "4.8/5", label: "Customer rating" },
|
|
2711
|
+
]
|
|
2712
|
+
|
|
2713
|
+
export default function AboutPage() {
|
|
2714
|
+
return (
|
|
2715
|
+
<div className="min-h-screen flex flex-col">
|
|
2716
|
+
<Header />
|
|
2717
|
+
|
|
2718
|
+
<main className="flex-1">
|
|
2719
|
+
{/* Hero */}
|
|
2720
|
+
<section className="py-16 md:py-24">
|
|
2721
|
+
<div className="container mx-auto px-4">
|
|
2722
|
+
<div className="max-w-3xl mx-auto text-center">
|
|
2723
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
2724
|
+
We're on a mission to help teams work better together
|
|
2725
|
+
</h1>
|
|
2726
|
+
<p className="text-xl text-muted-foreground">
|
|
2727
|
+
SaaSify was founded in 2020 with a simple belief: work doesn't have to be
|
|
2728
|
+
complicated. We're building the tools that help teams focus on what matters.
|
|
2729
|
+
</p>
|
|
2730
|
+
</div>
|
|
2731
|
+
</div>
|
|
2732
|
+
</section>
|
|
2733
|
+
|
|
2734
|
+
{/* Stats */}
|
|
2735
|
+
<section className="py-12 bg-muted/30">
|
|
2736
|
+
<div className="container mx-auto px-4">
|
|
2737
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-8">
|
|
2738
|
+
{stats.map((stat) => (
|
|
2739
|
+
<div key={stat.label} className="text-center">
|
|
2740
|
+
<div className="text-4xl md:text-5xl font-bold text-primary mb-2">
|
|
2741
|
+
{stat.value}
|
|
2742
|
+
</div>
|
|
2743
|
+
<div className="text-muted-foreground">{stat.label}</div>
|
|
2744
|
+
</div>
|
|
2745
|
+
))}
|
|
2746
|
+
</div>
|
|
2747
|
+
</div>
|
|
2748
|
+
</section>
|
|
2749
|
+
|
|
2750
|
+
{/* Story */}
|
|
2751
|
+
<section className="py-16 md:py-24">
|
|
2752
|
+
<div className="container mx-auto px-4">
|
|
2753
|
+
<div className="max-w-3xl mx-auto">
|
|
2754
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-8 text-center">
|
|
2755
|
+
Our story
|
|
2756
|
+
</h2>
|
|
2757
|
+
<div className="prose prose-lg max-w-none text-muted-foreground">
|
|
2758
|
+
<p className="mb-6">
|
|
2759
|
+
It all started with a frustration we've all felt: too many tools, too many
|
|
2760
|
+
tabs, too much time wasted switching between them. We knew there had to be
|
|
2761
|
+
a better way.
|
|
2762
|
+
</p>
|
|
2763
|
+
<p className="mb-6">
|
|
2764
|
+
So we set out to build a platform that brings everything together\u2014tasks,
|
|
2765
|
+
documents, communication, and automation\u2014in one seamless experience. No more
|
|
2766
|
+
context switching. No more lost information. Just focused, productive work.
|
|
2767
|
+
</p>
|
|
2768
|
+
<p>
|
|
2769
|
+
Today, SaaSify is used by over 50,000 teams worldwide, from two-person
|
|
2770
|
+
startups to Fortune 500 companies. And we're just getting started.
|
|
2771
|
+
</p>
|
|
2772
|
+
</div>
|
|
2773
|
+
</div>
|
|
2774
|
+
</div>
|
|
2775
|
+
</section>
|
|
2776
|
+
|
|
2777
|
+
{/* Values */}
|
|
2778
|
+
<section className="py-16 md:py-24 bg-muted/30">
|
|
2779
|
+
<div className="container mx-auto px-4">
|
|
2780
|
+
<div className="text-center mb-12 md:mb-16">
|
|
2781
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
2782
|
+
Our values
|
|
2783
|
+
</h2>
|
|
2784
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
2785
|
+
These principles guide everything we do, from product decisions to how we
|
|
2786
|
+
treat each other.
|
|
2787
|
+
</p>
|
|
2788
|
+
</div>
|
|
2789
|
+
|
|
2790
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8 max-w-5xl mx-auto">
|
|
2791
|
+
{values.map((value) => (
|
|
2792
|
+
<div
|
|
2793
|
+
key={value.title}
|
|
2794
|
+
className="bg-card rounded-lg border border-border p-6"
|
|
2795
|
+
>
|
|
2796
|
+
<div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
|
|
2797
|
+
{value.icon}
|
|
2798
|
+
</div>
|
|
2799
|
+
<h3 className="text-lg font-semibold mb-2">{value.title}</h3>
|
|
2800
|
+
<p className="text-muted-foreground text-sm">{value.description}</p>
|
|
2801
|
+
</div>
|
|
2802
|
+
))}
|
|
2803
|
+
</div>
|
|
2804
|
+
</div>
|
|
2805
|
+
</section>
|
|
2806
|
+
|
|
2807
|
+
{/* Trusted By */}
|
|
2808
|
+
<LogoBanner
|
|
2809
|
+
heading="Trusted by teams at companies of all sizes"
|
|
2810
|
+
style="scroll"
|
|
2811
|
+
/>
|
|
2812
|
+
|
|
2813
|
+
{/* Final CTA */}
|
|
2814
|
+
<FinalCTA
|
|
2815
|
+
headline="Join us on our mission"
|
|
2816
|
+
subheading="Start your free trial today and see why thousands of teams trust SaaSify."
|
|
2817
|
+
style="dark"
|
|
2818
|
+
links={[
|
|
2819
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
2820
|
+
{ label: "Contact us", href: "/contact", variant: "default" },
|
|
2821
|
+
]}
|
|
2822
|
+
/>
|
|
2823
|
+
</main>
|
|
2824
|
+
|
|
2825
|
+
<Footer />
|
|
2826
|
+
</div>
|
|
2827
|
+
)
|
|
2828
|
+
}
|
|
2829
|
+
`,
|
|
2830
|
+
"marketing/nextjs/src/app/blog/[slug]/page.tsx": `import { Header } from "@/components/Header"
|
|
2831
|
+
import { Footer } from "@/components/Footer"
|
|
2832
|
+
import { FinalCTA } from "@/components/blocks"
|
|
2833
|
+
import Link from "next/link"
|
|
2834
|
+
import { ArrowLeft, Calendar, Clock, User } from "lucide-react"
|
|
2835
|
+
|
|
2836
|
+
// This is sample data - in a real app, you would fetch this from a CMS or MDX files
|
|
2837
|
+
const blogPosts: Record<string, {
|
|
2838
|
+
title: string
|
|
2839
|
+
description: string
|
|
2840
|
+
content: string
|
|
2841
|
+
date: string
|
|
2842
|
+
author: string
|
|
2843
|
+
readTime: string
|
|
2844
|
+
category: string
|
|
2845
|
+
}> = {
|
|
2846
|
+
"boost-team-productivity": {
|
|
2847
|
+
title: "10 Ways to Boost Your Team's Productivity",
|
|
2848
|
+
description: "Discover proven strategies to help your team work smarter, not harder.",
|
|
2849
|
+
date: "January 15, 2025",
|
|
2850
|
+
author: "Sarah Johnson",
|
|
2851
|
+
readTime: "8 min read",
|
|
2852
|
+
category: "Productivity",
|
|
2853
|
+
content: \`
|
|
2854
|
+
<p>In today's fast-paced business environment, productivity isn't just about working harder\u2014it's about working smarter. Here are 10 proven strategies to help your team achieve more while maintaining a healthy work-life balance.</p>
|
|
2855
|
+
|
|
2856
|
+
<h2>1. Set Clear Goals and Priorities</h2>
|
|
2857
|
+
<p>Without clear direction, teams can easily get lost in busywork. Start each week by defining the top 3-5 priorities that will move the needle for your organization.</p>
|
|
2858
|
+
|
|
2859
|
+
<h2>2. Embrace Asynchronous Communication</h2>
|
|
2860
|
+
<p>Not every message needs an immediate response. By embracing async communication, you give your team members uninterrupted blocks of time to focus on deep work.</p>
|
|
2861
|
+
|
|
2862
|
+
<h2>3. Automate Repetitive Tasks</h2>
|
|
2863
|
+
<p>If your team is doing the same task more than twice, it's time to automate it. Modern tools make it easy to create workflows that handle routine work automatically.</p>
|
|
2864
|
+
|
|
2865
|
+
<h2>4. Hold Fewer, Better Meetings</h2>
|
|
2866
|
+
<p>Before scheduling a meeting, ask yourself: "Could this be an email?" When meetings are necessary, have a clear agenda and stick to the allotted time.</p>
|
|
2867
|
+
|
|
2868
|
+
<h2>5. Invest in the Right Tools</h2>
|
|
2869
|
+
<p>The right tools can multiply your team's effectiveness. Look for platforms that integrate well with each other to reduce context switching.</p>
|
|
2870
|
+
|
|
2871
|
+
<h2>6. Create a Culture of Documentation</h2>
|
|
2872
|
+
<p>When knowledge lives only in people's heads, it creates bottlenecks. Document processes, decisions, and learnings so everyone can move faster independently.</p>
|
|
2873
|
+
|
|
2874
|
+
<h2>7. Encourage Regular Breaks</h2>
|
|
2875
|
+
<p>Counterintuitive as it may seem, taking breaks actually improves productivity. The human brain needs rest to perform at its best.</p>
|
|
2876
|
+
|
|
2877
|
+
<h2>8. Provide Feedback Continuously</h2>
|
|
2878
|
+
<p>Don't wait for annual reviews to give feedback. Regular, constructive feedback helps team members course-correct and grow continuously.</p>
|
|
2879
|
+
|
|
2880
|
+
<h2>9. Eliminate Unnecessary Approvals</h2>
|
|
2881
|
+
<p>Too many approval steps slow teams down. Trust your people to make good decisions and only require sign-off when truly necessary.</p>
|
|
2882
|
+
|
|
2883
|
+
<h2>10. Celebrate Wins (Big and Small)</h2>
|
|
2884
|
+
<p>Recognition fuels motivation. Take time to acknowledge achievements, whether it's closing a big deal or simply shipping a feature on time.</p>
|
|
2885
|
+
|
|
2886
|
+
<h2>Conclusion</h2>
|
|
2887
|
+
<p>Improving productivity is an ongoing journey, not a destination. Start with one or two of these strategies, measure the impact, and keep iterating. Your team will thank you for it.</p>
|
|
2888
|
+
\`,
|
|
2889
|
+
},
|
|
2890
|
+
}
|
|
2891
|
+
|
|
2892
|
+
// Generate static params for static generation
|
|
2893
|
+
export function generateStaticParams() {
|
|
2894
|
+
return Object.keys(blogPosts).map((slug) => ({
|
|
2895
|
+
slug,
|
|
2896
|
+
}))
|
|
2897
|
+
}
|
|
2898
|
+
|
|
2899
|
+
export default async function BlogPostPage({
|
|
2900
|
+
params,
|
|
2901
|
+
}: {
|
|
2902
|
+
params: Promise<{ slug: string }>
|
|
2903
|
+
}) {
|
|
2904
|
+
const { slug } = await params
|
|
2905
|
+
const post = blogPosts[slug]
|
|
2906
|
+
|
|
2907
|
+
// If post doesn't exist, show a placeholder
|
|
2908
|
+
if (!post) {
|
|
2909
|
+
return (
|
|
2910
|
+
<div className="min-h-screen flex flex-col">
|
|
2911
|
+
<Header />
|
|
2912
|
+
<main className="flex-1">
|
|
2913
|
+
<section className="py-16 md:py-24">
|
|
2914
|
+
<div className="container mx-auto px-4 text-center">
|
|
2915
|
+
<h1 className="text-4xl font-bold mb-4">Post Not Found</h1>
|
|
2916
|
+
<p className="text-muted-foreground mb-8">
|
|
2917
|
+
This blog post doesn't exist or has been removed.
|
|
2918
|
+
</p>
|
|
2919
|
+
<Link
|
|
2920
|
+
href="/blog"
|
|
2921
|
+
className="inline-flex items-center text-primary hover:underline"
|
|
2922
|
+
>
|
|
2923
|
+
<ArrowLeft className="h-4 w-4 mr-2" />
|
|
2924
|
+
Back to blog
|
|
2925
|
+
</Link>
|
|
2926
|
+
</div>
|
|
2927
|
+
</section>
|
|
2928
|
+
</main>
|
|
2929
|
+
<Footer />
|
|
2930
|
+
</div>
|
|
2931
|
+
)
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2934
|
+
return (
|
|
2935
|
+
<div className="min-h-screen flex flex-col">
|
|
2936
|
+
<Header />
|
|
2937
|
+
|
|
2938
|
+
<main className="flex-1">
|
|
2939
|
+
{/* Back Link */}
|
|
2940
|
+
<section className="pt-8">
|
|
2941
|
+
<div className="container mx-auto px-4">
|
|
2942
|
+
<Link
|
|
2943
|
+
href="/blog"
|
|
2944
|
+
className="inline-flex items-center text-muted-foreground hover:text-foreground transition-colors"
|
|
2945
|
+
>
|
|
2946
|
+
<ArrowLeft className="h-4 w-4 mr-2" />
|
|
2947
|
+
Back to blog
|
|
2948
|
+
</Link>
|
|
2949
|
+
</div>
|
|
2950
|
+
</section>
|
|
2951
|
+
|
|
2952
|
+
{/* Header */}
|
|
2953
|
+
<section className="py-12 md:py-16">
|
|
2954
|
+
<div className="container mx-auto px-4">
|
|
2955
|
+
<div className="max-w-3xl mx-auto">
|
|
2956
|
+
<div className="mb-6">
|
|
2957
|
+
<span className="inline-block px-3 py-1 text-xs font-medium rounded-full bg-primary/10 text-primary">
|
|
2958
|
+
{post.category}
|
|
2959
|
+
</span>
|
|
2960
|
+
</div>
|
|
2961
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
2962
|
+
{post.title}
|
|
2963
|
+
</h1>
|
|
2964
|
+
<p className="text-xl text-muted-foreground mb-8">
|
|
2965
|
+
{post.description}
|
|
2966
|
+
</p>
|
|
2967
|
+
<div className="flex flex-wrap items-center gap-6 text-sm text-muted-foreground">
|
|
2968
|
+
<div className="flex items-center gap-2">
|
|
2969
|
+
<User className="h-4 w-4" />
|
|
2970
|
+
{post.author}
|
|
2971
|
+
</div>
|
|
2972
|
+
<div className="flex items-center gap-2">
|
|
2973
|
+
<Calendar className="h-4 w-4" />
|
|
2974
|
+
{post.date}
|
|
2975
|
+
</div>
|
|
2976
|
+
<div className="flex items-center gap-2">
|
|
2977
|
+
<Clock className="h-4 w-4" />
|
|
2978
|
+
{post.readTime}
|
|
2979
|
+
</div>
|
|
2980
|
+
</div>
|
|
2981
|
+
</div>
|
|
2982
|
+
</div>
|
|
2983
|
+
</section>
|
|
2984
|
+
|
|
2985
|
+
{/* Content */}
|
|
2986
|
+
<section className="pb-16 md:pb-24">
|
|
2987
|
+
<div className="container mx-auto px-4">
|
|
2988
|
+
<div
|
|
2989
|
+
className="max-w-3xl mx-auto prose prose-lg prose-gray dark:prose-invert"
|
|
2990
|
+
dangerouslySetInnerHTML={{ __html: post.content }}
|
|
2991
|
+
/>
|
|
2992
|
+
</div>
|
|
2993
|
+
</section>
|
|
2994
|
+
|
|
2995
|
+
{/* Final CTA */}
|
|
2996
|
+
<FinalCTA
|
|
2997
|
+
headline="Ready to transform how your team works?"
|
|
2998
|
+
subheading="Start your free trial and see the difference SaaSify can make."
|
|
2999
|
+
style="dark"
|
|
3000
|
+
links={[
|
|
3001
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
3002
|
+
{ label: "View pricing", href: "/pricing", variant: "default" },
|
|
3003
|
+
]}
|
|
3004
|
+
/>
|
|
3005
|
+
</main>
|
|
3006
|
+
|
|
3007
|
+
<Footer />
|
|
3008
|
+
</div>
|
|
3009
|
+
)
|
|
3010
|
+
}
|
|
3011
|
+
`,
|
|
2673
3012
|
"marketing/nextjs/src/app/blog/page.tsx": `import { Header } from "@/components/Header"
|
|
2674
3013
|
import { Footer } from "@/components/Footer"
|
|
2675
3014
|
import Link from "next/link"
|
|
@@ -2737,30 +3076,360 @@ export default function BlogPage() {
|
|
|
2737
3076
|
</div>
|
|
2738
3077
|
</section>
|
|
2739
3078
|
|
|
2740
|
-
{/* Blog Grid */}
|
|
2741
|
-
<section className="pb-24">
|
|
3079
|
+
{/* Blog Grid */}
|
|
3080
|
+
<section className="pb-24">
|
|
3081
|
+
<div className="container mx-auto px-4">
|
|
3082
|
+
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
|
|
3083
|
+
{blogPosts.map((post) => (
|
|
3084
|
+
<article
|
|
3085
|
+
key={post.title}
|
|
3086
|
+
className="group rounded-lg border border-border bg-card p-6 transition-all hover:shadow-lg"
|
|
3087
|
+
>
|
|
3088
|
+
<div className="mb-4">
|
|
3089
|
+
<span className="inline-block px-3 py-1 text-xs font-medium rounded-full bg-primary/10 text-primary">
|
|
3090
|
+
{post.category}
|
|
3091
|
+
</span>
|
|
3092
|
+
</div>
|
|
3093
|
+
<h2 className="text-xl font-semibold mb-2 group-hover:text-primary transition-colors">
|
|
3094
|
+
<Link href={post.slug}>{post.title}</Link>
|
|
3095
|
+
</h2>
|
|
3096
|
+
<p className="text-muted-foreground mb-4">{post.description}</p>
|
|
3097
|
+
<time className="text-sm text-muted-foreground">{post.date}</time>
|
|
3098
|
+
</article>
|
|
3099
|
+
))}
|
|
3100
|
+
</div>
|
|
3101
|
+
</div>
|
|
3102
|
+
</section>
|
|
3103
|
+
</main>
|
|
3104
|
+
|
|
3105
|
+
<Footer />
|
|
3106
|
+
</div>
|
|
3107
|
+
)
|
|
3108
|
+
}
|
|
3109
|
+
`,
|
|
3110
|
+
"marketing/nextjs/src/app/features/analytics/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { FinalCTA } from "@/components/blocks"\nimport { BarChart3, TrendingUp, LineChart, PieChart, Target, Bell } from "lucide-react"\n\nconst features = [\n {\n icon: <BarChart3 className="h-6 w-6" />,\n title: "Real-Time Dashboards",\n description:\n "See your metrics update live. No more waiting for reports to refresh.",\n },\n {\n icon: <TrendingUp className="h-6 w-6" />,\n title: "Trend Analysis",\n description:\n "Spot patterns and trends before they become obvious. Make proactive decisions.",\n },\n {\n icon: <LineChart className="h-6 w-6" />,\n title: "Custom Reports",\n description:\n "Build reports that matter to your business. Export to PDF, Excel, or share live links.",\n },\n {\n icon: <PieChart className="h-6 w-6" />,\n title: "Team Performance",\n description:\n "Track productivity metrics across your team. Identify bottlenecks and opportunities.",\n },\n {\n icon: <Target className="h-6 w-6" />,\n title: "Goal Tracking",\n description:\n "Set targets and track progress in real-time. Keep your team focused on what matters.",\n },\n {\n icon: <Bell className="h-6 w-6" />,\n title: "Smart Alerts",\n description:\n "Get notified when metrics cross thresholds. Never miss an important change.",\n },\n]\n\nexport default function AnalyticsPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n Analytics\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Make decisions backed by real-time data\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n Track every metric that matters. From team performance to customer insights, get the visibility you need to drive growth.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n Watch demo\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Dashboard Preview */}\n <section className="pb-16 md:pb-24">\n <div className="container mx-auto px-4">\n <div className="max-w-5xl mx-auto">\n <div className="aspect-video bg-gradient-to-br from-primary/20 to-primary/5 rounded-lg border border-border flex items-center justify-center">\n <div className="text-center text-muted-foreground">\n <BarChart3 className="h-16 w-16 mx-auto mb-4 opacity-50" />\n <p>Dashboard Preview</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Features Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Analytics that drive action\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Everything you need to understand your data and make better decisions.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {features.map((feature) => (\n <div\n key={feature.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {feature.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>\n <p className="text-muted-foreground text-sm">{feature.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to unlock insights?"\n subheading="Start your free trial and see your data come to life."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Book a demo", href: "/demo", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3111
|
+
"marketing/nextjs/src/app/features/automation/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { FinalCTA } from "@/components/blocks"\nimport { Zap, GitBranch, Clock, Repeat, Mail, Bell } from "lucide-react"\n\nconst features = [\n {\n icon: <Zap className="h-6 w-6" />,\n title: "Visual Workflow Builder",\n description:\n "Build powerful automations with our drag-and-drop builder. No coding required.",\n },\n {\n icon: <GitBranch className="h-6 w-6" />,\n title: "Conditional Logic",\n description:\n "Create smart workflows with if/then rules, filters, and branching paths.",\n },\n {\n icon: <Clock className="h-6 w-6" />,\n title: "Scheduled Triggers",\n description:\n "Run automations on a schedule. Daily reports, weekly syncs, monthly reviews.",\n },\n {\n icon: <Repeat className="h-6 w-6" />,\n title: "Cross-App Actions",\n description:\n "Trigger actions across all your connected tools. True end-to-end automation.",\n },\n {\n icon: <Mail className="h-6 w-6" />,\n title: "Email Automation",\n description:\n "Send automated emails based on triggers. Follow-ups, reminders, notifications.",\n },\n {\n icon: <Bell className="h-6 w-6" />,\n title: "Smart Notifications",\n description:\n "Route notifications intelligently. Right message, right person, right time.",\n },\n]\n\nconst useCases = [\n {\n title: "Lead Assignment",\n description: "Automatically assign new leads to sales reps based on territory or round-robin.",\n },\n {\n title: "Approval Workflows",\n description: "Route documents for approval with multi-step workflows and escalation.",\n },\n {\n title: "Onboarding",\n description: "Create welcome sequences for new customers or team members automatically.",\n },\n {\n title: "Status Updates",\n description: "Sync status changes across tools and notify stakeholders automatically.",\n },\n]\n\nexport default function AutomationPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n Automation\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Eliminate busywork with smart automation\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n Build powerful workflows without code. Automate approvals, notifications, data entry, and more to focus on what matters.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n See it in action\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Features Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Automation that scales with you\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n From simple triggers to complex workflows, automate anything.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {features.map((feature) => (\n <div\n key={feature.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {feature.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>\n <p className="text-muted-foreground text-sm">{feature.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Use Cases */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Popular automation recipes\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Get started quickly with pre-built templates for common workflows.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 gap-6 max-w-3xl mx-auto">\n {useCases.map((useCase) => (\n <div\n key={useCase.title}\n className="p-6 rounded-lg border border-border bg-card hover:border-primary/50 transition-colors"\n >\n <h3 className="font-semibold mb-2">{useCase.title}</h3>\n <p className="text-muted-foreground text-sm">{useCase.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to automate your workflow?"\n subheading="Start your free trial and build your first automation in minutes."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "View templates", href: "#", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3112
|
+
"marketing/nextjs/src/app/features/dashboard/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { FinalCTA } from "@/components/blocks"\nimport { LayoutDashboard, Layers, Palette, Monitor, Smartphone, Share2 } from "lucide-react"\n\nconst features = [\n {\n icon: <LayoutDashboard className="h-6 w-6" />,\n title: "Customizable Layouts",\n description:\n "Drag and drop widgets to create the perfect view for your workflow.",\n },\n {\n icon: <Layers className="h-6 w-6" />,\n title: "Multiple Views",\n description:\n "Switch between board, list, timeline, and calendar views instantly.",\n },\n {\n icon: <Palette className="h-6 w-6" />,\n title: "Personalized Themes",\n description:\n "Choose from light, dark, or system themes. Make it yours.",\n },\n {\n icon: <Monitor className="h-6 w-6" />,\n title: "Desktop App",\n description:\n "Native apps for Mac and Windows. Full offline support included.",\n },\n {\n icon: <Smartphone className="h-6 w-6" />,\n title: "Mobile Ready",\n description:\n "Full-featured iOS and Android apps. Stay productive on the go.",\n },\n {\n icon: <Share2 className="h-6 w-6" />,\n title: "Shareable Dashboards",\n description:\n "Share views with stakeholders. Public links or password-protected.",\n },\n]\n\nexport default function DashboardPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n Dashboard\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Your command center for everything\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n A beautiful, customizable dashboard that puts everything you need at your fingertips. Multiple views, drag-and-drop widgets, and full mobile support.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n Watch demo\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Dashboard Preview */}\n <section className="pb-16 md:pb-24">\n <div className="container mx-auto px-4">\n <div className="max-w-5xl mx-auto">\n <div className="aspect-video bg-gradient-to-br from-primary/20 to-primary/5 rounded-lg border border-border flex items-center justify-center">\n <div className="text-center text-muted-foreground">\n <LayoutDashboard className="h-16 w-16 mx-auto mb-4 opacity-50" />\n <p>Dashboard Preview</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Features Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n A dashboard that works for you\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Customize every aspect of your workspace to match how you work best.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {features.map((feature) => (\n <div\n key={feature.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {feature.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>\n <p className="text-muted-foreground text-sm">{feature.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to build your perfect workspace?"\n subheading="Start your free trial and customize your dashboard in minutes."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Watch demo", href: "/demo", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3113
|
+
"marketing/nextjs/src/app/features/integrations/page.tsx": `import { Header } from "@/components/Header"
|
|
3114
|
+
import { Footer } from "@/components/Footer"
|
|
3115
|
+
import { LogoBanner, FinalCTA } from "@/components/blocks"
|
|
3116
|
+
import { Link2, RefreshCw, Code2, Zap, ArrowRight, Check } from "lucide-react"
|
|
3117
|
+
|
|
3118
|
+
const features = [
|
|
3119
|
+
{
|
|
3120
|
+
icon: <Link2 className="h-6 w-6" />,
|
|
3121
|
+
title: "100+ Native Integrations",
|
|
3122
|
+
description:
|
|
3123
|
+
"Connect with the tools your team already uses. From CRMs to project management, we've got you covered.",
|
|
3124
|
+
},
|
|
3125
|
+
{
|
|
3126
|
+
icon: <RefreshCw className="h-6 w-6" />,
|
|
3127
|
+
title: "Two-Way Sync",
|
|
3128
|
+
description:
|
|
3129
|
+
"Changes flow automatically between apps. Update in one place, see it everywhere.",
|
|
3130
|
+
},
|
|
3131
|
+
{
|
|
3132
|
+
icon: <Code2 className="h-6 w-6" />,
|
|
3133
|
+
title: "Developer API",
|
|
3134
|
+
description:
|
|
3135
|
+
"Build custom integrations with our comprehensive REST API and webhooks.",
|
|
3136
|
+
},
|
|
3137
|
+
{
|
|
3138
|
+
icon: <Zap className="h-6 w-6" />,
|
|
3139
|
+
title: "Real-Time Updates",
|
|
3140
|
+
description:
|
|
3141
|
+
"Data syncs instantly, not in batches. Always work with the latest information.",
|
|
3142
|
+
},
|
|
3143
|
+
]
|
|
3144
|
+
|
|
3145
|
+
const integrationCategories = [
|
|
3146
|
+
{
|
|
3147
|
+
name: "CRM & Sales",
|
|
3148
|
+
tools: ["Salesforce", "HubSpot", "Pipedrive", "Close"],
|
|
3149
|
+
},
|
|
3150
|
+
{
|
|
3151
|
+
name: "Communication",
|
|
3152
|
+
tools: ["Slack", "Microsoft Teams", "Discord", "Email"],
|
|
3153
|
+
},
|
|
3154
|
+
{
|
|
3155
|
+
name: "Project Management",
|
|
3156
|
+
tools: ["Jira", "Asana", "Linear", "Notion"],
|
|
3157
|
+
},
|
|
3158
|
+
{
|
|
3159
|
+
name: "Productivity",
|
|
3160
|
+
tools: ["Google Workspace", "Microsoft 365", "Dropbox", "Box"],
|
|
3161
|
+
},
|
|
3162
|
+
]
|
|
3163
|
+
|
|
3164
|
+
export default function IntegrationsPage() {
|
|
3165
|
+
return (
|
|
3166
|
+
<div className="min-h-screen flex flex-col">
|
|
3167
|
+
<Header />
|
|
3168
|
+
|
|
3169
|
+
<main className="flex-1">
|
|
3170
|
+
{/* Hero */}
|
|
3171
|
+
<section className="py-16 md:py-24">
|
|
3172
|
+
<div className="container mx-auto px-4">
|
|
3173
|
+
<div className="max-w-3xl mx-auto text-center">
|
|
3174
|
+
<div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
|
|
3175
|
+
Integrations
|
|
3176
|
+
</div>
|
|
3177
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
3178
|
+
Connect everything your team uses
|
|
3179
|
+
</h1>
|
|
3180
|
+
<p className="text-xl text-muted-foreground mb-8">
|
|
3181
|
+
Integrate with 100+ popular tools. Two-way sync keeps everything up to date automatically.
|
|
3182
|
+
</p>
|
|
3183
|
+
<div className="flex flex-wrap gap-4 justify-center">
|
|
3184
|
+
<a
|
|
3185
|
+
href="/sign-up"
|
|
3186
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
|
|
3187
|
+
>
|
|
3188
|
+
Start free trial
|
|
3189
|
+
</a>
|
|
3190
|
+
<a
|
|
3191
|
+
href="/contact"
|
|
3192
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"
|
|
3193
|
+
>
|
|
3194
|
+
Request integration
|
|
3195
|
+
</a>
|
|
3196
|
+
</div>
|
|
3197
|
+
</div>
|
|
3198
|
+
</div>
|
|
3199
|
+
</section>
|
|
3200
|
+
|
|
3201
|
+
{/* Features Grid */}
|
|
3202
|
+
<section className="py-16 md:py-24 bg-muted/30">
|
|
3203
|
+
<div className="container mx-auto px-4">
|
|
3204
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
|
3205
|
+
{features.map((feature) => (
|
|
3206
|
+
<div
|
|
3207
|
+
key={feature.title}
|
|
3208
|
+
className="bg-card rounded-lg border border-border p-6"
|
|
3209
|
+
>
|
|
3210
|
+
<div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
|
|
3211
|
+
{feature.icon}
|
|
3212
|
+
</div>
|
|
3213
|
+
<h3 className="text-lg font-semibold mb-2">{feature.title}</h3>
|
|
3214
|
+
<p className="text-muted-foreground text-sm">{feature.description}</p>
|
|
3215
|
+
</div>
|
|
3216
|
+
))}
|
|
3217
|
+
</div>
|
|
3218
|
+
</div>
|
|
3219
|
+
</section>
|
|
3220
|
+
|
|
3221
|
+
{/* Integration Categories */}
|
|
3222
|
+
<section className="py-16 md:py-24">
|
|
3223
|
+
<div className="container mx-auto px-4">
|
|
3224
|
+
<div className="text-center mb-12 md:mb-16">
|
|
3225
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
3226
|
+
Integrations for every workflow
|
|
3227
|
+
</h2>
|
|
3228
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
3229
|
+
Connect the tools you already use to streamline your work.
|
|
3230
|
+
</p>
|
|
3231
|
+
</div>
|
|
3232
|
+
|
|
3233
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8 max-w-5xl mx-auto">
|
|
3234
|
+
{integrationCategories.map((category) => (
|
|
3235
|
+
<div key={category.name} className="bg-card rounded-lg border border-border p-6">
|
|
3236
|
+
<h3 className="font-semibold mb-4">{category.name}</h3>
|
|
3237
|
+
<ul className="space-y-3">
|
|
3238
|
+
{category.tools.map((tool) => (
|
|
3239
|
+
<li key={tool} className="flex items-center text-sm text-muted-foreground">
|
|
3240
|
+
<Check className="h-4 w-4 text-primary mr-2 shrink-0" />
|
|
3241
|
+
{tool}
|
|
3242
|
+
</li>
|
|
3243
|
+
))}
|
|
3244
|
+
</ul>
|
|
3245
|
+
<a
|
|
3246
|
+
href="#"
|
|
3247
|
+
className="inline-flex items-center text-sm text-primary hover:underline mt-4"
|
|
3248
|
+
>
|
|
3249
|
+
See all <ArrowRight className="h-4 w-4 ml-1" />
|
|
3250
|
+
</a>
|
|
3251
|
+
</div>
|
|
3252
|
+
))}
|
|
3253
|
+
</div>
|
|
3254
|
+
</div>
|
|
3255
|
+
</section>
|
|
3256
|
+
|
|
3257
|
+
{/* Logo Banner */}
|
|
3258
|
+
<LogoBanner
|
|
3259
|
+
heading="Integrates with your favorite tools"
|
|
3260
|
+
style="grid"
|
|
3261
|
+
logos={[
|
|
3262
|
+
{ name: "Slack", initials: "SL" },
|
|
3263
|
+
{ name: "Salesforce", initials: "SF" },
|
|
3264
|
+
{ name: "HubSpot", initials: "HS" },
|
|
3265
|
+
{ name: "Google Workspace", initials: "GW" },
|
|
3266
|
+
{ name: "Zapier", initials: "ZP" },
|
|
3267
|
+
{ name: "Jira", initials: "JI" },
|
|
3268
|
+
]}
|
|
3269
|
+
/>
|
|
3270
|
+
|
|
3271
|
+
{/* Final CTA */}
|
|
3272
|
+
<FinalCTA
|
|
3273
|
+
headline="Ready to connect your tools?"
|
|
3274
|
+
subheading="Start your free trial and integrate with your favorite apps in minutes."
|
|
3275
|
+
style="dark"
|
|
3276
|
+
links={[
|
|
3277
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
3278
|
+
{ label: "View all integrations", href: "#", variant: "default" },
|
|
3279
|
+
]}
|
|
3280
|
+
/>
|
|
3281
|
+
</main>
|
|
3282
|
+
|
|
3283
|
+
<Footer />
|
|
3284
|
+
</div>
|
|
3285
|
+
)
|
|
3286
|
+
}
|
|
3287
|
+
`,
|
|
3288
|
+
"marketing/nextjs/src/app/features/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport {\n BentoFeatures,\n FeatureShowcase,\n LogoBanner,\n FinalCTA,\n} from "@/components/blocks"\n\nexport default function FeaturesPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4 text-center">\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Powerful features for modern teams\n </h1>\n <p className="text-xl text-muted-foreground max-w-2xl mx-auto">\n Everything you need to streamline workflows, boost productivity, and scale your business.\n </p>\n </div>\n </section>\n\n {/* Bento Features */}\n <BentoFeatures\n heading="Discover what SaaSify can do"\n subheading="Everything you need to work smarter and scale faster"\n />\n\n {/* Feature Showcase: Integrations */}\n <FeatureShowcase\n label="Seamless Integrations"\n headline="Connect everything your team uses in one place"\n description="Integrate with 100+ popular tools including Slack, Salesforce, HubSpot, and more. Two-way sync keeps everything up to date automatically."\n features={[\n { text: "100+ native integrations" },\n { text: "Two-way data sync" },\n { text: "Custom webhooks" },\n { text: "API access included" },\n ]}\n link={{ label: "Learn more", href: "#" }}\n imagePosition="right"\n />\n\n {/* Feature Showcase: Analytics */}\n <FeatureShowcase\n label="Actionable Analytics"\n headline="Make decisions backed by real-time data"\n description="Track every metric that matters. From team performance to customer insights, get the visibility you need to drive growth."\n features={[\n { text: "Real-time dashboards" },\n { text: "Custom reports" },\n { text: "Team performance metrics" },\n { text: "Automated insights" },\n ]}\n link={{ label: "Learn more", href: "#" }}\n imagePosition="left"\n />\n\n {/* Feature Showcase: Automation */}\n <FeatureShowcase\n label="Workflow Automation"\n headline="Eliminate busywork with smart automation"\n description="Build powerful workflows without code. Automate approvals, notifications, data entry, and more to focus on what matters."\n features={[\n { text: "Visual workflow builder" },\n { text: "Conditional logic" },\n { text: "Scheduled triggers" },\n { text: "Cross-app automation" },\n ]}\n link={{ label: "Learn more", href: "#" }}\n imagePosition="right"\n />\n\n {/* Logo Banner */}\n <LogoBanner\n heading="Integrates with your favorite tools"\n style="grid"\n logos={[\n { name: "Slack", initials: "SL" },\n { name: "Salesforce", initials: "SF" },\n { name: "HubSpot", initials: "HS" },\n { name: "Google Workspace", initials: "GW" },\n { name: "Zapier", initials: "ZP" },\n { name: "Jira", initials: "JI" },\n ]}\n />\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to transform how your team works?"\n subheading="Start your free trial today. No credit card required."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "View pricing", href: "/pricing", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3289
|
+
"marketing/nextjs/src/app/features/security/page.tsx": `import { Header } from "@/components/Header"
|
|
3290
|
+
import { Footer } from "@/components/Footer"
|
|
3291
|
+
import { FinalCTA } from "@/components/blocks"
|
|
3292
|
+
import { Shield, Lock, Key, Eye, Server, FileCheck } from "lucide-react"
|
|
3293
|
+
|
|
3294
|
+
const features = [
|
|
3295
|
+
{
|
|
3296
|
+
icon: <Shield className="h-6 w-6" />,
|
|
3297
|
+
title: "SOC 2 Type II Certified",
|
|
3298
|
+
description:
|
|
3299
|
+
"We've passed rigorous third-party audits to verify our security controls and practices.",
|
|
3300
|
+
},
|
|
3301
|
+
{
|
|
3302
|
+
icon: <Lock className="h-6 w-6" />,
|
|
3303
|
+
title: "AES-256 Encryption",
|
|
3304
|
+
description:
|
|
3305
|
+
"All data is encrypted at rest and in transit using industry-standard encryption.",
|
|
3306
|
+
},
|
|
3307
|
+
{
|
|
3308
|
+
icon: <Key className="h-6 w-6" />,
|
|
3309
|
+
title: "Single Sign-On (SSO)",
|
|
3310
|
+
description:
|
|
3311
|
+
"Connect with your identity provider. Support for SAML 2.0, OIDC, and OAuth.",
|
|
3312
|
+
},
|
|
3313
|
+
{
|
|
3314
|
+
icon: <Eye className="h-6 w-6" />,
|
|
3315
|
+
title: "Audit Logs",
|
|
3316
|
+
description:
|
|
3317
|
+
"Track every action in your workspace. Full audit trails for compliance and security.",
|
|
3318
|
+
},
|
|
3319
|
+
{
|
|
3320
|
+
icon: <Server className="h-6 w-6" />,
|
|
3321
|
+
title: "99.9% Uptime SLA",
|
|
3322
|
+
description:
|
|
3323
|
+
"We guarantee availability with redundant infrastructure across multiple regions.",
|
|
3324
|
+
},
|
|
3325
|
+
{
|
|
3326
|
+
icon: <FileCheck className="h-6 w-6" />,
|
|
3327
|
+
title: "GDPR Compliant",
|
|
3328
|
+
description:
|
|
3329
|
+
"Full compliance with GDPR, CCPA, and other privacy regulations. Your data, your control.",
|
|
3330
|
+
},
|
|
3331
|
+
]
|
|
3332
|
+
|
|
3333
|
+
const certifications = [
|
|
3334
|
+
{ name: "SOC 2 Type II", description: "Audited security controls" },
|
|
3335
|
+
{ name: "GDPR", description: "EU data protection" },
|
|
3336
|
+
{ name: "CCPA", description: "California privacy" },
|
|
3337
|
+
{ name: "ISO 27001", description: "Information security" },
|
|
3338
|
+
]
|
|
3339
|
+
|
|
3340
|
+
export default function SecurityPage() {
|
|
3341
|
+
return (
|
|
3342
|
+
<div className="min-h-screen flex flex-col">
|
|
3343
|
+
<Header />
|
|
3344
|
+
|
|
3345
|
+
<main className="flex-1">
|
|
3346
|
+
{/* Hero */}
|
|
3347
|
+
<section className="py-16 md:py-24">
|
|
3348
|
+
<div className="container mx-auto px-4">
|
|
3349
|
+
<div className="max-w-3xl mx-auto text-center">
|
|
3350
|
+
<div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
|
|
3351
|
+
Security
|
|
3352
|
+
</div>
|
|
3353
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
3354
|
+
Enterprise-grade security for every team
|
|
3355
|
+
</h1>
|
|
3356
|
+
<p className="text-xl text-muted-foreground mb-8">
|
|
3357
|
+
Your data is protected by industry-leading security practices. SOC 2 certified, GDPR compliant, and built for enterprise.
|
|
3358
|
+
</p>
|
|
3359
|
+
<div className="flex flex-wrap gap-4 justify-center">
|
|
3360
|
+
<a
|
|
3361
|
+
href="/sign-up"
|
|
3362
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
|
|
3363
|
+
>
|
|
3364
|
+
Start free trial
|
|
3365
|
+
</a>
|
|
3366
|
+
<a
|
|
3367
|
+
href="/contact"
|
|
3368
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"
|
|
3369
|
+
>
|
|
3370
|
+
Contact security team
|
|
3371
|
+
</a>
|
|
3372
|
+
</div>
|
|
3373
|
+
</div>
|
|
3374
|
+
</div>
|
|
3375
|
+
</section>
|
|
3376
|
+
|
|
3377
|
+
{/* Certifications */}
|
|
3378
|
+
<section className="pb-16 md:pb-24">
|
|
2742
3379
|
<div className="container mx-auto px-4">
|
|
2743
|
-
<div className="grid
|
|
2744
|
-
{
|
|
2745
|
-
<
|
|
2746
|
-
key={
|
|
2747
|
-
className="
|
|
3380
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-6 max-w-3xl mx-auto">
|
|
3381
|
+
{certifications.map((cert) => (
|
|
3382
|
+
<div
|
|
3383
|
+
key={cert.name}
|
|
3384
|
+
className="text-center p-6 rounded-lg border border-border bg-card"
|
|
2748
3385
|
>
|
|
2749
|
-
<div className="mb-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
3386
|
+
<div className="font-semibold mb-1">{cert.name}</div>
|
|
3387
|
+
<div className="text-sm text-muted-foreground">{cert.description}</div>
|
|
3388
|
+
</div>
|
|
3389
|
+
))}
|
|
3390
|
+
</div>
|
|
3391
|
+
</div>
|
|
3392
|
+
</section>
|
|
3393
|
+
|
|
3394
|
+
{/* Features Grid */}
|
|
3395
|
+
<section className="py-16 md:py-24 bg-muted/30">
|
|
3396
|
+
<div className="container mx-auto px-4">
|
|
3397
|
+
<div className="text-center mb-12 md:mb-16">
|
|
3398
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
3399
|
+
Security you can trust
|
|
3400
|
+
</h2>
|
|
3401
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
3402
|
+
We take security seriously at every layer of our platform.
|
|
3403
|
+
</p>
|
|
3404
|
+
</div>
|
|
3405
|
+
|
|
3406
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
3407
|
+
{features.map((feature) => (
|
|
3408
|
+
<div
|
|
3409
|
+
key={feature.title}
|
|
3410
|
+
className="bg-card rounded-lg border border-border p-6"
|
|
3411
|
+
>
|
|
3412
|
+
<div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
|
|
3413
|
+
{feature.icon}
|
|
2753
3414
|
</div>
|
|
2754
|
-
<
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
<p className="text-muted-foreground mb-4">{post.description}</p>
|
|
2758
|
-
<time className="text-sm text-muted-foreground">{post.date}</time>
|
|
2759
|
-
</article>
|
|
3415
|
+
<h3 className="text-lg font-semibold mb-2">{feature.title}</h3>
|
|
3416
|
+
<p className="text-muted-foreground text-sm">{feature.description}</p>
|
|
3417
|
+
</div>
|
|
2760
3418
|
))}
|
|
2761
3419
|
</div>
|
|
2762
3420
|
</div>
|
|
2763
3421
|
</section>
|
|
3422
|
+
|
|
3423
|
+
{/* Final CTA */}
|
|
3424
|
+
<FinalCTA
|
|
3425
|
+
headline="Ready to secure your workflow?"
|
|
3426
|
+
subheading="Start your free trial with enterprise-grade security from day one."
|
|
3427
|
+
style="dark"
|
|
3428
|
+
links={[
|
|
3429
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
3430
|
+
{ label: "View security docs", href: "#", variant: "default" },
|
|
3431
|
+
]}
|
|
3432
|
+
/>
|
|
2764
3433
|
</main>
|
|
2765
3434
|
|
|
2766
3435
|
<Footer />
|
|
@@ -2768,7 +3437,7 @@ export default function BlogPage() {
|
|
|
2768
3437
|
)
|
|
2769
3438
|
}
|
|
2770
3439
|
`,
|
|
2771
|
-
"marketing/nextjs/src/app/features/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport {\n
|
|
3440
|
+
"marketing/nextjs/src/app/features/workflows/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { FinalCTA } from "@/components/blocks"\nimport { Workflow, Users, FileText, CheckSquare, Kanban, Calendar } from "lucide-react"\n\nconst features = [\n {\n icon: <Workflow className="h-6 w-6" />,\n title: "Custom Workflows",\n description:\n "Design workflows that match how your team actually works. Fully customizable stages and transitions.",\n },\n {\n icon: <Users className="h-6 w-6" />,\n title: "Team Collaboration",\n description:\n "Assign tasks, leave comments, and collaborate in real-time. Everyone stays in sync.",\n },\n {\n icon: <FileText className="h-6 w-6" />,\n title: "Templates Library",\n description:\n "Start fast with pre-built templates for common workflows. Customize as needed.",\n },\n {\n icon: <CheckSquare className="h-6 w-6" />,\n title: "Task Dependencies",\n description:\n "Link tasks together with dependencies. See the critical path at a glance.",\n },\n {\n icon: <Kanban className="h-6 w-6" />,\n title: "Kanban Boards",\n description:\n "Visualize your workflow with drag-and-drop kanban boards. Track progress instantly.",\n },\n {\n icon: <Calendar className="h-6 w-6" />,\n title: "Timeline View",\n description:\n "See your workflow on a timeline. Plan sprints and manage deadlines visually.",\n },\n]\n\nexport default function WorkflowsPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n Workflows\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Build workflows that match how you work\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n Design custom workflows with kanban boards, timelines, and task dependencies. Keep your team aligned and projects on track.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n Watch demo\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Workflow Preview */}\n <section className="pb-16 md:pb-24">\n <div className="container mx-auto px-4">\n <div className="max-w-5xl mx-auto">\n <div className="aspect-video bg-gradient-to-br from-primary/20 to-primary/5 rounded-lg border border-border flex items-center justify-center">\n <div className="text-center text-muted-foreground">\n <Kanban className="h-16 w-16 mx-auto mb-4 opacity-50" />\n <p>Workflow Preview</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Features Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Everything you need to manage work\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Powerful features that adapt to any team or project type.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {features.map((feature) => (\n <div\n key={feature.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {feature.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>\n <p className="text-muted-foreground text-sm">{feature.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to streamline your workflow?"\n subheading="Start your free trial and build your first workflow in minutes."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Explore templates", href: "#", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
2772
3441
|
"marketing/nextjs/src/app/globals.css.hbs": '@import "tailwindcss";\n@import "tw-animate-css";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n /* Colors */\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n\n --color-destructive: var(--destructive);\n\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n\n /* Border radius */\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n\n /* Fonts */\n --font-sans: var(--font-geist-sans), system-ui, sans-serif;\n --font-mono: var(--font-geist-mono), monospace;\n\n /* Container */\n --container-sm: 40rem;\n --container-md: 48rem;\n --container-lg: 64rem;\n --container-xl: 80rem;\n --container-2xl: 96rem;\n\n /* Animations */\n --animate-accordion-down: accordion-down 0.2s ease-out;\n --animate-accordion-up: accordion-up 0.2s ease-out;\n}\n\n@keyframes accordion-down {\n from {\n height: 0;\n }\n to {\n height: var(--radix-accordion-content-height);\n }\n}\n\n@keyframes accordion-up {\n from {\n height: var(--radix-accordion-content-height);\n }\n to {\n height: 0;\n }\n}\n\n/* ========================================\n THEME COLOR VARIABLES\n ======================================== */\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.546 0.245 262.881);\n --primary-foreground: oklch(0.985 0.002 247.858);\n --ring: oklch(0.546 0.245 262.881);\n --chart-1: oklch(0.546 0.245 262.881);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.596 0.145 163.225);\n --primary-foreground: oklch(0.982 0.018 155.826);\n --ring: oklch(0.596 0.145 163.225);\n --chart-1: oklch(0.596 0.145 163.225);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.627 0.265 303.9);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.627 0.265 303.9);\n --chart-1: oklch(0.627 0.265 303.9);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.637 0.237 25.331);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.637 0.237 25.331);\n --chart-1: oklch(0.637 0.237 25.331);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.705 0.191 47.604);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.705 0.191 47.604);\n --chart-1: oklch(0.705 0.191 47.604);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.769 0.188 70.08);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.769 0.188 70.08);\n --chart-1: oklch(0.769 0.188 70.08);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.646 0.222 41.116);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.715 0.143 215.221);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.715 0.143 215.221);\n --chart-1: oklch(0.715 0.143 215.221);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.696 0.17 162.48);\n --chart-1: oklch(0.696 0.17 162.48);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.667 0.295 322.15);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.667 0.295 322.15);\n --chart-1: oklch(0.667 0.295 322.15);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.585 0.233 277.117);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.585 0.233 277.117);\n --chart-1: oklch(0.585 0.233 277.117);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.768 0.233 130.85);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.768 0.233 130.85);\n --chart-1: oklch(0.768 0.233 130.85);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.718 0.202 349.761);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.718 0.202 349.761);\n --chart-1: oklch(0.718 0.202 349.761);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.645 0.246 16.439);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.645 0.246 16.439);\n --chart-1: oklch(0.645 0.246 16.439);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.685 0.169 237.323);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.685 0.169 237.323);\n --chart-1: oklch(0.685 0.169 237.323);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.704 0.14 182.503);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.704 0.14 182.503);\n --chart-1: oklch(0.704 0.14 182.503);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.606 0.25 292.717);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.606 0.25 292.717);\n --chart-1: oklch(0.606 0.25 292.717);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.795 0.184 86.047);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.795 0.184 86.047);\n --chart-1: oklch(0.795 0.184 86.047);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.646 0.222 41.116);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{/if}}\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.269 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.371 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.623 0.214 262.881);\n --primary-foreground: oklch(0.273 0.033 256.848);\n --ring: oklch(0.623 0.214 262.881);\n --chart-1: oklch(0.623 0.214 262.881);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.696 0.17 162.48);\n --chart-1: oklch(0.696 0.17 162.48);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.714 0.203 305.504);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.714 0.203 305.504);\n --chart-1: oklch(0.714 0.203 305.504);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.704 0.191 22.216);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.704 0.191 22.216);\n --chart-1: oklch(0.704 0.191 22.216);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.792 0.17 52.615);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.792 0.17 52.615);\n --chart-1: oklch(0.792 0.17 52.615);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.828 0.189 84.429);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.828 0.189 84.429);\n --chart-1: oklch(0.828 0.189 84.429);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.488 0.243 264.376);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.789 0.154 211.53);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.789 0.154 211.53);\n --chart-1: oklch(0.789 0.154 211.53);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.765 0.166 160.391);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.765 0.166 160.391);\n --chart-1: oklch(0.765 0.166 160.391);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.74 0.238 322.16);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.74 0.238 322.16);\n --chart-1: oklch(0.74 0.238 322.16);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.673 0.182 276.935);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.673 0.182 276.935);\n --chart-1: oklch(0.673 0.182 276.935);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.841 0.238 128.85);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.841 0.238 128.85);\n --chart-1: oklch(0.841 0.238 128.85);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.775 0.181 349.761);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.775 0.181 349.761);\n --chart-1: oklch(0.775 0.181 349.761);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.712 0.194 13.428);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.712 0.194 13.428);\n --chart-1: oklch(0.712 0.194 13.428);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.756 0.143 232.661);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.756 0.143 232.661);\n --chart-1: oklch(0.756 0.143 232.661);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.777 0.152 181.912);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.777 0.152 181.912);\n --chart-1: oklch(0.777 0.152 181.912);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.702 0.183 293.541);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.702 0.183 293.541);\n --chart-1: oklch(0.702 0.183 293.541);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.852 0.199 91.936);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.852 0.199 91.936);\n --chart-1: oklch(0.852 0.199 91.936);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.488 0.243 264.376);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{/if}}\n}\n\n/* ========================================\n BASE STYLES\n ======================================== */\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n\n/* Container utility */\n.container {\n width: 100%;\n margin-left: auto;\n margin-right: auto;\n padding-left: 1rem;\n padding-right: 1rem;\n max-width: 96rem;\n}\n\n@media (min-width: 640px) {\n .container {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: 2rem;\n padding-right: 2rem;\n }\n}\n\n/* ========================================\n HERO TYPOGRAPHY\n ======================================== */\n\n.hero-content h1 {\n font-size: 2.25rem !important;\n line-height: 2.5rem !important;\n font-weight: 700 !important;\n letter-spacing: -0.025em !important;\n margin-bottom: 1.5rem !important;\n color: var(--color-foreground) !important;\n}\n\n.hero-content p {\n font-size: 1.25rem !important;\n line-height: 1.75rem !important;\n color: var(--color-muted-foreground) !important;\n max-width: 42rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: 2rem !important;\n}\n\n.hero-content--dark h1 {\n color: white !important;\n}\n\n.hero-content--dark p {\n color: rgba(255, 255, 255, 0.8) !important;\n}\n\n@media (min-width: 768px) {\n .hero-content h1 {\n font-size: 3.75rem !important;\n line-height: 1 !important;\n }\n}\n\n/* Left-aligned hero content */\n.hero-content--left h1 {\n text-align: left !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.hero-content--left p {\n text-align: left !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n/* ========================================\n PRODUCT SHOWCASE HERO STYLES\n ======================================== */\n\n.hero-showcase {\n position: relative;\n border-radius: 1rem;\n overflow: hidden;\n height: 25rem;\n width: 100%;\n background: linear-gradient(135deg, var(--primary) 0%, color-mix(in oklch, var(--primary) 70%, black) 100%);\n}\n\n@media (min-width: 768px) {\n .hero-showcase {\n height: 31.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .hero-showcase {\n height: 37.5rem;\n }\n}\n\n.hero-bg-image {\n position: absolute;\n inset: 0;\n z-index: 0;\n opacity: 0.1;\n}\n\n.hero-bg-image img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n object-position: center;\n}\n\n.hero-mockup-centered {\n position: relative;\n z-index: 10;\n padding: 2rem;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n}\n\n@media (min-width: 768px) {\n .hero-mockup-centered {\n padding: 3rem;\n }\n}\n\n.mockup-wrapper {\n background: var(--color-background);\n border-radius: 12px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 12px 24px -8px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n animation: mockup-entrance 0.8s ease-out;\n width: 100%;\n}\n\n.mockup-wrapper img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n@keyframes mockup-entrance {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Browser chrome */\n.mockup-chrome {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n background: var(--color-muted);\n border-bottom: 1px solid var(--color-border);\n}\n\n.mockup-chrome-dots {\n display: flex;\n gap: 6px;\n}\n\n.mockup-chrome-dots .dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n}\n\n.mockup-chrome-dots .dot-red {\n background: #ff5f56;\n}\n.mockup-chrome-dots .dot-yellow {\n background: #ffbd2e;\n}\n.mockup-chrome-dots .dot-green {\n background: #27ca40;\n}\n\n.mockup-chrome-title {\n flex: 1;\n text-align: center;\n font-size: 13px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n}\n\n.mockup-chrome-actions {\n width: 60px;\n}\n\n/* App content layout */\n.mockup-content {\n display: flex;\n min-height: 400px;\n}\n\n.mockup-sidebar {\n width: 220px;\n background: var(--color-card);\n border-right: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n\n.sidebar-header {\n padding: 16px;\n border-bottom: 1px solid var(--color-border);\n}\n\n.sidebar-logo {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.logo-icon {\n width: 28px;\n height: 28px;\n background: var(--color-primary);\n color: white;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 14px;\n}\n\n.logo-text {\n font-weight: 600;\n font-size: 14px;\n color: var(--color-foreground);\n}\n\n.sidebar-nav {\n padding: 8px;\n}\n\n.sidebar-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 6px;\n font-size: 13px;\n color: var(--color-muted-foreground);\n transition: all 0.15s ease;\n cursor: pointer;\n}\n\n.sidebar-item:hover {\n background: var(--color-accent);\n color: var(--color-accent-foreground);\n}\n\n.sidebar-item--active {\n background: oklch(from var(--color-primary) l c h / 0.12);\n color: var(--color-primary);\n}\n\n.sidebar-icon {\n font-size: 16px;\n}\n\n.sidebar-label {\n flex: 1;\n}\n\n.sidebar-badge {\n background: var(--color-primary);\n color: var(--color-primary-foreground);\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 10px;\n font-weight: 500;\n}\n\n/* Main content area */\n.mockup-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--color-background);\n}\n\n.main-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--color-border);\n}\n\n.header-title {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.header-title h2 {\n font-size: 16px;\n font-weight: 600;\n margin: 0;\n color: var(--color-foreground);\n}\n\n.header-breadcrumb {\n font-size: 12px;\n color: var(--color-muted-foreground);\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn {\n padding: 8px 16px;\n background: var(--color-primary);\n color: var(--color-primary-foreground);\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n\n.action-btn--success {\n background: #27ca40;\n}\n\n.action-btn--featured {\n background: var(--color-primary);\n}\n\n/* Split view */\n.main-split {\n display: flex;\n flex: 1;\n}\n\n.editor-panel {\n flex: 1;\n padding: 20px;\n border-right: 1px solid var(--color-border);\n}\n\n.editor-section {\n margin-bottom: 20px;\n}\n\n.editor-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n margin-bottom: 6px;\n}\n\n.editor-input {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n display: flex;\n align-items: center;\n}\n\n.input-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.input-cursor {\n width: 2px;\n height: 18px;\n background: var(--color-primary);\n animation: blink 1s infinite;\n margin-left: 2px;\n}\n\n@keyframes blink {\n 0%,\n 50% {\n opacity: 1;\n }\n 51%,\n 100% {\n opacity: 0;\n }\n}\n\n.editor-select {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.select-arrow {\n font-size: 10px;\n color: var(--color-muted-foreground);\n}\n\n.editor-textarea {\n background: var(--color-muted);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 14px;\n color: var(--color-foreground);\n min-height: 80px;\n}\n\n.textarea-text {\n transition: all 0.5s ease;\n}\n\n.textarea-text--complete {\n color: var(--color-foreground);\n}\n\n/* Preview panel */\n.preview-panel {\n width: 320px;\n padding: 20px;\n background: oklch(from var(--color-muted) l c h / 0.5);\n}\n\n.preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.preview-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--color-muted-foreground);\n}\n\n.preview-url {\n font-size: 11px;\n color: var(--color-muted-foreground);\n font-family: monospace;\n}\n\n.preview-card {\n background: var(--color-card);\n border: 1px solid var(--color-border);\n border-radius: 10px;\n overflow: hidden;\n position: relative;\n transition: all 0.3s ease;\n}\n\n.preview-badge {\n position: absolute;\n top: 10px;\n right: 10px;\n background: var(--color-primary);\n color: white;\n font-size: 11px;\n padding: 4px 8px;\n border-radius: 4px;\n font-weight: 500;\n animation: badge-pop 0.3s ease;\n}\n\n@keyframes badge-pop {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.preview-image {\n height: 120px;\n background: linear-gradient(135deg, var(--color-muted) 0%, var(--color-accent) 100%);\n}\n\n.preview-image-placeholder {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 40px;\n}\n\n.preview-content {\n padding: 16px;\n}\n\n.preview-category-tag {\n display: inline-block;\n font-size: 11px;\n color: var(--color-primary);\n font-weight: 500;\n margin-bottom: 8px;\n}\n\n.preview-title {\n font-size: 16px;\n font-weight: 600;\n margin: 0 0 8px;\n color: var(--color-foreground);\n}\n\n.preview-description {\n font-size: 13px;\n color: var(--color-muted-foreground);\n line-height: 1.5;\n margin: 0 0 12px;\n}\n\n.preview-meta {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.meta-rating {\n color: #ffc24a;\n}\n\n.meta-reviews {\n color: var(--color-muted-foreground);\n}\n\n/* State indicators */\n.mockup-indicators {\n display: flex;\n justify-content: center;\n gap: 24px;\n padding: 16px;\n border-top: 1px solid var(--color-border);\n}\n\n.indicator {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 20px;\n transition: all 0.2s ease;\n}\n\n.indicator:hover {\n background: var(--color-accent);\n}\n\n.indicator--active {\n background: oklch(from var(--color-primary) l c h / 0.12);\n}\n\n.indicator-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--color-muted-foreground);\n transition: all 0.2s ease;\n}\n\n.indicator--active .indicator-dot {\n background: var(--color-primary);\n box-shadow: 0 0 0 3px oklch(from var(--color-primary) l c h / 0.2);\n}\n\n.indicator-label {\n font-size: 12px;\n color: var(--color-muted-foreground);\n}\n\n.indicator--active .indicator-label {\n color: var(--color-foreground);\n font-weight: 500;\n}\n\n/* ========================================\n LOGO BANNER STYLES\n ======================================== */\n\n.logo-scroll-container {\n overflow: hidden;\n mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);\n}\n\n.logo-scroll-track {\n display: flex;\n animation: logo-scroll 30s linear infinite;\n}\n\n.logo-scroll-track:hover {\n animation-play-state: paused;\n}\n\n@keyframes logo-scroll {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-50%);\n }\n}\n\n.logo-item {\n flex-shrink: 0;\n min-width: 150px;\n}\n\n/* ========================================\n RESPONSIVE ADJUSTMENTS\n ======================================== */\n\n@media (max-width: 768px) {\n .mockup-content {\n flex-direction: column;\n }\n\n .mockup-sidebar {\n width: 100%;\n border-right: none;\n border-bottom: 1px solid var(--color-border);\n }\n\n .sidebar-nav {\n display: flex;\n overflow-x: auto;\n padding: 8px;\n gap: 4px;\n }\n\n .sidebar-item {\n white-space: nowrap;\n }\n\n .main-split {\n flex-direction: column;\n }\n\n .editor-panel {\n border-right: none;\n border-bottom: 1px solid var(--color-border);\n }\n\n .preview-panel {\n width: 100%;\n }\n\n .mockup-indicators {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .indicator-label {\n display: none;\n }\n}\n\n/* ========================================\n ANIMATION STYLES\n ======================================== */\n\n/* Industry Tabs Animation */\n.industry-tab-content {\n animation: tab-fade-in 0.3s ease-out;\n}\n\n@keyframes tab-fade-in {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Feature Showcase Entrance Animation */\n@keyframes feature-slide-in {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.feature-showcase-content {\n animation: feature-slide-in 0.5s ease-out;\n}\n\n/* Testimonial Card Hover Effects */\n.testimonial-card {\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.testimonial-card:hover {\n transform: translateY(-4px);\n box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.15);\n}\n\n/* Stat Number Animation */\n@keyframes stat-count-up {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.stat-number {\n animation: stat-count-up 0.6s ease-out;\n}\n\n/* Trust Column Icon Animation */\n.trust-icon {\n transition: transform 0.2s ease, background-color 0.2s ease;\n}\n\n.trust-icon:hover {\n transform: scale(1.1);\n}\n\n/* Final CTA Background Animation */\n@keyframes subtle-float {\n 0%,\n 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-10px);\n }\n}\n\n.cta-decorative {\n animation: subtle-float 6s ease-in-out infinite;\n}\n\n/* Feature Grid Card Entrance */\n@keyframes card-entrance {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.feature-card {\n animation: card-entrance 0.4s ease-out;\n animation-fill-mode: both;\n}\n\n.feature-card:nth-child(1) {\n animation-delay: 0.1s;\n}\n.feature-card:nth-child(2) {\n animation-delay: 0.2s;\n}\n.feature-card:nth-child(3) {\n animation-delay: 0.3s;\n}\n.feature-card:nth-child(4) {\n animation-delay: 0.4s;\n}\n.feature-card:nth-child(5) {\n animation-delay: 0.5s;\n}\n.feature-card:nth-child(6) {\n animation-delay: 0.6s;\n}\n\n/* Smooth Section Transitions */\nsection {\n scroll-margin-top: 80px;\n}\n\n/* Button Hover Enhancement */\n.cta-button {\n position: relative;\n overflow: hidden;\n}\n\n.cta-button::after {\n content: "";\n position: absolute;\n inset: 0;\n background: linear-gradient(rgba(255, 255, 255, 0.1), transparent);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.cta-button:hover::after {\n opacity: 1;\n}\n\n/* Responsive Image Container */\n.feature-image-container {\n position: relative;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n transition: transform 0.3s ease, box-shadow 0.3s ease;\n}\n\n.feature-image-container:hover {\n transform: translateY(-4px);\n box-shadow: 0 30px 60px -15px rgba(0, 0, 0, 0.2);\n}\n',
|
|
2773
3442
|
"marketing/nextjs/src/app/layout.tsx.hbs": `import type { Metadata } from 'next'
|
|
2774
3443
|
import { Geist, Geist_Mono } from 'next/font/google'
|
|
@@ -2985,16 +3654,449 @@ export default function HomePage() {
|
|
|
2985
3654
|
"marketing/nextjs/src/app/pricing/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { PricingTable, FinalCTA } from "@/components/blocks"\n\nexport default function PricingPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4 text-center">\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Simple, transparent pricing\n </h1>\n <p className="text-xl text-muted-foreground max-w-2xl mx-auto">\n Start free, upgrade as your team grows. No hidden fees, no surprises.\n </p>\n </div>\n </section>\n\n {/* Pricing Table */}\n <PricingTable\n heading=""\n subheading=""\n />\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to get started?"\n subheading="Join thousands of teams who chose the smarter way to work."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Contact sales", href: "/contact", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
2986
3655
|
"marketing/nextjs/src/app/privacy/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\n\nexport default function PrivacyPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n <article className="py-16 md:py-24">\n <div className="container mx-auto px-4 max-w-3xl">\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Privacy Policy\n </h1>\n <p className="text-muted-foreground mb-8">\n Last updated: January 1, 2025\n </p>\n\n <div className="prose prose-neutral dark:prose-invert max-w-none">\n <h2 className="text-2xl font-semibold mt-8 mb-4">Introduction</h2>\n <p className="text-muted-foreground mb-4">\n At SaaSify, we take your privacy seriously. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our service.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Information We Collect</h2>\n <p className="text-muted-foreground mb-4">\n We collect information you provide directly to us, such as when you create an account, make a purchase, or contact us for support.\n </p>\n <ul className="list-disc pl-6 text-muted-foreground mb-4 space-y-2">\n <li>Account information (name, email, password)</li>\n <li>Payment information (processed securely by our payment providers)</li>\n <li>Usage data and analytics</li>\n <li>Communications with our support team</li>\n </ul>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">How We Use Your Information</h2>\n <p className="text-muted-foreground mb-4">\n We use the information we collect to:\n </p>\n <ul className="list-disc pl-6 text-muted-foreground mb-4 space-y-2">\n <li>Provide, maintain, and improve our services</li>\n <li>Process transactions and send related information</li>\n <li>Send you technical notices, updates, and support messages</li>\n <li>Respond to your comments, questions, and requests</li>\n </ul>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Data Security</h2>\n <p className="text-muted-foreground mb-4">\n We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Contact Us</h2>\n <p className="text-muted-foreground mb-4">\n If you have any questions about this Privacy Policy, please contact us at privacy@saasify.com.\n </p>\n </div>\n </div>\n </article>\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
2987
3656
|
"marketing/nextjs/src/app/terms/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\n\nexport default function TermsPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n <article className="py-16 md:py-24">\n <div className="container mx-auto px-4 max-w-3xl">\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Terms of Service\n </h1>\n <p className="text-muted-foreground mb-8">\n Last updated: January 1, 2025\n </p>\n\n <div className="prose prose-neutral dark:prose-invert max-w-none">\n <h2 className="text-2xl font-semibold mt-8 mb-4">Agreement to Terms</h2>\n <p className="text-muted-foreground mb-4">\n By accessing or using SaaSify, you agree to be bound by these Terms of Service. If you disagree with any part of the terms, you may not access the service.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Use License</h2>\n <p className="text-muted-foreground mb-4">\n Subject to your compliance with these Terms, we grant you a limited, non-exclusive, non-transferable license to access and use our service for your internal business purposes.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">User Accounts</h2>\n <p className="text-muted-foreground mb-4">\n When you create an account with us, you must provide accurate, complete, and current information. You are responsible for safeguarding your account credentials and for all activities that occur under your account.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Prohibited Uses</h2>\n <p className="text-muted-foreground mb-4">\n You may not use our service:\n </p>\n <ul className="list-disc pl-6 text-muted-foreground mb-4 space-y-2">\n <li>For any unlawful purpose or to promote illegal activities</li>\n <li>To violate any applicable laws or regulations</li>\n <li>To infringe upon the rights of others</li>\n <li>To interfere with or disrupt the service or servers</li>\n </ul>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Payment Terms</h2>\n <p className="text-muted-foreground mb-4">\n Paid subscriptions are billed in advance on a monthly or annual basis. You agree to pay all fees associated with your subscription plan.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Limitation of Liability</h2>\n <p className="text-muted-foreground mb-4">\n In no event shall SaaSify be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of the service.\n </p>\n\n <h2 className="text-2xl font-semibold mt-8 mb-4">Contact Us</h2>\n <p className="text-muted-foreground mb-4">\n If you have any questions about these Terms, please contact us at legal@saasify.com.\n </p>\n </div>\n </div>\n </article>\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3657
|
+
"marketing/nextjs/src/app/use-cases/marketing/page.tsx": `import { Header } from "@/components/Header"
|
|
3658
|
+
import { Footer } from "@/components/Footer"
|
|
3659
|
+
import { TestimonialsGrid, FinalCTA } from "@/components/blocks"
|
|
3660
|
+
import { Megaphone, BarChart3, Calendar, Users, Sparkles, Target } from "lucide-react"
|
|
3661
|
+
|
|
3662
|
+
const benefits = [
|
|
3663
|
+
{
|
|
3664
|
+
icon: <Megaphone className="h-6 w-6" />,
|
|
3665
|
+
title: "Campaign Management",
|
|
3666
|
+
description:
|
|
3667
|
+
"Plan, execute, and track campaigns across channels. Everything in one place.",
|
|
3668
|
+
},
|
|
3669
|
+
{
|
|
3670
|
+
icon: <BarChart3 className="h-6 w-6" />,
|
|
3671
|
+
title: "Performance Analytics",
|
|
3672
|
+
description:
|
|
3673
|
+
"See what's working with real-time dashboards. ROI tracking for every campaign.",
|
|
3674
|
+
},
|
|
3675
|
+
{
|
|
3676
|
+
icon: <Calendar className="h-6 w-6" />,
|
|
3677
|
+
title: "Content Calendar",
|
|
3678
|
+
description:
|
|
3679
|
+
"Plan your content pipeline visually. Collaborate on drafts and approvals.",
|
|
3680
|
+
},
|
|
3681
|
+
{
|
|
3682
|
+
icon: <Users className="h-6 w-6" />,
|
|
3683
|
+
title: "Team Collaboration",
|
|
3684
|
+
description:
|
|
3685
|
+
"Creative briefs, feedback, and approvals in one workflow. No more email chains.",
|
|
3686
|
+
},
|
|
3687
|
+
{
|
|
3688
|
+
icon: <Sparkles className="h-6 w-6" />,
|
|
3689
|
+
title: "AI-Powered Insights",
|
|
3690
|
+
description:
|
|
3691
|
+
"Get recommendations for improving campaign performance based on your data.",
|
|
3692
|
+
},
|
|
3693
|
+
{
|
|
3694
|
+
icon: <Target className="h-6 w-6" />,
|
|
3695
|
+
title: "Audience Segmentation",
|
|
3696
|
+
description:
|
|
3697
|
+
"Build and manage audience segments. Personalize at scale.",
|
|
3698
|
+
},
|
|
3699
|
+
]
|
|
3700
|
+
|
|
3701
|
+
const stats = [
|
|
3702
|
+
{ value: "40%", label: "More campaigns shipped" },
|
|
3703
|
+
{ value: "2.5x", label: "Faster time to launch" },
|
|
3704
|
+
{ value: "25%", label: "Better campaign ROI" },
|
|
3705
|
+
]
|
|
3706
|
+
|
|
3707
|
+
export default function MarketingPage() {
|
|
3708
|
+
return (
|
|
3709
|
+
<div className="min-h-screen flex flex-col">
|
|
3710
|
+
<Header />
|
|
3711
|
+
|
|
3712
|
+
<main className="flex-1">
|
|
3713
|
+
{/* Hero */}
|
|
3714
|
+
<section className="py-16 md:py-24">
|
|
3715
|
+
<div className="container mx-auto px-4">
|
|
3716
|
+
<div className="max-w-3xl mx-auto text-center">
|
|
3717
|
+
<div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
|
|
3718
|
+
For Marketing Teams
|
|
3719
|
+
</div>
|
|
3720
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
3721
|
+
Launch campaigns that drive results
|
|
3722
|
+
</h1>
|
|
3723
|
+
<p className="text-xl text-muted-foreground mb-8">
|
|
3724
|
+
Plan, execute, and measure marketing campaigns with a platform built for modern marketing teams.
|
|
3725
|
+
</p>
|
|
3726
|
+
<div className="flex flex-wrap gap-4 justify-center">
|
|
3727
|
+
<a
|
|
3728
|
+
href="/sign-up"
|
|
3729
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
|
|
3730
|
+
>
|
|
3731
|
+
Start free trial
|
|
3732
|
+
</a>
|
|
3733
|
+
<a
|
|
3734
|
+
href="/demo"
|
|
3735
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"
|
|
3736
|
+
>
|
|
3737
|
+
See it in action
|
|
3738
|
+
</a>
|
|
3739
|
+
</div>
|
|
3740
|
+
</div>
|
|
3741
|
+
</div>
|
|
3742
|
+
</section>
|
|
3743
|
+
|
|
3744
|
+
{/* Stats */}
|
|
3745
|
+
<section className="pb-16 md:pb-24">
|
|
3746
|
+
<div className="container mx-auto px-4">
|
|
3747
|
+
<div className="grid grid-cols-3 gap-8 max-w-2xl mx-auto">
|
|
3748
|
+
{stats.map((stat) => (
|
|
3749
|
+
<div key={stat.label} className="text-center">
|
|
3750
|
+
<div className="text-3xl md:text-4xl font-bold text-primary mb-2">
|
|
3751
|
+
{stat.value}
|
|
3752
|
+
</div>
|
|
3753
|
+
<div className="text-sm text-muted-foreground">{stat.label}</div>
|
|
3754
|
+
</div>
|
|
3755
|
+
))}
|
|
3756
|
+
</div>
|
|
3757
|
+
</div>
|
|
3758
|
+
</section>
|
|
3759
|
+
|
|
3760
|
+
{/* Benefits Grid */}
|
|
3761
|
+
<section className="py-16 md:py-24 bg-muted/30">
|
|
3762
|
+
<div className="container mx-auto px-4">
|
|
3763
|
+
<div className="text-center mb-12 md:mb-16">
|
|
3764
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
3765
|
+
Built for modern marketing
|
|
3766
|
+
</h2>
|
|
3767
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
3768
|
+
Everything you need to plan, execute, and measure your marketing efforts.
|
|
3769
|
+
</p>
|
|
3770
|
+
</div>
|
|
3771
|
+
|
|
3772
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
3773
|
+
{benefits.map((benefit) => (
|
|
3774
|
+
<div
|
|
3775
|
+
key={benefit.title}
|
|
3776
|
+
className="bg-card rounded-lg border border-border p-6"
|
|
3777
|
+
>
|
|
3778
|
+
<div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
|
|
3779
|
+
{benefit.icon}
|
|
3780
|
+
</div>
|
|
3781
|
+
<h3 className="text-lg font-semibold mb-2">{benefit.title}</h3>
|
|
3782
|
+
<p className="text-muted-foreground text-sm">{benefit.description}</p>
|
|
3783
|
+
</div>
|
|
3784
|
+
))}
|
|
3785
|
+
</div>
|
|
3786
|
+
</div>
|
|
3787
|
+
</section>
|
|
3788
|
+
|
|
3789
|
+
{/* Testimonials */}
|
|
3790
|
+
<TestimonialsGrid
|
|
3791
|
+
heading="Trusted by marketing teams everywhere"
|
|
3792
|
+
subheading="See how teams like yours are driving results with SaaSify."
|
|
3793
|
+
/>
|
|
3794
|
+
|
|
3795
|
+
{/* Final CTA */}
|
|
3796
|
+
<FinalCTA
|
|
3797
|
+
headline="Ready to level up your marketing?"
|
|
3798
|
+
subheading="Start your free trial and see why top marketing teams choose SaaSify."
|
|
3799
|
+
style="dark"
|
|
3800
|
+
links={[
|
|
3801
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
3802
|
+
{ label: "Talk to us", href: "/contact", variant: "default" },
|
|
3803
|
+
]}
|
|
3804
|
+
/>
|
|
3805
|
+
</main>
|
|
3806
|
+
|
|
3807
|
+
<Footer />
|
|
3808
|
+
</div>
|
|
3809
|
+
)
|
|
3810
|
+
}
|
|
3811
|
+
`,
|
|
3812
|
+
"marketing/nextjs/src/app/use-cases/operations/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { TestimonialsGrid, FinalCTA } from "@/components/blocks"\nimport { Settings, Workflow, Clock, Shield, BarChart3, Users } from "lucide-react"\n\nconst benefits = [\n {\n icon: <Workflow className="h-6 w-6" />,\n title: "Process Automation",\n description:\n "Automate repetitive tasks and approvals. Free your team to focus on strategic work.",\n },\n {\n icon: <Settings className="h-6 w-6" />,\n title: "Resource Management",\n description:\n "Track and allocate resources across projects. Optimize utilization and reduce waste.",\n },\n {\n icon: <Clock className="h-6 w-6" />,\n title: "Time Tracking",\n description:\n "Track time across projects and clients. Automated timesheets and billing integration.",\n },\n {\n icon: <Shield className="h-6 w-6" />,\n title: "Compliance Management",\n description:\n "Track compliance requirements and deadlines. Audit trails for everything.",\n },\n {\n icon: <BarChart3 className="h-6 w-6" />,\n title: "Operational Analytics",\n description:\n "Real-time dashboards for operational metrics. Identify bottlenecks and optimize.",\n },\n {\n icon: <Users className="h-6 w-6" />,\n title: "Vendor Management",\n description:\n "Track vendors, contracts, and renewals. Never miss a deadline.",\n },\n]\n\nconst stats = [\n { value: "50%", label: "Less manual work" },\n { value: "35%", label: "Cost reduction" },\n { value: "99%", label: "Compliance rate" },\n]\n\nexport default function OperationsPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n For Operations Teams\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Run operations like a well-oiled machine\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n Automate processes, manage resources, and ensure compliance. The operations platform that scales with you.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n See it in action\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Stats */}\n <section className="pb-16 md:pb-24">\n <div className="container mx-auto px-4">\n <div className="grid grid-cols-3 gap-8 max-w-2xl mx-auto">\n {stats.map((stat) => (\n <div key={stat.label} className="text-center">\n <div className="text-3xl md:text-4xl font-bold text-primary mb-2">\n {stat.value}\n </div>\n <div className="text-sm text-muted-foreground">{stat.label}</div>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Benefits Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Built for operational excellence\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Everything you need to run efficient, compliant operations.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {benefits.map((benefit) => (\n <div\n key={benefit.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {benefit.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{benefit.title}</h3>\n <p className="text-muted-foreground text-sm">{benefit.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Testimonials */}\n <TestimonialsGrid\n heading="Trusted by operations teams everywhere"\n subheading="See how teams like yours are optimizing operations with SaaSify."\n />\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to optimize your operations?"\n subheading="Start your free trial and see why top operations teams choose SaaSify."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Talk to us", href: "/contact", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3813
|
+
"marketing/nextjs/src/app/use-cases/product/page.tsx": 'import { Header } from "@/components/Header"\nimport { Footer } from "@/components/Footer"\nimport { TestimonialsGrid, FinalCTA } from "@/components/blocks"\nimport { Lightbulb, GitBranch, MessageSquare, BarChart3, Users, Rocket } from "lucide-react"\n\nconst benefits = [\n {\n icon: <Lightbulb className="h-6 w-6" />,\n title: "Idea Management",\n description:\n "Capture and prioritize ideas from your team and customers. Never lose a great idea.",\n },\n {\n icon: <GitBranch className="h-6 w-6" />,\n title: "Roadmap Planning",\n description:\n "Build visual roadmaps that keep stakeholders aligned. Easy drag-and-drop planning.",\n },\n {\n icon: <MessageSquare className="h-6 w-6" />,\n title: "User Feedback",\n description:\n "Collect and organize user feedback. Close the loop with customers automatically.",\n },\n {\n icon: <BarChart3 className="h-6 w-6" />,\n title: "Product Analytics",\n description:\n "Track feature adoption and usage patterns. Make data-driven product decisions.",\n },\n {\n icon: <Users className="h-6 w-6" />,\n title: "Cross-Team Collaboration",\n description:\n "Connect product, engineering, and design. Everyone works from the same source of truth.",\n },\n {\n icon: <Rocket className="h-6 w-6" />,\n title: "Release Management",\n description:\n "Plan releases, coordinate launches, and communicate changes across the organization.",\n },\n]\n\nconst stats = [\n { value: "45%", label: "Faster time to market" },\n { value: "3x", label: "More features shipped" },\n { value: "60%", label: "Better stakeholder alignment" },\n]\n\nexport default function ProductPage() {\n return (\n <div className="min-h-screen flex flex-col">\n <Header />\n\n <main className="flex-1">\n {/* Hero */}\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">\n For Product Teams\n </div>\n <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">\n Ship better products, faster\n </h1>\n <p className="text-xl text-muted-foreground mb-8">\n From idea to launch, manage your entire product lifecycle. Roadmaps, feedback, and collaboration in one platform.\n </p>\n <div className="flex flex-wrap gap-4 justify-center">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Start free trial\n </a>\n <a\n href="/demo"\n className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"\n >\n See it in action\n </a>\n </div>\n </div>\n </div>\n </section>\n\n {/* Stats */}\n <section className="pb-16 md:pb-24">\n <div className="container mx-auto px-4">\n <div className="grid grid-cols-3 gap-8 max-w-2xl mx-auto">\n {stats.map((stat) => (\n <div key={stat.label} className="text-center">\n <div className="text-3xl md:text-4xl font-bold text-primary mb-2">\n {stat.value}\n </div>\n <div className="text-sm text-muted-foreground">{stat.label}</div>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Benefits Grid */}\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n Built for product-led teams\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n Everything you need to build products users love.\n </p>\n </div>\n\n <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">\n {benefits.map((benefit) => (\n <div\n key={benefit.title}\n className="bg-card rounded-lg border border-border p-6"\n >\n <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">\n {benefit.icon}\n </div>\n <h3 className="text-lg font-semibold mb-2">{benefit.title}</h3>\n <p className="text-muted-foreground text-sm">{benefit.description}</p>\n </div>\n ))}\n </div>\n </div>\n </section>\n\n {/* Testimonials */}\n <TestimonialsGrid\n heading="Trusted by product teams everywhere"\n subheading="See how teams like yours are shipping better products with SaaSify."\n />\n\n {/* Final CTA */}\n <FinalCTA\n headline="Ready to build better products?"\n subheading="Start your free trial and see why top product teams choose SaaSify."\n style="dark"\n links={[\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Talk to us", href: "/contact", variant: "default" },\n ]}\n />\n </main>\n\n <Footer />\n </div>\n )\n}\n',
|
|
3814
|
+
"marketing/nextjs/src/app/use-cases/sales/page.tsx": `import { Header } from "@/components/Header"
|
|
3815
|
+
import { Footer } from "@/components/Footer"
|
|
3816
|
+
import { TestimonialsGrid, FinalCTA } from "@/components/blocks"
|
|
3817
|
+
import { Target, TrendingUp, Users, Zap, BarChart3, Clock } from "lucide-react"
|
|
3818
|
+
|
|
3819
|
+
const benefits = [
|
|
3820
|
+
{
|
|
3821
|
+
icon: <Target className="h-6 w-6" />,
|
|
3822
|
+
title: "Close More Deals",
|
|
3823
|
+
description:
|
|
3824
|
+
"Track every opportunity from first contact to close. Never let a deal slip through the cracks.",
|
|
3825
|
+
},
|
|
3826
|
+
{
|
|
3827
|
+
icon: <TrendingUp className="h-6 w-6" />,
|
|
3828
|
+
title: "Forecast Accurately",
|
|
3829
|
+
description:
|
|
3830
|
+
"AI-powered forecasting gives you confidence in your pipeline. Know what's coming.",
|
|
3831
|
+
},
|
|
3832
|
+
{
|
|
3833
|
+
icon: <Users className="h-6 w-6" />,
|
|
3834
|
+
title: "Align Your Team",
|
|
3835
|
+
description:
|
|
3836
|
+
"Keep everyone on the same page with shared visibility into accounts and deals.",
|
|
3837
|
+
},
|
|
3838
|
+
{
|
|
3839
|
+
icon: <Zap className="h-6 w-6" />,
|
|
3840
|
+
title: "Automate Follow-ups",
|
|
3841
|
+
description:
|
|
3842
|
+
"Never forget a follow-up. Automated reminders and sequences keep deals moving.",
|
|
3843
|
+
},
|
|
3844
|
+
{
|
|
3845
|
+
icon: <BarChart3 className="h-6 w-6" />,
|
|
3846
|
+
title: "Track Performance",
|
|
3847
|
+
description:
|
|
3848
|
+
"Real-time dashboards show rep performance, pipeline health, and revenue metrics.",
|
|
3849
|
+
},
|
|
3850
|
+
{
|
|
3851
|
+
icon: <Clock className="h-6 w-6" />,
|
|
3852
|
+
title: "Save Hours Weekly",
|
|
3853
|
+
description:
|
|
3854
|
+
"Reduce data entry with automatic logging. Spend more time selling.",
|
|
3855
|
+
},
|
|
3856
|
+
]
|
|
3857
|
+
|
|
3858
|
+
const stats = [
|
|
3859
|
+
{ value: "32%", label: "Faster deal cycles" },
|
|
3860
|
+
{ value: "28%", label: "Higher win rates" },
|
|
3861
|
+
{ value: "5hrs", label: "Saved per week" },
|
|
3862
|
+
]
|
|
3863
|
+
|
|
3864
|
+
export default function SalesPage() {
|
|
3865
|
+
return (
|
|
3866
|
+
<div className="min-h-screen flex flex-col">
|
|
3867
|
+
<Header />
|
|
3868
|
+
|
|
3869
|
+
<main className="flex-1">
|
|
3870
|
+
{/* Hero */}
|
|
3871
|
+
<section className="py-16 md:py-24">
|
|
3872
|
+
<div className="container mx-auto px-4">
|
|
3873
|
+
<div className="max-w-3xl mx-auto text-center">
|
|
3874
|
+
<div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
|
|
3875
|
+
For Sales Teams
|
|
3876
|
+
</div>
|
|
3877
|
+
<h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
|
|
3878
|
+
Close more deals, faster
|
|
3879
|
+
</h1>
|
|
3880
|
+
<p className="text-xl text-muted-foreground mb-8">
|
|
3881
|
+
Give your sales team the tools they need to hit quota. Track deals, automate follow-ups, and forecast with confidence.
|
|
3882
|
+
</p>
|
|
3883
|
+
<div className="flex flex-wrap gap-4 justify-center">
|
|
3884
|
+
<a
|
|
3885
|
+
href="/sign-up"
|
|
3886
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
|
|
3887
|
+
>
|
|
3888
|
+
Start free trial
|
|
3889
|
+
</a>
|
|
3890
|
+
<a
|
|
3891
|
+
href="/demo"
|
|
3892
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"
|
|
3893
|
+
>
|
|
3894
|
+
See it in action
|
|
3895
|
+
</a>
|
|
3896
|
+
</div>
|
|
3897
|
+
</div>
|
|
3898
|
+
</div>
|
|
3899
|
+
</section>
|
|
3900
|
+
|
|
3901
|
+
{/* Stats */}
|
|
3902
|
+
<section className="pb-16 md:pb-24">
|
|
3903
|
+
<div className="container mx-auto px-4">
|
|
3904
|
+
<div className="grid grid-cols-3 gap-8 max-w-2xl mx-auto">
|
|
3905
|
+
{stats.map((stat) => (
|
|
3906
|
+
<div key={stat.label} className="text-center">
|
|
3907
|
+
<div className="text-3xl md:text-4xl font-bold text-primary mb-2">
|
|
3908
|
+
{stat.value}
|
|
3909
|
+
</div>
|
|
3910
|
+
<div className="text-sm text-muted-foreground">{stat.label}</div>
|
|
3911
|
+
</div>
|
|
3912
|
+
))}
|
|
3913
|
+
</div>
|
|
3914
|
+
</div>
|
|
3915
|
+
</section>
|
|
3916
|
+
|
|
3917
|
+
{/* Benefits Grid */}
|
|
3918
|
+
<section className="py-16 md:py-24 bg-muted/30">
|
|
3919
|
+
<div className="container mx-auto px-4">
|
|
3920
|
+
<div className="text-center mb-12 md:mb-16">
|
|
3921
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
3922
|
+
Built for modern sales teams
|
|
3923
|
+
</h2>
|
|
3924
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
3925
|
+
Everything you need to manage your pipeline and close more deals.
|
|
3926
|
+
</p>
|
|
3927
|
+
</div>
|
|
3928
|
+
|
|
3929
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
3930
|
+
{benefits.map((benefit) => (
|
|
3931
|
+
<div
|
|
3932
|
+
key={benefit.title}
|
|
3933
|
+
className="bg-card rounded-lg border border-border p-6"
|
|
3934
|
+
>
|
|
3935
|
+
<div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
|
|
3936
|
+
{benefit.icon}
|
|
3937
|
+
</div>
|
|
3938
|
+
<h3 className="text-lg font-semibold mb-2">{benefit.title}</h3>
|
|
3939
|
+
<p className="text-muted-foreground text-sm">{benefit.description}</p>
|
|
3940
|
+
</div>
|
|
3941
|
+
))}
|
|
3942
|
+
</div>
|
|
3943
|
+
</div>
|
|
3944
|
+
</section>
|
|
3945
|
+
|
|
3946
|
+
{/* Testimonials */}
|
|
3947
|
+
<TestimonialsGrid
|
|
3948
|
+
heading="Trusted by sales teams everywhere"
|
|
3949
|
+
subheading="See how teams like yours are crushing their quotas with SaaSify."
|
|
3950
|
+
/>
|
|
3951
|
+
|
|
3952
|
+
{/* Final CTA */}
|
|
3953
|
+
<FinalCTA
|
|
3954
|
+
headline="Ready to accelerate your sales?"
|
|
3955
|
+
subheading="Start your free trial and see why top sales teams choose SaaSify."
|
|
3956
|
+
style="dark"
|
|
3957
|
+
links={[
|
|
3958
|
+
{ label: "Start free trial", href: "/sign-up", variant: "outline" },
|
|
3959
|
+
{ label: "Talk to sales", href: "/contact", variant: "default" },
|
|
3960
|
+
]}
|
|
3961
|
+
/>
|
|
3962
|
+
</main>
|
|
3963
|
+
|
|
3964
|
+
<Footer />
|
|
3965
|
+
</div>
|
|
3966
|
+
)
|
|
3967
|
+
}
|
|
3968
|
+
`,
|
|
2988
3969
|
"marketing/nextjs/src/components/Footer/index.tsx": '"use client"\n\nimport Link from "next/link"\nimport { Logo } from "@/components/Logo"\nimport { ThemeSelector } from "@/components/ThemeSelector"\n\n// Footer navigation structure\nconst footerColumns = [\n {\n title: "Product",\n links: [\n { label: "Home", href: "/" },\n { label: "Features", href: "/features" },\n { label: "Pricing", href: "/pricing" },\n ],\n },\n {\n title: "Resources",\n links: [\n { label: "Blog", href: "/blog" },\n ],\n },\n {\n title: "Legal",\n links: [\n { label: "Privacy", href: "/privacy" },\n { label: "Terms", href: "/terms" },\n ],\n },\n]\n\nconst socialLinks = {\n twitter: "https://x.com/saasify",\n linkedin: "https://linkedin.com/company/saasify",\n github: "https://github.com/saasify",\n}\n\n// Social icons as inline SVGs\nconst SocialIcons = {\n twitter: (\n <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">\n <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" />\n </svg>\n ),\n linkedin: (\n <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">\n <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />\n </svg>\n ),\n github: (\n <svg className="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">\n <path\n fillRule="evenodd"\n d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"\n clipRule="evenodd"\n />\n </svg>\n ),\n}\n\nexport function Footer() {\n const currentYear = new Date().getFullYear()\n\n return (\n <footer className="mt-auto border-t border-border bg-background">\n {/* Main Footer Content */}\n <div className="container mx-auto px-4 py-12 lg:py-16">\n <div className="grid grid-cols-2 gap-8 md:grid-cols-3 lg:grid-cols-5">\n {/* Link Columns */}\n {footerColumns.map((column) => (\n <div key={column.title} className="col-span-1">\n <h3 className="mb-4 text-sm font-medium text-foreground">\n {column.title}\n </h3>\n <ul className="space-y-3">\n {column.links.map((link) => (\n <li key={link.label}>\n <Link\n href={link.href}\n className="text-sm text-muted-foreground transition-colors hover:text-foreground"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n ))}\n\n {/* Newsletter Column */}\n <div className="col-span-2">\n <h3 className="mb-4 text-sm font-medium text-foreground">\n Newsletter\n </h3>\n <p className="mb-4 text-sm text-muted-foreground">\n Get product updates, tips, and insights delivered weekly.\n </p>\n <form className="flex gap-2">\n <input\n type="email"\n placeholder="Enter your email"\n className="flex-1 px-3 py-2 text-sm rounded-md border border-input bg-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"\n />\n <button\n type="submit"\n className="px-4 py-2 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90"\n >\n Subscribe\n </button>\n </form>\n </div>\n </div>\n\n {/* Social Links */}\n <div className="mt-10 flex items-center gap-4 border-t border-border pt-8">\n <a\n href={socialLinks.twitter}\n target="_blank"\n rel="noopener noreferrer"\n className="text-muted-foreground transition-colors hover:text-foreground"\n aria-label="X (Twitter)"\n >\n {SocialIcons.twitter}\n </a>\n <a\n href={socialLinks.linkedin}\n target="_blank"\n rel="noopener noreferrer"\n className="text-muted-foreground transition-colors hover:text-foreground"\n aria-label="LinkedIn"\n >\n {SocialIcons.linkedin}\n </a>\n <a\n href={socialLinks.github}\n target="_blank"\n rel="noopener noreferrer"\n className="text-muted-foreground transition-colors hover:text-foreground"\n aria-label="GitHub"\n >\n {SocialIcons.github}\n </a>\n </div>\n </div>\n\n {/* Bottom Bar */}\n <div className="border-t border-border">\n <div className="container mx-auto flex flex-col items-center justify-between gap-4 px-4 py-6 sm:flex-row">\n {/* Logo and Copyright */}\n <div className="flex items-center gap-4">\n <Link href="/" className="flex items-center">\n <Logo className="h-6 w-6" />\n </Link>\n <p className="text-sm text-muted-foreground">\n \xA9 {currentYear} SaaSify\n </p>\n </div>\n\n {/* Theme Selector */}\n <div className="flex items-center gap-6">\n <ThemeSelector />\n </div>\n </div>\n </div>\n </footer>\n )\n}\n',
|
|
2989
3970
|
"marketing/nextjs/src/components/Header/MegaMenu.tsx": '"use client"\n\nimport { useState } from "react"\nimport Link from "next/link"\nimport { ChevronDown, Layout, BarChart3, Shield, Zap, Layers, Target, Rocket, Settings } from "lucide-react"\nimport { cn } from "@/lib/utils"\n\ninterface MenuItem {\n label: string\n description: string\n href: string\n icon: string\n}\n\ninterface MenuColumn {\n title: string\n items: MenuItem[]\n}\n\ninterface MegaMenuProps {\n menu: {\n label: string\n columns: MenuColumn[]\n }\n}\n\nconst iconMap: Record<string, React.ComponentType<{ className?: string }>> = {\n layout: Layout,\n barChart: BarChart3,\n shield: Shield,\n zap: Zap,\n layers: Layers,\n target: Target,\n rocket: Rocket,\n settings: Settings,\n}\n\nexport function MegaMenu({ menu }: MegaMenuProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n <div\n className="relative"\n onMouseEnter={() => setIsOpen(true)}\n onMouseLeave={() => setIsOpen(false)}\n >\n <button\n type="button"\n className={cn(\n "flex items-center gap-1 px-4 py-2 text-sm font-medium transition-colors",\n isOpen ? "text-foreground" : "text-muted-foreground hover:text-foreground"\n )}\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n >\n {menu.label}\n <ChevronDown\n className={cn(\n "h-4 w-4 transition-transform",\n isOpen && "rotate-180"\n )}\n />\n </button>\n\n {/* Dropdown */}\n <div\n className={cn(\n "absolute left-0 top-full pt-2 transition-all",\n isOpen\n ? "opacity-100 translate-y-0 pointer-events-auto"\n : "opacity-0 -translate-y-2 pointer-events-none"\n )}\n >\n <div className="bg-background border border-border rounded-lg shadow-lg p-6 min-w-[480px]">\n <div className={cn(\n "grid gap-8",\n menu.columns.length === 1 ? "grid-cols-1" : "grid-cols-2"\n )}>\n {menu.columns.map((column) => (\n <div key={column.title}>\n <h3 className="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-4">\n {column.title}\n </h3>\n <ul className="space-y-1">\n {column.items.map((item) => {\n const Icon = iconMap[item.icon] || Layout\n return (\n <li key={item.href}>\n <Link\n href={item.href}\n className="flex items-start gap-3 p-3 rounded-lg hover:bg-muted transition-colors group"\n onClick={() => setIsOpen(false)}\n >\n <div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-muted group-hover:bg-background">\n <Icon className="h-5 w-5 text-primary" />\n </div>\n <div>\n <div className="text-sm font-medium text-foreground">\n {item.label}\n </div>\n <div className="text-xs text-muted-foreground mt-0.5">\n {item.description}\n </div>\n </div>\n </Link>\n </li>\n )\n })}\n </ul>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n )\n}\n',
|
|
2990
3971
|
"marketing/nextjs/src/components/Header/MobileMenu.tsx": '"use client"\n\nimport { useState } from "react"\nimport Link from "next/link"\nimport { Menu, X } from "lucide-react"\nimport { cn } from "@/lib/utils"\n\ninterface MobileMenuProps {\n navLinks: { label: string; href: string }[]\n ctaLinks: { label: string; href: string; variant: "default" | "ghost" }[]\n}\n\nexport function MobileMenu({ navLinks, ctaLinks }: MobileMenuProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n const handleClose = () => {\n setIsOpen(false)\n }\n\n return (\n <div className="lg:hidden">\n <button\n type="button"\n className="p-2 text-muted-foreground hover:text-foreground"\n onClick={() => setIsOpen(!isOpen)}\n aria-label={isOpen ? "Close menu" : "Open menu"}\n >\n {isOpen ? <X className="h-6 w-6" /> : <Menu className="h-6 w-6" />}\n </button>\n\n {/* Mobile menu overlay */}\n {isOpen && (\n <div className="fixed inset-0 top-16 z-50 bg-background">\n <nav className="overflow-y-auto max-h-[calc(100vh-4rem)]">\n {/* Navigation links */}\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className="flex items-center px-4 py-3 text-sm font-medium border-b border-border hover:bg-muted"\n onClick={handleClose}\n >\n {link.label}\n </Link>\n ))}\n\n {/* CTA links */}\n <div className="p-4 space-y-2">\n {ctaLinks.map((link) => (\n <Link\n key={link.label}\n href={link.href}\n className={cn(\n "flex items-center justify-center w-full px-4 py-3 text-sm font-medium rounded-md transition-colors",\n link.variant === "default"\n ? "bg-primary text-primary-foreground hover:bg-primary/90"\n : "border border-border hover:bg-muted"\n )}\n onClick={handleClose}\n >\n {link.label}\n </Link>\n ))}\n </div>\n </nav>\n </div>\n )}\n </div>\n )\n}\n',
|
|
2991
|
-
"marketing/nextjs/src/components/Header/index.tsx": '"use client"\n\nimport Link from "next/link"\nimport { Logo } from "@/components/Logo"\nimport { MobileMenu } from "./MobileMenu"\nimport { cn } from "@/lib/utils"\n\n//
|
|
3972
|
+
"marketing/nextjs/src/components/Header/index.tsx": '"use client"\n\nimport Link from "next/link"\nimport { Logo } from "@/components/Logo"\nimport { MobileMenu } from "./MobileMenu"\nimport { MegaMenu } from "./MegaMenu"\nimport { cn } from "@/lib/utils"\n\n// Features mega menu configuration\nconst featuresMenu = {\n label: "Features",\n columns: [\n {\n title: "Platform",\n items: [\n { label: "Dashboard", description: "Your command center", href: "/features/dashboard", icon: "layout" },\n { label: "Analytics", description: "Real-time insights", href: "/features/analytics", icon: "barChart" },\n { label: "Integrations", description: "Connect your tools", href: "/features/integrations", icon: "layers" },\n ],\n },\n {\n title: "Capabilities",\n items: [\n { label: "Automation", description: "Eliminate busywork", href: "/features/automation", icon: "zap" },\n { label: "Workflows", description: "Custom processes", href: "/features/workflows", icon: "settings" },\n { label: "Security", description: "Enterprise-grade", href: "/features/security", icon: "shield" },\n ],\n },\n ],\n}\n\n// Solutions mega menu configuration\nconst solutionsMenu = {\n label: "Solutions",\n columns: [\n {\n title: "By Team",\n items: [\n { label: "Sales Teams", description: "Close more deals", href: "/use-cases/sales", icon: "target" },\n { label: "Marketing Teams", description: "Launch campaigns", href: "/use-cases/marketing", icon: "rocket" },\n { label: "Product Teams", description: "Ship faster", href: "/use-cases/product", icon: "layers" },\n { label: "Operations", description: "Run efficiently", href: "/use-cases/operations", icon: "settings" },\n ],\n },\n ],\n}\n\n// Simple navigation links\nconst navLinks = [\n { label: "Pricing", href: "/pricing" },\n { label: "Blog", href: "/blog" },\n { label: "About", href: "/about" },\n]\n\n// For mobile menu - flat list of all links\nconst mobileNavLinks = [\n { label: "Features", href: "/features" },\n { label: "Pricing", href: "/pricing" },\n { label: "Blog", href: "/blog" },\n { label: "About", href: "/about" },\n]\n\nconst ctaLinks = [\n { label: "Sign In", href: "/sign-in", variant: "ghost" as const },\n { label: "Get Started", href: "/pricing", variant: "default" as const },\n]\n\nexport function Header() {\n return (\n <header className="sticky top-0 z-50 border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">\n <div className="container mx-auto px-4 h-16 flex justify-between items-center">\n {/* Left section: Logo + Nav */}\n <div className="flex items-center gap-8">\n <Link href="/" className="flex items-center gap-2">\n <Logo />\n <span className="text-xl font-semibold hidden sm:inline">SaaSify</span>\n </Link>\n\n {/* Desktop navigation */}\n <nav className="hidden lg:flex items-center gap-1">\n <MegaMenu menu={featuresMenu} />\n <MegaMenu menu={solutionsMenu} />\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className="px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"\n >\n {link.label}\n </Link>\n ))}\n </nav>\n </div>\n\n {/* Right section: CTAs */}\n <div className="flex items-center gap-3">\n {/* Desktop CTAs */}\n <div className="hidden lg:flex items-center gap-3">\n {ctaLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className={cn(\n "px-4 py-2 text-sm font-medium rounded-md transition-colors",\n link.variant === "default"\n ? "bg-primary text-primary-foreground hover:bg-primary/90"\n : "text-muted-foreground hover:text-foreground"\n )}\n >\n {link.label}\n </Link>\n ))}\n </div>\n\n {/* Mobile: Primary CTA + Hamburger */}\n <Link\n href="/pricing"\n className="lg:hidden px-4 py-2 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90"\n >\n Get Started\n </Link>\n\n <MobileMenu\n navLinks={mobileNavLinks}\n ctaLinks={ctaLinks}\n />\n </div>\n </div>\n </header>\n )\n}\n',
|
|
2992
3973
|
"marketing/nextjs/src/components/Logo.tsx": '"use client"\n\nimport { useTheme } from "next-themes"\nimport { useEffect, useState } from "react"\nimport { cn } from "@/lib/utils"\n\ninterface LogoProps {\n className?: string\n variant?: "light" | "dark" | "auto"\n}\n\nexport function Logo({ className, variant = "auto" }: LogoProps) {\n const { resolvedTheme } = useTheme()\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Determine which variant to show\n const showDark =\n variant === "dark" ||\n (variant === "auto" && mounted && resolvedTheme === "dark")\n\n return (\n <div\n className={cn(\n "flex h-8 w-8 items-center justify-center rounded-lg",\n showDark ? "bg-white" : "bg-foreground",\n className\n )}\n >\n <svg\n className={cn("h-5 w-5", showDark ? "text-gray-900" : "text-background")}\n viewBox="0 0 24 24"\n fill="none"\n stroke="currentColor"\n strokeWidth={2}\n strokeLinecap="round"\n strokeLinejoin="round"\n >\n <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" />\n </svg>\n </div>\n )\n}\n',
|
|
2993
3974
|
"marketing/nextjs/src/components/ThemeProvider.tsx": '"use client"\n\nimport { ThemeProvider as NextThemesProvider } from "next-themes"\nimport type { ThemeProviderProps } from "next-themes"\n\nexport function ThemeProvider({ children, ...props }: ThemeProviderProps) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>\n}\n',
|
|
2994
3975
|
"marketing/nextjs/src/components/ThemeSelector.tsx": '"use client"\n\nimport { Moon, Sun, Monitor } from "lucide-react"\nimport { useTheme } from "next-themes"\nimport { useEffect, useState } from "react"\nimport { cn } from "@/lib/utils"\n\nexport function ThemeSelector() {\n const { theme, setTheme } = useTheme()\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) {\n return (\n <div className="flex items-center gap-1 rounded-full border border-border bg-background/50 p-1">\n <div className="h-7 w-7 rounded-full" />\n <div className="h-7 w-7 rounded-full" />\n <div className="h-7 w-7 rounded-full" />\n </div>\n )\n }\n\n return (\n <div className="flex items-center gap-1 rounded-full border border-border bg-background/50 p-1">\n <button\n type="button"\n onClick={() => setTheme("light")}\n className={cn(\n "flex h-7 w-7 items-center justify-center rounded-full transition-colors",\n theme === "light"\n ? "bg-foreground text-background"\n : "text-muted-foreground hover:text-foreground"\n )}\n aria-label="Light mode"\n >\n <Sun className="h-4 w-4" />\n </button>\n <button\n type="button"\n onClick={() => setTheme("dark")}\n className={cn(\n "flex h-7 w-7 items-center justify-center rounded-full transition-colors",\n theme === "dark"\n ? "bg-foreground text-background"\n : "text-muted-foreground hover:text-foreground"\n )}\n aria-label="Dark mode"\n >\n <Moon className="h-4 w-4" />\n </button>\n <button\n type="button"\n onClick={() => setTheme("system")}\n className={cn(\n "flex h-7 w-7 items-center justify-center rounded-full transition-colors",\n theme === "system"\n ? "bg-foreground text-background"\n : "text-muted-foreground hover:text-foreground"\n )}\n aria-label="System theme"\n >\n <Monitor className="h-4 w-4" />\n </button>\n </div>\n )\n}\n',
|
|
2995
3976
|
"marketing/nextjs/src/components/blocks/BentoFeatures.tsx": '"use client"\n\nimport {\n BarChart3,\n Globe,\n Layers,\n type LucideIcon,\n Rocket,\n Settings,\n Shield,\n Zap,\n} from "lucide-react"\nimport { cn } from "@/lib/utils"\n\ninterface Feature {\n size?: "small" | "tall"\n style?: "default" | "primary" | "accent" | "gradient"\n icon?: string\n stat?: string\n title: string\n description: string\n}\n\ninterface BentoFeaturesProps {\n heading?: string\n subheading?: string\n features?: Feature[]\n}\n\nconst iconMap: Record<string, LucideIcon> = {\n rocket: Rocket,\n zap: Zap,\n layers: Layers,\n shield: Shield,\n globe: Globe,\n settings: Settings,\n barChart: BarChart3,\n}\n\nconst gridPositions = [\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-2",\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-1",\n "md:col-span-1 md:row-span-1",\n]\n\nconst styleClasses: Record<string, { bg: string; text: string; icon: string; statText: string }> = {\n default: {\n bg: "bg-card border border-border/50 hover:border-border",\n text: "text-foreground",\n icon: "bg-primary/10 text-primary",\n statText: "text-primary",\n },\n primary: {\n bg: "bg-primary hover:bg-primary/95",\n text: "text-primary-foreground",\n icon: "bg-white/20 text-white",\n statText: "text-white",\n },\n accent: {\n bg: "bg-gradient-to-br from-teal-500 to-teal-600 hover:from-teal-500/95 hover:to-teal-600/95",\n text: "text-white",\n icon: "bg-white/20 text-white",\n statText: "text-white",\n },\n gradient: {\n bg: "bg-gradient-to-br from-primary via-primary/90 to-secondary hover:from-primary/95",\n text: "text-white",\n icon: "bg-white/20 text-white",\n statText: "text-white",\n },\n}\n\nconst defaultFeatures: Feature[] = [\n {\n size: "small",\n style: "gradient",\n icon: "zap",\n stat: "5x",\n title: "Faster onboarding",\n description: "Get your team up and running in hours, not weeks.",\n },\n {\n size: "small",\n style: "accent",\n icon: "rocket",\n title: "Quick setup",\n description: "Configure your workspace, invite your team, and start collaborating.",\n },\n {\n size: "small",\n style: "default",\n icon: "layers",\n title: "Powerful integrations",\n description: "Connect with 100+ tools you already use.",\n },\n {\n size: "tall",\n style: "primary",\n icon: "shield",\n title: "Enterprise security",\n description: "SOC 2 compliant with end-to-end encryption and complete audit trails for peace of mind.",\n },\n {\n size: "small",\n style: "default",\n icon: "globe",\n stat: "99.9%",\n title: "Uptime",\n description: "Reliable infrastructure you can count on.",\n },\n {\n size: "small",\n style: "default",\n icon: "globe",\n title: "Global scale",\n description: "Multi-region with custom domains.",\n },\n {\n size: "small",\n style: "default",\n icon: "settings",\n title: "Smart automation",\n description: "Automate repetitive tasks and workflows.",\n },\n {\n size: "small",\n style: "default",\n icon: "layers",\n title: "Flexible workflows",\n description: "Build custom processes for any use case.",\n },\n]\n\nexport function BentoFeatures({\n heading = "Discover what SaaSify can do",\n subheading = "Everything you need to work smarter and scale faster",\n features = defaultFeatures,\n}: BentoFeaturesProps) {\n const displayFeatures = features.length > 0 ? features : defaultFeatures\n\n return (\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n {/* Header */}\n {(heading || subheading) && (\n <div className="text-center mb-12 md:mb-16 max-w-3xl mx-auto">\n {heading && (\n <h2 className="text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight mb-6">\n {heading}\n </h2>\n )}\n {subheading && (\n <p className="text-xl md:text-2xl text-muted-foreground">{subheading}</p>\n )}\n </div>\n )}\n\n {/* Bento Grid */}\n <div className="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-5 md:grid-rows-[repeat(3,minmax(140px,160px))]">\n {displayFeatures.map((feature, index) => {\n const style = feature.style || "default"\n const iconKey = feature.icon\n const Icon = iconKey && iconKey in iconMap ? iconMap[iconKey] : null\n const styleConfig = styleClasses[style] || styleClasses.default\n const gridPosition = gridPositions[index] || "md:col-span-1 md:row-span-1"\n const isLarge =\n gridPosition.includes("col-span-2") && gridPosition.includes("row-span-2")\n\n return (\n <div\n key={feature.title}\n className={cn(\n "relative rounded-2xl overflow-hidden p-5 md:p-6 flex flex-col transition-all duration-300 group",\n "hover:shadow-lg hover:-translate-y-0.5",\n "col-span-1 row-span-1",\n gridPosition,\n styleConfig.bg\n )}\n >\n {/* Decorative elements */}\n {!isLarge && feature.size === "tall" && (\n <div className="absolute -right-6 -bottom-6 w-24 h-24 md:w-32 md:h-32 rounded-full bg-white/10 blur-xl" />\n )}\n\n {/* Content */}\n <div className="relative z-10 flex flex-col h-full">\n {/* Icon */}\n {Icon && (\n <div\n className={cn(\n "w-10 h-10 md:w-11 md:h-11 rounded-xl flex items-center justify-center mb-auto",\n styleConfig.icon\n )}\n >\n <Icon className="w-5 h-5 md:w-5 md:h-5" />\n </div>\n )}\n\n {/* Spacer */}\n <div className="flex-1 min-h-2" />\n\n {/* Stat */}\n {feature.stat && (\n <div\n className={cn(\n "font-bold mb-0.5 leading-none",\n isLarge ? "text-5xl md:text-6xl" : "text-3xl md:text-4xl",\n styleConfig.statText\n )}\n >\n {feature.stat}\n </div>\n )}\n\n {/* Title */}\n <h3\n className={cn(\n "font-semibold mb-1",\n isLarge ? "text-lg md:text-xl" : "text-base md:text-lg",\n styleConfig.text\n )}\n >\n {feature.title}\n </h3>\n\n {/* Description */}\n <p\n className={cn(\n "leading-snug",\n isLarge ? "text-sm md:text-base" : "text-xs md:text-sm",\n style === "default" ? "text-muted-foreground" : "text-white/80"\n )}\n >\n {feature.description}\n </p>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </section>\n )\n}\n',
|
|
3977
|
+
"marketing/nextjs/src/components/blocks/FAQAccordion.tsx": `"use client"
|
|
3978
|
+
|
|
3979
|
+
import { useState } from "react"
|
|
3980
|
+
import { ChevronDown } from "lucide-react"
|
|
3981
|
+
import { cn } from "@/lib/utils"
|
|
3982
|
+
|
|
3983
|
+
interface FAQItem {
|
|
3984
|
+
question: string
|
|
3985
|
+
answer: string
|
|
3986
|
+
}
|
|
3987
|
+
|
|
3988
|
+
interface FAQAccordionProps {
|
|
3989
|
+
heading?: string
|
|
3990
|
+
subheading?: string
|
|
3991
|
+
items?: FAQItem[]
|
|
3992
|
+
}
|
|
3993
|
+
|
|
3994
|
+
const defaultFAQs: FAQItem[] = [
|
|
3995
|
+
{
|
|
3996
|
+
question: "How does the free trial work?",
|
|
3997
|
+
answer:
|
|
3998
|
+
"Our 14-day free trial gives you full access to all features with no credit card required. At the end of your trial, you can choose the plan that best fits your needs.",
|
|
3999
|
+
},
|
|
4000
|
+
{
|
|
4001
|
+
question: "Can I change plans at any time?",
|
|
4002
|
+
answer:
|
|
4003
|
+
"Yes! You can upgrade or downgrade your plan at any time. Changes take effect immediately, and we'll prorate any billing differences.",
|
|
4004
|
+
},
|
|
4005
|
+
{
|
|
4006
|
+
question: "What payment methods do you accept?",
|
|
4007
|
+
answer:
|
|
4008
|
+
"We accept all major credit cards (Visa, Mastercard, American Express) as well as PayPal. For Enterprise plans, we also offer invoicing.",
|
|
4009
|
+
},
|
|
4010
|
+
{
|
|
4011
|
+
question: "Is my data secure?",
|
|
4012
|
+
answer:
|
|
4013
|
+
"Absolutely. We use industry-standard encryption (AES-256) for all data at rest and in transit. We're SOC 2 Type II certified and GDPR compliant.",
|
|
4014
|
+
},
|
|
4015
|
+
{
|
|
4016
|
+
question: "Do you offer discounts for nonprofits or educational institutions?",
|
|
4017
|
+
answer:
|
|
4018
|
+
"Yes! We offer 50% off for qualified nonprofits and educational institutions. Contact our sales team to learn more about our discount programs.",
|
|
4019
|
+
},
|
|
4020
|
+
{
|
|
4021
|
+
question: "What kind of support do you offer?",
|
|
4022
|
+
answer:
|
|
4023
|
+
"All plans include email support with 24-hour response time. Professional plans get priority support, and Enterprise plans include a dedicated success manager.",
|
|
4024
|
+
},
|
|
4025
|
+
]
|
|
4026
|
+
|
|
4027
|
+
export function FAQAccordion({
|
|
4028
|
+
heading = "Frequently asked questions",
|
|
4029
|
+
subheading = "Everything you need to know about SaaSify",
|
|
4030
|
+
items = defaultFAQs,
|
|
4031
|
+
}: FAQAccordionProps) {
|
|
4032
|
+
const [openIndex, setOpenIndex] = useState<number | null>(null)
|
|
4033
|
+
|
|
4034
|
+
return (
|
|
4035
|
+
<section className="py-16 md:py-24">
|
|
4036
|
+
<div className="container mx-auto px-4">
|
|
4037
|
+
{/* Header */}
|
|
4038
|
+
<div className="text-center mb-12 md:mb-16">
|
|
4039
|
+
<h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
|
|
4040
|
+
{heading}
|
|
4041
|
+
</h2>
|
|
4042
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
4043
|
+
{subheading}
|
|
4044
|
+
</p>
|
|
4045
|
+
</div>
|
|
4046
|
+
|
|
4047
|
+
{/* Accordion */}
|
|
4048
|
+
<div className="max-w-3xl mx-auto">
|
|
4049
|
+
{items.map((item, index) => (
|
|
4050
|
+
<div
|
|
4051
|
+
key={index}
|
|
4052
|
+
className="border-b border-border"
|
|
4053
|
+
>
|
|
4054
|
+
<button
|
|
4055
|
+
onClick={() => setOpenIndex(openIndex === index ? null : index)}
|
|
4056
|
+
className="flex items-center justify-between w-full py-5 text-left"
|
|
4057
|
+
>
|
|
4058
|
+
<span className="font-medium text-foreground pr-4">
|
|
4059
|
+
{item.question}
|
|
4060
|
+
</span>
|
|
4061
|
+
<ChevronDown
|
|
4062
|
+
className={cn(
|
|
4063
|
+
"h-5 w-5 text-muted-foreground transition-transform shrink-0",
|
|
4064
|
+
openIndex === index && "rotate-180"
|
|
4065
|
+
)}
|
|
4066
|
+
/>
|
|
4067
|
+
</button>
|
|
4068
|
+
<div
|
|
4069
|
+
className={cn(
|
|
4070
|
+
"overflow-hidden transition-all",
|
|
4071
|
+
openIndex === index ? "max-h-96 pb-5" : "max-h-0"
|
|
4072
|
+
)}
|
|
4073
|
+
>
|
|
4074
|
+
<p className="text-muted-foreground">{item.answer}</p>
|
|
4075
|
+
</div>
|
|
4076
|
+
</div>
|
|
4077
|
+
))}
|
|
4078
|
+
</div>
|
|
4079
|
+
|
|
4080
|
+
{/* Contact CTA */}
|
|
4081
|
+
<div className="text-center mt-12">
|
|
4082
|
+
<p className="text-muted-foreground mb-4">
|
|
4083
|
+
Still have questions?
|
|
4084
|
+
</p>
|
|
4085
|
+
<a
|
|
4086
|
+
href="/contact"
|
|
4087
|
+
className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
|
|
4088
|
+
>
|
|
4089
|
+
Contact support
|
|
4090
|
+
</a>
|
|
4091
|
+
</div>
|
|
4092
|
+
</div>
|
|
4093
|
+
</section>
|
|
4094
|
+
)
|
|
4095
|
+
}
|
|
4096
|
+
`,
|
|
2996
4097
|
"marketing/nextjs/src/components/blocks/FeatureShowcase.tsx": '"use client"\n\nimport Link from "next/link"\nimport { Check } from "lucide-react"\nimport { cn } from "@/lib/utils"\n\ninterface FeatureShowcaseProps {\n label?: string\n headline: string\n description: string\n features?: { text: string }[]\n link?: {\n label: string\n href: string\n }\n imagePosition?: "left" | "right"\n}\n\nexport function FeatureShowcase({\n label,\n headline,\n description,\n features = [],\n link,\n imagePosition = "right",\n}: FeatureShowcaseProps) {\n return (\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div\n className={cn(\n "grid md:grid-cols-2 gap-12 lg:gap-16 items-center",\n imagePosition === "left" && "md:grid-flow-dense"\n )}\n >\n {/* Content */}\n <div className={cn(imagePosition === "left" && "md:col-start-2")}>\n {label && (\n <span className="inline-block text-sm font-medium text-primary mb-4">\n {label}\n </span>\n )}\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n {headline}\n </h2>\n <p className="text-lg text-muted-foreground mb-6">\n {description}\n </p>\n\n {features.length > 0 && (\n <ul className="space-y-3 mb-8">\n {features.map((feature) => (\n <li key={feature.text} className="flex items-center gap-3">\n <div className="flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary/10">\n <Check className="h-3 w-3 text-primary" />\n </div>\n <span className="text-sm text-muted-foreground">\n {feature.text}\n </span>\n </li>\n ))}\n </ul>\n )}\n\n {link && (\n <Link\n href={link.href}\n className="inline-flex items-center gap-2 text-sm font-medium text-primary hover:underline"\n >\n {link.label}\n <span aria-hidden="true">\u2192</span>\n </Link>\n )}\n </div>\n\n {/* Image Placeholder */}\n <div\n className={cn(\n "relative aspect-[4/3] rounded-2xl bg-muted overflow-hidden",\n imagePosition === "left" && "md:col-start-1 md:row-start-1"\n )}\n >\n <div className="absolute inset-0 flex items-center justify-center">\n <div className="text-center">\n <div className="w-16 h-16 mx-auto mb-4 rounded-xl bg-primary/10 flex items-center justify-center">\n <svg\n className="w-8 h-8 text-primary"\n fill="none"\n stroke="currentColor"\n viewBox="0 0 24 24"\n >\n <path\n strokeLinecap="round"\n strokeLinejoin="round"\n strokeWidth={1.5}\n d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"\n />\n </svg>\n </div>\n <p className="text-sm text-muted-foreground">\n Feature illustration\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n}\n',
|
|
2997
4098
|
"marketing/nextjs/src/components/blocks/FinalCTA.tsx": '"use client"\n\nimport Link from "next/link"\nimport { cn } from "@/lib/utils"\n\ninterface FinalCTALink {\n label: string\n href: string\n variant: "default" | "outline"\n}\n\ninterface FinalCTAProps {\n headline?: string\n subheading?: string\n links?: FinalCTALink[]\n style?: "dark" | "light" | "gradient"\n}\n\nexport function FinalCTA({\n headline = "Ready to transform how your team works?",\n subheading = "Join thousands of teams who chose the smarter way to work. Start free, upgrade as you grow.",\n links = [\n { label: "Start free trial", href: "/sign-up", variant: "outline" },\n { label: "Book a demo", href: "/contact", variant: "default" },\n ],\n style = "dark",\n}: FinalCTAProps) {\n const bgClasses = {\n dark: "bg-primary text-primary-foreground",\n light: "bg-muted text-foreground",\n gradient: "bg-gradient-to-br from-primary to-primary/80 text-primary-foreground",\n }\n\n const buttonClasses = {\n dark: {\n default: "bg-primary-foreground text-primary hover:bg-primary-foreground/90",\n outline: "border border-primary-foreground/30 text-primary-foreground hover:bg-primary-foreground/10",\n },\n light: {\n default: "bg-primary text-primary-foreground hover:bg-primary/90",\n outline: "border border-border hover:bg-background",\n },\n gradient: {\n default: "bg-background text-foreground hover:bg-background/90",\n outline: "border border-primary-foreground/30 text-primary-foreground hover:bg-primary-foreground/10",\n },\n }\n\n return (\n <section className={cn("py-16 md:py-24", bgClasses[style])}>\n <div className="container mx-auto px-4">\n <div className="max-w-3xl mx-auto text-center">\n <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-6">\n {headline}\n </h2>\n {subheading && (\n <p\n className={cn(\n "text-lg md:text-xl mb-8",\n style === "dark"\n ? "text-primary-foreground/80"\n : style === "gradient"\n ? "text-primary-foreground/80"\n : "text-muted-foreground"\n )}\n >\n {subheading}\n </p>\n )}\n\n {links && links.length > 0 && (\n <div className="flex flex-wrap gap-4 justify-center">\n {links.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className={cn(\n "inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md transition-colors",\n buttonClasses[style][link.variant]\n )}\n >\n {link.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n',
|
|
4099
|
+
"marketing/nextjs/src/components/blocks/HowItWorks.tsx": 'import { UserPlus, Settings, Zap } from "lucide-react"\n\ninterface Step {\n icon: React.ReactNode\n title: string\n description: string\n}\n\ninterface HowItWorksProps {\n heading?: string\n subheading?: string\n steps?: Step[]\n}\n\nconst defaultSteps: Step[] = [\n {\n icon: <UserPlus className="h-8 w-8" />,\n title: "Sign up in seconds",\n description:\n "Create your account with just an email. No credit card required to get started.",\n },\n {\n icon: <Settings className="h-8 w-8" />,\n title: "Configure your workspace",\n description:\n "Set up your team, invite members, and customize your workspace to fit your workflow.",\n },\n {\n icon: <Zap className="h-8 w-8" />,\n title: "Start collaborating",\n description:\n "Hit the ground running with templates, integrations, and automation built right in.",\n },\n]\n\nexport function HowItWorks({\n heading = "Get started in minutes",\n subheading = "Three simple steps to transform how your team works",\n steps = defaultSteps,\n}: HowItWorksProps) {\n return (\n <section className="py-16 md:py-24 bg-muted/30">\n <div className="container mx-auto px-4">\n {/* Header */}\n <div className="text-center mb-12 md:mb-16">\n <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">\n {heading}\n </h2>\n <p className="text-lg text-muted-foreground max-w-2xl mx-auto">\n {subheading}\n </p>\n </div>\n\n {/* Steps */}\n <div className="max-w-5xl mx-auto">\n <div className="grid md:grid-cols-3 gap-8 md:gap-12">\n {steps.map((step, index) => (\n <div key={index} className="relative">\n {/* Connector line (hidden on mobile, shown between items on desktop) */}\n {index < steps.length - 1 && (\n <div className="hidden md:block absolute top-10 left-[calc(50%+3rem)] w-[calc(100%-6rem)] h-px bg-border" />\n )}\n\n <div className="flex flex-col items-center text-center">\n {/* Step number badge */}\n <div className="relative mb-6">\n <div className="w-20 h-20 rounded-full bg-primary/10 flex items-center justify-center text-primary">\n {step.icon}\n </div>\n <span className="absolute -top-2 -right-2 w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-bold flex items-center justify-center">\n {index + 1}\n </span>\n </div>\n\n <h3 className="text-xl font-semibold mb-3">{step.title}</h3>\n <p className="text-muted-foreground">{step.description}</p>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* CTA */}\n <div className="text-center mt-12 md:mt-16">\n <a\n href="/sign-up"\n className="inline-flex items-center justify-center px-8 py-4 text-base font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"\n >\n Get started for free\n </a>\n </div>\n </div>\n </section>\n )\n}\n',
|
|
2998
4100
|
"marketing/nextjs/src/components/blocks/IndustryTabs.tsx": `"use client"
|
|
2999
4101
|
|
|
3000
4102
|
import { useState } from "react"
|
|
@@ -3138,7 +4240,7 @@ export function IndustryTabs({
|
|
|
3138
4240
|
"marketing/nextjs/src/components/blocks/ProofBanner.tsx": '"use client"\n\nimport Link from "next/link"\nimport { cn } from "@/lib/utils"\n\ninterface ProofBannerLink {\n label: string\n href: string\n variant: "default" | "outline"\n}\n\ninterface ProofBannerProps {\n headline?: string\n subtext?: string\n links?: ProofBannerLink[]\n style?: "centered" | "left"\n}\n\nexport function ProofBanner({\n headline = "Transform how your team works, collaborates, and grows",\n subtext = "Every interaction feeds into a powerful platform that powers personalized experiences, seamless collaboration, and intelligent automation across every touchpoint.",\n links = [\n { label: "Start free trial", href: "/sign-up", variant: "default" },\n { label: "Book a demo", href: "/contact", variant: "outline" },\n ],\n style = "centered",\n}: ProofBannerProps) {\n return (\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div\n className={cn(\n "max-w-4xl",\n style === "centered" ? "mx-auto text-center" : ""\n )}\n >\n <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-6">\n {headline}\n </h2>\n {subtext && (\n <p className="text-lg md:text-xl text-muted-foreground mb-8 max-w-3xl mx-auto">\n {subtext}\n </p>\n )}\n {links && links.length > 0 && (\n <div\n className={cn(\n "flex flex-wrap gap-4",\n style === "centered" ? "justify-center" : ""\n )}\n >\n {links.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className={cn(\n "inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md transition-colors",\n link.variant === "default"\n ? "bg-primary text-primary-foreground hover:bg-primary/90"\n : "border border-border bg-background hover:bg-muted"\n )}\n >\n {link.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n',
|
|
3139
4241
|
"marketing/nextjs/src/components/blocks/TestimonialsGrid.tsx": '"use client"\n\nimport { cn } from "@/lib/utils"\n\ninterface Testimonial {\n stat: string\n statLabel: string\n quote: string\n author: string\n company: string\n}\n\ninterface TestimonialsGridProps {\n heading?: string\n subheading?: string\n testimonials?: Testimonial[]\n}\n\nconst defaultTestimonials: Testimonial[] = [\n {\n stat: "94%",\n statLabel: "Faster onboarding",\n quote:\n "We got our entire team onboarded in under a day. The intuitive interface and powerful integrations saved us weeks of setup time.",\n author: "Sarah Chen",\n company: "TechFlow Inc",\n },\n {\n stat: "3x",\n statLabel: "Productivity",\n quote:\n "Our team is shipping features faster than ever. The automation tools eliminated hours of manual work every week.",\n author: "Marcus Rivera",\n company: "Beacon Digital",\n },\n {\n stat: "40%",\n statLabel: "Cost reduction",\n quote:\n "We consolidated five different tools into SaaSify. The ROI was immediate and our team loves having everything in one place.",\n author: "David Kim",\n company: "Cascade Systems",\n },\n]\n\nexport function TestimonialsGrid({\n heading = "Loved by teams at companies of all sizes",\n subheading = "See how leading teams use SaaSify to drive growth and productivity.",\n testimonials = defaultTestimonials,\n}: TestimonialsGridProps) {\n const displayTestimonials = testimonials.length > 0 ? testimonials : defaultTestimonials\n\n return (\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n {/* Header */}\n {(heading || subheading) && (\n <div className="text-center mb-12 md:mb-16 max-w-3xl mx-auto">\n {heading && (\n <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-4">\n {heading}\n </h2>\n )}\n {subheading && (\n <p className="text-lg md:text-xl text-muted-foreground">\n {subheading}\n </p>\n )}\n </div>\n )}\n\n {/* Testimonials Grid */}\n <div className="grid md:grid-cols-3 gap-6 lg:gap-8">\n {displayTestimonials.map((testimonial) => (\n <div\n key={testimonial.author}\n className="relative bg-card border border-border rounded-2xl p-6 md:p-8"\n >\n {/* Stat */}\n <div className="mb-6">\n <div className="text-4xl md:text-5xl font-bold text-primary mb-1">\n {testimonial.stat}\n </div>\n <p className="text-sm font-medium text-muted-foreground">\n {testimonial.statLabel}\n </p>\n </div>\n\n {/* Quote */}\n <blockquote className="text-foreground mb-6">\n "{testimonial.quote}"\n </blockquote>\n\n {/* Author */}\n <div className="flex items-center gap-3">\n <div className="w-10 h-10 rounded-full bg-muted flex items-center justify-center">\n <span className="text-sm font-medium">\n {testimonial.author\n .split(" ")\n .map((n) => n[0])\n .join("")}\n </span>\n </div>\n <div>\n <p className="text-sm font-medium text-foreground">\n {testimonial.author}\n </p>\n <p className="text-sm text-muted-foreground">\n {testimonial.company}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n )\n}\n',
|
|
3140
4242
|
"marketing/nextjs/src/components/blocks/TrustColumns.tsx": '"use client"\n\nimport {\n Award,\n Cloud,\n Database,\n Globe,\n Lock,\n Plug,\n Shield,\n Zap,\n type LucideIcon,\n} from "lucide-react"\nimport { cn } from "@/lib/utils"\n\ninterface TrustItem {\n icon: string\n text: string\n}\n\ninterface TrustColumn {\n label: string\n heading: string\n description: string\n items: TrustItem[]\n}\n\ninterface TrustColumnsProps {\n columns?: TrustColumn[]\n}\n\nconst iconMap: Record<string, LucideIcon> = {\n zap: Zap,\n plug: Plug,\n database: Database,\n cloud: Cloud,\n shield: Shield,\n lock: Lock,\n award: Award,\n globe: Globe,\n}\n\nconst defaultColumns: TrustColumn[] = [\n {\n label: "Integrations",\n heading: "Connect anywhere",\n description:\n "Plug in and get started immediately with pre-built connectors for every major platform.",\n items: [\n { icon: "zap", text: "Go live in minutes" },\n { icon: "plug", text: "Pre-built connectors" },\n { icon: "database", text: "Complete data sync" },\n { icon: "cloud", text: "Cloud-native infrastructure" },\n ],\n },\n {\n label: "Security & Compliance",\n heading: "Enterprise-level security",\n description:\n "Keep your data safe with encryption, granular access control, and compliance-ready infrastructure.",\n items: [\n { icon: "shield", text: "SOC 2 Type II certified" },\n { icon: "lock", text: "End-to-end encryption" },\n { icon: "award", text: "Complete audit trails" },\n { icon: "globe", text: "GDPR compliant" },\n ],\n },\n]\n\nexport function TrustColumns({ columns = defaultColumns }: TrustColumnsProps) {\n const displayColumns = columns.length > 0 ? columns : defaultColumns\n\n return (\n <section className="py-16 md:py-24">\n <div className="container mx-auto px-4">\n <div className="grid md:grid-cols-2 gap-12 lg:gap-16">\n {displayColumns.map((column) => (\n <div key={column.label}>\n <span className="inline-block text-sm font-medium text-primary mb-4">\n {column.label}\n </span>\n <h2 className="text-2xl md:text-3xl font-bold tracking-tight mb-4">\n {column.heading}\n </h2>\n <p className="text-muted-foreground mb-8">\n {column.description}\n </p>\n\n <ul className="space-y-4">\n {column.items.map((item) => {\n const Icon = iconMap[item.icon] || Shield\n return (\n <li key={item.text} className="flex items-center gap-3">\n <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10">\n <Icon className="h-4 w-4 text-primary" />\n </div>\n <span className="text-sm font-medium">\n {item.text}\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n ))}\n </div>\n </div>\n </section>\n )\n}\n',
|
|
3141
|
-
"marketing/nextjs/src/components/blocks/index.ts": 'export { LogoBanner } from "./LogoBanner"\nexport { ProofBanner } from "./ProofBanner"\nexport { BentoFeatures } from "./BentoFeatures"\nexport { FeatureShowcase } from "./FeatureShowcase"\nexport { IndustryTabs } from "./IndustryTabs"\nexport { TestimonialsGrid } from "./TestimonialsGrid"\nexport { TrustColumns } from "./TrustColumns"\nexport { PricingTable } from "./PricingTable"\nexport { FinalCTA } from "./FinalCTA"\n',
|
|
4243
|
+
"marketing/nextjs/src/components/blocks/index.ts": 'export { LogoBanner } from "./LogoBanner"\nexport { ProofBanner } from "./ProofBanner"\nexport { BentoFeatures } from "./BentoFeatures"\nexport { FeatureShowcase } from "./FeatureShowcase"\nexport { IndustryTabs } from "./IndustryTabs"\nexport { TestimonialsGrid } from "./TestimonialsGrid"\nexport { TrustColumns } from "./TrustColumns"\nexport { PricingTable } from "./PricingTable"\nexport { FinalCTA } from "./FinalCTA"\nexport { FAQAccordion } from "./FAQAccordion"\nexport { HowItWorks } from "./HowItWorks"\n',
|
|
3142
4244
|
"marketing/nextjs/src/components/heros/AnimatedMockup.tsx": '"use client"\n\nimport { useEffect, useState } from "react"\nimport { cn } from "@/lib/utils"\n\ninterface MockupState {\n id: number\n label: string\n sidebarActive: string\n previewTitle: string\n previewDescription: string\n previewCategory: string\n previewStatus: "draft" | "published" | "featured"\n previewUrl?: string\n}\n\nconst mockupStates: MockupState[] = [\n {\n id: 1,\n label: "Setup & styling",\n sidebarActive: "templates",\n previewTitle: "Atlas Directory",\n previewDescription: "Apply your brand, typography, and layout in minutes.",\n previewCategory: "Design systems",\n previewStatus: "draft",\n previewUrl: "atlas.directory/home",\n },\n {\n id: 2,\n label: "Plans & pricing",\n sidebarActive: "billing",\n previewTitle: "Pro Listing Plan",\n previewDescription: "Recurring billing, featured placements, and add-ons configured.",\n previewCategory: "Monetization",\n previewStatus: "draft",\n previewUrl: "atlas.directory/billing",\n },\n {\n id: 3,\n label: "SEO & publishing",\n sidebarActive: "seo",\n previewTitle: "Atlas Directory",\n previewDescription: "Schema, sitemap, and custom domain are ready to publish.",\n previewCategory: "SEO & domains",\n previewStatus: "published",\n previewUrl: "atlas.directory/launch",\n },\n {\n id: 4,\n label: "Payouts live",\n sidebarActive: "overview",\n previewTitle: "Atlas Directory",\n previewDescription: "Subscribers active, payouts scheduled to Stripe, featured slots sold.",\n previewCategory: "Revenue",\n previewStatus: "featured",\n previewUrl: "atlas.directory/analytics",\n },\n]\n\ninterface SidebarItemProps {\n icon: string\n label: string\n active?: boolean\n badge?: number\n}\n\nfunction SidebarItem({ icon, label, active, badge }: SidebarItemProps) {\n return (\n <div className={cn("sidebar-item", active && "sidebar-item--active")}>\n <span className="sidebar-icon">{icon}</span>\n <span className="sidebar-label">{label}</span>\n {badge && <span className="sidebar-badge">{badge}</span>}\n </div>\n )\n}\n\nexport function AnimatedMockup() {\n const [currentState, setCurrentState] = useState(0)\n const [isPaused, setIsPaused] = useState(false)\n\n useEffect(() => {\n if (isPaused) return\n\n const interval = setInterval(() => {\n setCurrentState((prev) => (prev + 1) % mockupStates.length)\n }, 3000)\n\n return () => clearInterval(interval)\n }, [isPaused])\n\n const state = mockupStates[currentState]\n\n return (\n <div\n className="mockup-wrapper"\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n {/* Browser Chrome */}\n <div className="mockup-chrome">\n <div className="mockup-chrome-dots">\n <span className="dot dot-red" />\n <span className="dot dot-yellow" />\n <span className="dot dot-green" />\n </div>\n <div className="mockup-chrome-title">SaaSify</div>\n <div className="mockup-chrome-actions" />\n </div>\n\n {/* App Content */}\n <div className="mockup-content">\n {/* Sidebar */}\n <div className="mockup-sidebar">\n <div className="sidebar-header">\n <div className="sidebar-logo">\n <span className="logo-icon">D</span>\n <span className="logo-text">My Directory</span>\n </div>\n </div>\n <nav className="sidebar-nav">\n <SidebarItem icon="\u{1F4CA}" label="Overview" active={state.sidebarActive === "overview"} />\n <SidebarItem icon="\u{1F5BC}\uFE0F" label="Templates" active={state.sidebarActive === "templates"} />\n <SidebarItem\n icon="\u{1F4CB}"\n label="Listings"\n active={state.sidebarActive === "listings"}\n badge={24}\n />\n <SidebarItem\n icon="\u{1F4B3}"\n label="Plans & Billing"\n active={state.sidebarActive === "billing"}\n />\n <SidebarItem\n icon="\u26A1"\n label="Automations"\n active={state.sidebarActive === "automations"}\n />\n <SidebarItem icon="\u{1F50E}" label="SEO" active={state.sidebarActive === "seo"} />\n <SidebarItem icon="\u2699\uFE0F" label="Settings" active={state.sidebarActive === "settings"} />\n </nav>\n </div>\n\n {/* Main Content Area */}\n <div className="mockup-main">\n {/* Header */}\n <div className="main-header">\n <div className="header-title">\n <h2>{state.label}</h2>\n <span className="header-breadcrumb">SaaSify / {state.previewTitle}</span>\n </div>\n <div className="header-actions">\n <button\n type="button"\n className={cn(\n "action-btn",\n state.previewStatus === "published" && "action-btn--success",\n state.previewStatus === "featured" && "action-btn--featured"\n )}\n >\n {state.previewStatus === "draft" && "Save Draft"}\n {state.previewStatus === "published" && "\u2713 Published"}\n {state.previewStatus === "featured" && "\u2B50 Featured"}\n </button>\n </div>\n </div>\n\n {/* Split View: Editor + Preview */}\n <div className="main-split">\n {/* Editor Panel */}\n <div className="editor-panel">\n <div className="editor-section">\n <span className="editor-label">Listing Name</span>\n <div className="editor-input">\n <span className="input-text">{state.previewTitle}</span>\n <span className="input-cursor" />\n </div>\n </div>\n <div className="editor-section">\n <span className="editor-label">Category</span>\n <div className="editor-select">\n <span>{state.previewCategory}</span>\n <span className="select-arrow">\u25BC</span>\n </div>\n </div>\n <div className="editor-section">\n <span className="editor-label">Description</span>\n <div className="editor-textarea">\n <span className={cn("textarea-text", state.id >= 2 && "textarea-text--complete")}>\n {state.previewDescription}\n </span>\n </div>\n </div>\n </div>\n\n {/* Preview Panel */}\n <div className="preview-panel">\n <div className="preview-header">\n <span className="preview-label">Live Preview</span>\n <span className="preview-url">{state.previewUrl ?? "saasify.app/live"}</span>\n </div>\n <div className="preview-card">\n {state.previewStatus === "featured" && (\n <div className="preview-badge">\u2B50 Featured</div>\n )}\n <div className="preview-image">\n <div className="preview-image-placeholder">\n <span>\u{1F3E2}</span>\n </div>\n </div>\n <div className="preview-content">\n <span className="preview-category-tag">{state.previewCategory}</span>\n <h3 className="preview-title">{state.previewTitle}</h3>\n <p className="preview-description">{state.previewDescription}</p>\n <div className="preview-meta">\n <span className="meta-rating">\u2605\u2605\u2605\u2605\u2605</span>\n <span className="meta-reviews">24 reviews</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* State Indicator */}\n <div className="mockup-indicators">\n {mockupStates.map((s, i) => (\n <button\n type="button"\n key={s.id}\n onClick={() => setCurrentState(i)}\n className={cn("indicator", i === currentState && "indicator--active")}\n >\n <span className="indicator-dot" />\n <span className="indicator-label">{s.label}</span>\n </button>\n ))}\n </div>\n </div>\n )\n}\n',
|
|
3143
4245
|
"marketing/nextjs/src/components/heros/ProductShowcaseHero.tsx": '"use client"\n\nimport Link from "next/link"\nimport Image from "next/image"\nimport { AnimatedMockup } from "./AnimatedMockup"\nimport { cn } from "@/lib/utils"\n\ninterface HeroLink {\n label: string\n href: string\n variant: "default" | "outline"\n}\n\ninterface ProductShowcaseHeroProps {\n headline: string\n description: string\n links?: HeroLink[]\n}\n\nexport function ProductShowcaseHero({\n headline = "The modern platform for growing teams",\n description = "Streamline workflows, boost productivity, and scale your business with one powerful platform.",\n links = [\n { label: "Start free trial", href: "/sign-up", variant: "default" },\n { label: "Watch demo", href: "/demo", variant: "outline" },\n ],\n}: ProductShowcaseHeroProps) {\n return (\n <div className="relative overflow-hidden">\n {/* Hero Content - Left Aligned */}\n <div className="container mx-auto px-4 pt-8 pb-16 md:pt-16 md:pb-24">\n <div className="max-w-2xl">\n <h1 className="text-4xl font-bold tracking-tight text-foreground sm:text-5xl md:text-6xl">\n {headline}\n </h1>\n <p className="mt-6 text-lg text-muted-foreground md:text-xl">\n {description}\n </p>\n {links && links.length > 0 && (\n <div className="mt-8 flex flex-wrap gap-4">\n {links.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className={cn(\n "inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md transition-colors",\n link.variant === "default"\n ? "bg-primary text-primary-foreground hover:bg-primary/90"\n : "border border-border bg-background hover:bg-muted"\n )}\n >\n {link.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Product Mockup Section */}\n <div className="container mx-auto px-4">\n <div className="hero-showcase">\n {/* Background Image */}\n <div className="hero-bg-image">\n <Image\n src="/media/hero-bg.png"\n alt=""\n fill\n sizes="(max-width: 1280px) 100vw, 1280px"\n className="object-cover"\n priority\n quality={75}\n />\n </div>\n\n {/* Mockup - centered within background */}\n <div className="hero-mockup-centered">\n <AnimatedMockup />\n </div>\n </div>\n </div>\n </div>\n )\n}\n',
|
|
3144
4246
|
"marketing/nextjs/src/components/heros/index.ts": 'export { ProductShowcaseHero } from "./ProductShowcaseHero"\nexport { AnimatedMockup } from "./AnimatedMockup"\n',
|
|
@@ -3192,6 +4294,7 @@ GCS_CREDENTIALS="{}" # JSON service account key
|
|
|
3192
4294
|
{{/if}}
|
|
3193
4295
|
`,
|
|
3194
4296
|
"marketing/payload/_env.local.hbs": "# Database (Supabase PostgreSQL)\nDATABASE_URL=\n\n# Payload CMS\nPAYLOAD_SECRET=\n\n# Scheduled Jobs\nCRON_SECRET=\n\n# Draft Previews\nPREVIEW_SECRET=\n\n# Email (Resend)\nRESEND_API_KEY=\nRESEND_FROM_EMAIL=\n\n{{#if (eq integrations.payloadStorage 's3')}}\n# S3 Storage\nS3_BUCKET=media\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_REGION=us-east-1\nS3_ENDPOINT=\n{{/if}}\n{{#if (eq integrations.payloadStorage 'r2')}}\n# Cloudflare R2 Storage\nR2_BUCKET=\nR2_ACCESS_KEY_ID=\nR2_SECRET_ACCESS_KEY=\nR2_ENDPOINT=\n{{/if}}\n{{#if (eq integrations.payloadStorage 'vercel-blob')}}\n# Vercel Blob Storage\nBLOB_READ_WRITE_TOKEN=\n{{/if}}\n{{#if (eq integrations.payloadStorage 'gcs')}}\n# Google Cloud Storage\nGCS_BUCKET=\nGCS_PROJECT_ID=\nGCS_CREDENTIALS=\n{{/if}}\n",
|
|
4297
|
+
"marketing/payload/components.json.hbs": '{\n "$schema": "https://ui.shadcn.com/schema.json",\n{{#if (eq shadcn.style "nova")}}\n "style": "new-york",\n{{else if (eq shadcn.style "vega")}}\n "style": "default",\n{{else if (eq shadcn.style "maia")}}\n "style": "new-york",\n{{else if (eq shadcn.style "lyra")}}\n "style": "new-york",\n{{else if (eq shadcn.style "mira")}}\n "style": "default",\n{{else}}\n "style": "new-york",\n{{/if}}\n "rsc": true,\n "tsx": true,\n "tailwind": {\n "config": "",\n "css": "src/app/(frontend)/globals.css",\n "baseColor": "{{shadcn.baseColor}}",\n "cssVariables": true,\n "prefix": ""\n },\n{{#if (eq shadcn.iconLibrary "lucide")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "hugeicons")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "tabler")}}\n "iconLibrary": "lucide",\n{{else if (eq shadcn.iconLibrary "phosphor")}}\n "iconLibrary": "lucide",\n{{else}}\n "iconLibrary": "lucide",\n{{/if}}\n "aliases": {\n "components": "@/components",\n "utils": "@/utilities",\n "ui": "@/components/ui",\n "lib": "@/lib",\n "hooks": "@/hooks"\n },\n "registries": {}\n}\n',
|
|
3195
4298
|
"marketing/payload/next.config.ts.hbs": "import { withPayload } from '@payloadcms/next/withPayload'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n}\n\nexport default withPayload(nextConfig)\n",
|
|
3196
4299
|
"marketing/payload/package.json.hbs": '{\n "name": "@repo/marketing",\n "version": "0.1.0",\n "private": true,\n "type": "module",\n "scripts": {\n "build": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap && next build",\n "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev --port 3000",\n "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",\n "generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types",\n "lint": "biome check .",\n "lint:fix": "biome check --write .",\n "payload": "cross-env NODE_OPTIONS=--no-deprecation payload",\n "start": "cross-env NODE_OPTIONS=--no-deprecation next start",\n "typecheck": "tsc --noEmit",\n "db:push": "payload migrate",\n "db:seed": "tsx src/seed.ts"\n },\n "dependencies": {\n "@payloadcms/admin-bar": "^3.0.0",\n "@payloadcms/db-postgres": "^3.0.0",\n "@payloadcms/email-resend": "^3.0.0",\n "@payloadcms/live-preview-react": "^3.0.0",\n "@payloadcms/next": "^3.0.0",\n "@payloadcms/plugin-form-builder": "^3.0.0",\n "@payloadcms/plugin-nested-docs": "^3.0.0",\n "@payloadcms/plugin-redirects": "^3.0.0",\n "@payloadcms/plugin-search": "^3.0.0",\n "@payloadcms/plugin-seo": "^3.0.0",\n "@payloadcms/richtext-lexical": "^3.0.0",\n "@payloadcms/storage-vercel-blob": "^3.0.0",\n "@payloadcms/ui": "^3.0.0",\n "@radix-ui/react-accordion": "^1.2.0",\n "@radix-ui/react-checkbox": "^1.0.4",\n "@radix-ui/react-label": "^2.0.2",\n "@radix-ui/react-select": "^2.0.0",\n "@radix-ui/react-slot": "^1.0.2",\n "@repo/ui": "workspace:*",\n "class-variance-authority": "^0.7.1",\n "clsx": "^2.1.1",\n "cross-env": "^7.0.3",\n "geist": "^1.3.0",\n "lucide-react": "^0.562.0",\n "next": "^15.4.10",\n "payload": "^3.70.0",\n "posthog-js": "^1.200.0",\n "prism-react-renderer": "^2.4.1",\n "react": "^19.0.0",\n "react-dom": "^19.0.0",\n "react-hook-form": "^7.71.1",\n "sharp": "^0.34.0",\n "stripe": "^17.7.0",\n "tailwind-merge": "^3.4.0"\n },\n "devDependencies": {\n "@repo/config-typescript": "workspace:*",\n "@tailwindcss/postcss": "^4.0.0",\n "@tailwindcss/typography": "^0.5.19",\n "@types/node": "^20.0.0",\n "@types/react": "^19.0.0",\n "@types/react-dom": "^19.0.0",\n "postcss": "^8.4.0",\n "sass": "^1.86.0",\n "tailwindcss": "^4.0.0",\n "tsx": "^4.0.0",\n "tw-animate-css": "^1.4.0",\n "typescript": "^5.0.0"\n }\n}\n',
|
|
3197
4300
|
"marketing/payload/postcss.config.mjs.hbs": "export default {\n plugins: {\n '@tailwindcss/postcss': {},\n },\n}\n",
|
|
@@ -11603,7 +12706,7 @@ export default function Index() {
|
|
|
11603
12706
|
"packages/ui/src/styles.css.hbs": '@import "tailwindcss";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-sidebar-ring: var(--sidebar-ring);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar: var(--sidebar);\n --color-chart-5: var(--chart-5);\n --color-chart-4: var(--chart-4);\n --color-chart-3: var(--chart-3);\n --color-chart-2: var(--chart-2);\n --color-chart-1: var(--chart-1);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n',
|
|
11604
12707
|
"packages/ui/tsconfig.json.hbs": '{\n "compilerOptions": {\n "target": "ES2020",\n "lib": ["dom", "dom.iterable", "esnext"],\n "allowJs": true,\n "skipLibCheck": true,\n "strict": true,\n "noEmit": true,\n "esModuleInterop": true,\n "module": "esnext",\n "moduleResolution": "bundler",\n "resolveJsonModule": true,\n "isolatedModules": true,\n "jsx": "react-jsx",\n "incremental": true,\n "paths": {\n "@/*": ["./src/*"]\n }\n },\n "include": ["src/**/*"],\n "exclude": ["node_modules"]\n}\n',
|
|
11605
12708
|
"web/_env.local.hbs": "# Convex - These values are synced from packages/backend/.env.local after running convex dev\n# NEXT_PUBLIC_CONVEX_URL and NEXT_PUBLIC_CONVEX_SITE_URL are auto-synced by dev script\nNEXT_PUBLIC_CONVEX_URL=\nNEXT_PUBLIC_CONVEX_SITE_URL=\n\n# Site URL for auth (your frontend URL)\nNEXT_PUBLIC_SITE_URL=http://localhost:3000\n{{#if (eq integrations.analytics 'posthog')}}\n\n# PostHog\nNEXT_PUBLIC_POSTHOG_KEY=\nNEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com\n{{/if}}\n{{#if (eq integrations.payments 'stripe')}}\n\n# Stripe\nNEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=\n{{/if}}\n",
|
|
11606
|
-
"web/components.json.hbs": '{\n "$schema": "https://ui.shadcn.com/schema.json",\n "style": "new-york",\n "rsc": true,\n "tsx": true,\n "tailwind": {\n "config": "",\n "css": "src/app/globals.css",\n "baseColor": "{{shadcn.baseColor}}",\n "cssVariables": true,\n "prefix": ""\n },\n "aliases": {\n "components": "@/components",\n "utils": "@/lib/utils",\n "ui": "@/components/ui",\n "lib": "@/lib",\n "hooks": "@/hooks"\n },\n "iconLibrary": "{{shadcn.iconLibrary}}"\n}\n',
|
|
12709
|
+
"web/components.json.hbs": '{\n "$schema": "https://ui.shadcn.com/schema.json",\n{{#if (eq shadcn.style "nova")}}\n "style": "new-york",\n{{else if (eq shadcn.style "vega")}}\n "style": "default",\n{{else}}\n "style": "new-york",\n{{/if}}\n "rsc": true,\n "tsx": true,\n "tailwind": {\n "config": "",\n "css": "src/app/globals.css",\n "baseColor": "{{shadcn.baseColor}}",\n "cssVariables": true,\n "prefix": ""\n },\n "aliases": {\n "components": "@/components",\n "utils": "@/lib/utils",\n "ui": "@/components/ui",\n "lib": "@/lib",\n "hooks": "@/hooks"\n },\n "iconLibrary": "{{shadcn.iconLibrary}}"\n}\n',
|
|
11607
12710
|
"web/next.config.ts.hbs": "import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n{{#if (eq structure 'monorepo')}}\n transpilePackages: ['@repo/ui', '@repo/backend'],\n{{/if}}\n}\n\nexport default nextConfig\n",
|
|
11608
12711
|
"web/package.json.hbs": `{
|
|
11609
12712
|
"name": "{{#if (eq structure 'monorepo')}}@repo/web{{else}}{{projectName}}{{/if}}",
|
|
@@ -11678,7 +12781,7 @@ export default function Index() {
|
|
|
11678
12781
|
"web/src/app/(auth)/sign-in/page.tsx.hbs": "import { SignInForm } from '@/components/auth/sign-in-form'\n\nexport default function SignInPage() {\n return <SignInForm />\n}\n",
|
|
11679
12782
|
"web/src/app/(auth)/sign-up/page.tsx.hbs": "import { SignUpForm } from '@/components/auth/sign-up-form'\n\nexport default function SignUpPage() {\n return <SignUpForm />\n}\n",
|
|
11680
12783
|
"web/src/app/api/auth/[...all]/route.ts.hbs": "import { handler } from '@/lib/auth-server'\n\nexport const { GET, POST } = handler\n",
|
|
11681
|
-
"web/src/app/globals.css.hbs": '@import "tailwindcss";\n@import "tw-animate-css";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-sidebar-ring: var(--sidebar-ring);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar: var(--sidebar);\n --color-chart-5: var(--chart-5);\n --color-chart-4: var(--chart-4);\n --color-chart-3: var(--chart-3);\n --color-chart-2: var(--chart-2);\n --color-chart-1: var(--chart-1);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n --sidebar-ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n',
|
|
12784
|
+
"web/src/app/globals.css.hbs": '@import "tailwindcss";\n@import "tw-animate-css";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-sidebar-ring: var(--sidebar-ring);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar: var(--sidebar);\n --color-chart-5: var(--chart-5);\n --color-chart-4: var(--chart-4);\n --color-chart-3: var(--chart-3);\n --color-chart-2: var(--chart-2);\n --color-chart-1: var(--chart-1);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n\n/* ========================================\n THEME COLOR VARIABLES - LIGHT MODE\n ======================================== */\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.546 0.245 262.881);\n --primary-foreground: oklch(0.985 0.002 247.858);\n --ring: oklch(0.546 0.245 262.881);\n --sidebar-primary: oklch(0.546 0.245 262.881);\n --sidebar-primary-foreground: oklch(0.985 0.002 247.858);\n --sidebar-ring: oklch(0.546 0.245 262.881);\n --chart-1: oklch(0.546 0.245 262.881);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.596 0.145 163.225);\n --primary-foreground: oklch(0.982 0.018 155.826);\n --ring: oklch(0.596 0.145 163.225);\n --sidebar-primary: oklch(0.596 0.145 163.225);\n --sidebar-primary-foreground: oklch(0.982 0.018 155.826);\n --sidebar-ring: oklch(0.596 0.145 163.225);\n --chart-1: oklch(0.596 0.145 163.225);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.627 0.265 303.9);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.627 0.265 303.9);\n --sidebar-primary: oklch(0.627 0.265 303.9);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.627 0.265 303.9);\n --chart-1: oklch(0.627 0.265 303.9);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.637 0.237 25.331);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.637 0.237 25.331);\n --sidebar-primary: oklch(0.637 0.237 25.331);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.637 0.237 25.331);\n --chart-1: oklch(0.637 0.237 25.331);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.705 0.191 47.604);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.705 0.191 47.604);\n --sidebar-primary: oklch(0.705 0.191 47.604);\n --sidebar-primary-foreground: oklch(0.216 0.006 56.043);\n --sidebar-ring: oklch(0.705 0.191 47.604);\n --chart-1: oklch(0.705 0.191 47.604);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.769 0.188 70.08);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.769 0.188 70.08);\n --sidebar-primary: oklch(0.769 0.188 70.08);\n --sidebar-primary-foreground: oklch(0.216 0.006 56.043);\n --sidebar-ring: oklch(0.769 0.188 70.08);\n --chart-1: oklch(0.769 0.188 70.08);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.646 0.222 41.116);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.715 0.143 215.221);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.715 0.143 215.221);\n --sidebar-primary: oklch(0.715 0.143 215.221);\n --sidebar-primary-foreground: oklch(0.216 0.006 56.043);\n --sidebar-ring: oklch(0.715 0.143 215.221);\n --chart-1: oklch(0.715 0.143 215.221);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.696 0.17 162.48);\n --sidebar-primary: oklch(0.696 0.17 162.48);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.696 0.17 162.48);\n --chart-1: oklch(0.696 0.17 162.48);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.667 0.295 322.15);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.667 0.295 322.15);\n --sidebar-primary: oklch(0.667 0.295 322.15);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.667 0.295 322.15);\n --chart-1: oklch(0.667 0.295 322.15);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.585 0.233 277.117);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.585 0.233 277.117);\n --sidebar-primary: oklch(0.585 0.233 277.117);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.585 0.233 277.117);\n --chart-1: oklch(0.585 0.233 277.117);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.768 0.233 130.85);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.768 0.233 130.85);\n --sidebar-primary: oklch(0.768 0.233 130.85);\n --sidebar-primary-foreground: oklch(0.216 0.006 56.043);\n --sidebar-ring: oklch(0.768 0.233 130.85);\n --chart-1: oklch(0.768 0.233 130.85);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.718 0.202 349.761);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.718 0.202 349.761);\n --sidebar-primary: oklch(0.718 0.202 349.761);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.718 0.202 349.761);\n --chart-1: oklch(0.718 0.202 349.761);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.645 0.246 16.439);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.645 0.246 16.439);\n --sidebar-primary: oklch(0.645 0.246 16.439);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.645 0.246 16.439);\n --chart-1: oklch(0.645 0.246 16.439);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.685 0.169 237.323);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.685 0.169 237.323);\n --sidebar-primary: oklch(0.685 0.169 237.323);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.685 0.169 237.323);\n --chart-1: oklch(0.685 0.169 237.323);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.704 0.14 182.503);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.704 0.14 182.503);\n --sidebar-primary: oklch(0.704 0.14 182.503);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.704 0.14 182.503);\n --chart-1: oklch(0.704 0.14 182.503);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.606 0.25 292.717);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.606 0.25 292.717);\n --sidebar-primary: oklch(0.606 0.25 292.717);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.606 0.25 292.717);\n --chart-1: oklch(0.606 0.25 292.717);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.795 0.184 86.047);\n --primary-foreground: oklch(0.216 0.006 56.043);\n --ring: oklch(0.795 0.184 86.047);\n --sidebar-primary: oklch(0.795 0.184 86.047);\n --sidebar-primary-foreground: oklch(0.216 0.006 56.043);\n --sidebar-ring: oklch(0.795 0.184 86.047);\n --chart-1: oklch(0.795 0.184 86.047);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.646 0.222 41.116);\n --chart-5: oklch(0.769 0.188 70.08);\n{{else}}\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.708 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n{{/if}}\n}\n\n/* ========================================\n THEME COLOR VARIABLES - DARK MODE\n ======================================== */\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(1 0 0 / 10%);\n\n{{#if (eq shadcn.themeColor "neutral")}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "blue")}}\n --primary: oklch(0.623 0.214 262.881);\n --primary-foreground: oklch(0.273 0.033 256.848);\n --ring: oklch(0.623 0.214 262.881);\n --sidebar-primary: oklch(0.623 0.214 262.881);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.623 0.214 262.881);\n --chart-1: oklch(0.623 0.214 262.881);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "green")}}\n --primary: oklch(0.696 0.17 162.48);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.696 0.17 162.48);\n --sidebar-primary: oklch(0.696 0.17 162.48);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.696 0.17 162.48);\n --chart-1: oklch(0.696 0.17 162.48);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "purple")}}\n --primary: oklch(0.714 0.203 305.504);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.714 0.203 305.504);\n --sidebar-primary: oklch(0.714 0.203 305.504);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.714 0.203 305.504);\n --chart-1: oklch(0.714 0.203 305.504);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "red")}}\n --primary: oklch(0.704 0.191 22.216);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.704 0.191 22.216);\n --sidebar-primary: oklch(0.704 0.191 22.216);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.704 0.191 22.216);\n --chart-1: oklch(0.704 0.191 22.216);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "orange")}}\n --primary: oklch(0.792 0.17 52.615);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.792 0.17 52.615);\n --sidebar-primary: oklch(0.792 0.17 52.615);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.792 0.17 52.615);\n --chart-1: oklch(0.792 0.17 52.615);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "amber")}}\n --primary: oklch(0.828 0.189 84.429);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.828 0.189 84.429);\n --sidebar-primary: oklch(0.828 0.189 84.429);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.828 0.189 84.429);\n --chart-1: oklch(0.828 0.189 84.429);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.488 0.243 264.376);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "cyan")}}\n --primary: oklch(0.789 0.154 211.53);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.789 0.154 211.53);\n --sidebar-primary: oklch(0.789 0.154 211.53);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.789 0.154 211.53);\n --chart-1: oklch(0.789 0.154 211.53);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "emerald")}}\n --primary: oklch(0.765 0.166 160.391);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.765 0.166 160.391);\n --sidebar-primary: oklch(0.765 0.166 160.391);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.765 0.166 160.391);\n --chart-1: oklch(0.765 0.166 160.391);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "fuchsia")}}\n --primary: oklch(0.74 0.238 322.16);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.74 0.238 322.16);\n --sidebar-primary: oklch(0.74 0.238 322.16);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.74 0.238 322.16);\n --chart-1: oklch(0.74 0.238 322.16);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "indigo")}}\n --primary: oklch(0.673 0.182 276.935);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.673 0.182 276.935);\n --sidebar-primary: oklch(0.673 0.182 276.935);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.673 0.182 276.935);\n --chart-1: oklch(0.673 0.182 276.935);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "lime")}}\n --primary: oklch(0.841 0.238 128.85);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.841 0.238 128.85);\n --sidebar-primary: oklch(0.841 0.238 128.85);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.841 0.238 128.85);\n --chart-1: oklch(0.841 0.238 128.85);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "pink")}}\n --primary: oklch(0.775 0.181 349.761);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.775 0.181 349.761);\n --sidebar-primary: oklch(0.775 0.181 349.761);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.775 0.181 349.761);\n --chart-1: oklch(0.775 0.181 349.761);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "rose")}}\n --primary: oklch(0.712 0.194 13.428);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.712 0.194 13.428);\n --sidebar-primary: oklch(0.712 0.194 13.428);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.712 0.194 13.428);\n --chart-1: oklch(0.712 0.194 13.428);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.488 0.243 264.376);\n{{else if (eq shadcn.themeColor "sky")}}\n --primary: oklch(0.756 0.143 232.661);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.756 0.143 232.661);\n --sidebar-primary: oklch(0.756 0.143 232.661);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.756 0.143 232.661);\n --chart-1: oklch(0.756 0.143 232.661);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "teal")}}\n --primary: oklch(0.777 0.152 181.912);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.777 0.152 181.912);\n --sidebar-primary: oklch(0.777 0.152 181.912);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.777 0.152 181.912);\n --chart-1: oklch(0.777 0.152 181.912);\n --chart-2: oklch(0.488 0.243 264.376);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "violet")}}\n --primary: oklch(0.702 0.183 293.541);\n --primary-foreground: oklch(0.985 0 0);\n --ring: oklch(0.702 0.183 293.541);\n --sidebar-primary: oklch(0.702 0.183 293.541);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.702 0.183 293.541);\n --chart-1: oklch(0.702 0.183 293.541);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.488 0.243 264.376);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else if (eq shadcn.themeColor "yellow")}}\n --primary: oklch(0.852 0.199 91.936);\n --primary-foreground: oklch(0.15 0 0);\n --ring: oklch(0.852 0.199 91.936);\n --sidebar-primary: oklch(0.852 0.199 91.936);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.852 0.199 91.936);\n --chart-1: oklch(0.852 0.199 91.936);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.488 0.243 264.376);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{else}}\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --ring: oklch(0.556 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-ring: oklch(0.556 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n{{/if}}\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n body {\n @apply bg-background text-foreground;\n }\n}\n',
|
|
11682
12785
|
"web/src/app/layout.tsx.hbs": "import type { Metadata } from 'next'\nimport { Geist, Geist_Mono } from 'next/font/google'\nimport { ConvexClientProvider } from '@/components/providers/convex-provider'\n{{#if (eq integrations.analytics 'posthog')}}\nimport { PostHogProvider } from '@/components/providers/posthog-provider'\n{{/if}}\n{{#if (eq integrations.analytics 'vercel')}}\nimport { Analytics } from '@vercel/analytics/react'\nimport { SpeedInsights } from '@vercel/speed-insights/next'\n{{/if}}\nimport './globals.css'\n\nconst geistSans = Geist({\n variable: '--font-geist-sans',\n subsets: ['latin'],\n})\n\nconst geistMono = Geist_Mono({\n variable: '--font-geist-mono',\n subsets: ['latin'],\n})\n\nexport const metadata: Metadata = {\n title: '{{projectName}}',\n description: 'Built with create-kofi-stack',\n}\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\" suppressHydrationWarning>\n <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>\n <ConvexClientProvider>\n {{#if (eq integrations.analytics 'posthog')}}\n <PostHogProvider>\n {children}\n </PostHogProvider>\n {{else}}\n {children}\n {{/if}}\n </ConvexClientProvider>\n {{#if (eq integrations.analytics 'vercel')}}\n <Analytics />\n <SpeedInsights />\n {{/if}}\n </body>\n </html>\n )\n}\n",
|
|
11683
12786
|
"web/src/app/page.tsx.hbs": `'use client'
|
|
11684
12787
|
|