27c0189f2b
Pasting the indented CSS through Slack turned the indentation into non-breaking spaces, so GHL kept the rules but browsers dropped their declarations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
65 lines
3.9 KiB
Markdown
65 lines
3.9 KiB
Markdown
# 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: <head>, 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. El estilo oscuro del formulario vive en GHL: pega `ghl/lead-form.min.css` en el formulario (Custom CSS). Usa la versión compacta: al copiar la versión con sangría desde Slack se cuelan espacios invisibles (non-breaking spaces) y GHL descarta esas reglas.
|