# CONTINUE — visibilidad por breakpoint (`visibleFrom` / `hiddenFrom`) (handoff, act. 2026-08-19) **Estado: F1–F3 HECHAS, AUDITADAS, VERIFICADAS en Chrome real y COMMITEADAS** (2026-08-19, `uix(box): ocultar por CSS descarga el vídeo igual…`). La auditoría de cierre encontró tres desviaciones menores, las tres corregidas antes del commit (ver §Auditoría). Nada bloquea el uso. **Por dónde entrar: [§Qué queda, por orden](#qué-queda-por-orden).** Lo único pendiente es F4 (rollout al hero), y sólo si el autor lo pide. ## Qué es Dos props en `Box` que **NO RENDERIZAN** el elemento fuera de su rango de breakpoints — el subárbol no está en el DOM, sus efectos no corren y su media no se pide. Es la mitad que `display={{ base: 'none' }}` no puede dar (oculta, pero monta). Por herencia la ganan los once contenedores que componen `Box` (Section, Container, Flex, Grid, Stack, Group, Wrap, AutoGrid, Surface, AspectRatio, Float) sin tocar sus ficheros. - `visibleFrom="md"` → no existe por debajo de `md` (desktop-only). - `hiddenFrom="md"` → no existe desde `md` (mobile-only). - Ambos → rango contiguo. `base` excluido del tipo a propósito. La puerta es `eidos.dom.isAtLeast(bp)` —el predicado que `ActiveDom` ya tenía, sobre los breakpoints que configura el app— en un `$derived` y un `{#if}` alrededor de la raíz de `box.svelte`. Sin atributos nuevos, sin generador. **Fuente viva de las decisiones**: `C:\Users\dev\.claude\plans\elegant-weaving-lark.md` (D-V.1…4 firmadas 2026-08-18, con el estudio de cómo lo hacen Mantine, Chakra, MUI, Vuetify, Framer y Webflow — todos por CSS o pagando flash/adivinando el ancho). Su contenido de decisiones debería moverse a un lugar del repo si el eje sigue creciendo (hoy vive en el README de Box y en `docs/architecture/eidos.md`). ## Auditoría de cierre (2026-08-19) — hallazgos y correcciones | # | Hallazgo | Corrección | | --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | El tipo aceptaba `base`: `visibleFrom="base"` = «siempre», `hiddenFrom="base"` = «nunca renderiza» — y la demo (correctamente) no lo ofrecía en los chips: paridad rota entre tipo y demo | `Exclude` en ambas props, con el porqué en el JSDoc. El mismo `Exclude` bajó a la demo (`$state` + chips) el 2026-08-19: sin él `npm run check` daba 2 errores en `box/`. **HECHO** | | 2 | README decía «los doce contenedores que componen Box» y listaba once (el doceavo es Box) | «once… — doce con Box». **HECHO** | | 3 | El plan pedía en Gaps la exclusión de Card / Banner / ScrollArea / Sticky (raíz propia, no heredan) y faltaba | Fila añadida con la regla del `as` (≥2 casos reales). **HECHO** | | 4 | Dos afirmaciones del informe no se habían LEÍDO en consola: «Svelte repara el `{#if}` sin aviso» y «sin `effect_update_depth_exceeded` al cruzar con capas que se registran» | Medido en Chrome con consola capturada desde la carga: **cero** avisos de hidratación, **cero** bucles en 3 ciclos con un `Background.Gradient animate` dentro; `Stack → Flex → Box` hereda. **CONFIRMADO** | | 5 | La nota documental fue a `docs/architecture/eidos.md` y no a `theming/reference.md` como decía el plan | `theming/reference.md` no tiene sección responsive; el párrafo del «puente responsive» vive en `eidos.md` §tokens. Desvío justificado, no error | Verificado (Chrome real, 2026-08-18/19): a 2133px conviven `visibleFrom="md"` presente, `hiddenFrom="md"` ausente y rango `sm–lg` ausente · al cerrar la puerta en vivo desaparecen sección, `