docs(theming): close the touch-rows/§37 reconciliation — pseudo hit-slop CONFIRMED (user decision)

Option (a) with riders: the ::before slop stands for bare markers (the
Material mdc-touch-target / Android touch-delegate / iOS hit-inset lineage).
Rider 1: dense coarse stacks must keep pitch >= --touch-target (WCAG excludes
overlapped area; bare boxes still hold AA via 2.5.8 Spacing worst-case).
Rider 2: the Field labeled-row task stays open as the ADDITIVE improvement —
the row becomes the real AAA target (2.5.5 Equivalent) and the slop remains a
harmless net. Chronicle updated in changelog §37; standing in reference §37;
handoff block resolved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
menubar-v4-safe
dev 3 months ago
parent dd0637f65b
commit bf573430b8

@ -38,18 +38,17 @@ componentes. La **fuente de verdad de los veredictos** es
| **P6** C7 textarea-measure + D13 · C6 weekInfo · B.11 splitter | ✅ **CERRADO** — C6 `3b02fd11` · C7 `444e05eb` · B.11 `0f0feb4f` |
| **P7** S9 iniciativas · S4 READMEs · S7 papeleo · errores de tipo baseline | ✅ **S4 COMPLETO 2026-07-10** (baseline ✅ · S7 ✅ · S4 29+1 dossiers ✅, E-2.3=0, máquina 102 PASS) — S9 queda como sesiones dedicadas POST-audit-fix |
## ⚠️ Reconciliar PRIMERO — conflicto touch-rows ↔ §37
## ✅ Reconciliación touch-rows ↔ §37 — CERRADA (decisión usuario 2026-07-10)
El **touch-rows** de hoy cerró checkbox/switch con un `::before` hit-slop (área ≠
visual). Pero el **changelog §37 (2026-06-28, ya commiteado)** había **rechazado
explícitamente el pseudo** para markers ("un pseudo de 44px que desborda al vecino
NO vale: WCAG excluye el área solapada") y ruteado checkbox/switch a la **fila-label
(tarea de Field)** — que es lo que el veredicto de auditoría pedía ("patrón radio-row").
La decisión de sesión (con comparativa de 5 frameworks) se tomó sin tener delante ese
rechazo previo. **Decisión pendiente del usuario**: (a) la decisión de hoy supersede el
§37 (dejar el `::before`, ya documentado como revisión), o (b) revertir a la vía
fila-label/Field. El código y los docs (§37 reference + changelog) están puestos como
"revisión que revierte, pendiente de confirmar". Registrado en `changelog.md §37`.
**Opción (a) con nota**: el `::before` hit-slop queda CONFIRMADO como mecanismo
para markers desnudos (linaje Material `mdc-touch-target` / Android
touch-delegates / iOS hit-test insets). El argumento WCAG-solape del §37
original se resuelve con (1) requisito de spacing en pilas táctiles densas
(pitch ≥ `--touch-target`; AA garantizado en el peor caso por la excepción
Spacing) y (2) la **fila-label de Field sigue viva como mejora ADITIVA** — la
fila será el target AAA real cuando exista (2.5.5 Equivalent) y el pseudo queda
de red. Redactado en `changelog.md §37` (reconciliación) + `reference.md §37`
(standing "confirmed 2026-07-10").
## P4 — hecho este bloque (N1–N10)

@ -1364,12 +1364,25 @@ gated a coarse — **crece el ÁREA, no el visual** — más el token `--touch-t
en `:root` de `archetypes.css` (compartido por controles + fila de radio, antes `44px` a pelo).
Comparativa hecha con 5 frameworks (React Aria, Radix, Material/MUI, Ark, Base/Bootstrap/shadcn):
solo React Aria y Material desacoplan área/visual; Material Web usa exactamente un pseudo-elemento
(`mdc-touch-target`). ⚠️ **Esto REVIERTE el "pseudo rechazado / tarea de Field" de arriba.**
(`mdc-touch-target`). **Esto REVIERTE el "pseudo rechazado / tarea de Field" de arriba.**
Justificación: checkbox/switch son `<button>` desnudos sin fila propia (el label es externo),
así que la fila-label no aplica sin reestructurar. El solape que preocupaba al §37 original se
mitiga con coarse-only (los layouts táctiles espacian) — pero **queda pendiente reconciliar**
si esta decisión de sesión supersede al argumento WCAG-solape original, o si se revierte a la
vía fila-label/Field. Ver [`docs/process/continue-audit-fixes-2026-07.md`](../process/continue-audit-fixes-2026-07.md).
así que la fila-label no aplica sin reestructurar.
**Reconciliación CERRADA (decisión del usuario, 2026-07-10) — el pseudo queda CONFIRMADO**
como mecanismo para markers desnudos; supersede el rechazo del §37 original. Es el mecanismo
institucionalizado por las plataformas (Material `mdc-touch-target` · Android touch-delegates ·
iOS hit-test insets sobre los 44pt del HIG), no un atajo. El argumento WCAG-solape original se
resuelve en dos piezas:
1. **Requisito de spacing en listas táctiles densas**: WCAG excluye el área solapada de la
medición, así que una pila de checkboxes en coarse debe mantener pitch ≥ `--touch-target`
(o gap ≥ el excedente del pseudo) para que el AAA medible se conserve — mismo modelo con el
que Material gobierna la densidad. La caja desnuda cumple AA (2.5.8, excepción Spacing) por
sí sola en el peor caso.
2. **La fila-label de Field sigue viva como mejora ADITIVA** (la tarea que el §37 original ya
pedía): cuando el marker tenga fila etiquetada, la FILA es el target AAA real (2.5.5,
excepción Equivalent — patrón React Aria) y el pseudo queda como red inofensiva. Ambas
vías coexisten en los sistemas maduros; no compiten.
---

@ -1571,7 +1571,7 @@ trigger→panel gap is an OFFSET of the positioning engine via
value — dates arbitrate)*. Since 2026-07-07 the two gaps are config data:
`primitives.floating` (changelog §40).
## 37. Touch-target — 44px on touch, pointer-gated (2026-06-28 · rev. 2026-07-08)
## 37. Touch-target — 44px on touch, pointer-gated (2026-06-28 · rev. 2026-07-08 · confirmed 2026-07-10)
Chronicle in [`changelog.md §37`](./changelog.md). Standing: the 44px touch
target applies ONLY under `@media (pointer: coarse)` — desktop keeps its
@ -1600,6 +1600,16 @@ A single floor (44 AAA), not a per-size AA/AAA split: no reference framework
does the split, and the nearest analog (MUI's small variant falling below the
target) is treated as a defect.
**Confirmed 2026-07-10** (user decision — chronicle in changelog §37): the
`::before` slop is the standing mechanism for bare markers (the
Material/Android/iOS lineage). Two riders: (1) dense coarse stacks must keep
pitch ≥ `--touch-target` — WCAG excludes overlapped area from measurement, so
spacing is part of the contract (bare boxes still hold AA via the 2.5.8
Spacing exception in the worst case); (2) the labeled-row task on Field stays
open as the ADDITIVE improvement — once a marker has a labeled row, the ROW is
the real AAA target (2.5.5 Equivalent, the React Aria pattern) and the slop
remains as a harmless net.
## 38. The state layer — unified neutral feedback (2026-06-28)
Chronicle in [`changelog.md §38`](./changelog.md). Standing: neutral

Loading…
Cancel
Save

Powered by TurnKey Linux.