commit 974823b9bbda0149c4cad016fadb1f17df3d1e64 Author: Francisco León Date: Wed Aug 5 11:10:53 2026 -0600 hiparquia.dog — sitio F0-lite: Astro estático, cero JS, candado del protocolo en código diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f232c3c --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +node_modules/ +dist/ +.astro/ +fotos/ + +# LA REGLA: se rastrea la fuente, no la salida — pero solo cuando la salida se +# puede volver a fabricar en el sitio donde hace falta. +# +# La fuente embarcable SE DERIVA en el propio Dockerfile (solo necesita fontTools): +# npm run fuente +public/Commissioner-wght.woff2 + +# Las tarjetas og SÍ se versionan, y es una excepción con razón: fabricarlas +# necesita Chromium, y meter Chromium en la imagen de construcción cuesta más de +# 300 MB para tres PNG que cambian una vez por ficha. Se regeneran a mano con +# npm run tarjetas +# y se comitean. Si algún día el generador cambia, se nota en el diff del PNG. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3ef614f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +# hiparquia.dog — sitio estático. Se construye una vez y se sirve como archivos. +# No hay servidor de aplicación porque no hay aplicación: son tres HTML y una fuente. + +FROM node:22-alpine AS construir +WORKDIR /app + +# fontTools deriva la fuente embarcable del maestro (npm run fuente): quita los +# tres ejes que el sitio no usa y la deja en 36 KB en vez de 95. No necesita +# navegador, así que cabe en la imagen de construcción sin engordarla. +RUN apk add --no-cache python3 py3-pip \ + && pip3 install --break-system-packages --no-cache-dir fonttools brotli + +COPY package*.json ./ +RUN npm ci --omit=dev || npm install --omit=dev +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY --from=construir /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/LEEME.md b/LEEME.md new file mode 100644 index 0000000..befdfed --- /dev/null +++ b/LEEME.md @@ -0,0 +1,106 @@ +# hiparquia.dog — la casa + +El sitio que las piezas prometen. Cada carrusel termina diciendo *«la ficha completa vive en +la casa»* y cada pin lleva `hiparquia.dog` impreso; esto es la casa. + +**Fase F0-lite del `9-1`.** La arquitectura dice que el corpus vive en Directus y las fichas +en `ink.hiparquia.dog`. Directus todavía no está en pie, así que el corpus son archivos +markdown y las fichas cuelgan de la raíz. **El esquema es el mismo contrato**: cuando Directus +exista se cambia el `loader` de `src/content.config.ts` y nada más — las páginas no se enteran. + +## Qué hay + +``` +src/content/fichas/*.md el corpus. Una ficha pública por texto +src/content.config.ts el esquema + EL CANDADO del protocolo +src/pages/index.astro el manifiesto y el índice +src/pages/ficha/[slug].astro la ficha, con su schema.org +src/layouts/Base.astro cabeza, og:, tipografía +src/styles/global.css dos tintas y nada más +src/fuentes/ el MAESTRO de Commissioner (4 ejes, no se embarca) +scripts/fuente.py deriva la fuente embarcable +scripts/og.mjs fabrica las tarjetas al compartir +scripts/verificar.mjs los seis escenarios adversos +``` + +## El candado, en código + +```js +.filter(f => f.data.semaforo === 'verde' || f.data.semaforo === 'propio') +``` + +Está en el índice **y** en `getStaticPaths`. Una ficha en ámbar o rojo no aparece en la lista +**y su página no se construye**: no existe la URL. El `9-1 §2` dice que el protocolo deja de +ser documento y se vuelve software; esto es esa línea. + +## Nada se mueve + +Ni una animación. La única transición del sitio es el color de un enlace bajo el cursor, +120 ms lineal — retroalimentación, no gesto. La pregunta de `ioon-gesto §0.5` es *¿qué se +pierde si esto no se mueve?*, y en un archivo de fichas la respuesta es: nada. + +**No hay `font-weight` ni `letter-spacing` en ningún `:hover`.** Ensanchan el elemento y +empujan a sus vecinos. Medido: el ancho del enlace no cambia, delta 0.00 px. + +## Las dos fuentes de Commissioner, y por qué son dos + +| | ejes | peso | dónde | +|---|---|---|---| +| **maestro** | `wght` `slnt` `FLAR` `VOLM` | 95,144 B | `src/fuentes/` — no se embarca | +| **embarcable** | solo `wght` 100–900 | **36,400 B** | `public/` — se deriva | + +**−61.7 % sin tocar un solo carácter.** El sitio nunca usa `slnt`, `FLAR` ni `VOLM`, así que +los tres se fijan en 0 y desaparecen del binario. Los 230 glifos del subconjunto latino se +quedan enteros: el corpus va a crecer con textos que todavía no existen, y recortar por los +caracteres de hoy rompería los de mañana. + +Es la misma partición que en los SVG: un maestro que lo conserva todo y un embarcable que solo +lleva lo que la pieza usa. + +## Qué se versiona y qué no + +Se rastrea la fuente, no la salida — **pero solo cuando la salida se puede volver a fabricar +donde hace falta.** + +- **La fuente embarcable NO se versiona.** Se deriva dentro del propio `Dockerfile`; fontTools + cabe en la imagen de construcción sin engordarla. +- **Las tarjetas og SÍ se versionan.** Fabricarlas necesita Chromium, y meterlo en la imagen de + construcción cuesta más de 300 MB para tres PNG que cambian una vez por ficha. Es una + excepción con razón escrita, no un descuido. Se regeneran con `npm run tarjetas`. + +## Las tarjetas al compartir + +`serclin.mx` no tiene `og:image`, y por eso su enlace viaja desnudo por WhatsApp. Aquí van +desde el primer día: 1200×630, una por ficha más la de la casa. **WhatsApp y Facebook no +ejecutan JavaScript** — leen las etiquetas `og:` y nada más. + +## Cómo se corre + +``` +npm install +npm run build:completo # fuente + tarjetas + astro build +npm run verificar # los seis escenarios, contra dist/ servido en 127.0.0.1 +npm run dev +``` + +## Cómo se despliega + +**El paso 2 no es opcional** (`ioon-verificar §1.1`): mientras Coolify no esté expuesto por +Traefik con HTTPS, GitHub no tiene por dónde entregar el webhook. Un fix bien escrito estuvo +68 días sin salir del repositorio de serclin por creer lo contrario. + +1. `git push` +2. **`Redeploy` manual en Coolify** +3. **Verificar contra producción**, con dos comprobaciones que no mienten: que cambió el + `last-modified` **y** que el HTML servido trae el texto nuevo. En este sitio el CSS va + incrustado en el HTML, así que no hay hash de bundle que mirar: se comprueba el HTML. + +Antes de nada: **`hiparquia.dog` tiene que resolver.** Los dos pines lo llevan impreso y no +pueden publicarse hasta entonces. + +## Pendientes + +- DNS en Cloudflare + TLS por Traefik (`9-1 §1`). +- Cuando haya más de ~20 fichas: paginación o índice por autor. +- Cuando Directus esté en pie: cambiar el `loader`, mover a `ink.` y dejar redirecciones. +- `ask.` (AnythingLLM) y la tienda son F1/F2 — nada de esto los bloquea. diff --git a/VERIFICACION.md b/VERIFICACION.md new file mode 100644 index 0000000..d03297b --- /dev/null +++ b/VERIFICACION.md @@ -0,0 +1,85 @@ +--- +proyecto: "9. hiparquia" +subtema: "verificación · hiparquia.dog (F0-lite, antes de desplegar)" +slug: "verificacion-hiparquia-sitio" +version: "v20260804-2140" +autor: "Francisco León (ioon) + Claude" +nivel: "reporte de verificación" +estado: "PASA 12/12 · 1 BLOQUEADO (el dominio, que no es de la pieza)" +--- + +# VERIFICACIÓN · hiparquia.dog · 04-ago-2026 21:40, hora Oaxaca + +**régimen:** automático · **sin licencias declaradas** + +Medido contra `dist/` servido en `127.0.0.1`, no contra el disco. Tres rutas: `/`, +`/ficha/hombres-necios/`, `/ficha/nada-te-turbe/`. + +--- + +## Los seis escenarios adversos + +| # | escenario | resultado | +|---|---|---| +| 1 | **Sin JavaScript** | contenido **completo**: 1,108 · 3,827 · 3,874 caracteres visibles. `

` presente, enlaces navegables ✔ | +| 2 | **`prefers-reduced-motion: reduce`** | `transition-duration: 1e-05s` ✔ | +| 3 | **Pestaña oculta + `rAF` congelado** | **0 elementos invisibles.** Nada nace en `opacity-0` ✔ | +| 4 | **360 px** | `scrollWidth === clientWidth` en las tres rutas ✔ | +| 5 | **Táctil 390 px** | sin desborde; nada depende de `:hover` para funcionar ✔ | +| 6 | **Recarga a media página** | no aplica: no hay estado de llegada que rearmar ✔ | + +## PASA 12/12 + +- ✔ **Cero JavaScript.** Dos recursos en el cable y ya: el HTML y la fuente. No hay ni un + `