diff --git a/docs/process/CONTINUE-perceptual-surface.md b/docs/process/CONTINUE-perceptual-surface.md index 7f0bcb359..ff26712e6 100644 --- a/docs/process/CONTINUE-perceptual-surface.md +++ b/docs/process/CONTINUE-perceptual-surface.md @@ -62,9 +62,10 @@ supresión por labelledby sobre un prop sin default. **Lo siguiente, en orden:** 1. ~~**`alert-dialog`** — la única cadena mecánica que queda (30 min).~~ **HECHA 2026-08-12.** -2. ~~**Dos decisiones del autor** (§4)~~ **FIRMADAS 2026-08-12** — `fixedWeeks` - (crecer filas), el chip bloqueado (vía b + su letra pequeña) y - `mode`/`scope` (retirar): las disposiciones completas viven en §4. +2. ~~**Dos decisiones del autor** (§4)~~ **FIRMADAS 2026-08-12**: el chip + bloqueado (vía b + su letra pequeña) y `mode`/`scope` (retirar). La tercera, + `fixedWeeks`, quedó **REVOCADA el 2026-08-13** al aparecer el SPEC del + componente — las disposiciones completas viven en §4. 3. **C5 rebanada 3**, y empieza por **subir a soma el comportamiento del chip** — la tabla de §C5-r3 explica por qué no es mecánica. 4. ~~**Arreglar `npm run translations:check`** (casca) y censar los 166 morfos.~~ @@ -1068,14 +1069,13 @@ reproducible, y el 1 espera decisión tuya. Salieron al responder dos preguntas del autor sobre la vista de mes. Ninguno es de superficie perceptual; se anotan aquí para que no se pierdan. -1. **La 6ª fila fantasma.** `fixedWeeks` vale **`true` por defecto en chronos** - (`components/chronos.svelte:20`), al revés que Calendar / DatePicker / - RangeCalendar / DateRangePicker, que lo traen `false`. `buildMonthGrid` - rellena entonces hasta 42 celdas (`engine/grid.ts:67`), así que un mes que - cabe en 5 filas (junio de 2026: lun 1 jun → dom 5 jul) se inventa una 6ª - fila **entera del mes siguiente**. Decisión: alinear el defecto con la - familia, o mantener la altura estable creciendo las filas en vez de añadir - una semana. +1. ~~**La 6ª fila fantasma.**~~ **NO ERA UN DEFECTO — REVOCADO 2026-08-13, ver + §4.** `fixedWeeks` viene `true` en chronos y `false` en Calendar / DatePicker / + RangeCalendar / DateRangePicker, y de esa asimetría se dedujo una deriva. Es + al revés: chronos es **el único que escribió su decisión** (`SPEC.md:270`, + `:492`, `:311`/`:461`) y coincide con el default de FullCalendar y Toast UI; + los otros cuatro son rejillas en popover, otro problema. La ficha además leyó + mal el CSS y se dejó la mitad de los defaults — el detalle, en §4. 2. ~~**Una ocurrencia de evento recurrente NO se puede mover.**~~ **ARREGLADO 2026-08-11** — y el arreglo NO era el que parecía. Su id es sintético (`${serie}::${YYYY-MM-DD}`, `engine/recurrence.ts:145`) y `moveEventToDay` @@ -1361,13 +1361,44 @@ Detalle: `morfo.md` Step 4 + ledger §A-85 RESOLUCIÓN. ¿Alineamos el defecto con la familia, o mantenemos la altura estable **creciendo las filas** en vez de añadir una semana? (Google Calendar hace lo segundo.) - **FIRMADA (2026-08-12): crecer las filas.** Mata el fantasma Y mantiene la - altura estable; `fixedWeeks` pasa a `false` como parte del cambio, así que la - alineación de familia sale gratis. Y no es sólo el default: las filas del mes - son hoy de altura FIJA (`grid-auto-rows: var(--_chronos-lane-height)`, - `chronos.css:278`), así que un `false` pelado cambiaría la semana fantasma - por saltos de altura al navegar — el arreglo es de RECETA (altura de grid - estable + filas `minmax(0, 1fr)`), no un flip de flag. + ~~**FIRMADA (2026-08-12): crecer las filas.**~~ **REVOCADA POR EL AUTOR + (2026-08-13) — NO SE TOCA: `fixedWeeks` se queda en `true`.** La firma se dio + sobre una premisa incompleta: **nadie puso el SPEC del componente sobre la + mesa**, y el SPEC no dice una línea sino tres coordinadas — + `SPEC.md:270` («Rejilla de 6 filas constante (**estabiliza la altura**). + Default: true.»), `SPEC.md:492` (el inventario de reuso pide «Rejilla de mes + **6×7**») y `SPEC.md:311`+`:461` (`data-outside-month` es un estado declarado + de `day-cell` **con su propio token de tema**). La 6ª fila no es un fantasma: + es la rejilla especificada, y la altura estable que la decisión perseguía ya + está — medido: 115 px por fila y 724 px de rejilla en TODOS los meses. + + Y la comparación competitiva, verificada en las fuentes en vez de citada: + **FullCalendar `fixedWeekCount` viene `true`** («the calendar will always be + 6 weeks tall») y **Toast UI `month.isAlways6Weeks` viene `true`** — los dos + referentes de librería de la propia matriz del SPEC (§2.1) hacen lo que + chronos hace. Google/Apple/Outlook sí varían las filas, pero **porque son + aplicaciones que llenan el viewport** y la rejilla se estira hasta el alto de + la ventana (Google llega a exponer un ajuste de densidad para regularlo). Esa + condición chronos no la tiene: sus filas son `min-block-size` y la rejilla + crece con el contenido, así que no hay altura dentro de la que estirarse — por + eso la receta propuesta tenía que INVENTARSE la altura con + `calc(6 * var(--_chronos-cell-min-block))`, que es la altura de 6 filas. Era + «seguir midiendo 6 filas de alto, pero con 5 filas más gordas»: misma altura, + menos información. + + ⚠️ Dos errores de la ficha original, corregidos para que no se repitan: el + default vive en DOS sitios (`components/chronos.svelte:20` **y** + `engine/state.svelte.ts:64`), y `chronos.css:278` + (`grid-auto-rows: var(--_chronos-lane-height)`) **no es la altura de las filas + del mes** — es la pista de los carriles de chips DENTRO de una fila + (`.chronos-overlay`, absoluta). Las filas del mes son hijos flex con + `min-block-size` (`chronos.css:188-193`). + + **Si algún día se quiere la conducta de Google, es una FUNCIONALIDAD, no un + flip de flag**: contrato de altura (la rejilla llena su contenedor) + `maxLanes` + derivado de la altura medida — hoy es `$state(3)` fijo + (`engine/state.svelte.ts:66`), así que crecer las filas no enseña ni un evento + más. Eso necesita firma propia y una enmienda deliberada del SPEC. - **Cómo pintar un chip bloqueado.** Una ocurrencia recurrente ya no se arrastra, pero sigue con `cursor: grab` porque `DragDrop.Draggable` no estampa `data-disabled`. Dos vías: (a) `event-chip` declara un estado nuevo — local y