From 50a64f21e30809c0a1b7e23a4b2d050b4af8042d Mon Sep 17 00:00:00 2001 From: urieljareth Date: Sun, 27 Sep 2026 21:13:13 -0600 Subject: [PATCH] Render: chat pegado abajo, hojas sin desfase, separadores y fidelidad iOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scrollAbajo instantáneo + ResizeObserver 'pegado abajo' (imágenes tardías, pestaña oculta) - Hoja de opciones busca la fila viva; re-render de su mensaje cierra la hoja - Separadores de filas de la hoja, proporciones de lista, un solo separador entre grupos - Home indicator sobre la hoja, composer oscuro #232626 con hairline, padding 7/12/6 - URLs sin puntuación final, www. -> https://, negrita/cursiva/tachado con reglas de WhatsApp - Documento: 'tamaño • ext' o 'PDF'; transición de color al cambiar tema - Presentación sin toolbar en escritorio (Esc para salir), hooks de zoom, móvil sin marco Co-Authored-By: Claude Opus 5.5 --- SPEC.md | 11 +++- css/iphone.css | 71 +++++++++++++++++++++- css/whatsapp.css | 41 ++++++++----- js/render.js | 151 +++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 233 insertions(+), 41 deletions(-) diff --git a/SPEC.md b/SPEC.md index 0decca3..3cdbd51 100644 --- a/SPEC.md +++ b/SPEC.md @@ -95,7 +95,16 @@ cancela demo y flujos (interactivity.js envuelve `WAM.render`). `#pantalla`: título = `boton`, filas `button.sheet-fila[data-sec][data-fila]`, botón `.sheet-cerrar`) - `WAM.abrirOpciones(i | Mensaje, li?)` → void: hoja "Todas las opciones" de un mensaje con >3 botones (la abre el propio B al pulsar `[data-ver-todas]`). Sus filas de respuesta llevan `data-opcion=""` - y B reenvía el clic al `[data-btn=""]` oculto de la burbuja, que atiende la delegación normal de main.js. + y B reenvía el clic al `[data-btn=""]` oculto de la burbuja, que atiende la delegación normal de main.js + (busca la fila viva en el momento del clic). `renderMensaje` de un mensaje cuya hoja está abierta la cierra + (re-render parcial del editor), así la hoja nunca queda desfasada. +- `scrollAbajo()` es instantáneo (ignora `scroll-behavior`) y deja el chat "pegado abajo": mientras el usuario + no suba (>60 px del fondo), un ResizeObserver sobre `#chat-cuerpo` y sus filas vuelve a bajar cuando algo + crece (imágenes que decodifican tarde, pestaña Vista previa que pasa a visible). +- Documento: campo opcional `tamano` (y `headerTamano` en la cabecera de plantilla) → subtítulo + "243 KB • pdf"; sin él, solo la extensión en mayúsculas ("PDF"). +- Hooks de CSS (css/iphone.css): `body[data-wam-zoom="100"|"125"]` fija la escala del teléfono (sin + atributo = ajuste automático); en ≤ 520 px el teléfono va sin marco salvo con `body.con-marco`. - `WAM.tick(estado)` → string SVG inline (✓ / ✓✓ del color de la hora; ✓✓ leído azul iOS `#027bfc`) - Botones del teléfono: `