uix(background): se va `Backdrop`, que llevaba desde F1 absorbido y esperando tu palabra

D-BG.1 firmó la absorción y el borrado el 2026-08-17, pero el borrado exigía
orden explícita del autor y no la tenía; llegó hoy. Se van cinco ficheros:
`eidos/components/backdrop/` entero —`backdrop.css`, `backdrop.svelte`,
`index.ts`, `types.ts`— y su morfo `morfo/components/backdrop.ts`. Con `git rm`,
no con `rm`, para que el índice lo registre.

El censo se repitió justo antes de tocar nada, no se dio por bueno el de ayer:
ningún import del componente ni del morfo fuera de su propia carpeta, no lo
exporta el índice de eidos, no aparece en ningún índice de morfos, sin langs, sin
demo, y ningún `import.meta.glob` que lo cargara por convención.

Los gates lo confirman por aritmética, que es mejor que por ausencia de ruido:
`morfo:check` pasa de 168 morfos a 167 y de 8 saltados sin demo a 7 — exactamente
uno, el que se fue. `check` conserva sus 72 errores preexistentes y no menciona
backdrop en ninguno (el recuento de ficheros baja de 6985 a 6981). vitest de
`eidos` + `morfo` 653/654, con el rojo de siempre (`skin-media-player`).
`docs:check` 0/635. `smoke` 320/320.

Lo que NO se borra son las citas. La §Baseline del README de `Background` sigue
nombrando a `Backdrop` —ahora fechada, con la nota de que sus cuatro tramas
(`glow · mesh · grid · dots`), su máscara de desvanecido y su caída bajo
`prefers-contrast` se migraron valor por valor, y de que la historia guarda el
original— porque esa fila explica algo que el código ya no puede: por qué este
componente se llama `Background` y no `Backdrop`. El nombre colisionaba con el
velo modal (MUI, Vuetify, y el propio archetype `overlay`), y esa colisión es la
razón del nombre que hoy llevan `data-background`, `--background-*` y
`Background.Video`.

Con esto el eje queda cerrado: las cuatro firmas del autor ejecutadas, la
verificación en navegador completa —travel, 60 fps, reflow y la rama
`@supports not`— y el paseo A–H registrado. Vivo sólo queda lo que pertenece a
otros ejes: `Ambient` honrando la pausa (del pack) y el puerto de estado para
`<video>`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 4a9315d977
commit f7be59cdcf

@ -15,15 +15,15 @@ real, 60 fps y 0 reflows, con dos defectos encontrados y arreglados — el
`overflow: hidden` del stage que congelaba la timeline, y el rect cacheado del `overflow: hidden` del stage que congelaba la timeline, y el rect cacheado del
puntero que se desviaba con el scroll. Sin commitear todavía. puntero que se desviaba con el scroll. Sin commitear todavía.
**Por dónde entrar mañana: [§Qué queda](#qué-queda).** Nada bloquea el uso del **Por dónde entrar mañana: [§Qué queda](#qué-queda).** El eje está **CERRADO**:
componente. Lo que queda es **UNA firma tuya** (borrar `backdrop/`) y tus cuatro firmas ejecutadas, la verificación en navegador completa (incluida la
**dos tareas de otros ejes**. La rama `@supports not`) y `backdrop/` borrado. Lo único vivo son **dos tareas de
verificación en navegador está cerrada, incluida la rama `@supports not`. otros ejes** — y son de esos ejes, no de éste.
## ⚠️ LO PRIMERO: la fuente viva es el PLAN, no este fichero ## ⚠️ LO PRIMERO: la fuente viva es el PLAN, no este fichero
**`docs/process/PLAN-background.md`** — decisiones firmadas `D-BG.1…D-BG.18` en **`docs/process/PLAN-background.md`** — decisiones firmadas `D-BG.1…D-BG.18` en
§6, y el registro de ejecución fase por fase en §7.bis…§7.duodecies, cada uno con §6, y el registro de ejecución fase por fase en §7.bis…§7.terdecies, cada uno con
sus mediciones. Este handoff indexa; el plan manda. sus mediciones. Este handoff indexa; el plan manda.
## Qué queda ## Qué queda
@ -106,20 +106,19 @@ la página sin `on`. Tres roles existentes, ninguno inventado.
- ⚠️ El selector de contexto va en `:where()`: a pelo llegaba a (0,4,0) y ganaba a - ⚠️ El selector de contexto va en `:where()`: a pelo llegaba a (0,4,0) y ganaba a
`[data-color]`, derrotando el sistema de color abierto (§25). `[data-color]`, derrotando el sistema de color abierto (§25).
### 2. Lo que queda de tus firmas: UNA ### 2. ✅ Tus cuatro firmas, TODAS ejecutadas
De las cuatro, TRES quedaron ejecutadas: la escala del scrim (ordenada, con - **La escala del scrim** — ordenada, con tokens propios (§7.decies).
tokens propios), la banda de `feature-split` (por sección) y el techo de contraste - **El techo de contraste** — resuelto de raíz en D-BG.20 (§7.duodecies):
(D-BG.20, §1.ter — resuelto de raíz cambiando la tinta, no subiendo un número). cambiando la TINTA, no subiendo un número.
Queda una: - **La banda de `feature-split`** — por sección, enmendada en el plan (×3) y en
`PLAN-blocks-quality` §3 col. B.
- ⛔ **Borrar `src/uix/eidos/components/backdrop/`** — D-BG.1 lo firmó **con su - **Borrar `backdrop/`** — hecho el 2026-08-18 con tu orden explícita
morfo incluido** (`src/uix/morfo/components/backdrop.ts`). Censado: cinco (§7.terdecies): cinco ficheros (el componente y su morfo), cero consumidores,
ficheros, **cero consumidores** (no lo exporta el índice de eidos, no está en el `git rm`. Los gates lo confirman por aritmética: `morfo:check` pasa de 168 a
índice de morfos, sin langs, sin demo). Las menciones que quedan son texto: tres 167 morfos y de 8 a 7 saltados sin demo. Las CITAS se conservan: la §Baseline
docs de proceso y la §Baseline del README de `Background`, que se conservan. del README sigue nombrando a `Backdrop`, ahora fechada, porque explica por qué
**No lo he tocado**: la regla del repo exige orden de borrado explícita, y el componente se llama `Background`.
«ejecuta el plan» no la sustituye. Una palabra tuya y va.
### 3. Tareas de otros ejes que este abrió ### 3. Tareas de otros ejes que este abrió

@ -1095,6 +1095,36 @@ Gates: audit PASS 0/0 · eidos-lint invalid 0 / class-hooks 0 · `rtl:check` 0/1
vitest eidos 434/435 (el `skin-media-player` de siempre) · `check` con los 72 vitest eidos 434/435 (el `skin-media-player` de siempre) · `check` con los 72
errores preexistentes y ninguno propio. errores preexistentes y ninguno propio.
### 7.terdecies `backdrop/` borrado (2026-08-18) — D-BG.1 completada
La orden explícita del autor llegó el 2026-08-18 («ok borra»), que es lo que
D-BG.1 llevaba esperando desde que se firmó: la absorción estaba hecha desde F1,
pero el borrado exigía su palabra y no la tenía.
**Cinco ficheros**, todos rastreados: `eidos/components/backdrop/`
(`backdrop.css`, `backdrop.svelte`, `index.ts`, `types.ts`) y su morfo
`morfo/components/backdrop.ts`. Censo previo, repetido justo antes de tocar
nada: ningún import del componente ni del morfo fuera de su propia carpeta, no
lo exporta el índice de eidos, no está en ningún índice de morfos, sin langs,
sin demo, y ningún descubrimiento por `import.meta.glob` que lo cargara. Borrado
con `git rm`, no con `rm`, para que el índice lo registre.
**Gates después**: `check` con los mismos **72 errores preexistentes** y ninguna
mención a backdrop (el conteo de ficheros baja de 6985 a 6981) · vitest
`eidos` + `morfo` **653/654** (el rojo sigue siendo `skin-media-player`) ·
`docs:check` **0/635** · `smoke` **320/320** · `morfo:check` sin cambios en los
fallos y con **167 morfos donde había 168**, y los saltados sin demo bajan de 8 a
7 — la aritmética confirma que lo que se fue era exactamente lo que se pretendía.
Lo que NO se borra: las citas. La §Baseline del README de `Background` conserva a
`Backdrop` como su baseline —ahora fechada, con la nota de que sus cuatro tramas
se migraron valor por valor y que la historia guarda el original— y las tres
menciones en docs de proceso se quedan donde están. Una fila de registro nunca es
basura: es la huella de por qué el componente se llama `Background` y no
`Backdrop` (el nombre colisionaba con el velo modal).
---
--- ---
## 8. Riesgos y cómo se acotan ## 8. Riesgos y cómo se acotan

@ -1,100 +0,0 @@
/*
* Backdrop recipe — paints the decoration in a `::before` behind the content.
*
* Everything derives from tokens: the accent from the `data-color` palette
* forward (`--palette-solid`), the rules from `--color-border-*`, the mesh from
* the canonical `--gradient-aurora`. No hand-picked colour, so a theme / palette
* swap carries the decoration with it.
*
* Public tokens: `--backdrop-*`. Internal: `--_backdrop-*`.
*/
[data-box][data-backdrop] {
--_backdrop-tint: var(--backdrop-tint, var(--palette-solid, var(--color-primary-solid)));
--_backdrop-rule: var(--backdrop-rule, var(--color-border-subtle));
--_backdrop-cell: var(--backdrop-cell, 2.5rem);
position: relative;
/* Own stacking context, so the `z-index: -1` layer can never slip behind an
ancestor's background. */
isolation: isolate;
}
[data-box][data-backdrop]::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background-repeat: repeat;
}
/* ── glow — the hero halo ────────────────────────────────────────────────── */
[data-box][data-backdrop][data-pattern='glow']::before {
background-image: radial-gradient(
var(--backdrop-glow-size, 60% 55%) at var(--backdrop-glow-at, 50% 0%),
color-mix(in oklch, var(--_backdrop-tint) var(--backdrop-glow-strength, 28%), transparent),
transparent 70%
);
}
/* ── mesh — the canonical aurora, derived from the theme's own roles ─────── */
[data-box][data-backdrop][data-pattern='mesh']::before {
background-image: var(--gradient-aurora);
opacity: var(--backdrop-mesh-opacity, 0.45);
}
/* ── grid — ruled hairlines ──────────────────────────────────────────────── */
[data-box][data-backdrop][data-pattern='grid']::before {
background-image:
linear-gradient(to right, var(--_backdrop-rule) 1px, transparent 1px),
linear-gradient(to bottom, var(--_backdrop-rule) 1px, transparent 1px);
background-size: var(--_backdrop-cell) var(--_backdrop-cell);
}
/* ── dots — a dot matrix ─────────────────────────────────────────────────── */
[data-box][data-backdrop][data-pattern='dots']::before {
background-image: radial-gradient(
circle at 1px 1px,
var(--_backdrop-rule) var(--backdrop-dot-size, 1.5px),
transparent 0
);
background-size: var(--_backdrop-cell) var(--_backdrop-cell);
}
[data-box][data-backdrop][data-pattern='none']::before {
content: none;
}
/* ── fade — so a pattern never hard-cuts into the next section ───────────────
* The mask reads only the ALPHA channel, so its stops are a stencil, not a
* colour choice: `currentColor` is the opaque end and `transparent` the clear
* one. (A hardcoded `#000` here would be a raw colour literal for no reason —
* the recipe contract is right to reject it.)
*/
[data-box][data-backdrop][data-fade]::before {
-webkit-mask-image: radial-gradient(
var(--backdrop-fade-size, 75% 75%) at var(--backdrop-fade-at, 50% 35%),
currentColor 40%,
transparent 100%
);
mask-image: radial-gradient(
var(--backdrop-fade-size, 75% 75%) at var(--backdrop-fade-at, 50% 35%),
currentColor 40%,
transparent 100%
);
}
/* Decoration is the first thing to drop when the user asks for less: keep the
* structural patterns, lose the saturated bloom that can hurt contrast. */
@media (prefers-contrast: more) {
[data-box][data-backdrop][data-pattern='glow']::before,
[data-box][data-backdrop][data-pattern='mesh']::before {
content: none;
}
}

@ -1,51 +0,0 @@
<script lang="ts">
/**
* Eidos `<Backdrop>` — a decorative layer behind a section's content. The
* depth the layout primitives alone cannot give.
*
* <Backdrop pattern="glow">
* <Section>…</Section>
* </Backdrop>
*
* <Backdrop pattern="grid" fade>…</Backdrop>
*
* It WRAPS its content (rather than asking the consumer to position a sibling
* layer) so a block can compose it without owning any CSS: the recipe paints a
* `::before` behind, `pointer-events: none`, from tokens only — the accent via
* the `data-color` palette forward, the mesh from `--gradient-aurora`.
*/
import './backdrop.css';
import Box from '../box/box.svelte';
import { resolveComponentColor } from '$uix/eidos/lib/component-color';
import { composeInlineStyle } from '$uix/eidos/lib/style';
import type { BackdropProps } from './types';
let {
pattern = 'glow',
color = 'primary',
fade = true,
style,
class: className,
children,
...restProps
}: BackdropProps = $props();
// A canonical role / scale goes to `data-color` (the palette forward resolves
// it); a raw CSS value is seeded as `--color-custom` — the shared treatment
// every coloured recipe uses.
const colorAttrs = $derived(resolveComponentColor(color));
const mergedStyle = $derived(composeInlineStyle(style, colorAttrs.customStyle));
</script>
<Box
{...restProps}
class={className}
style={mergedStyle}
data-backdrop=""
data-pattern={pattern}
data-fade={fade ? '' : undefined}
data-color={colorAttrs.dataColor}
data-color-custom={colorAttrs.isCustom ? '' : undefined}
>
{@render children?.()}
</Box>

@ -1,16 +0,0 @@
// Backdrop — a decorative layer (glow · mesh · grid · dots) behind content.
//
// import { Backdrop } from '$uix/eidos/components/backdrop';
//
// <Backdrop pattern="glow"><Section>…</Section></Backdrop>
// <Backdrop pattern="grid" fade>…</Backdrop>
// <Backdrop pattern="mesh" color="teal">…</Backdrop>
//
// Wraps its content and paints behind it from tokens only (accent via the
// `data-color` palette forward, mesh from `--gradient-aurora`), so a theme or
// palette swap carries the decoration along. Every Box prop still applies.
import Backdrop from './backdrop.svelte';
export { Backdrop };
export default Backdrop;
export type { BackdropProps, BackdropPattern } from './types';

@ -1,26 +0,0 @@
import type { Snippet } from 'svelte';
import type { BoxProps } from '../box/types';
import type { ComponentColorProp } from '$uix/eidos/lib/types';
/** The decorative treatment painted behind the content. */
export type BackdropPattern = 'none' | 'glow' | 'mesh' | 'grid' | 'dots';
export type BackdropProps = BoxProps & {
/**
* Which decoration to paint:
* - `glow` — a soft radial bloom of the accent, top-centred (the hero halo)
* - `mesh` — the canonical `--gradient-aurora` mesh, derived from the theme roles
* - `grid` — a ruled grid of hairlines
* - `dots` — a dot matrix
* @default 'glow'
*/
pattern?: BackdropPattern;
/** Accent the `glow` tints with — full colour system. @default 'primary' */
color?: ComponentColorProp;
/**
* Fade the decoration out towards the edges so it never hard-cuts against the
* next section. @default true
*/
fade?: boolean;
children?: Snippet;
};

@ -319,10 +319,14 @@ its own; the count is what decides whether a pause control is owed at all
Two, both in-tree: Two, both in-tree:
- **`Backdrop`** (`eidos/components/backdrop`) — the four patterns - **`Backdrop`** — **deleted 2026-08-18** (D-BG.1, on the author's explicit order;
(`glow · mesh · grid · dots`), their fade mask and the `prefers-contrast` it lived at `eidos/components/backdrop` with its own morfo). Its four patterns
drop are migrated here value for value. It painted ONE layer in a `::before` (`glow · mesh · grid · dots`), their fade mask and the `prefers-contrast` drop
and wrapped its content; that is the shape this component supersedes. were migrated here value for value, so nothing of it is lost — read it in the
history if you need the original. It painted ONE layer in a `::before` and
wrapped its content; that is the shape this component supersedes, and the name
collided with the modal veil (MUI/Vuetify, and the `overlay` archetype), which
is why `Background` is not called `Backdrop`.
- **The hero block's `background` layout** (`blocks/hero/hero.svelte`) — three - **The hero block's `background` layout** (`blocks/hero/hero.svelte`) — three
hand-made `Box` layers, an inline scrim (`style="background: hand-made `Box` layers, an inline scrim (`style="background:
var(--color-overlay); opacity: var(--opacity-scrim)"`) and a scoped, justified var(--color-overlay); opacity: var(--opacity-scrim)"`) and a scoped, justified

@ -1,35 +0,0 @@
import type { Morfo } from '../types';
/**
* Backdrop — a decorative background layer behind a section's content (glow,
* mesh, grid, dots). A visual primitive, like `aspect-ratio`, `mockup` and
* `reveal`.
*
* Eidos-native: the recipe paints the layer in a `::before` pseudo (no extra
* node, nothing focusable, `pointer-events: none`) derived from tokens — the
* accent from the `data-color` palette forward, the rules from
* `--color-border-*`, the mesh from the canonical `--gradient-aurora`. The
* `pattern` axis is an eidos wrapper attr (`data-pattern`): it selects a
* treatment and crosses into no runtime (Backdrop has no soma).
*
* Justification for the 0-event surface: a Backdrop is decoration — it does not
* commit, emerge or react. Adding events would manufacture semantics it doesn't
* carry. Same justification as `mockup.ts` / `reveal.ts`.
*/
export const backdropMorfo = {
name: 'Backdrop',
kebab: 'backdrop',
scope: ['eidos'],
parts: [
{
name: 'Provider',
kebab: 'provider',
archetype: 'provider',
kind: 'public',
defaultElement: 'div',
optional: false,
data: [],
aria: []
}
]
} as const satisfies Morfo;
Loading…
Cancel
Save

Powered by TurnKey Linux.