Hazla tuya
Dónde cambiar el nombre, los textos, las imágenes, los precios, los colores, las fuentes, las secciones y los enlaces.
Ejecuta el sitio con yarn dev mientras editas: la página se recarga cada vez que guardas. Todas las rutas de abajo son relativas a la carpeta landing-page-template-2.
| Para cambiar | Edita |
|---|---|
| El nombre de la marca | name en src/config/site.ts |
| Cualquier texto de la página | messages/en.json y messages/ar.json |
| Imágenes y logotipos | public/ y la carpeta constants/ de cada sección |
| Precios y planes | src/features/home/Pricing/constants/plans.ts y src/features/home/ComparisonTable/constants/ |
| Colores | src/styles/globals.css y las clases de Tailwind en los componentes |
| Fuentes | src/lib/fonts.ts |
| Qué secciones aparecen, y su orden | src/app/[locale]/page.tsx |
| Enlaces del menú, del pie de página y de redes sociales | src/layouts/Header/constants/, src/layouts/Footer/constants/footer.ts, src/config/site.ts |
| La dirección del sitio para buscadores y para compartir | NEXT_PUBLIC_SITE_URL |
Los dos ajustes
| Variable | Valor por defecto | Qué hace |
|---|---|---|
NEXT_PUBLIC_SITE_URL | http://localhost:3030 | La dirección pública del sitio. A partir de ella se crean el enlace canonical, las alternativas de idioma y las tarjetas para compartir en redes sociales. Ponle tu dominio antes de publicar. |
NEXT_PUBLIC_API_BASE_URL | vacío | La API que recibe las suscripciones a la newsletter. Solo la usa la sección de newsletter. |
Sin Docker, ponlos en .env.local (copia .env.example). Con Docker, pásalos como argumentos de construcción: la construcción de la imagen no lee los archivos .env ni .env.local.
NEXT_PUBLIC_SITE_URL=https://www.your-domain.comlanding-page-template-2docker build -t saas-landing --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-domain.com .Ambos valores se compilan en la página al construirla. Después de un cambio, reinicia yarn dev, vuelve a ejecutar yarn build o vuelve a construir la imagen de Docker. Nunca pongas un secreto en un valor NEXT_PUBLIC_: cualquier visitante puede leerlo.
El nombre de la marca y el logotipo
name en src/config/site.ts es la marca. El logotipo del encabezado y del pie de página es su primera letra en un cuadrado de color, seguida del nombre, y lo dibuja src/components/Logo.tsx. Los textos que dicen {brand} en los archivos de mensajes también lo usan.
name: "SaasPro",El mismo valor rellena el título de la página, la tarjeta para compartir en redes, el menú Resources y el manifiesto de la aplicación web, que src/app/manifest.ts genera con los colores oscuros de la página. Cambias el nombre en un solo sitio.
creator, en el mismo archivo, es el autor que aparece en los metadatos de la página. Cámbialo también.
Texto
Cada palabra visible, cada descripción de imagen y el título de la página están en messages/en.json y messages/ar.json. Cada sección tiene su propio bloque, con su nombre: Header, Hero, SocialProof, Features, HowItWorks, Testimonials, Pricing, Comparison, Integrations, Faq, Blog, Cta, Newsletter y Footer.
- Cambia el valor, conserva la clave y cámbialo en ambos archivos. Una clave que falta en un archivo aparece como un error de mensaje ausente en la página de ese idioma.
- Las palabras entre llaves, como
{brand}y{year}, las rellena la aplicación. Consérvalas tal cual. - En
HowItWorks.title, las palabras entre<highlight>y</highlight>se muestran con el color degradado. Conserva ambas etiquetas.
Imágenes
| Imagen | Archivo | Se define en |
|---|---|---|
| Imagen del hero | public/images/hero.webp | src/features/home/Hero/constants/hero.ts |
| Cómo funciona, una por paso | public/images/dashboard.png, team.png, webinar.png, automation.png | src/features/home/HowItWorks/constants/steps.ts |
| Imágenes de los menús del encabezado | public/images/dashboard.png, webinar.png | src/layouts/Header/constants/mega-menus.ts |
| Logotipos de empresas | public/images/logos/*.svg | src/features/home/SocialProof/constants/companies.ts |
| Logotipos de integraciones | public/images/logos/*.svg | src/features/home/Integrations/constants/integrations.ts |
| Fotos de los testimonios | images.unsplash.com | src/features/home/Testimonials/constants/testimonials.ts |
| Imágenes de las tarjetas del blog | images.unsplash.com | src/features/home/BlogPreview/constants/articles.ts |
| Favicons | public/favicon.svg, favicon.ico, favicon-96x96.png, apple-touch-icon.png, web-app-manifest-*.png | src/app/[locale]/layout.tsx, src/app/manifest.ts |
| Imagen para compartir en redes sociales, de 1200 por 630 | public/image.png | ogImage en src/config/site.ts |
El cambio más fácil es reemplazar un archivo por uno tuyo con el mismo nombre. Para un archivo nuevo, ponlo en public/ y usa su ruta desde la raíz del sitio, como /images/your-photo.jpg.
Una imagen de otro sitio web solo se carga si su host figura en images.remotePatterns en next.config.js. Solo figura images.unsplash.com. Añade ahí tu host, o copia los archivos en public/.
remotePatterns: [
{ protocol: "https", hostname: "images.unsplash.com" },
{ protocol: "https", hostname: "cdn.your-domain.com" },
],Precios y planes
Los precios están en dos lugares, uno por sección. Cambia ambos para que coincidan:
| Sección | Precios y características | Texto |
|---|---|---|
| Tarjetas de precios | src/features/home/Pricing/constants/plans.ts: price, featureIds y popular por plan | Pricing.plans en los archivos de mensajes |
| Tabla comparativa | src/features/home/ComparisonTable/constants/pricing-tiers.ts para los precios, comparison-features.ts para lo que incluye cada plan | Comparison.tiers y Comparison.features en los archivos de mensajes |
Las características de un plan se listan por id en featureIds, y cada id necesita su texto bajo el plan en ambos archivos de mensajes. popular: true marca el plan con la insignia Most Popular.
Los precios son mensuales, en dólares estadounidenses, y src/hooks/usePriceFormatter.ts les da el formato del idioma de la página. Para mostrar otra moneda, cambia su valor por defecto currency = "USD" por el código de tu moneda, como "EUR".
Colores
- Los colores de acento: clases de Tailwind moradas y rosas (
purple-*,pink-*) en los componentes, comofrom-purple-600 to-pink-500en los botones y el logotipo. Buscapurple-ypink-en la carpetasrcpara cambiarlas todas. - El fondo de la página:
bg-gray-950en el elemento exterior de la página ensrc/app/[locale]/page.tsx. Las secciones usan clasesgray-*sobre él. - El botón y el campo compartidos: las variables CSS de
src/styles/globals.css, como--primaryy--ring. El bloque.darkes el que se usa.
La página siempre es oscura: src/app/[locale]/layout.tsx añade la clase dark e inicia el proveedor de tema con defaultTheme="dark". No hay tema claro ni selector de tema.
Fuentes
src/lib/fonts.ts carga Inter para el inglés y Noto Sans Arabic para el árabe desde Google Fonts, mediante next/font. Las fuentes se descargan al construir el sitio y luego las sirve el propio sitio. src/app/[locale]/layout.tsx elige la fuente según el idioma.
import { Inter, Noto_Sans_Arabic } from "next/font/google";
export const inter = Inter({ subsets: ["latin"] });
export const notoSansArabic = Noto_Sans_Arabic({ subsets: ["arabic"] });Para usar otra fuente de Google, impórtala desde next/font/google en lugar de una de estas y conserva el nombre exportado, o cambia el nombre donde lo usa layout.tsx.
Secciones
src/app/[locale]/page.tsx lista las secciones en el orden en que aparecen. Elimina una línea para ocultar una sección, o muévela para cambiar el orden. Cada sección está en su propia carpeta dentro de src/features/home/.
<Header />
<Hero />
<SocialProof />
<Features />
<HowItWorks />
<Testimonials />
<Pricing />
<ComparisonTable />
<Integrations />
<Faq />
<BlogPreview />
<Cta />
<Footer />El encabezado enlaza a las secciones por su id, como #pricing y #testimonials. Si eliminas una sección, elimina también su enlace.
Para añadir una sección:
- Crea
src/features/home/<Section>/con unindex.tsxy las carpetascomponents/yconstants/, como tienen las demás secciones. - Añade sus textos bajo una clave nueva en ambos archivos de mensajes y léelos con
useTranslations. - Expórtala desde
src/features/home/index.tsy colócala ensrc/app/[locale]/page.tsx.
La sección de newsletter
En src/features/home/Newsletter/ se incluye una sección de newsletter con un formulario de correo electrónico, pero no está en la página. Para mostrarla, impórtala junto a las demás y colócala, por ejemplo antes de la llamada a la acción:
import {
…
BlogPreview,
Newsletter,
Cta,
} from "@/features/home";
<BlogPreview />
<Newsletter />
<Cta />El formulario necesita una API propia. Configura NEXT_PUBLIC_API_BASE_URL con su dirección; el formulario envía { "email": "…" } como JSON en un POST a <NEXT_PUBLIC_API_BASE_URL>/newsletter/subscribe, directamente desde el navegador del visitante.
- Una respuesta
2xxmuestra el mensaje de éxito y vacía el formulario. - Cualquier otra respuesta, un error de red o una
NEXT_PUBLIC_API_BASE_URLvacía muestran el mensaje de error. No se envía nada mientras la variable está vacía. - Como es el navegador quien envía la solicitud, tu API debe permitir la dirección de tu sitio en sus ajustes de CORS.
Los textos están bajo Newsletter en los archivos de mensajes.
Enlaces y botones
La mayoría de los enlaces de la plantilla apuntan a # hasta que les das un destino:
| Enlaces | Edita |
|---|---|
| Enlaces del encabezado (Pricing, Testimonials) | src/layouts/Header/constants/nav-links.ts |
| Menús Products y Resources | src/layouts/Header/constants/mega-menus.ts |
| Menú móvil | src/layouts/Header/constants/mobile-menu.ts |
| Columnas del pie de página | footerColumns en src/layouts/Footer/constants/footer.ts |
| Iconos de redes sociales en el pie de página | links en src/config/site.ts |
| Log in en el encabezado | src/layouts/Header/components/HeaderActions.tsx |
| Botón de Cómo funciona y enlaces de los pasos | src/features/home/HowItWorks/components/CtaButton.tsx y StepDetails.tsx |
| Tarjetas del blog | src/features/home/BlogPreview/components/ArticleCard.tsx |
Los botones Get Started, Start Free Trial y Book a Demo, y los botones de las tarjetas de precios, son botones simples sin destino. Para convertir uno en enlace, dale al Button la prop asChild y pon un Link dentro, como hace src/components/LocaleSwitcher.tsx:
import { Link } from "@/i18n/navigation";
<Button asChild className="…">
<Link href="/signup">{common("getStarted")}</Link>
</Button>El Link de @/i18n/navigation mantiene el idioma del visitante en la dirección. Para otro sitio web, usa en su lugar un <a href="https://…"> simple.
Fechas y el año del copyright
- El año del copyright del pie de página es el año en que se construyó el sitio, desde
COPYRIGHT_YEARensrc/layouts/Footer/constants/footer.ts. Vuelve a construirlo en un año nuevo para actualizarlo. - La fecha y el tiempo de lectura de cada tarjeta del blog son
publishedAtyreadMinutesensrc/features/home/BlogPreview/constants/articles.ts; su título y su resumen están bajoBlogen los archivos de mensajes.
Buscadores y compartir
- El título y la descripción de la página son
Metadata.titleyMetadata.descriptionen cada archivo de mensajes, así que cada idioma tiene los suyos. NEXT_PUBLIC_SITE_URLda a cada página su dirección canonical (/eno/ar) y los enlaces entre los dos idiomas. Ponle tu dominio antes de construir para producción, o los buscadores y las tarjetas sociales apuntarán alocalhost.- La tarjeta para compartir en redes sociales usa
public/image.png(1200 por 630) con el mismo título y la misma descripción. - La plantilla no incluye
sitemap.xmlnirobots.txt.