M SISTEMA DE DISEÑO Grupo MIM · Identidad digital v1.0 ← Ver sitios

Documento interno · Arquitectura

Un codebase, ocho salidas.

Los 7 dominios del grupo y este sitio de diseño salen del mismo proyecto Eleventy. Esta página explica cómo construir, correr, extender y verificar todo el sistema.

Node 20+ Eleventy 3 Tailwind 3.4 Alpine 3 + HTMX 2

01 / El pipeline

De fuentes a dist/.

Entradas

  • src/pages/ — plantillas Nunjucks
  • src/_includes/ — layouts + parciales
  • src/_data/ — JSON por sitio + compartido
  • src/styles/main.css — entrada Tailwind
  • src/assets/ — imágenes, fuentes, vendor, PDF*

Proceso (scripts/build.js)

  • 1. tailwindcss → src/assets/css/main.css
  • 2. por cada SITE_ID: eleventy con --output=dist/<dominio>/ --pathprefix=/<dominio>/
  • 3. sitemap.xml + robots.txt por dominio
  • 4. manifiestos de redirects (7 dominios)

Salidas

  • dist/grupo-mim.com/ — 18 páginas
  • dist/vitsa.com.mx/ … dist/mibqro.com/
  • dist/diseno/ — este sitio (noindex)
  • deploy/redirects/ — csv · web.config · nginx

* Los PDF no están en git: se regeneran con scripts/harvest.sh desde los sitios legados.

02 / Construir y correr

Comandos del día a día.

ComandoQué hace
npm installInstala dependencias y copia los assets vendored (postinstall: Alpine, HTMX, fuentes woff2).
npm run buildTailwind → src/assets/css/main.css, luego Eleventy ×8 → dist/<dominio>/ (7 sitios + diseno).
node scripts/build.js --only=mim,migsaBuild parcial de un subconjunto de sitios.
SITE_ID=mibqro node scripts/build.jsBuild de un solo sitio (equivale a --only=mibqro).
npm run serveServidor estático zero-dep en http://localhost:8080 con índice de sitios en /.
npm startbuild + serve en un solo paso.
npm run qaBatería de verificación: datos, enlaces, meta, HTML, a11y, contraste, sitemap, perf.
./scripts/harvest.shDescarga los PDF (catálogos y legales) desde los sitios legados — no se versionan en git.

Prerrequisitos: Node 20+. Playwright (raíz del repo) solo para las capturas QA — requiere executablePath al headless-shell cacheado (ver qa/shots-mim.js).

03 / Eleventy en la práctica

Cómo una plantilla sabe en qué sitio está.

Cascada de datos

  • — src/_data/sites/<id>.json → mapa global sites; el sitio activo se lee como sites[siteId].
  • — src/_data/siteId.js → process.env.SITE_ID (lo fija el build loop).
  • — src/_data/shared/*.json → contenido compartido (familias, catálogos, directorio…).
  • — src/_data/siteOrder.json → los 7 ids comerciales (diseno queda fuera).
  • — pages/pages.11tydata.js restaura el mapa sites vía eleventyComputed (el front matter sites: lo ocultaría).

Filtrado multi-sitio

---
sites: all            # los 7 comerciales
sites: branches       # los 7 menos mim
sites: [mim]          # solo grupo-mim.com
sites: [diseno]       # solo este sitio
---

eleventy.config.js pre-escanea el front matter y mete a ignores lo que no aplica al SITE_ID activo. Cada página declara su permalink explícito (sin prefijo /pages).

Filtros propios

  • — | url / | href — anteponen el path prefix del dominio (externos y anchors intactos).
  • — | interpolate(site) — resuelve {name} {short} {city} {phone}… en metadescripciones.
  • — | digits — "(55) 58 99 24 00" → "5558992400" para tel:+52….
  • — | yearsSince — años desde 1972 (el "54+" se actualiza solo).

Parciales y macros

Todo bloque repetido es un parcial en src/_includes/partials/ (header, footer, hero, cards, spec-table, aviso-modal, contact-form…). Los macros viven en icon.njk y logo-block.njk. Ojo Nunjucks: un macro importado no ve el contexto global — importar siempre {% import x with context %} cuando use shared.* o sites.*.

04 / Assets

Qué se versiona y qué se regenera.

En git

  • — Imágenes y fotos (originales + webp 1920/800/400).
  • — Logotipos legados (+ originals/).
  • — Fuentes woff2 (Archivo, Inter, IBM Plex Mono) y libs vendored (alpine, htmx).
  • — Manifiestos: asset-manifest.json, rename-map.json, harvest-map.tsv.

Fuera de git (regenerables)

  • — PDF de catálogos y legales → scripts/harvest.sh.
  • — dist/ completo → npm run build.
  • — Capturas qa/shots/ → scripts de qa/.
  • — src/assets/css/main.css → npm run build:css.

Optimización de imágenes

scripts/optimize-images.js y optimize-photos.js (sharp): héroes 1920w, tarjetas 800w, thumbs 400w, webp q80. Las páginas referencian siempre las variantes img/opt/; los originales quedan como máster.

05 / Extender el sistema

Agregar una página o un sitio nuevo.

Nueva página (todos los sitios)

  1. Crear src/pages/mi-pagina.njk con layout: layouts/base.njk, sites: all, permalink: /mi-pagina/, title y description (con tokens {name}…).
  2. Agregar el enlace en nav de cada sites/*.json que aplique.
  3. npm run build + npm run qa en verde.

Nuevo sitio (p. ej. 8.ª filial)

  1. src/_data/sites/nueva.json (copiar una existente: dominio, acento, contacto, nav, hero/secondary images, aviso).
  2. Sumar el id a siteOrder.json y a SITES en scripts/build.js.
  3. Alta en shared/directorio.json y en shared/avisos.json.
  4. Reglas de redirects del dominio legado en scripts/redirects.js y build completo.

06 / Verificación

La batería que cuida el sistema.

validate-data

Esquema de _data + cruce con assets en disco.

check-links

0 enlaces internos rotos en los 8 dominios.

check-meta

Título, descripción, canonical y OG por página.

check-html

Doctype, un h1, etiquetas balanceadas, & escapado.

check-a11y

Alt, labels, títulos de iframe.

check-contrast

Ratios WCAG de acentos × usos con texto.

check-sitemap

Sitemaps bien formados, URLs existentes.

check-perf

Peso de páginas; imágenes >500 KB sin webp.

Todo se corre con npm run qa. Las capturas visuales (Playwright) están en qa/shots-mim.js y qa/shots-branches.js.

07 / Despliegue y runtime

Hoy estático, mañana con datos vivos.

Hoy — estático

  • — Cada dist/<dominio>/ es un sitio estático completo: sirve en cualquier host (IIS, nginx, Netlify…).
  • — Redirects del sitio legado: renombrar <dominio>.web.config → web.config (IIS) o incluir el .nginx.conf — en deploy/redirects/.
  • — Formulario de contacto: fallback mailto (forms.live: false).

Mañana — fase ERP (ADR-001)

  • — Host ASP.NET Core MimPortal.Sitios por dominio en IIS: sirve el estático + endpoints /api/* mismo origen (catálogos, contacto).
  • — Consulta directa a PostgreSQL con la DLL compartida MimPortal.Entities; sitios sin autenticación, rol DB mim_web de solo lectura.
  • — Catálogos se administran en el ERP (MimPortal). Detalle completo: docs/ARCHITECTURE.md.

Mapa del proyecto

sites/redesign/
├── eleventy.config.js      # config + filtros + filtrado multi-sitio
├── tailwind.config.js      # tokens (acero, naranja, fuentes, radius 0)
├── scripts/                # build, serve, harvest, sitemap, redirects, checks…
├── src/
│   ├── _data/              # sites/<id>.json · shared/*.json · siteOrder
│   ├── _includes/          # layouts + partials (header, footer, hero…)
│   ├── pages/              # plantillas con `sites:` y `permalink`
│   ├── styles/main.css     # entrada Tailwind + clases de componente
│   └── assets/             # img (originales + opt webp), fonts, vendor, PDF*
├── deploy/redirects/       # 7 dominios × (csv · web.config · nginx)
├── qa/                     # scripts de captura y overflow
└── docs/                   # ARCHITECTURE.md + research/ (5 documentos)

← Volver al Sistema de Identidad Digital