diff --git a/mvp/b2c/next.config.ts b/mvp/b2c/next.config.ts index fffffc4..05c7a96 100644 --- a/mvp/b2c/next.config.ts +++ b/mvp/b2c/next.config.ts @@ -4,10 +4,17 @@ const nextConfig: NextConfig = { // @react-pdf/renderer usa módulos nativos/wasm (yoga, fontkit) que no deben bundlearse. serverExternalPackages: ['@react-pdf/renderer'], async rewrites() { - return [ - // Landing B2B estática (mvp/b2b) servida en /b2b. El fichero vive en public/b2b.html. - { source: "/b2b", destination: "/b2b.html" }, - ]; + // beforeFiles: estas reglas ganan a las rutas del filesystem (incluida [slug]). + // La raíz y /b2b sirven la landing B2B estática (public/b2b.html); cada reformista + // tiene su funnel en /{slug} vía app/[slug]/page.tsx. + return { + beforeFiles: [ + { source: "/", destination: "/b2b.html" }, + { source: "/b2b", destination: "/b2b.html" }, + ], + afterFiles: [], + fallback: [], + }; }, }; diff --git a/mvp/b2c/src/app/[slug]/page.tsx b/mvp/b2c/src/app/[slug]/page.tsx new file mode 100644 index 0000000..0bd8ef3 --- /dev/null +++ b/mvp/b2c/src/app/[slug]/page.tsx @@ -0,0 +1,44 @@ +import type { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import Hero from '@/components/Hero/Hero'; +import ReformaSlider from '@/components/ReformaSlider/ReformaSlider'; +import Features from '@/components/Features/Features'; +import Testimonials from '@/components/Testimonials/Testimonials'; +import Footer from '@/components/Footer/Footer'; +import TenantBrand from '@/components/funnel/TenantBrand'; +import { getTenantBySlug } from '@/lib/funnel/public-queries'; + +export const dynamic = 'force-dynamic'; + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string }>; +}): Promise { + const { slug } = await params; + const tenant = await getTenantBySlug(slug); + if (!tenant) return { title: 'Reforma no encontrada' }; + return { + title: `${tenant.nombreEmpresa} · Presupuesto de reforma`, + description: `Pide tu presupuesto de reforma a ${tenant.nombreEmpresa}. Render IA y presupuesto orientativo en minutos.`, + }; +} + +export default async function FunnelPage({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const tenant = await getTenantBySlug(slug); + if (!tenant) notFound(); + + return ( + <> + +
+ + + + +
+