branding #5

Merged
kengru merged 4 commits from branding into main 2026-05-24 04:59:47 +00:00
Owner
No description provided.
Fase 1 (foundation): paleta editorial vermillón + cream + sumi-black, Albert Sans + Noto Serif JP + IBM Plex Mono, icono 目 con maker's mark, manifest actualizado, dark mode.

Fase 2 (auth + library + releases): eyebrow + page-head + accent en titulares, OTP grande monospace, badges de estado con prefijos numéricos (01/02/03), favorito ● vermillón, .empty-state con kanji.
Fase 3 (perfil + biblioteca + flujos secundarios):
- home, settings, profile, library/entry, library/search rediseñados con eyebrow + page-head + accent.
- delete-account/restore-account/unsubscribe con .auth-page shell + .danger-callout.
- .block, .profile-counters, .profile-header agregados al CSS.

Fase 4 (errores + emails):
- web/templates/404.html y 500.html (faltan wiring en internal/server: rendering listo, handler queda pendiente).
- web/emails/digest.html actualizado; otp.html y account-deletion.html agregados como opt-in HTML (los .txt siguen siendo el flujo activo).
- .error-page, .error-glyph, .error-cta-secondary agregados al CSS.

Backend mínimo para soportar las nuevas plantillas:
- homeData.Username (slug.String cuando hay slug) para el saludo "hola, @slug".
- profileData.Counters *profileCounters como hook opcional — queda nil por ahora; el {{if .Counters}} de profile.html no se dispara.
Cierra los tres ítems que el handoff de identidad dejó pendientes (ver docs/diseno-identidad.md).

404/500 estilizados (internal/server/errors.go nuevo):
- errorRenderer parsea layout+404.html y layout+500.html una sola vez en server.New.
- routes.go monta el catch-all "/" → NotFound; longest-match deja los patterns existentes ganar.
- recoverer usa ServerError con el request_id como ErrorID visible (para issues).
- Fallback a http.Error plano si HTMLTemplates es nil (tests viejos no se rompen).
- Tests cubren: 404 estilizado, 500 via panic, fallback sin templates.

Emails HTML multipart (auth + delete):
- internal/auth: parsea otp.html si existe (fs.Stat) y manda multipart/alternative.
  Si falta, mantiene el flujo solo-texto. SendMessage ya soportaba ambos.
- internal/profile: misma idea con account-deletion.html.
- Sin cambios en SMTP wiring; el digest semanal ya era HTML.

Counters de perfil:
- countByStatus(entries) calcula leyendo/por leer/completado in-memory desde
  las entries ya cargadas — sin query nueva (N por usuario es chico).
- Retorna nil si no hay entries para que profile.html no muestre strip vacío.

Documentación:
- docs/diseno-identidad.md (nuevo) — resumen de las 4 fases + decisiones de
  backend (Username field, Counters hook, errorRenderer, multipart opt-in).
- docs/decisiones-pendientes.md — ítem "Marca / identidad visual" cerrado;
  sección CSS aclara que plano + variables custom quedó decidido al aplicar.
fix: quitar comentarios con </style> literal que cerraban el <style> antes de tiempo
All checks were successful
Deploy mokuji / deploy (push) Successful in 8s
821806b7a5
Los tres comentarios "Phase N additions — append before </style>" venían de
los _phaseN-additions.css del handoff como instrucciones para el implementador,
no como CSS de runtime. El parser HTML de los navegadores cierra <style> apenas
ve la cadena "</style>" — sin importar que esté dentro de un comentario /* */ —
así que el CSS posterior al primer comentario se renderizaba como texto
visible arriba de cada página.
kengru merged commit 821806b7a5 into main 2026-05-24 04:59:47 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kengru/mokuji!5
No description provided.