Clarify Eidos visual-only parts

active-uix
dev 5 months ago
parent 240916e7d6
commit 53b76f6b4d

@ -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:

@ -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) => {

@ -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

Loading…
Cancel
Save

Powered by TurnKey Linux.