<<<<<<< HEAD Framer-style marketing site built with Next.js, deployed on Cloudflare Pages with Supabase backend for lead capture.
Framer-style marketing site built with Next.js, deployed on Cloudflare Pages with Supabase backend.
beb1ea251b23458612440d77875abcc4b9ef2f24
- Next.js 15 (App Router, Static Export) + TypeScript
- TailwindCSS with CSS variable tokens + shadcn/ui (Button, Card, Input, Textarea, Dialog)
- Framer Motion entrance animations
- React Hook Form + Zod for validated lead capture
- Cloudflare Pages Functions for serverless API
- Supabase PostgreSQL for lead storage
- Optional PostHog analytics (client-side, env-gated)
- Install dependencies:
npm install - Run the dev server:
npm run dev - Open
http://localhost:3000
npm run dev- start Next.js in dev modenpm run build- production buildnpm run start- start the built appnpm run lint- ESLintnpm run typecheck- TypeScript without emitnpm run format- Prettier format (Tailwind plugin included)npm run sitemap- generate sitemap/robots via next-sitemap
<<<<<<< HEAD
See DEPLOYMENT.md for Cloudflare Pages deployment instructions.
See DEPLOYMENT.md for complete Cloudflare Pages deployment instructions.
Quick setup:
beb1ea251b23458612440d77875abcc4b9ef2f24
- Connect your GitHub repo to Cloudflare Pages
- Set build command:
npm run build - Set output directory:
out - Add environment variables:
SUPABASE_URLandSUPABASE_SERVICE_ROLE_KEY - Deploy
- Copy & links:
content/site.ts(nav, hero, features, CTA, footer, Calendly URL) - Design tokens/theme:
app/globals.cssfor CSS variables +tailwind.config.tsfor mapping/fonts/container - Sections:
components/sections/*(Hero with motion, Features grid, CTA with Calendly + lead form) - Layout:
components/layout/*for Navbar/Footer/Container - Lead capture:
components/sections/LeadForm.tsxposts to/api/lead(Cloudflare Pages Function) - Calendly: set
siteConfig.cta.calendlyUrlincontent/site.ts; inline embed supported viaCTAcomponent - Analytics: set
NEXT_PUBLIC_POSTHOG_KEY(and optionalNEXT_PUBLIC_POSTHOG_HOST) to enablecomponents/Analytics.tsx - SEO: defaults in
content/site.ts+lib/seo.ts; setNEXT_PUBLIC_SITE_URLto correct metadata/sitemaps
- shadcn/ui initialized via
components.json; primitives live incomponents/ui/ - Prettier +
prettier-plugin-tailwindcssand VS Code settings for format on save - ESLint (Next core web vitals) and strict TypeScript
app/
layout.tsx # Global metadata, fonts, Analytics injection
page.tsx # Page composition (Navbar, Hero, Features, CTA, Footer)
globals.css # Tailwind + design tokens
components/
layout/ # Navbar, Footer, Container
sections/ # Hero, Features, CTA, LeadForm
ui/ # shadcn/ui components (Button, Card, Input, Textarea, Dialog)
functions/
api/lead.ts # Cloudflare Pages Function for lead capture
lib/ # env, seo, utils, validations
content/site.ts # Single source of truth for copy/links
out/ # Build output (static site)
<<<<<<< HEAD
See .env.example for local development and DEPLOYMENT.md for production setup.
See .env.example for local development and DEPLOYMENT.md for production setup.
Local development:
beb1ea251b23458612440d77875abcc4b9ef2f24
NEXT_PUBLIC_SITE_URL=http://localhost:3000
NEXT_PUBLIC_POSTHOG_KEY=
NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com
<<<<<<< HEAD Production (Cloudflare Pages):
NEXT_PUBLIC_SITE_URL=https://datamodulator.ro
SUPABASE_URL=https://your-project-url.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
Optional (Mailgun email notifications):
MAILGUN_API_KEY=your-mailgun-api-key
MAILGUN_DOMAIN=your-domain.mailgun.org
MAILGUN_FROM="DM Growth <no-reply@your-domain.com>"
MAILGUN_TO=you@your-domain.com
MAILGUN_API_BASE=https://api.mailgun.net
All form submissions are stored in Supabase PostgreSQL. Access your leads in the Supabase dashboard -> Table Editor -> leads table.
Production (Cloudflare Pages):
NEXT_PUBLIC_SITE_URL=https://datamodulator.ro
SUPABASE_URL=your-project-url.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
All form submissions are stored in Supabase PostgreSQL. Access your leads in the Supabase dashboard → Table Editor → leads table.
beb1ea251b23458612440d77875abcc4b9ef2f24