From 53b76f6b4d96d6ac65dd4aab39c11720c7cd86c0 Mon Sep 17 00:00:00 2001 From: dev Date: Sat, 16 May 2026 19:48:18 +0200 Subject: [PATCH] Clarify Eidos visual-only parts --- continue.md | 5 ++ scripts/eidos-lint-all.ts | 73 ++++++++++++++++++++++++------ src/uix/eidos/components/README.md | 22 +++++++++ 3 files changed, 86 insertions(+), 14 deletions(-) diff --git a/continue.md b/continue.md index 2d752574a..dd3682366 100644 --- a/continue.md +++ b/continue.md @@ -183,6 +183,11 @@ Actualizacion Eidos component API 2026-05-16: historico `/test/eidos/*`; ahora prueba `/uix/components/toggle`, `/uix/components/switch` y `/uix/components/dialog`, detectando puertos 5173-5180. +- `scripts/eidos-lint-all.ts` afinado: mantiene allowlist explicita de attrs + y partes Eidos-only documentadas (`Header`, `Footer`, `Status`, `Main`, + `Handle`, indicadores, `data-columns`, `data-ready`, wrapper flotante, etc.) + y ahora sale con codigo 1 si aparecen selectores invalidos. La ejecucion + actual queda en invalid=0 y sin drift hotspots fuera de esa allowlist. Actualizacion 2026-05-16: diff --git a/scripts/eidos-lint-all.ts b/scripts/eidos-lint-all.ts index 732f5e624..5ee17c9ad 100644 --- a/scripts/eidos-lint-all.ts +++ b/scripts/eidos-lint-all.ts @@ -14,6 +14,57 @@ import { compileMorfo } from '../src/uix/morfo/compile' import { lintEidosCss } from '../src/uix/eidos/lint' import type { Morfo } from '../src/uix/morfo/types' +const EIDOS_ONLY_ATTRS = new Set([ + 'data-archetype', + 'data-block', + 'data-collapsed', + 'data-color', + 'data-columns', + 'data-dragging', + 'data-event', + 'data-event-family', + 'data-event-id', + 'data-event-intent', + 'data-event-phase', + 'data-fitted', + 'data-icon-only', + 'data-indicator-placement', + 'data-motion', + 'data-motion-disabled', + 'data-position', + 'data-ready', + 'data-scrollable', + 'data-sheet', + 'data-size', + 'data-soma-floating-wrapper', + 'data-svg', + 'data-svg-direction', + 'data-variant' +]) + +const RUNTIME_SIGNAL_ATTRS = new Set([ + 'data-disabled', + 'data-invalid', + 'data-last-action', + 'data-orientation', + 'data-readonly', + 'data-side', + 'data-state' +]) + +const EIDOS_ONLY_PART_SUFFIXES = [ + 'flat', + 'footer', + 'handle', + 'header', + 'indicator', + 'label', + 'main', + 'row', + 'row-label', + 'status' +] as const + async function main() { const eidosDir = resolve('src/uix/eidos/components') const cssFiles = readdirSync(eidosDir, { withFileTypes: true }).flatMap((entry) => { @@ -96,24 +147,18 @@ async function main() { for (const r of h.invalid) console.log(` ✗ ${r}`) for (const r of h.eidosOnly) console.log(` · ${r}`) } + } else { + console.log('\nNo drift hotspots beyond documented Eidos-only attrs/parts.') } + + if (totalInvalid > 0) process.exit(1) } function isAllowedEidosOnlyAttr(attr: string): boolean { - return ( - attr === 'data-event' || - attr === 'data-event-id' || - attr === 'data-event-phase' || - attr === 'data-event-family' || - attr === 'data-event-intent' || - attr === 'data-archetype' || - attr.endsWith('-color') || - attr.endsWith('-size') || - attr.endsWith('-variant') || - attr.endsWith('-position') || - attr.endsWith('-block') || - attr.endsWith('-icon-only') - ) + if (EIDOS_ONLY_ATTRS.has(attr)) return true + if (RUNTIME_SIGNAL_ATTRS.has(attr)) return true + + return EIDOS_ONLY_PART_SUFFIXES.some((suffix) => attr.endsWith(`-${suffix}`)) } main().catch((err) => { diff --git a/src/uix/eidos/components/README.md b/src/uix/eidos/components/README.md index d0742d5b6..7e90b05fc 100644 --- a/src/uix/eidos/components/README.md +++ b/src/uix/eidos/components/README.md @@ -199,6 +199,28 @@ export type DrawerContentProps = SomaDrawerContentProps & { > **Sin `XxxFlatProps`, sin `XxxProviderProps as ProviderProps` aliases.** > Hay un solo `XxxProps` (el del root) y los `XxxPartProps` per hijo. +### Partes Eidos-only + +Algunas partes existen solo para componer la superficie visual: `Header`, +`Footer`, `Status`, `Main`, `Handle`, filas/labels planas, indicadores +decorativos o primitives `svg`. No necesitan morfo propio mientras cumplan +las cuatro reglas: + +1. No crean comportamiento ni estado. +2. No son target de eventos perceptivos. +3. No poseen ARIA obligatoria ni relaciones accesibles propias. +4. Solo emiten estructura, clase/estilo passthrough o `data-*` visuales que + el recipe consume. + +Si cualquiera de esas reglas deja de cumplirse, la parte deja de ser +Eidos-only y debe subir al contrato correspondiente: primero morfo, luego Soma +si necesita runtime. + +El agregador `scripts/eidos-lint-all.ts` mantiene una allowlist explícita de +estos attrs/parts visuales. El lint base sigue siendo estricto con valores +inválidos de enums morfo; la allowlist solo evita que el reporte de drift se +llene de partes visuales intencionales. + ### Uso del consumidor ```svelte