From 6d8c552407eb2919ccd13c8718ea3a429b0159ee Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 5 Jun 2026 21:37:15 +0200 Subject: [PATCH] =?UTF-8?q?feat(eidos):=20shape=20Fase=205=20=E2=80=94=20/?= =?UTF-8?q?temas/forma=20showcase=20+=20docs=20(channel=20complete)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shape channel end to end, live: - Continuidad — round vs squircle + a live --shape-smoothing dial (1 -> 3.2). - Familias — rounded/continuous/cut/scoop (one corner-shape mechanism). - Armonia anidada — concentric data-shape-nest (inner = outer - gap), toggle to see it break. - Ocurre — press -> the corner firms (the press-squeeze cross-modal firma). Docs: SHAPE_ENGINE_RFC Fases 1-5 done; THEMING 30 (shape). Verified: check 0 errors. Browser (Chrome 146): continuous->squircle, cut->bevel, scoop->scoop; nest inner radius = outer(16) - gap(8) = 8px; press-squeeze firma fires on the continuous button. corner-shape degrades to arc where unsupported. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/uix/eidos/SHAPE_ENGINE_RFC.md | 26 +-- src/uix/eidos/THEMING.md | 28 +++ web/routes/temas/forma/+page.svelte | 271 ++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+), 11 deletions(-) create mode 100644 web/routes/temas/forma/+page.svelte diff --git a/src/uix/eidos/SHAPE_ENGINE_RFC.md b/src/uix/eidos/SHAPE_ENGINE_RFC.md index e880e079c..962536878 100644 --- a/src/uix/eidos/SHAPE_ENGINE_RFC.md +++ b/src/uix/eidos/SHAPE_ENGINE_RFC.md @@ -103,17 +103,21 @@ nada → cero rotura): ## 6. Fases (la flexibilidad va horneada en cada una) -1. **Continuidad + escala** — `--shape-smoothing` + emisión progresiva (`border-radius` + - `corner-shape` donde se soporte) + validación + test + regen. Puertas: smoothing - config-driven/override, `--radius-*` intactos, escape al `border-radius` crudo. -2. **Armonía anidada** — convención/helper de radio anidado computado (`--shape-nest-gap`). -3. **Forma _eventful_ (momento-evento)** — firma `shape-morph` (squeeze/round) **sobre el - sistema de `signatures` existente**, coordinada con motion/depth desde un evento, degradando - con reduced-motion. Anulable (sobreescribe keyframes/signatures). No un sistema paralelo. -4. **Familias** — `rounded/continuous/cut/pill/sharp` como atributo + recipe + builder - `applyShape(seed)`. -5. **Showcase + docs** — `/temas/forma` (continuidad/anidado/familias/eventful en vivo) + - THEMING §shape. +1. ✅ **Continuidad + escala + familias** — `--shape-smoothing` + `data-shape` → + `corner-shape` con las 4 familias (`rounded`/`continuous`/`cut`/`scoop`). Emisión + progresiva: `border-radius` universal (la magnitud, `--radius-*` intactos) + `corner-shape` + donde se soporte (degrada al arco). Config-driven + validación + test + regen. (Las familias + se adelantaron aquí — son la misma mecánica `corner-shape`.) +2. ✅ **Armonía anidada** — `--shape-nest-gap` + regla `[data-shape-nest]`: + `border-radius: max(0, var(--shape-outer-radius) − gap)` (concéntrico). +3. ✅ **Forma _eventful_ (momento-evento)** — el morph de esquina **plegado en la firma + `press-squeeze`** (cross-modal: un press = escala + sombra + esquina) + `@property + --shape-smoothing` para que interpole. Sobre el sistema de `signatures` existente; degrada con + reduced-motion. No un sistema paralelo. +4. ✅ **Builder runtime `applyShape(seed)`** — dial de `smoothing`/`nestGap` + override de + familias, bloque gestionado (hermano de `applyColorScheme`/`applyTypeScale`/`applyDepth`). +5. ✅ **Showcase + docs** — `/temas/forma` (continuidad con dial + familias + anidado + + eventful en vivo) + THEMING §30. ## 7. Composición con lo existente diff --git a/src/uix/eidos/THEMING.md b/src/uix/eidos/THEMING.md index 7fefc2230..d515c9fda 100644 --- a/src/uix/eidos/THEMING.md +++ b/src/uix/eidos/THEMING.md @@ -2308,6 +2308,34 @@ en vivo — hermano de `applyColorScheme` / `applyTypeScale`. Demo: `/temas/prof **Pendiente** (menor): el cue `scrim` está disponible como token (`--depth-{plane}-scrim`) pero sin regla cableada — el backdrop dim de los modales lo gestiona hoy cada componente. +## 30. Forma (shape) — continuidad + familias + anidado + eventful (2026-06-05) + +La forma es un **canal**, no un número de `border-radius`. Guía canónica: +`SHAPE_ENGINE_RFC.md`. La **magnitud** sigue en `--radius-*` (intacta); shape añade los ejes +que todos dejan planos. **El primer squircle-como-token de la web** (el campo entero es +arco + estático; la continuidad solo existía en Apple, atada a plataforma). + +- **Continuidad** — `--shape-smoothing` (exponente superelipse: 1 = arco, 2 = squircle) + + familias vía `data-shape='{family}'` → `corner-shape`: `rounded` (round) · `continuous` + (`superellipse(var(--shape-smoothing))`) · `cut` (bevel) · `scoop`. **Opt-in** (no pisa + círculos/píldoras) y **progresivo**: degrada al arco de `border-radius` donde no hay + `corner-shape` (Chromium 2025+). +- **Armonía anidada** — `[data-shape-nest]` deriva `border-radius: max(0px, + var(--shape-outer-radius) − var(--shape-nest-gap))`: el hijo queda concéntrico al padre (que + expone su radio en `--shape-outer-radius`). +- **Eventful (dos momentos)** — la forma en reposo (`data-shape`) + el **morph** al pulsar: la + firma `press-squeeze` cuadra la esquina un instante (`--shape-smoothing` 2→3→2, registrado con + `@property` para que interpole). Cross-modal: un evento mueve escala + sombra + esquina. + Degrada con `prefers-reduced-motion`. No-op en familias no-`continuous`. +- **Jaula abierta** — escala + familias config-driven (`EidosConfig.primitives.shape`); el + `border-radius` crudo siempre a un paso; builder runtime `ActiveEidos.applyShape(seed)` / + `clearShape()` (+ `buildShape` puro, exportado de `$uix/eidos`) para dialar continuidad / + nestGap / familias en vivo. Demo: `/temas/forma`. + +**Pendiente** (futuro): adopción por componentes (hoy las recipes usan `--radius-*` con arco; +optar a `data-shape='continuous'` en las superficies rectangulares es una pasada separada, con +cuidado de no squircle-izar avatares/píldoras). + --- **Última revisión**: 2026-06-05. Si algo en este doc no coincide con diff --git a/web/routes/temas/forma/+page.svelte b/web/routes/temas/forma/+page.svelte new file mode 100644 index 000000000..f0a65e479 --- /dev/null +++ b/web/routes/temas/forma/+page.svelte @@ -0,0 +1,271 @@ + + +Forma · Eidos + +
+
+
+

Eidos · canal de forma

+ +
+

La esquina, repensada

+

+ Toda la web reduce la forma a un número: border-radius, un arco circular. La + esquina tiene más ejes — continuidad, familia, + armonía y tensión. Aquí la forma es un canal, y también + ocurre. +

+
+ + +
+
+

Continuidad

+

+ El arco circular tiene un quiebre donde el lado encuentra la curva. El squircle + (superelipse) fluye sin costura — lo que hace premium a iOS. En Eidos es un token: + --shape-smoothing. Muévelo. +

+
+
+
+
+
+
rounded · arco · superellipse(1)
+
+
+
+
continuous · superellipse({smoothing.toFixed(2)})
+
+
+
+ + corner-shape: superellipse(var(--shape-smoothing)); +
+
+
+ + +
+
+

Familias

+

+ Una sola mecánica (corner-shape vía data-shape) cubre cuatro + familias perceptuales. Material solo tiene cut; Apple solo + continuous. Aquí, las cuatro. +

+
+
+ {#each FAMILIES as f} +
+
+
{f.label}{f.note}
+
+ {/each} +
+
+ + +
+
+

Armonía anidada

+

+ Radios concéntricos: el interior = exterior − gap, así las esquinas quedan + paralelas. Sin esto, una tarjeta dentro de otra desencaja. Solo SwiftUI lo tiene; + aquí es data-shape-nest. Apágalo y míralo romperse. +

+
+
+
+
+ {#if nest} +
+
+ {:else} +
+
+ {/if} +
+
+ +
+
+ + +
+
+

La forma ocurre

+

+ Púlsalo: la esquina se afirma bajo el dedo (la continuidad se cuadra un instante) + — a la vez que baja de escala y se aplana la sombra. Un solo evento, tres canales: la + firma cross-modal. (Solo el botón continuous morfea; el otro es el + control.) +

+
+
+ + +
+
+ +
+

+ El primer squircle-como-token de la web. Todo el campo (Tailwind · shadcn · + Chakra · Mantine · Ant · Radix · Carbon · Fluent · Spectrum · Polaris) es escala de magnitud + + arco + estático. La continuidad solo existía en Apple (plataforma); el morph solo en + Material (ad-hoc). Eidos reúne continuidad + familias + anidado + eventful como tokens + abiertos — magnitud intacta en --radius-*, degradando al arco donde no hay + corner-shape. Runtime: applyShape(). +

+
+
+ +