fix(demos): rebuild /temas/profundidad — real + interactive, not abstract tiles

The first cut was weak (grey tiles + a "dispárame" box — it did not sell depth).
Rebuilt around real UI that responds:

  - Reacciona — metric cards that lift on hover (raised -> overlay: shadow grows +
    translateY): depth responds to interaction (state moment).
  - Asciende — an app mockup whose trigger rises a dialog over a scrim; the dialog
    shadow grows from flat -> its modal plane as it ascends (the present-rise firma,
    fired by stamping data-event-*) and the backdrop recedes (event moment).
  - Cada plano, un rol — the 5 planes as the real components they are for:
    chips (flush) / card (raised) / menu (overlay) / dialog (modal) / input (recessed).

Self-contained, dark editorial aesthetic. Verified: check 0 errors; browser — the
dialog rises with the firma over a scrim (firmaFired + scrim true), archetypes render
with their plane shadows.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
active-uix
dev 4 months ago
parent 019b93d284
commit 9b420f37cf

@ -1,39 +1,34 @@
<script lang="ts"> <script lang="ts">
/** /**
* Depth demo — the Eidos depth system, the novel "depth occurs" channel. * Depth demo — the Eidos depth channel, made visceral.
* *
* Two moments, both live: * Not abstract tiles: real UI that RESPONDS. Three beats —
* - ESTADO: the 5 planes (`data-depth`) — the resting elevation (where an element *is*), * 1. Reacciona — cards lift on hover (state moment: depth responds to interaction).
* composing surface + shadow + z. Toggle light/dark to see the mode-aware mix. * 2. Asciende — a dialog RISES over a scrim on open (event moment: the `present-rise`
* - EVENTO: stamping `data-event-*` (as sema would during the hold) fires the firma — * firma — shadow grows + lift — fired by stamping `data-event-*`, as sema would).
* emerge → the shadow GROWS (rise); contact → it FLATTENS (recede). Depth *occurs*. * 3. Cada plano, un rol — the 5 planes shown as the real components they're for.
* *
* Self-contained: imports the eidos foundation (planes + firma keyframes) + `data-theme`. * Self-contained: eidos foundation (planes + firma) + `data-theme`.
*/ */
import '@/uix/eidos/index.css' import '@/uix/eidos/index.css'
let theme = $state<'light' | 'dark'>('dark') let theme = $state<'light' | 'dark'>('dark')
const PLANES = [ // ── Ascenso: a dialog that rises over a scrim (the event moment) ────────────
{ id: 'flush', label: 'flush', note: 'a ras de superficie' }, let open = $state(false)
{ id: 'raised', label: 'raised', note: 'tarjetas · reposo' }, let evt = $state<{ event?: string; phase?: string }>({})
{ id: 'overlay', label: 'overlay', note: 'menús · popovers' },
{ id: 'modal', label: 'modal', note: 'diálogos · cima' },
{ id: 'recessed', label: 'recessed', note: 'pozos · inputs' }
] as const
// ── Event moment: stamp data-event-* to fire the firma (as sema would) ────── function summon(): void {
let targetPlane = $state<'raised' | 'overlay' | 'modal'>('overlay') open = true
let evt = $state<{ event?: string; family?: string; phase?: string }>({}) evt = {}
function fire(next: { event?: string; family?: string }): void {
evt = {} // clear → lets the one-shot animation restart on re-trigger
requestAnimationFrame(() => { requestAnimationFrame(() => {
evt = { ...next, phase: 'active' } evt = { event: 'present', phase: 'active' }
}) })
} }
const fireEmerge = () => fire({ event: 'present' }) function dismiss(): void {
const firePress = () => fire({ family: 'contact' }) open = false
evt = {}
}
</script> </script>
<svelte:head><title>Profundidad · Eidos</title></svelte:head> <svelte:head><title>Profundidad · Eidos</title></svelte:head>
@ -48,86 +43,152 @@
</div> </div>
<h1 class="mast-title">La profundidad <em>ocurre</em></h1> <h1 class="mast-title">La profundidad <em>ocurre</em></h1>
<p class="mast-lede"> <p class="mast-lede">
No es una propiedad que un elemento <i>tiene</i> — es algo que <i>sucede</i>. Un plano en No es una propiedad que un elemento <i>tiene</i> — es algo que <i>sucede</i>. Mira: la
reposo (estado) <strong>y</strong> un ascenso al emerger (evento): los dos momentos, un solo profundidad <strong>responde</strong> al cursor y <strong>asciende</strong> cuando algo emerge.
canal.
</p> </p>
</header> </header>
<!-- ── Planos (momento-estado) ────────────────────────────────────────── --> <!-- ── 1 · Reacciona (estado · hover) ─────────────────────────────────── -->
<section class="section"> <section class="section">
<div class="sec-head"> <div class="sec-head">
<h2 class="sec-title">Planos · momento-estado</h2> <h2 class="sec-title">Reacciona</h2>
<p class="sec-note"> <p class="sec-note">Pasa el cursor — cada tarjeta sube de plano (raised → overlay): la sombra crece y se eleva.</p>
<code>data-depth='{`{plane}`}'</code> — un nivel cohere superficie + sombra + z. La mezcla
es mode-aware (en dark, "más arriba" = más claro). Cambia el tema arriba.
</p>
</div> </div>
<div class="planes"> <div class="lift-row">
{#each PLANES as p} {#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}
<div class="plane-cell"> <article class="lift-card" data-depth="raised">
<div <span class="lift-tag" data-c={card.c}>{card.t}</span>
class="plane-card" <span class="lift-value">{card.v}</span>
data-depth={p.id} <span class="lift-delta">{card.d}</span>
style="background: var(--depth-{p.id}-surface, var(--color-surface-default))" </article>
></div>
<span class="plane-label">{p.label}</span>
<span class="plane-note">{p.note}</span>
</div>
{/each} {/each}
</div> </div>
</section> </section>
<!-- ── El evento (momento-evento) ─────────────────────────────────────── --> <!-- ── 2 · Asciende (evento · la firma) ───────────────────────────────── -->
<section class="section"> <section class="section">
<div class="sec-head"> <div class="sec-head">
<h2 class="sec-title">El evento · momento-evento</h2> <h2 class="sec-title">Asciende</h2>
<p class="sec-note"> <p class="sec-note">
La elevación vive en la <em>firma</em>: dispara un evento (como haría sema durante el Abre el panel: <em>asciende</em> sobre el contenido (que recede tras el scrim). La sombra
<code>hold</code>) y la sombra <strong>crece</strong> al emerger / se <strong>aplana</strong> crece desde plano hasta su elevación — la <em>firma</em> del evento, no un estilo fijo.
al presionar — coordinado con posición + escala desde un solo evento.
</p> </p>
</div> </div>
<div class="event-stage"> <div class="stage">
<div class="event-controls"> <div class="stage-app" class:dimmed={open}>
<div class="ctrl"> <div class="app-bar">
<span class="ctrl-label">plano de reposo</span> <span class="app-dot"></span><span class="app-dot"></span><span class="app-dot"></span>
<div class="chips"> <span class="app-title">panel · proyecto</span>
{#each ['raised', 'overlay', 'modal'] as pl}
<button class="chip" data-on={targetPlane === pl} onclick={() => (targetPlane = pl as typeof targetPlane)}>{pl}</button>
{/each}
</div>
</div>
<div class="fire-row">
<button class="fire-btn" onclick={fireEmerge}>↑ emerge <small>(sube)</small></button>
<button class="fire-btn" onclick={firePress}>↓ contact <small>(recede)</small></button>
</div> </div>
{#each ['Revisar borrador de diseño', 'Publicar el sprint de profundidad', 'Cerrar incidencias abiertas'] as row, i}
<div class="app-row"><span class="app-check" data-on={i === 1}></span>{row}</div>
{/each}
</div> </div>
<div class="event-arena"> {#if open}
<button class="scrim" aria-label="cerrar" onclick={dismiss}></button>
<div <div
class="event-target" class="risen"
data-depth={targetPlane} data-depth="modal"
data-event={evt.event} data-event={evt.event}
data-event-family={evt.family}
data-event-phase={evt.phase} data-event-phase={evt.phase}
style="background: var(--depth-{targetPlane}-surface, var(--color-surface-overlay))"
> >
<span class="target-glyph">↕</span> <h3 class="risen-title">Acabo de ascender</h3>
<span class="target-text">dispárame</span> <p class="risen-body">
Mi sombra creció desde la superficie hasta el plano <code>modal</code> mientras subía — y
el contenido de detrás recedió. Eso es la profundidad <em>ocurriendo</em>.
</p>
<div class="risen-actions">
<button class="btn btn-primary" onclick={dismiss}>Entendido</button>
<button class="btn btn-ghost" onclick={dismiss}>Cerrar</button>
</div>
</div> </div>
</div> {/if}
<button class="stage-trigger" onclick={() => (open ? dismiss() : summon())}>
{open ? '↓ cerrar' : '↑ abrir panel'}
</button>
</div>
</section>
<!-- ── 3 · Cada plano, un rol ─────────────────────────────────────────── -->
<section class="section">
<div class="sec-head">
<h2 class="sec-title">Cada plano, un rol</h2>
<p class="sec-note">
Los 5 planos son los componentes que los necesitan. <code>data-depth</code> cohere
superficie + sombra + z; en dark, "más arriba" = más claro (mode-aware).
</p>
</div>
<div class="roles">
<!-- flush -->
<figure class="role">
<div class="role-stage">
<div class="chips">
<span class="chip" data-depth="flush">diseño</span>
<span class="chip" data-depth="flush">activo</span>
<span class="chip" data-depth="flush">v2</span>
</div>
</div>
<figcaption><b>flush</b> · chips, a ras de superficie</figcaption>
</figure>
<!-- raised -->
<figure class="role">
<div class="role-stage">
<div class="mini-card" data-depth="raised">
<span class="mini-avatar">A</span>
<div><span class="mini-name">Tarjeta</span><span class="mini-sub">contenido en reposo</span></div>
</div>
</div>
<figcaption><b>raised</b> · tarjetas, paneles</figcaption>
</figure>
<!-- overlay -->
<figure class="role">
<div class="role-stage">
<div class="mini-menu" data-depth="overlay">
<div class="menu-item">Duplicar</div>
<div class="menu-item" data-on>Mover a…</div>
<div class="menu-item">Eliminar</div>
</div>
</div>
<figcaption><b>overlay</b> · menús, popovers</figcaption>
</figure>
<!-- modal -->
<figure class="role">
<div class="role-stage">
<div class="mini-dialog" data-depth="modal">
<span class="mini-name">¿Eliminar?</span>
<span class="mini-sub">No se puede deshacer.</span>
<span class="mini-btn">Eliminar</span>
</div>
</div>
<figcaption><b>modal</b> · diálogos, cima</figcaption>
</figure>
<!-- recessed -->
<figure class="role">
<div class="role-stage">
<div class="mini-field">
<span class="field-label">Buscar</span>
<span class="field-input" data-depth="recessed">escribe aquí…</span>
</div>
</div>
<figcaption><b>recessed</b> · inputs, pozos</figcaption>
</figure>
</div> </div>
</section> </section>
<footer class="footnote"> <footer class="footnote">
<p> <p>
<strong>Default fuerte, jaula abierta.</strong> El set de planos, su mezcla y la firma son <strong>Default fuerte, jaula abierta.</strong> Planos config-driven, primitivos
config-driven y anulables; los primitivos (<code>--shadow-*</code>, <code>z-index</code>, (<code>--shadow-*</code>, <code>z-index</code>) a un paso, firma anulable; la capa eventful
<code>box-shadow</code> crudo) siguen a un paso. La capa eventful es <em>aditiva</em> sobre el es aditiva y degrada con <code>prefers-reduced-motion</code>. Un solo evento mueve
plano de reposo — un elemento <i>flush</i> no eleva nada; uno <i>raised</i> sube proporcional profundidad + posición + sound + haptic, coordinados.
a su plano. Y degrada con <code>prefers-reduced-motion</code>.
</p> </p>
</footer> </footer>
</div> </div>
@ -136,209 +197,150 @@
.root { .root {
min-block-size: 100vh; min-block-size: 100vh;
background: background:
radial-gradient(120% 80% at 50% -10%, var(--color-surface-raised), transparent 60%), radial-gradient(130% 90% at 50% -15%, var(--color-surface-raised), transparent 55%),
var(--color-surface-default); var(--color-surface-default);
color: var(--color-content-primary); color: var(--color-content-primary);
font-family: var(--font-family-primary); font-family: var(--font-family-primary);
padding: clamp(1.5rem, 5vw, 5rem) clamp(1.25rem, 5vw, 6rem) 6rem; padding: clamp(1.5rem, 5vw, 5rem) clamp(1.25rem, 5vw, 6rem) 6rem;
--rule: color-mix(in srgb, var(--color-border-default) 100%, transparent); --rule: var(--color-border-default);
} }
.masthead { .masthead { max-inline-size: 56rem; margin-block-end: clamp(3rem, 8vw, 6rem); }
max-inline-size: 56rem; .mast-row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-block-end: 2.5rem; }
margin-block-end: clamp(3rem, 8vw, 6rem); .kicker { margin: 0; font-family: var(--font-family-mono); font-size: var(--font-size-xs); letter-spacing: 0.18em; text-transform: uppercase; color: var(--color-content-muted); }
} .theme-toggle { font-family: var(--font-family-mono); font-size: var(--font-size-xs); color: var(--color-content-secondary); background: var(--color-surface-raised); border: 1px solid var(--rule); border-radius: 999px; padding: 0.5rem 1rem; cursor: pointer; }
.mast-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-block-end: 2.5rem;
}
.kicker {
margin: 0;
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--color-content-muted);
}
.theme-toggle {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
letter-spacing: 0.06em;
color: var(--color-content-secondary);
background: var(--color-surface-raised);
border: 1px solid var(--rule);
border-radius: 999px;
padding: 0.5rem 1rem;
cursor: pointer;
}
.theme-toggle:hover { color: var(--color-content-primary); } .theme-toggle:hover { color: var(--color-content-primary); }
.mast-title { .mast-title { font-family: var(--font-family-display); font-size: var(--font-size-xxxl); font-weight: 600; line-height: 1; letter-spacing: -0.03em; margin: 0 0 1.25rem; text-wrap: balance; }
font-family: var(--font-family-display);
font-size: var(--font-size-xxxl);
font-weight: 600;
line-height: 1;
letter-spacing: -0.03em;
margin: 0 0 1.25rem;
text-wrap: balance;
}
.mast-title em { font-style: italic; color: var(--color-primary-text, var(--color-content-primary)); } .mast-title em { font-style: italic; color: var(--color-primary-text, var(--color-content-primary)); }
.mast-lede { .mast-lede { max-inline-size: 48ch; font-size: var(--font-size-lg); line-height: 1.5; color: var(--color-content-secondary); margin: 0; text-wrap: pretty; }
max-inline-size: 46ch;
font-size: var(--font-size-lg);
line-height: 1.5;
color: var(--color-content-secondary);
margin: 0;
text-wrap: pretty;
}
.mast-lede i { font-style: italic; } .mast-lede i { font-style: italic; }
.mast-lede strong, .sec-note em { color: var(--color-content-primary); font-weight: 600; font-style: normal; }
.section { margin-block-end: clamp(3.5rem, 9vw, 7rem); } .section { margin-block-end: clamp(3.5rem, 9vw, 7rem); }
.sec-head { .sec-head { margin-block-end: 2.5rem; }
display: flex; .sec-title { font-family: var(--font-family-display); font-size: var(--font-size-xl); font-weight: 600; letter-spacing: -0.01em; margin: 0 0 0.5rem; }
flex-wrap: wrap; .sec-note { margin: 0; max-inline-size: 62ch; font-size: var(--font-size-sm); line-height: 1.55; color: var(--color-content-muted); }
align-items: baseline; code { font-family: var(--font-family-mono); font-size: 0.9em; color: var(--color-content-secondary); background: var(--color-surface-muted); padding: 0.1em 0.4em; border-radius: 4px; }
gap: 0.75rem 2rem;
padding-block-end: 1.25rem;
margin-block-end: 2.5rem;
border-block-end: 1px solid var(--rule);
}
.sec-title {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
margin: 0;
}
.sec-note {
margin: 0;
max-inline-size: 60ch;
font-size: var(--font-size-sm);
line-height: 1.55;
color: var(--color-content-muted);
}
code { font-family: var(--font-family-mono); font-size: 0.92em; color: var(--color-content-secondary); background: var(--color-surface-muted); padding: 0.1em 0.4em; border-radius: 4px; }
em { font-style: normal; color: var(--color-content-primary); font-weight: 500; }
/* Planes */
.planes {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 9rem), 1fr));
gap: clamp(1.5rem, 4vw, 3rem);
}
.plane-cell { display: flex; flex-direction: column; align-items: center; gap: 1rem; }
.plane-card {
inline-size: 100%;
block-size: 7rem;
border-radius: var(--radius-lg);
/* hairline so `flush` (no shadow, surface = canvas) still reads as a flat tile */
border: 1px solid color-mix(in srgb, var(--rule) 70%, transparent);
}
.plane-label {
font-family: var(--font-family-mono);
font-size: var(--font-size-sm);
letter-spacing: 0.04em;
color: var(--color-content-primary);
}
.plane-note {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
color: var(--color-content-muted);
text-align: center;
}
/* Event stage */ /* 1 · Reacciona (hover lift) */
.event-stage { .lift-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr)); gap: 1.5rem; }
display: grid; .lift-card {
grid-template-columns: minmax(0, 18rem) 1fr;
gap: clamp(1.5rem, 4vw, 3rem);
align-items: start;
}
@media (max-width: 720px) { .event-stage { grid-template-columns: 1fr; } }
.event-controls { display: flex; flex-direction: column; gap: 1.75rem; }
.ctrl { display: flex; flex-direction: column; gap: 0.7rem; }
.ctrl-label {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-content-muted);
}
.chips { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.chip {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
color: var(--color-content-secondary);
background: var(--color-surface-raised); background: var(--color-surface-raised);
border: 1px solid var(--rule); border: 1px solid var(--rule);
border-radius: 7px; border-radius: var(--radius-lg);
padding: 0.35rem 0.7rem; padding: 1.5rem;
cursor: pointer; display: flex;
flex-direction: column;
gap: 0.5rem;
cursor: default;
transition: box-shadow 240ms var(--ease-out, cubic-bezier(0.2, 0, 0, 1)), translate 240ms var(--ease-out, cubic-bezier(0.2, 0, 0, 1)), border-color 240ms;
} }
.chip[data-on='true'] { .lift-card:hover {
color: var(--color-primary-on-solid, #fff); box-shadow: var(--depth-overlay-shadow);
background: var(--color-primary-solid); translate: 0 -6px;
border-color: var(--color-primary-solid); border-color: color-mix(in srgb, var(--color-primary-solid) 40%, var(--rule));
} }
.fire-row { display: flex; flex-direction: column; gap: 0.6rem; } .lift-tag { font-family: var(--font-family-mono); font-size: var(--font-size-xs); letter-spacing: 0.04em; text-transform: uppercase; color: var(--color-content-muted); }
.fire-btn { .lift-tag[data-c='fulfill'] { color: var(--color-fulfill-text, var(--color-content-secondary)); }
font-family: var(--font-family-mono); .lift-tag[data-c='primary'] { color: var(--color-primary-text, var(--color-content-secondary)); }
font-size: var(--font-size-sm); .lift-tag[data-c='risk'] { color: var(--color-risk-text, var(--color-content-secondary)); }
color: var(--color-content-primary); .lift-value { font-family: var(--font-family-display); font-size: var(--font-size-xxl); line-height: 1; letter-spacing: -0.02em; color: var(--color-content-primary); }
background: var(--color-surface-raised); .lift-delta { font-size: var(--font-size-xs); color: var(--color-content-muted); }
@media (prefers-reduced-motion: reduce) { .lift-card { transition: box-shadow 240ms; } .lift-card:hover { translate: none; } }
/* 2 · Asciende (the stage + rising dialog + scrim) */
.stage {
position: relative;
overflow: hidden;
border-radius: var(--radius-lg);
border: 1px solid var(--rule); border: 1px solid var(--rule);
border-radius: var(--radius-md); background: var(--color-surface-default);
padding: 0.7rem 1rem; min-block-size: 22rem;
padding: clamp(1.25rem, 3vw, 2rem);
}
.stage-app { transition: filter 280ms var(--ease-out, ease), opacity 280ms; max-inline-size: 30rem; }
.stage-app.dimmed { filter: saturate(0.7); opacity: 0.5; }
.app-bar { display: flex; align-items: center; gap: 0.4rem; padding-block-end: 1rem; margin-block-end: 1rem; border-block-end: 1px solid var(--rule); }
.app-dot { inline-size: 0.6rem; block-size: 0.6rem; border-radius: 50%; background: var(--color-surface-muted); }
.app-title { margin-inline-start: 0.5rem; font-family: var(--font-family-mono); font-size: var(--font-size-xs); color: var(--color-content-muted); }
.app-row { display: flex; align-items: center; gap: 0.75rem; padding-block: 0.6rem; font-size: var(--font-size-sm); color: var(--color-content-secondary); border-block-end: 1px solid color-mix(in srgb, var(--rule) 50%, transparent); }
.app-check { inline-size: 1.05rem; block-size: 1.05rem; border-radius: 5px; border: 1.5px solid var(--rule); flex: none; }
.app-check[data-on='true'] { background: var(--color-primary-solid); border-color: var(--color-primary-solid); }
.scrim {
position: absolute;
inset: 0;
border: 0;
padding: 0;
background: color-mix(in srgb, var(--color-neutral-contrast, #000) 55%, transparent);
cursor: pointer; cursor: pointer;
text-align: left; animation: depth-scrim-in 240ms var(--ease-out, ease) both;
transition: border-color 140ms;
} }
.fire-btn small { color: var(--color-content-muted); } @keyframes depth-scrim-in { from { opacity: 0; } to { opacity: 1; } }
.fire-btn:hover { border-color: var(--color-primary-solid); }
.event-arena { .risen {
display: grid; position: absolute;
place-items: center; inset-block-start: 50%;
min-block-size: 18rem; inset-inline-start: 50%;
border-radius: var(--radius-lg); translate: -50% -50%;
background: inline-size: min(24rem, calc(100% - 3rem));
repeating-linear-gradient(45deg, transparent 0 13px, color-mix(in srgb, var(--rule) 45%, transparent) 13px 14px), background: var(--depth-modal-surface, var(--color-surface-overlay));
var(--color-surface-default);
border: 1px solid var(--rule); border: 1px solid var(--rule);
} border-radius: var(--radius-xl);
.event-target { padding: 1.75rem;
inline-size: 11rem;
block-size: 7.5rem;
border-radius: var(--radius-lg);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.5rem; gap: 0.75rem;
align-items: center;
justify-content: center;
}
.target-glyph { font-size: var(--font-size-xl); color: var(--color-content-secondary); }
.target-text {
font-family: var(--font-family-mono);
font-size: var(--font-size-xs);
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--color-content-muted);
} }
.risen-title { font-family: var(--font-family-display); font-size: var(--font-size-xl); margin: 0; color: var(--color-content-primary); }
.risen-body { margin: 0; font-size: var(--font-size-sm); line-height: 1.55; color: var(--color-content-secondary); }
.risen-actions { display: flex; gap: 0.6rem; margin-block-start: 0.75rem; }
.btn { font-family: var(--font-family-primary); font-size: var(--font-size-sm); border-radius: var(--radius-md); padding: 0.55rem 1.1rem; cursor: pointer; border: 1px solid transparent; }
.btn-primary { background: var(--color-primary-solid); color: var(--color-primary-on-solid, #fff); }
.btn-ghost { background: transparent; color: var(--color-content-secondary); border-color: var(--rule); }
.footnote { .stage-trigger {
max-inline-size: 60rem; position: absolute;
padding-block-start: 2rem; inset-block-end: 1.25rem;
border-block-start: 1px solid var(--rule); inset-inline-end: 1.25rem;
} font-family: var(--font-family-mono);
.footnote p {
margin: 0;
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
line-height: 1.6; color: var(--color-primary-on-solid, #fff);
color: var(--color-content-muted); background: var(--color-primary-solid);
text-wrap: pretty; border: 0;
border-radius: var(--radius-md);
padding: 0.65rem 1.1rem;
cursor: pointer;
z-index: 1;
box-shadow: var(--depth-raised-shadow);
} }
.footnote i { font-style: italic; }
/* 3 · Cada plano, un rol */
.roles { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr)); gap: clamp(1.25rem, 3vw, 2.5rem); }
.role { margin: 0; display: flex; flex-direction: column; gap: 1rem; }
.role-stage { min-block-size: 8rem; display: grid; place-items: center; padding: 1rem; border-radius: var(--radius-lg); background: var(--color-surface-default); border: 1px solid color-mix(in srgb, var(--rule) 60%, transparent); }
.role figcaption { font-family: var(--font-family-mono); font-size: var(--font-size-xs); color: var(--color-content-muted); }
.role figcaption b { color: var(--color-content-primary); font-weight: 600; }
.chips { display: flex; flex-wrap: wrap; gap: 0.5rem; justify-content: center; }
.chip { font-family: var(--font-family-mono); font-size: var(--font-size-xs); padding: 0.3rem 0.7rem; border-radius: 999px; background: var(--color-surface-muted); color: var(--color-content-secondary); border: 1px solid color-mix(in srgb, var(--rule) 60%, transparent); }
.mini-card { display: flex; align-items: center; gap: 0.75rem; padding: 0.9rem 1.1rem; border-radius: var(--radius-md); background: var(--color-surface-raised); }
.mini-avatar { inline-size: 2rem; block-size: 2rem; border-radius: 50%; display: grid; place-items: center; background: var(--color-primary-solid); color: var(--color-primary-on-solid, #fff); font-size: var(--font-size-sm); font-weight: 600; }
.mini-name { display: block; font-size: var(--font-size-sm); font-weight: 600; color: var(--color-content-primary); }
.mini-sub { display: block; font-size: var(--font-size-xs); color: var(--color-content-muted); }
.mini-menu { inline-size: 9rem; padding: 0.4rem; border-radius: var(--radius-md); background: var(--color-surface-overlay); display: flex; flex-direction: column; }
.menu-item { padding: 0.45rem 0.65rem; border-radius: var(--radius-sm); font-size: var(--font-size-sm); color: var(--color-content-secondary); }
.menu-item[data-on] { background: var(--color-primary-solid); color: var(--color-primary-on-solid, #fff); }
.mini-dialog { inline-size: 11rem; padding: 1rem; border-radius: var(--radius-md); background: var(--color-surface-overlay); display: flex; flex-direction: column; gap: 0.35rem; }
.mini-btn { margin-block-start: 0.5rem; align-self: flex-start; font-size: var(--font-size-xs); padding: 0.35rem 0.7rem; border-radius: var(--radius-sm); background: var(--color-threat-solid, var(--color-primary-solid)); color: #fff; }
.mini-field { display: flex; flex-direction: column; gap: 0.4rem; inline-size: 100%; max-inline-size: 11rem; }
.field-label { font-size: var(--font-size-xs); color: var(--color-content-muted); }
.field-input { padding: 0.6rem 0.8rem; border-radius: var(--radius-md); background: var(--color-surface-muted); color: var(--color-content-muted); font-size: var(--font-size-sm); }
.footnote { max-inline-size: 60rem; padding-block-start: 2rem; border-block-start: 1px solid var(--rule); }
.footnote p { margin: 0; font-size: var(--font-size-sm); line-height: 1.6; color: var(--color-content-muted); text-wrap: pretty; }
</style> </style>

Loading…
Cancel
Save

Powered by TurnKey Linux.