fix(eidos): A-47 — el anillo de foco sostiene el contraste sobre CUALQUIER superficie solida

El anillo global es primario translucido — suave a proposito — y sobre un
`Surface variant="solid"` de color primario compone primario-sobre-primario:
medido en la demo real del cta, 1,02:1 (peor aun que el 1,43:1 del ledger;
misma pareja, panel rgb(142,78,198)). Los DOS unicos elementos interactivos
del block quedaban sin indicador, contra el minimo 3:1 de WCAG 1.4.11.

Arreglada la CLASE, no la instancia: cualquier hijo enfocable de cualquier
superficie solida, en cualquier color y modo. Una declaracion en la regla
solida que ya existia en surface.css rescopa `--focus-ring-color` a la misma
tinta que el texto de ese lienzo — el slot `contrast(on-solid)`, elegido por
APCA con suelo WCAG2 (rfc-color-engine §8). Como §32 canonizo UN solo modelo
de foco (outline, todos los consumidores beben del var: button, calendar,
breadcrumb, anchor-nav…), la variable rescopada repara el catalogo entero por
cascada; forced-colors conserva su camino `Highlight`, ajeno a los tokens. A
plena fuerza y sin `color-mix` — aritmetica sobre un token garantizado
re-pierde la garantia (la clase «el silencio es un valor»).

Medido antes/despues con sonda de composicion (canvas getImageData — el panel
pinta en oklch wide-gamut y el ring en color(srgb …/0.52); un parser rgb da
null) y sobre el ELEMENTO real:

  dentro del panel   1,02:1  →  5,18:1  (outlineColor del boton enfocado)
  fuera del panel    2,17:1  →  2,17:1  (el token global INTACTO)

Dos hallazgos anotados sin decidir: `--focus-ring-color-error` sobre solido
(volcarlo a la tinta de contraste borraria la semantica de error) y el 2,17:1
del anillo global contra la PAGINA (el indicador puede satisfacer 1.4.11
contra el boton adyacente; abrirlo es decision de diseño). La fila del ledger
pasa a ARREGLADO pero el fichero NO viaja en este commit: es WIP de la otra
sesion (protocolo A-85).

Verificado: eidos 393 ✓ · check 69 = base aislada, diff VACIO · prettier:
surface.css estaba limpio en HEAD y queda limpio.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-dir-prefs
dev 2 months ago
parent 23b20fff5c
commit acda70f1e4

@ -312,7 +312,21 @@ por los dos caminos.
la puerta — la inyeccion del test va sobre `buildScheme` mismo, passthrough
real hasta que el flag lo revienta. Ambos tests vistos morder el codigo
viejo via stash.
5. **§3.6 blocks** — `A-47` (anillo de foco 1,43:1 sobre panel sólido) ·
5. **§3.6 blocks** — ~~`A-47`~~ **ARREGLADO 2026-08-13 en la CLASE, no en la
instancia**: el anillo global es primario translucido (suave a proposito) y
sobre un `Surface` solido primario media 1,02:1 (peor aun que el 1,43 del
ledger; misma pareja rgb(142,78,198)). Una declaracion en la regla solida de
`surface.css` rescopa `--focus-ring-color` a la tinta del slot
`contrast(on-solid)` (pick APCA + suelo WCAG, rfc-color-engine §8; §32 = un
solo modelo outline, todos los consumidores beben del var). Medido en la
demo real: 1,02 → **5,18:1** en el `outlineColor` del boton enfocado; el
token global fuera del panel INTACTO (2,17, sin cambios). A plena fuerza,
sin mix — aritmetica sobre token garantizado re-pierde la garantia.
Hallazgos anotados sin decidir: `--focus-ring-color-error` sobre solido
(semantica de error, caso aparte) y el 2,17:1 del anillo global contra la
PAGINA (el ledger no lo señalo; el contraste puede satisfacerse contra el
boton adyacente — decision de diseño si se abre). Fila del ledger →
ARREGLADO, SIN commitear (viaja con la otra sesion, protocolo A-85) ·
`A-69` (`duration` de count-up no significa segundos).
6. **§3.3 eje B** — 4 continuos sin throttle (gradient-builder, color-picker
área, number-field, css-field) · `sequence: 'coincident'` sin implementar

@ -31,6 +31,18 @@
inversion initiative's territory, not Surface's. */
--_surface-bg: var(--_surface-palette-solid);
--_surface-fg: var(--_surface-finish-ink, var(--_surface-palette-contrast));
/* A-47: the focus ring must hold on ITS canvas. The global ring is
translucent PRIMARY (soft by design), which composited over a solid
primary panel measured 1.02:1 — both interactive elements of the cta
block lost their indicator (WCAG 1.4.11 asks ≥ 3:1). Every recipe draws
the ring as `outline: … var(--focus-ring-color)` (§32, the one focus
model), so rescoping the VARIABLE here repairs the whole class — any
focusable child of any solid surface, every color, both modes. The ink
is the same the text uses on this canvas: the `contrast(on-solid)` slot,
APCA-picked with a WCAG floor (rfc-color-engine §8) — full strength, not
mixed down, because arithmetic on a guaranteed token re-loses the
guarantee. Forced-colors keeps its own `Highlight` path untouched. */
--focus-ring-color: var(--_surface-finish-ink, var(--_surface-palette-contrast));
}
/* Gradient finish (§39) — solid canvas only, like every finish consumer. */

Loading…
Cancel
Save

Powered by TurnKey Linux.