# CONTINUAR — Escala de iconos ↔ tipografía (correlación 1:1) > Sesión pausada 2026-06-13 "al límite". Retomar el próximo domingo. > Este archivo es el contexto completo para continuar SIN re-litigar decisiones. ## ✅ RESUELTO 2026-06-13 (continuación) Se eligió la **opción (1)**, NO la "1:1 total" que describía el plan de abajo: - **NO** se sube el font de los controles. El "bajón" del font (un control `md` muestra `font-sm`) resultó ser la **convención generalizada** (~20 recipes, densidad de controles) — deliberada y correcta. NO se toca `STATIC_SIZE`. - **Regla final**: el icono acompaña el **font que el componente realmente usa** (no el nombre del size). `icon = icon-{name}` del `font-{name}` que muestra. - **button**: `icon-size-sm` corregido `icon-xs→icon-sm` (sigue su font). Render ahora 14/16/16/18/20. Verificado visual. - **radio-cards**: iconos siguen el font del título → 16/16/18/18/20 (antes 18-32 inflados a mano). Verificado visual. - **Bug pre-existente arreglado** (`button.css`): el `` del `Icon` lleva `width: var(--icon-size)` inline, que vencía al `[data-button] svg { inline-size }` → el icono del button quedaba fijo en 18, NO respondía al size. Fix: el button alimenta `--icon-size: var(--_button-icon-size)`. Ahora responde. ### Pendiente (menor, futuro) - **Auditar** si OTROS componentes tienen el mismo bug del icono (dimensionan el svg por CSS externo y el inline `width:var(--icon-size)` del `Icon` lo vence). radio-cards NO lo tiene (responde bien). Patrón de fix: `--icon-size: var(--_x-icon-size)`. - Decidir si se borra el banco de pruebas `/uix/icon-scale-study`. --- (Plan original abajo — premisa "1:1 total" SUPERADA por la opción 1.) ## Dónde estamos (committeado en este punto) La escala de iconos se ata a la tipografía. **Decisión firme: `font-{name}` ↔ `icon-{name}` 1:1 por nombre** (el icono acompaña al texto, no se infla ni se hardcodea). Ya hecho y **committeado** (punto de reversión): - **Escala de iconos ajustada** (`lib/primitives/static.ts` → `STATIC_ICON.size`): `xl` 24→**32**, `xxl` 48→**52**. Validado por ojo en el banco de pruebas. `create-icon.ts` `ICON_SIZE_PX_MAP` actualizado igual. Impacto 0 (nadie consumía esos steps). - **button**: `icon-size-{size}` del recipe pasó de px hardcodeado a `var(--icon-size-X)` **mapeado por valor** (cero cambio visual, ya escalable). ⚠️ ESTO ES INTERMEDIO — se va a re-hacer a 1:1 (ver abajo). - **Docs**: `THEMING.md §5` "Escala tipográfica ↔ escala de iconos" + comentario en `static.ts`. - **Banco de pruebas**: `/uix/icon-scale-study` (`web/routes/uix/icon-scale-study/+page.svelte`). Compara modelos icon/font. Pendiente decidir si se borra o se deja. ## Tabla de correlación canónica (LA referencia) | size | font (px) | line-height | icon (px) | icon − font | |---|---|---|---|---| | xxs | 10 | 15 | 12 | +2 | | xs | 12 | 18 | 14 | +2 | | sm | 14 | 20 | 16 | +2 | | md | 16 | 23 | 18 | +2 | | lg | 20 | 27 | 20 | 0 | | xl | 24→28 | 34 | 32 | +4 | | xxl | 32→48 | 50 | 52 | +4 | (headings lg–xxl fluidos `clamp()`; col font = max desktop. Salto icon 20→32 es fiel al salto del texto 20→28: la tipografía tampoco tiene nada entre medias.) ## SIGUIENTE PASO — lo que estábamos a punto de hacer (NO implementado) **1:1 TOTAL** (opción A, confirmada por el usuario): `size md = font-md (16) = icon-md (18)`, sin "bajones". **El problema a resolver**: hoy el `size` canon (`STATIC_SIZE` en `lib/primitives/static.ts`) y varios recipes (button incluido) **bajan el font un escalón**: - `STATIC_SIZE`: `md → fontSize 'sm'`, `lg → 'md'`, `xl → 'lg'`, `xxl → 'xl'`. - button recipe: `font-size-md: var(--font-size-sm)`, `lg→md`, `xl→lg`. Para 1:1 hay que **quitar ese bajón** → `md → font-md`, etc. Consecuencia: **el texto de los controles SUBE** (button/input md: 14→16px). Cambio visual amplio. ### Tareas concretas para retomar 1. **MEDIR el impacto primero** (el grep se quedó sin ejecutar). Saber: - Qué recipes bajan su font a mano (`'font-size-(md|lg|xl)': 'var(--font-size-(xs|sm|md|lg))'`). - Quién consume `var(--size-{name}-font-size)` (heredan del canon). - → dimensionar si el cambio es 5 recipes o 40. 2. **Implementar 1:1**: - `STATIC_SIZE`: cada size → `fontSize` del MISMO nombre (md→'md', lg→'lg', xl→'xl', xxl→'xxl'). - **button** recipe: `font-size-{size}` → `var(--font-size-{size})` (1:1) + `icon-size-{size}` → `var(--icon-size-{size})` (1:1). Resultado button: xs/sm/md/lg/xl = font 12/14/16/18-20/24-28 + icon 14/16/18/20/32. ⚠️ button xl queda GRANDE (font 24-28 + icon 32) — MIRAR si convence; quizá button no debe llegar a xl tan grande. - Demás recipes que bajan: alinear a 1:1. 3. **radio-cards** (`recipes/base.ts` ~1975): migrar a la correlación. Hoy usa iconos PROMINENTES hardcodeados (18/20/24/28/32) más grandes que sus títulos (14/14/16/16/18-20). Bajo la regla "sin inflar", el icono **acompaña el título** → 16/16/18/18/20 (ENCOGEN). Si una card quiere icono grande, la vía canónica es subir el font del título (el icono lo sigue), NO inflar el icono. 4. **Regenerar** (`npm run generate:eidos-css`) + **verificar visual** dark/light (button gallery `/uix/components/button`, radio-cards, varios controles) + commitear. ## Decisiones de la sesión (NO re-litigar) - ❌ **NO** más escalas ni steps prominentes (24/28/40). "No vamos a meter más escalas que suban o bajen ni que el diseñador lo hardcodee." - ❌ **NO** Fluent puro (14/16/20/24/32/40/48/64). Se ajustó la escala actual atada a texto (solo xl→32, xxl→52). - ✅ Regla única: **el icono SIEMPRE acompaña al texto del componente** (`icon = icon-{name}` del `font` que el componente muestra). 1:1. - ✅ Coherencia total: `size = font = icon` por nombre (sin bajones). El usuario prefiere subir el font de los controles a mantener el bajón. ## Archivos clave | Archivo | Qué | |---|---| | `src/uix/eidos/lib/primitives/static.ts` | `STATIC_ICON.size` (escala iconos) + `STATIC_SIZE` (size canon que BAJA el font — a corregir) | | `src/uix/eidos/lib/primitives/typography.ts` | escala tipográfica (`sizes`: 10/12/14/16/20/28/48...) | | `src/uix/eidos/components/icon/create-icon.ts` | `ICON_SIZE_PX_MAP` (espejo de la escala) | | `src/uix/eidos/lib/recipes/base.ts` | button ~1470 · radio-cards ~1975 | | `src/uix/eidos/THEMING.md §5` | doc de la correlación | | `web/routes/uix/icon-scale-study/+page.svelte` | banco de pruebas visual | Regenerar siempre tras tocar la escala: `npm run generate:eidos-css`. ## Estado git al pausar Rama `active-uix`. Excluir SIEMPRE de commits: `palabras/**`, `.claude/launch.json`, y lo ajeno del usuario en el árbol (`ogl` en package.json, `web/routes/demos/animations/`, `web/routes/demos/+page.svelte`).