# dylanmazzei.com Sitio de Dylan Mazzei, Founder & Operator. HTML estático generado con un script de Node sin dependencias. ## Estructura ``` src/layout.mjs Layout compartido: , nav, footer, iconos y helpers src/pages/*.mjs Una página por archivo (texto literal del documento de contenido) src/service.mjs Bloques compartidos de las páginas de servicios de Consulting static/ Se copia tal cual a dist/ (CSS, JS, imágenes, favicon) build.mjs Genera dist/ + sitemap.xml + robots.txt + 404.html ``` | Ruta | Archivo | |------|---------| | `/` | `src/pages/home.mjs` | | `/about/` | `src/pages/about.mjs` | | `/portfolio/` | `src/pages/portfolio.mjs` | | `/consulting/` | `src/pages/consulting.mjs` | | `/consulting/marketing/` | `src/pages/marketing.mjs` | | `/consulting/business-setup/` | `src/pages/business-setup.mjs` | | `/consulting/business-optimization/` | `src/pages/business-optimization.mjs` | | `/consulting/supply-chain/` | `src/pages/supply-chain.mjs` | | `/consulting/cybersecurity/` | `src/pages/cybersecurity.mjs` | | `/consulting/education/` | `src/pages/education.mjs` | | `/consulting/fractional/` | `src/pages/fractional.mjs` | | `/contact/` | `src/pages/contact.mjs` | | `/contact/book/` | `src/pages/book.mjs` | | `/press/` | `src/pages/press.mjs` | ## Idiomas El sitio sale en inglés (`/`), español (`/es/`) y árabe (`/ar/`, de derecha a izquierda), con selector EN · ES · AR en la barra de navegación, `hreflang` en cada página y un `sitemap.xml` multilingüe. Las páginas se escriben en inglés. Al construir, `build.mjs` genera las versiones traducidas sustituyendo cada texto por su traducción de `src/i18n/es.json` y `src/i18n/ar.json` (clave = texto en inglés). Los textos que ponen los scripts del navegador están en `JS_STRINGS` (`src/i18n.mjs`). Los ajustes de diseño para árabe están en `static/assets/rtl.css`. Si cambias un texto en inglés, su traducción deja de coincidir y esa frase se ve en inglés en `/es/` y `/ar/`. El build lo avisa; para listar lo que falta: ```bash node scripts/i18n-extract.mjs # cuántos textos faltan por idioma node scripts/i18n-extract.mjs es falta.json # los textos en español que faltan, para traducir npm run build -- --strict # falla si falta alguna traducción ``` El formulario y el calendario de GoHighLevel se muestran tal como están configurados en GoHighLevel (en inglés). ## Desarrollo ```bash npm run build # genera dist/ npm run dev # build + servidor local ``` ## Deploy en Vercel Importa el repo en Vercel. `vercel.json` ya define el build (`npm run build`), la salida (`dist`) y las URLs limpias con slash final. No hace falta configurar nada más. ## Pendientes de contenido - **Press:** falta el link del artículo de Gulf Insider y confirmar su titular exacto (`FEATURE` en `src/pages/press.mjs`). - **Korrith:** falta el cargo de Dylan (el tercer campo, vacío, en `src/pages/portfolio.mjs`). - **Páginas fuera del alcance actual:** Playbook y Poetry no forman parte del sitio. Sus secciones se muestran sin botón; si se crean esas páginas, se añade el botón con su texto original del documento. - **Formulario y agenda (GoHighLevel):** los IDs están en `SITE.ghl` (`src/layout.mjs`). En GoHighLevel, el formulario "Dylan – Lead Form" debe redirigir a `https://dylanmazzei.com/contact/book/?submitted=1` al enviarse. Sin `?submitted=1`, `/contact/book/` muestra un aviso para llenar el formulario en vez de los calendarios (es solo un filtro en el navegador: los calendarios de GHL siguen siendo públicos, así que el cobro y la disponibilidad se controlan en GHL). La página no se indexa ni sale en el sitemap.