Ir al artículo
Aniq-UI

SaaS Landing PageHazla tuya

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 cambiarEdita
El nombre de la marcaname en src/config/site.ts
Cualquier texto de la páginamessages/en.json y messages/ar.json
Imágenes y logotipospublic/ y la carpeta constants/ de cada sección
Precios y planessrc/features/home/Pricing/constants/plans.ts y src/features/home/ComparisonTable/constants/
Coloressrc/styles/globals.css y las clases de Tailwind en los componentes
Fuentessrc/lib/fonts.ts
Qué secciones aparecen, y su ordensrc/app/[locale]/page.tsx
Enlaces del menú, del pie de página y de redes socialessrc/layouts/Header/constants/, src/layouts/Footer/constants/footer.ts, src/config/site.ts
La dirección del sitio para buscadores y para compartirNEXT_PUBLIC_SITE_URL

Los dos ajustes

VariableValor por defectoQué hace
NEXT_PUBLIC_SITE_URLhttp://localhost:3030La 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_URLvacíoLa 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.

.env.local
NEXT_PUBLIC_SITE_URL=https://www.your-domain.com
Terminalen landing-page-template-2
docker 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.

src/config/site.ts
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

ImagenArchivoSe define en
Imagen del heropublic/images/hero.webpsrc/features/home/Hero/constants/hero.ts
Cómo funciona, una por pasopublic/images/dashboard.png, team.png, webinar.png, automation.pngsrc/features/home/HowItWorks/constants/steps.ts
Imágenes de los menús del encabezadopublic/images/dashboard.png, webinar.pngsrc/layouts/Header/constants/mega-menus.ts
Logotipos de empresaspublic/images/logos/*.svgsrc/features/home/SocialProof/constants/companies.ts
Logotipos de integracionespublic/images/logos/*.svgsrc/features/home/Integrations/constants/integrations.ts
Fotos de los testimoniosimages.unsplash.comsrc/features/home/Testimonials/constants/testimonials.ts
Imágenes de las tarjetas del blogimages.unsplash.comsrc/features/home/BlogPreview/constants/articles.ts
Faviconspublic/favicon.svg, favicon.ico, favicon-96x96.png, apple-touch-icon.png, web-app-manifest-*.pngsrc/app/[locale]/layout.tsx, src/app/manifest.ts
Imagen para compartir en redes sociales, de 1200 por 630public/image.pngogImage 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/.

next.config.js
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ónPrecios y característicasTexto
Tarjetas de preciossrc/features/home/Pricing/constants/plans.ts: price, featureIds y popular por planPricing.plans en los archivos de mensajes
Tabla comparativasrc/features/home/ComparisonTable/constants/pricing-tiers.ts para los precios, comparison-features.ts para lo que incluye cada planComparison.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, como from-purple-600 to-pink-500 en los botones y el logotipo. Busca purple- y pink- en la carpeta src para cambiarlas todas.
  • El fondo de la página: bg-gray-950 en el elemento exterior de la página en src/app/[locale]/page.tsx. Las secciones usan clases gray-* sobre él.
  • El botón y el campo compartidos: las variables CSS de src/styles/globals.css, como --primary y --ring. El bloque .dark es 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.

src/lib/fonts.ts
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/.

src/app/[locale]/page.tsx
<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:

  1. Crea src/features/home/<Section>/ con un index.tsx y las carpetas components/ y constants/, como tienen las demás secciones.
  2. Añade sus textos bajo una clave nueva en ambos archivos de mensajes y léelos con useTranslations.
  3. Expórtala desde src/features/home/index.ts y colócala en src/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:

src/app/[locale]/page.tsx
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 2xx muestra el mensaje de éxito y vacía el formulario.
  • Cualquier otra respuesta, un error de red o una NEXT_PUBLIC_API_BASE_URL vací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.

La mayoría de los enlaces de la plantilla apuntan a # hasta que les das un destino:

EnlacesEdita
Enlaces del encabezado (Pricing, Testimonials)src/layouts/Header/constants/nav-links.ts
Menús Products y Resourcessrc/layouts/Header/constants/mega-menus.ts
Menú móvilsrc/layouts/Header/constants/mobile-menu.ts
Columnas del pie de páginafooterColumns en src/layouts/Footer/constants/footer.ts
Iconos de redes sociales en el pie de páginalinks en src/config/site.ts
Log in en el encabezadosrc/layouts/Header/components/HeaderActions.tsx
Botón de Cómo funciona y enlaces de los pasossrc/features/home/HowItWorks/components/CtaButton.tsx y StepDetails.tsx
Tarjetas del blogsrc/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:

TypeScript
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_YEAR en src/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 publishedAt y readMinutes en src/features/home/BlogPreview/constants/articles.ts; su título y su resumen están bajo Blog en los archivos de mensajes.

Buscadores y compartir

  • El título y la descripción de la página son Metadata.title y Metadata.description en cada archivo de mensajes, así que cada idioma tiene los suyos.
  • NEXT_PUBLIC_SITE_URL da a cada página su dirección canonical (/en o /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 a localhost.
  • 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.xml ni robots.txt.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.