From 96e1358bdcac7aa80e4aa106fc8657875130f55e Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Tue, 15 Sep 2026 22:09:28 -0300 Subject: [PATCH] Refactor how-it-works and pricing sections; update text and layout for clarity. Remove social proof section and related star component. Add demo and FAQ sections for enhanced user guidance. Introduce site configuration files for environment-specific settings. --- Dockerfile | 3 + README.md | 45 +++++-- docker-compose.yml | 2 + package.json | 6 +- src/_data/pricing.json | 23 ++-- src/_data/site.base.json | 20 +++ src/_data/site.dev.json | 6 + src/_data/site.js | 31 +++++ src/_data/site.json | 31 ----- src/_data/site.prod.json | 6 + src/_data/site.qa.json | 6 + src/_includes/layouts/base.njk | 2 + src/_includes/partials/demo.njk | 155 ++++++++++++++++++++++++ src/_includes/partials/faq.njk | 71 +++++++++++ src/_includes/partials/features.njk | 46 +++---- src/_includes/partials/final-cta.njk | 12 +- src/_includes/partials/footer.njk | 49 ++------ src/_includes/partials/header.njk | 10 +- src/_includes/partials/hero.njk | 137 +++------------------ src/_includes/partials/how-it-works.njk | 27 ++--- src/_includes/partials/pricing.njk | 12 +- src/_includes/partials/social-proof.njk | 89 -------------- src/_includes/partials/star.njk | 1 - src/index.njk | 7 +- 24 files changed, 435 insertions(+), 362 deletions(-) create mode 100644 src/_data/site.base.json create mode 100644 src/_data/site.dev.json create mode 100644 src/_data/site.js delete mode 100644 src/_data/site.json create mode 100644 src/_data/site.prod.json create mode 100644 src/_data/site.qa.json create mode 100644 src/_includes/partials/demo.njk create mode 100644 src/_includes/partials/faq.njk delete mode 100644 src/_includes/partials/social-proof.njk delete mode 100644 src/_includes/partials/star.njk diff --git a/Dockerfile b/Dockerfile index feceeb0..c9c73b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,9 @@ WORKDIR /app COPY package*.json ./ RUN npm ci +ARG ELEVENTY_ENV=prod +ENV ELEVENTY_ENV=$ELEVENTY_ENV + COPY . . RUN npm run build diff --git a/README.md b/README.md index f6945f7..0515080 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,31 @@ npm install ## Comandos -| Comando | Descripción | -| ---------------- | ------------------------------------------------------------------ | -| `npm start` | Servidor de desarrollo con recarga en vivo (`http://localhost:8081`) | -| `npm run build` | Genera el sitio estático en la carpeta `dist/` | +| Comando | Descripción | +| ------------------ | ------------------------------------------------------------------ | +| `npm start` | Servidor de desarrollo (entorno `dev`, `http://localhost:8081`) | +| `npm run build` | Genera el sitio estático en `dist/` (entorno `dev`) | +| `npm run build:qa` | Genera el sitio con los links del entorno de pruebas/QA | +| `npm run build:prod`| Genera el sitio con los links de producción | +| `npm start:qa` | Servidor de desarrollo con entorno de pruebas/QA | +| `npm start:prod` | Servidor de desarrollo con entorno de producción | + +## Entornos + +Los links hacia la app (registro e inicio de sesión) se configuran por entorno en `src/_data/site..json`, seleccionados con la variable `ELEVENTY_ENV` (`dev`, `qa` y `prod`; `dev` es el valor por defecto): + +```bash +ELEVENTY_ENV=qa npm run build # o npm run build:qa +``` + +- `src/_data/site.base.json`: datos comunes (nombre, navegación, footer). +- `src/_data/site.dev.json`: `http://localhost:6173/signup` y `/login` (app web en modo desarrollo). +- `src/_data/site.qa.json`: links del entorno de pruebas/QA. +- `src/_data/site.prod.json`: links de producción. + +> **Pendiente**: las URLs de QA (`site.qa.json`) y producción (`site.prod.json`) son placeholders. Confirmá los dominios reales antes de publicar. + +En el build de Docker, `ELEVENTY_ENV` se pasa como *build arg* (por defecto `prod`); docker-compose lo toma de la variable de entorno `ELEVENTY_ENV` del host. ## Acceso desde otros dispositivos @@ -39,21 +60,25 @@ Ejemplo: `http://192.168.x.x:8081` ├── package.json # Scripts y dependencias ├── src/ │ ├── _data/ -│ │ ├── site.json # Datos globales del sitio (nombre, navegación, footer, año) -│ │ └── pricing.json # Precios y monedas por plan (parametrizados) +│ │ ├── site.js # Selector de entorno (ELEVENTY_ENV) + merge de datos del sitio +│ │ ├── site.base.json # Datos comunes del sitio (nombre, navegación, footer) +│ │ ├── site.dev.json # Links de la app por entorno: dev / QA / prod +│ │ ├── site.qa.json +│ │ ├── site.prod.json +│ │ └── pricing.json # Precios y monedas por plan (parametrizados) │ ├── _includes/ │ │ ├── layouts/ │ │ │ └── base.njk # Layout principal (head, Tailwind CDN, dark mode, header/footer) │ │ └── partials/ # Secciones reutilizables de la landing │ │ ├── header.njk # Navbar con toggle de tema y CTA -│ │ ├── hero.njk # Portada con mockup de la app +│ │ ├── hero.njk # Portada con encabezado y CTAs +│ │ ├── demo.njk # Demostración ilustrativa del flujo de trabajo │ │ ├── features.njk # Características │ │ ├── how-it-works.njk# Cómo funciona │ │ ├── pricing.njk # Planes y precios -│ │ ├── social-proof.njk# Métricas y testimonios -│ │ ├── star.njk # SVG de estrella (reutilizable) +│ │ ├── faq.njk # Preguntas frecuentes │ │ ├── final-cta.njk # Llamado a la acción final -│ │ └── footer.njk # Pie de página con redes y enlaces +│ │ └── footer.njk # Pie de página con enlaces válidos │ └── index.njk # Página principal (front matter + includes) ``` diff --git a/docker-compose.yml b/docker-compose.yml index 54c2962..a0f1bb4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,8 @@ services: build: context: . dockerfile: Dockerfile + args: + ELEVENTY_ENV: ${ELEVENTY_ENV:-prod} image: gruperly-landing-page:latest container_name: gruperly-landing-page restart: unless-stopped diff --git a/package.json b/package.json index c72ec0f..dc31291 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,11 @@ "type": "module", "scripts": { "build": "eleventy", - "start": "eleventy --serve" + "build:qa": "ELEVENTY_ENV=qa eleventy", + "build:prod": "ELEVENTY_ENV=prod eleventy", + "start": "eleventy --serve", + "start:qa": "ELEVENTY_ENV=qa eleventy --serve", + "start:prod": "ELEVENTY_ENV=prod eleventy --serve" }, "keywords": [ "eleventy", diff --git a/src/_data/pricing.json b/src/_data/pricing.json index 2b32f96..555697e 100644 --- a/src/_data/pricing.json +++ b/src/_data/pricing.json @@ -6,31 +6,30 @@ "plans": [ { "name": "Starter", - "tagline": "Para grupos pequeños que están comenzando.", + "tagline": "Para quienes recién empiezan con grupos chicos.", "price": { "ars": 0, "usd": 0 }, "cta": "Empezar gratis", "ctaStyle": "outline", "features": [ - "Hasta 50 miembros", - "1 evento al mes", - "Analíticas básicas", - "Soporte por correo" + "Hasta 50 participantes", + "Clases recurrentes con días y horarios", + "1 evento especial al mes", + "Cobros mensuales o por clase" ] }, { "name": "Pro", - "tagline": "Para comunidades en crecimiento con funciones avanzadas.", + "tagline": "Para quienes manejan varios grupos y más participantes.", "price": { "ars": 30000, "usd": 25 }, "cta": "Empezar", "ctaStyle": "solid", "highlight": true, - "badge": "Más conveniente", + "badge": "Para crecer", "features": [ - "Miembros ilimitados", - "Eventos ilimitados", - "Automatizaciones ilimitadas", - "Analíticas avanzadas", - "Soporte prioritario" + "Todo lo del plan Starter", + "Más grupos y participantes que en Starter", + "Más eventos especiales por mes que en Starter", + "Seguimiento de cobros: al día, pendientes y atrasados" ] } ] diff --git a/src/_data/site.base.json b/src/_data/site.base.json new file mode 100644 index 0000000..fa9bb49 --- /dev/null +++ b/src/_data/site.base.json @@ -0,0 +1,20 @@ +{ + "name": "Gruperly", + "description": "Organizá tus actividades recurrentes, gestioná reservas y asistencia, y creá workshops o encuentros especiales con Gruperly.", + "url": "https://gruperly.com", + "year": "2026", + "nav": [ + { "label": "Características", "href": "#caracteristicas" }, + { "label": "Cómo funciona", "href": "#como-funciona" }, + { "label": "Precios", "href": "#precios" }, + { "label": "Preguntas frecuentes", "href": "#faq" } + ], + "footer": { + "producto": [ + { "label": "Características", "href": "#caracteristicas" }, + { "label": "Cómo funciona", "href": "#como-funciona" }, + { "label": "Precios", "href": "#precios" }, + { "label": "Preguntas frecuentes", "href": "#faq" } + ] + } +} \ No newline at end of file diff --git a/src/_data/site.dev.json b/src/_data/site.dev.json new file mode 100644 index 0000000..d285866 --- /dev/null +++ b/src/_data/site.dev.json @@ -0,0 +1,6 @@ +{ + "app": { + "signup": "http://localhost:6173/signup", + "login": "http://localhost:6173/login" + } +} \ No newline at end of file diff --git a/src/_data/site.js b/src/_data/site.js new file mode 100644 index 0000000..bf115f4 --- /dev/null +++ b/src/_data/site.js @@ -0,0 +1,31 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const dir = path.dirname(fileURLToPath(import.meta.url)); +const env = process.env.ELEVENTY_ENV || "dev"; + +function readJson(file) { + return JSON.parse(fs.readFileSync(path.join(dir, file), "utf8")); +} + +function mergeDeep(base, extra) { + if (!extra || typeof extra !== "object" || Array.isArray(extra)) { + return extra === undefined ? base : extra; + } + const result = { ...base }; + for (const key of Object.keys(extra)) { + result[key] = + base[key] && typeof base[key] === "object" && !Array.isArray(base[key]) + ? mergeDeep(base[key], extra[key]) + : extra[key]; + } + return result; +} + +const base = readJson("site.base.json"); + +const envFile = `site.${env}.json`; +const override = fs.existsSync(path.join(dir, envFile)) ? readJson(envFile) : {}; + +export default mergeDeep(base, override); \ No newline at end of file diff --git a/src/_data/site.json b/src/_data/site.json deleted file mode 100644 index 9723fa2..0000000 --- a/src/_data/site.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "Gruperly", - "description": "Gruperly es la plataforma SaaS para la gestión, organización y potenciación de comunidades y grupos.", - "url": "https://gruperly.com", - "year": "2026", - "nav": [ - { "label": "Características", "href": "#caracteristicas" }, - { "label": "Cómo funciona", "href": "#como-funciona" }, - { "label": "Precios", "href": "#precios" } - ], - "footer": { - "producto": [ - { "label": "Características", "href": "#caracteristicas" }, - { "label": "Precios", "href": "#precios" }, - { "label": "Integraciones", "href": "#" }, - { "label": "Novedades", "href": "#" } - ], - "empresa": [ - { "label": "Sobre nosotros", "href": "#" }, - { "label": "Blog", "href": "#" }, - { "label": "Empleo", "href": "#" }, - { "label": "Contacto", "href": "#" } - ], - "legal": [ - { "label": "Privacidad", "href": "#" }, - { "label": "Términos", "href": "#" }, - { "label": "Seguridad", "href": "#" }, - { "label": "Cookies", "href": "#" } - ] - } -} \ No newline at end of file diff --git a/src/_data/site.prod.json b/src/_data/site.prod.json new file mode 100644 index 0000000..63ef02d --- /dev/null +++ b/src/_data/site.prod.json @@ -0,0 +1,6 @@ +{ + "app": { + "signup": "https://app.gruperly.com/signup", + "login": "https://app.gruperly.com/login" + } +} \ No newline at end of file diff --git a/src/_data/site.qa.json b/src/_data/site.qa.json new file mode 100644 index 0000000..098d27b --- /dev/null +++ b/src/_data/site.qa.json @@ -0,0 +1,6 @@ +{ + "app": { + "signup": "https://app.qa.gruperly.com/signup", + "login": "https://app.qa.gruperly.com/login" + } +} \ No newline at end of file diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk index 6626497..59bdd6a 100644 --- a/src/_includes/layouts/base.njk +++ b/src/_includes/layouts/base.njk @@ -75,6 +75,8 @@