# Plan de corrección — herencia / escala (Eidos) · **v2, corregido por diseño + referencias** > **Compañero de** [`inherit_audit.md`](inherit_audit.md). · **Fecha:** 2026-06-27 > · **Excluidos:** `words/**`, `palabras/**`, `chronos/**` (WIP). > > **Esta v2 reemplaza la doctrina de radio de la v1.** La v1 acoplaba el radio al > `size` del control (sesgo de statu quo, anclado en `toggle`). La investigación de > 10 frameworks de referencia (Radix, Material 3, Apple HIG, Ant, MUI, Tailwind, > Carbon, Fluent, Chakra, Mantine — verificada adversarialmente) demostró que **eso > es un outlier**: nadie escala el radio sin tope con el size. La doctrina correcta, > decidida por el usuario, es el **modelo Radix** (radio = eje propio, desacoplado > del size) + **herencia concéntrica del padre** (modelo Apple). > > Cada decisión va con cita de diseño (`THEMING.md`/RFC) **o** de referencia (URL). --- ## 0. Doctrina raíz (corregida) > **Un componente deriva su GEOMETRÍA + TIPO + ICONO del primitivo de size > `--size-{k}-*` (que compone densidad×scaling); si no fija su size, HEREDA el del > padre (publishers deliberados, cadena Ant). El RADIO es un eje propio > —default por arquetipo × factor de tema `radius` × override `rounded`— > DESACOPLADO del size, y se HEREDA del padre de forma CONCÉNTRICA cuando anida > (`inner = max(0, outer − gap)`, modelo Apple).** **Decisiones cerradas:** - ✅ `--size-md-font-size = 16px` (1:1; el texto de control sigue la escala tipográfica — campo "font-in-size" de Chakra/Ant/Radix). El compact-md 14px queda muerto. - ✅ **Radio = modelo Radix** (Opción A): eje propio, desacoplado del `size`. **Reencuadre clave:** tu **regla 5** ("las esquinas heredan del padre; los radios concéntricos") **no** pide "el radio escala con el size propio" (eso era R4, ya cubierto por el size recipe). Pide **herencia del padre + concentricidad** — que es exactamente el modelo de Apple (`ContainerRelativeShape`/`ConcentricRectangle`) y el helper `[data-shape-nest]` que eidos **ya tiene**. El falso problema "cap-at-md vs full-scale" desaparece: el radio no es función del size. --- ## 1. Qué fijan el diseño + las referencias (resumen citado) | Eje | Referencia (cita) | eidos hoy | Acción | |---|---|---|---| | **scaling** (R1) | Radix `scaling` 90-110% escala todo incl. tipo ([radix/spacing](https://www.radix-ui.com/themes/docs/theme/spacing)). | `--scaling` idéntico. | ✅ validado; solo higiene (literales). | | **densidad** (R2) | M3/Carbon/Fluent: altura/spacing cambian, **texto estable** ([m3/density](https://m3.material.io/foundations/layout/understanding-layout/density)). | density compact/comfortable/spacious, texto estable. | ✅ validado. **eidos por delante**: tener densidad **Y** scaling es la unión que ningún referente ofrece. | | **size → internos** (R4) | Chakra/Ant/Radix meten font en el size recipe ([chakra/sizes](https://chakra-ui.com/docs/theming/sizes)). | recipes por-size (font incl.). | ✅ 1:1 (md=16) confirma el campo. | | **heredar size** (R3) | Ant `ConfigProvider.componentSize` global; cadena `explícito > grupo > contexto > md` ([ant/config](https://ant.design/components/config-provider/)). Publishers = contenedores **concretos** (Form, input-group, group). | hardcode `md`; solo 3 contextos ad-hoc. | **WS-A**. | | **radio** (R5.a/b) | Radix: radio = factor de tema × paso por rol, **independiente del size**; `full`→pill, checkbox capado ([radix/radius](https://www.radix-ui.com/themes/docs/theme/radius)). Ningún referente escala radio sin tope. | 3 filosofías; `STATIC_SIZE` lo escala 7 pasos (**outlier**). | **WS-B** (modelo Radix). | | **esquinas concéntricas** (R5) | Apple `inner = max(0, outer − gap)`, hijo deriva del padre ([apple/ConcentricRectangle](https://developer.apple.com/documentation/swiftui/concentricrectangle)); canon web idéntico ([Cloud Four](https://cloudfour.com/thinks/the-math-behind-nesting-rounded-corners/)). | `[data-shape-nest]` = ese modelo, **reference-grade**, pero solo 5/80. | **WS-C**. | --- ## 2. Workstreams ### WS-A — Herencia ambiental de `size` (R3) · esfuerzo L · pilot `Form→Field` **Verificado.** Todo wrapper resuelve con fallback literal `'md'` (`eidos.resolve(size,'md')`, `active-eidos.svelte.ts:540`), sin mirar al padre. Solo 3 contextos ad-hoc (`dialog/context.ts`, `lib/list-surface-context.ts`, `toggle-group/context.ts`). 124 archivos usan el idioma. **Diseño (modelo Ant, no "toda caja emite"):** 1. Nuevo `src/uix/eidos/lib/ui-size-context.ts` (espejo de `list-surface-context.ts`, getter reactivo) + `clampSize(size, allowed, fallback)` para el subset por componente. 2. **Publishers DELIBERADOS** (no cualquier caja): `Form`, los grupos (button-group/toggle-group ya), overlays (Dialog/Drawer/Popover content como provider de su propio size), y un **provider global tipo `ConfigProvider.componentSize`** (la superficie "size por defecto de la app"). Esto es lo que las referencias hacen; un `