Profundidad · Eidos

Eidos · canal de profundidad

La profundidad ocurre

No es una propiedad que un elemento tiene — es algo que sucede. Mira: la profundidad responde al cursor y asciende cuando algo emerge.

Reacciona

Pasa el cursor — cada tarjeta sube de plano (raised → overlay): la sombra crece y se eleva.

{#each [{ t: 'Ingresos', v: '€48.2k', d: '+12% este mes', c: 'fulfill' }, { t: 'Sesiones', v: '9 312', d: '+4% vs ayer', c: 'primary' }, { t: 'Alertas', v: '3', d: 'requieren acción', c: 'risk' }] as card}
{card.t} {card.v} {card.d}
{/each}

Responde a cada estado

No solo al hover. Reposo, foco, pulsado, deshabilitado — la profundidad cambia con cada estado. Donde Material publica una tabla de niveles por estado, aquí es un solo canal que reacciona. El último control es real: pásale el cursor, enfócalo con Tab, púlsalo.

{#each STATE_LADDER as s}
Guardar
{s.state} · {s.moves}
{/each}
en vivo · hover · foco · pulsa

Asciende

Abre el panel: asciende sobre el contenido (que recede tras el scrim). La sombra crece desde plano hasta su elevación — la firma del evento, no un estilo fijo.

panel · proyecto
{#each ['Revisar borrador de diseño', 'Publicar el sprint de profundidad', 'Cerrar incidencias abiertas'] as row, i}
{row}
{/each}
{#if open}

Acabo de ascender

Mi sombra creció desde la superficie hasta el plano modal mientras subía — y el contenido de detrás recedió. Eso es la profundidad ocurriendo.

{/if}

La escalera de planos

Cinco posiciones en la jerarquía de atención, de hundido a cima: recessed → flush → raised → overlay → modal. Cada peldaño compone superficie + sombra + z — míralos trepar hacia ti.

{#each PLANE_LADDER as plane, i}
{plane} z · {PLANE_CATALOG.find((p) => p.plane === plane)?.z}
{/each}

Cada plano, un rol

Los 5 planos son los componentes que los necesitan. data-depth cohere superficie + sombra + z; en dark, "más arriba" = más claro (mode-aware).

diseño activo v2
flush · chips, a ras de superficie
A
Tarjetacontenido en reposo
raised · tarjetas, paneles
overlay · menús, popovers
¿Eliminar? No se puede deshacer. Eliminar
modal · diálogos, cima
Buscar escribe aquí…
recessed · inputs, pozos

Catálogo de planos en reposo

La elevación en reposo de cada familia de componente — el equivalente a la tabla de especificación de Material, pero en planos nombrados por su rol, no en milímetros.

Plano Banda z Componentes Muestra
{#each PLANE_CATALOG as p}
{p.plane} {p.z} {p.use}
{/each}

Luz vs sombra

La misma tarjeta overlay, los dos modos a la vez. En claro manda la sombra proyectada y el halo es invisible. En oscuro la sombra apenas se ve — toma el relevo el halo: un rim de luz computado en oklab. La señal se adapta al modo en vez de mentir.

claro la sombra define el relieve
oscuro el halo toma el relevo

La jaula abierta

Opinión fuerte que nunca atrapa. El plano overlay trae una sombra canónica — pero la mezcla es tuya: retúnea por config, anula por componente, o baja al primitivo crudo. La misma tarjeta, cuatro mezclas — cámbiala y míralo en vivo.

data-depth="overlay" Sombra {SHADOW_VARIANTS.find((v) => v.key === shadowKey)?.label} el plano no cambia — su mezcla, sí
{#each SHADOW_VARIANTS as v} {/each}
box-shadow: {activeShadow};

canónica = el plano sin tocar · de marca = mezcla OKLCH con el color primario · primitivo crudo = var(--shadow-3), siempre a un paso. En una app real esto vive en EidosConfig.depth o en un override de recipe — el inline aquí es solo el atajo más corto a la misma puerta.

Accesibilidad

La profundidad acompaña — nunca carga sola con el significado.

{#each [{ t: 'Nunca el único canal', d: 'Cada plano va con borde, superficie y posición — no solo sombra. Quítale la sombra y la jerarquía sigue legible.' }, { t: 'Respeta reduced-motion', d: 'El ascenso eventful (la firma) degrada a un cambio de estado instantáneo cuando se prefiere menos movimiento.' }, { t: 'Sobrevive a forced-colors', d: 'En alto contraste el box-shadow desaparece; el plano se apoya en borde y superficie, que el modo sí respeta.' }, { t: 'Contraste, no relieve', d: 'La profundidad no sustituye al contraste de texto: el contenido cumple APCA en cualquier plano.' }] as item}
{item.t} {item.d}
{/each}