69 KiB
Continue
Fecha de corte: 2026-05-17. Rama: active-uix.
Actualizacion Eidos component migration 2026-05-17:
- Inicio de la migracion Soma -> Eidos siguiendo
soma/COMPONENT_GUIDE.mdyeidos/components/README.md. - Componentes migrados:
Progress: root visualprogress.svelte,Progress.Indicator,progress.css,types.tseindex.tscon disciplined option C.Meter: root visualmeter.svelte,Meter.Indicator,meter.css,types.tseindex.tscon disciplined option C.
- Decisiones aplicadas:
- Eidos no crea comportamiento: ambos wrappers envuelven
ProvidereIndicatorpublicos de Soma. - La unica prop visual anadida es
size?: ResponsiveProp<'sm' | 'md' | 'lg'>, resuelta conActiveEidos.resolve(...)y proyectada comodata-size. Progressusa eldata-statede Soma (indeterminate,loading,loaded) para cargar/terminar/indeterminado.Meterusa eldata-statede Soma (below,optimum,above) para zonas visuales; no se anade intent ni color en Eidos.- Los tokens base viven en
THEME_BASE_RECIPE_TOKENSy se regenerosrc/uix/eidos/generated/base.css.
- Eidos no crea comportamiento: ambos wrappers envuelven
- Guardias actualizadas:
component-visual-attrs.test.tsprotegedata-sizeenProgressyMeter.scripts/eidos-lint-all.tsreconocedata-floating-wrappercomo marcador publico actual y retira el sufijo legacyflat.components/README.mdreflejameteryprogresscomo migrados.
- Validado:
npx vitest run src/uix/eidos-> 7 archivos, 84 tests OK.npm run check-> 0 errores, 0 warnings.node --import tsx/esm scripts/eidos-lint-all.ts-> 0 invalid, sin drift hotspots.
- Siguiente bloque sugerido:
- Migrar otro grupo de bajo riesgo desde Soma a Eidos:
separatorno existe en Soma; candidatos reales por morfo/soma existentes sonslider,number-field,paginationorating-group. - Antes de tocar componentes grandes (
select,combobox,calendar,date-field) conviene fijar una tabla por componente: partes Soma, props visuales Eidos, recipe tokens y attrs esperados.
- Migrar otro grupo de bajo riesgo desde Soma a Eidos:
Actualizacion Eidos components audit 2026-05-17:
- Se acometieron los hallazgos autorizados sobre
src/uix/eidos/componentssin tocar demos ni rutasweb/routes/uix:Tabsinstala su contexto visual de forma sincronica durante init, no en$effect; los hijosTabs.Contentya no pueden inicializar sin contexto.Tabs.Indicatordeja de observarse a si mismo conResizeObserver, para evitar loops de medida provocados por sus propias escrituras inline.Avatar.Imageya no arranca oculto cuando haysrc; la visibilidad queda derivada desrcy de la ultima URL fallida.Accordion.Triggerya no contiene<style>scoped; la regla de layout del label vive enaccordion.css.Toast.Closeemitedata-icon-onlycuando renderiza el icono por defecto, igual queDialog.Close,Drawer.CloseyPopover.Close.Somaexponedata-floating-wrappercomo marcador publico del wrapper flotante;PopoveryTooltipdejan de depender dedata-soma-floating-wrapperen CSS.
- Guardias anadidas/reforzadas:
component-api-contract.test.tsfalla si un wrapper Eidos reintroduceonMount,<style>scoped odata-soma-*.component-visual-attrs.test.tscubre ahoratoast-close.sveltey sudata-icon-only.- Tests de Tooltip/LinkPreview esperan tambien el nuevo
data-floating-wrapper.
- Validado:
npx vitest run src/uix/eidos/component-api-contract.test.ts src/uix/eidos/component-visual-attrs.test.ts src/uix/eidos/recipe-css-contract.test.ts-> 3 archivos, 7 tests OK.npx vitest run src/uix/soma/components/tooltip/tooltip-provider.svelte.test.ts src/uix/soma/components/link-preview/link-preview-provider.svelte.test.ts-> 2 archivos, 5 tests OK.npx vitest run src/uix/soma/components/popover/popover-provider.svelte.test.ts-> 1 archivo, 2 tests OK.npx vitest run src/uix/eidos-> 7 archivos, 81 tests OK.npm run check-> 0 errores, 0 warnings.
- Pendiente deliberado:
- Ninguno del bloque auditado. Los
font-size: 0.9rem/0.85remrestantes quedaron migrados despues de esta nota a tokens de recipe canónicos.
- Ninguno del bloque auditado. Los
Actualizacion Eidos recipe typography 2026-05-17:
- Cerrado el ultimo hallazgo P3 de la auditoria de componentes:
dialog.cssya no usafont-size: 0.9rem; consume--dialog-trigger-font-size.popover.cssya no usafont-size: 0.9remni0.85rem; consume--popover-trigger-font-sizey--popover-close-font-size.popover.cssya no usa fallback cromatico literal para overlay; consume--popover-overlay-bg.- Los nuevos tokens viven en
THEME_BASE_RECIPE_TOKENSy se regenerosrc/uix/eidos/generated/base.cssconnpm run generate:eidos-css. recipe-css-contract.test.tsahora falla si un CSS de componente reintroduce colores raw (#...,rgb(...),hsl(...)) ofont-sizeliteral enpx/rem.
- Validado:
npx vitest run src/uix/eidos/recipe-css-contract.test.ts src/uix/eidos/generated-css.test.ts-> 2 archivos, 5 tests OK.npx vitest run src/uix/eidos-> 7 archivos, 79 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos intent wording 2026-05-17:
- Limpieza de naming en
src/uix/eidos/components/icon/*:IntentIconyINTENT_ICONya no describen el intent como propiedad de Sema. El tipo sigue importandose desde la fuente unica$uix/intenty los comentarios hablan deIntentcanonico.
- Validado:
rg "sema intent|Sema intent" src/uix src/arts-> 0 resultados.npx vitest run src/uix/eidos-> 7 archivos, 81 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos flat residue cleanup 2026-05-17:
- Retirado CSS muerto de
checkbox.csspara la antigua marcadata-checkbox-flat/data-checkbox-label; ningun componente ni morfo lo emitia y chocaba con la convencion actual sin APIs flat. ToasterPropsya no usa la palabra "Flat" en su docstring; queda descrito como convenience/default layout para no confundirlo con la API flat retirada.component-api-contract.test.tsanade guardia contra marcadoresdata-*-flaten fuentes de componentes Eidos.- Validado:
rg "data-[a-z0-9-]+-flat|flat default|Flat <Toaster>" src/uix/eidos/components-> 0 resultados.npx vitest run src/uix/eidos/component-api-contract.test.ts src/uix/eidos/recipe-css-contract.test.ts-> 2 archivos, 10 tests OK.npx vitest run src/uix/eidos-> 7 archivos, 82 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos CSS entry guard 2026-05-17:
index.csslimpia comentario stale de la fase "air-translated"; las recipes actuales se tratan como entrada activa de Eidos.recipe-css-contract.test.tsanade guardia para que todocomponents/{name}/{name}.csseste importado desdesrc/uix/eidos/index.css.- Validado:
npx vitest run src/uix/eidos/recipe-css-contract.test.ts-> 6 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos legacy layout guard 2026-05-17:
lint.test.tselimina fallback al layout CSS raiz retirado (components/{name}.css) y anade guardia explicita: todo CSS de componente debe vivir encomponents/{name}/{name}.css.- Limpieza de comentarios stale:
events.cssreferenciaEngineSemantic, noSemanticEngine.toast.cssdeja de hablar de "phase 2".components/README.mdcorrige "retiraled".
- Validado:
npx vitest run src/uix/eidos/lint.test.ts src/uix/eidos/recipe-css-contract.test.ts-> 2 archivos, 20 tests OK.rg "retiraled|SemanticEngine|phase 2|older flat|flat layout still" src/uix/eidos-> 0 resultados.npx vitest run src/uix/eidos-> 7 archivos, 84 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos config audit 2026-05-17:
- Resuelta la parte no-componente de la auditoria consolidada de
src/uix/eidos:validateTypography(...)ya no asume quesizes,families,weightsostylesexisten y son objetos; ahora produce issues de validacion.validateSizePrimitive(...)yvalidateTextMetric(...)degradan campos ausentes o mal tipados a issues, sinTypeErrorpor.trim().validateColorScale(...)valida escala como objeto plano y rechaza pasosnull/undefined.primitives.shadowqueda incluido en la validacion de shape.- El contrato CSS de
size-*-font-line-heightysize-*-font-letter-spacingapunta aprimitives.typography.sizes.{fontSize}.lineHeight/letterSpacing, no aprimitives.size.*.fontSize. renderThemeCss(config, themeId)ya no contiene el caso magicothemeId === 'base-light'; el renderer puro deriva el selector solo delthemeId.ActiveEidossigue siendo quien decide usar:rootcuando aplica runtime CSS.
- Tests nuevos en
src/uix/eidos/active-eidos-config.test.tscubren tipografia incompleta, size/text metric incompletos, escalas connull, shape deshadow, paths de contrato tipografico y selector raw porthemeId. - Validado:
npx vitest run src/uix/eidos-> 7 archivos, 78 tests OK.npm run check-> 0 errores, 0 warnings.
- Nota historica: en ese momento quedo pendiente porque se pidio no tocar
componentes aun; queda resuelto en la actualizacion de componentes del
2026-05-17:
avatar-image.svelte: estadovisiblederivable desdesrc.tabs-indicator.svelte:ResizeObserverobserva el propio indicador.accordion-trigger.svelte: unico scoped style dentro de componente.toast-close.svelte: faltadata-icon-onlyconsistente con Close de Dialog/Drawer/Popover.popover.cssytooltip.css: selectores acoplados adata-soma-floating-wrapper.
Actualizacion Eidos ecosystem 2026-05-16:
- Correccion de alcance: no seguir tocando demos/rutas ni
src/uix/eidos/components/*sin orden explicita. El foco vigente es el ecosistema Eidos fuera de componentes:ActiveEidos,eidos/lib, contrato/generacion/persistencia, tests de runtime y documentacion de capa. - Persistencia reforzada:
readEidosConfigFromDocument(...)yparseEidosConfigFromJson(...)ya no aceptan solamente un envelope valido; al convertirlo en runtime validan tambien lasoptionscontra el contrato completo deEidosConfigy lanzanEidosConfigValidationErrorsi el tema persistido no es usable. parseEidosConfigDocument(...)queda definido como parser de envelope versionado (kind/version/options), no como validador semantico del tema.- Guardia anadida: el contrato CSS de Eidos debe estar alineado con los
renderers generados; cada token
staticdebe aparecer enrenderStaticCss()y cada tokenthemeenrenderThemeCss('base-light'). - Overrides runtime reforzados:
ActiveEidosvalida y clonacssVariablesiniciales aunqueapplyDom:false, ysetCssVariables(...)es transaccional. Un mapa invalido no reemplaza el bloque de variables vigente. - Validacion de config reforzada: documentos persistidos con
optionsmalformadas fallan comoEidosConfigValidationErrorcon issues de contrato, no comoTypeErrorde runtime. - IDs de theme y nombres de escalas de color quedan validados como segmentos CSS kebab-case antes de generar selectores o custom properties desde config.
- Claves authorables de tipografia (
families,weights,styles) deben generar sufijos CSS validos;typography.sizespermanece canonico. - Motion e icon dejan de depender solo de tipos TS: sus key sets canonicos
(
DURATION_KEYS,EASE_KEYS,MOTION_DISTANCE_KEYS,MOTION_SCALE_KEYS,ICON_STROKE_WIDTH_KEYS) se exportan y validan en runtime antes de generar CSS. - Primitivas estaticas base reforzadas:
spacevalida sufijos CSS abiertos,controlHeightyradiususan key sets canonicos, yfocusRingvalida valores no vacios. - Grupos semanticos de color (
surface,content,border,focus) quedan cerrados con key sets canonicos y valores no vacios antes de generar tokens de theme. - Overrides de
semantics.color.roles.*.slotsquedan validados: solo slots canonicos y pasos1..12. - Valores CSS del
EidosConfigcomparten la misma defensa que los overrides runtime: no pueden contener;,{ni}. - Documentos persistidos con grupos opcionales malformados (
primitives.*,themes.*,recipes.*) fallan temprano comoEidosConfigValidationError. - Validado:
npx vitest run src/uix/eidos/active-eidos-config.test.ts-> 35 tests OK.npx vitest run src/uix/eidos/active-eidos.test.ts-> 19 tests OK.npx vitest run src/uix/eidos-> 7 archivos, 75 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion permutation runner 2026-05-16:
- Segunda tanda de demos
/uix/components/*instrumentada condata-perm-step:accordion,collapsible,dialog,drawer,popover,radio-group,toastytooltip.- La cobertura interactiva actual queda en 12 demos:
accordion,checkbox,collapsible,dialog,drawer,popover,radio-group,switch,tabs,toast,toggle,tooltip.
scripts/permutation-check.tsya no depende denetworkidleenpage.goto; carga condomcontentloaded, espera una estabilizacion hibrida (networkidlecorto si llega + settle explicito) y distingueSKIP no routedeSKIP no demo load.- El settle por defecto de cada paso pasa a 500ms para no validar antes de que los effects de Soma hayan proyectado atributos DOM en dev mode.
toastMorfocorrigedata-swipecomo atributo opcional: solo existe durante un gesto de swipe.data-swipe-directionsigue siendo estable.- Validacion:
npx vitest run src/uix/soma/components/toast/toast-provider.svelte.test.ts-> 2 tests OK.npm run check-> 0 errores, 0 warnings.node --import tsx/esm scripts/permutation-check.ts http://127.0.0.1:5190-> 12 demos instrumentadas OK, 28 pasos.
- Pendiente inmediato:
avatareicontienen ruta pero no interaccion significativa aun; se quedan comoSKIP no perm instrumentation.- Los 53 morfos restantes no tienen ruta
/uix/components/{kebab}en el shell actual; no contarlos como cobertura hasta que exista demo.
Actualizacion permutation axes 2026-05-16:
- Variantes URL del runner activadas en demos que ya tenian estado real para
honrarlas:
accordion:disabled.collapsible:disabled.checkbox:disabled,invalid.radio-group:dir,disabled,invalid.switch:disabled,invalid.tabs:dir,orientation,disabled.toggle:disabled,invalid.tooltip:dir,disabled.
- En variantes
disabled, los pasos interactivos se omiten desde la propia demo para validar el estado estatico deshabilitado sin forzar clicks sobre controles inactivos. - Validacion:
node --import tsx/esm scripts/permutation-check.ts http://127.0.0.1:5192-> 12 demos instrumentadas OK, 54 pasos, 28 variantes URL.
Actualizacion Eidos component API guard 2026-05-16:
src/uix/eidos/component-api-contract.test.tsahora tambien valida que los miembros declarados en cadaXxxNamespacecoincidan con las asignaciones explicitas del barrel (Tabs.Trigger = Trigger, etc.).- Esto cierra el hueco que dejaba el cast
const Tabs = TabsRoot as TabsNamespace: TypeScript no detecta una asignacion olvidada despues del cast, pero la guardia estatica si. - Validacion:
npx vitest run src/uix/eidos/component-api-contract.test.ts-> 3 tests OK;npm run check-> 0 errores, 0 warnings.
Arranque rapido para mañana:
- Rama
active-uixqueda por delante degita/active-uixcon los commits de limpieza de Soma/UIX ya hechos y validados. - Ultimos commits relevantes:
Keep Soma internals off public aliasNarrow Soma root barrelRemove Soma common langs facadeGuard Sema runtime boundariesInject ActiveDom into Soma scroll lockRecord Soma scroll lock validation
- Validacion final del bloque:
npm run check-> 0 errores, 0 warnings.npm run test-> 233 archivos, 2248 tests OK.
- Estado arquitectonico cerrado hoy:
- Dentro de Soma no se importa desde
$soma/*; el alias publico queda para consumidores externos y tests de superficie. $somaraiz solo expone el scopeSomay su error de contexto; helpers publicos se consumen desde subpaths explicitos.soma/core/langs.tseliminado;common.*pertenece asrc/uix/langs.ts.- Sema queda protegido contra listeners globales nativos y
console.*. ScrollLockde Soma inyectaActiveDomhaciaBodyScrollLock.
- Dentro de Soma no se importa desde
- Decision de cierre:
- La fase Soma queda terminada. No seguir corrigiendo Soma a ciegas salvo bug concreto o regresion nueva.
- La siguiente fase autorizada es volver a Eidos, empezando por auditoria de componentes Option C y su relacion con Soma/Morfo sin reabrir runtime general ni arquitectura ActiveUix.
- Lo primero para continuar:
- Arrancar Eidos leyendo primero
src/uix/eidos/README.md,src/uix/eidos/components/README.md,src/uix/active_architecture.mdy este archivo. - Auditar componentes Eidos Option C: root visual + partes attached,
imports desde subpaths publicos de Soma, sin
Providervisual publico, sin flat snippets y sin duplicar behavior headless. - Validar las rutas actuales bajo
web/routes/uix/components/*despues de cualquier cambio Eidos; el smoke navegador limpio de Soma queda como baseline. - Decidir si el directorio vacio
src/uix/soma/components/avatar/se borra o se deja como placeholder documentado. Hoy Avatar eseidosscope. Decidido: no hay accion versionable; solo existe un directorio local vacio (components/) y Git no lo registra. No crear placeholder Soma. - Sium P0 de integridad queda cerrado:
isPlainObjectRecord,email,regexcon flags mutables y docs dectx.rootValue. - Mantener fuera de commits los logs sueltos (
.codex-vite-*,debug.log) salvo que el usuario pida conservarlos.
- Arrancar Eidos leyendo primero
Actualizacion Eidos 2026-05-16:
- Primera pasada de componentes Option C ejecutada:
- Barrels multi-part normalizados a asignacion explicita per-property
(
const Drawer = DrawerRoot as DrawerNamespace; Drawer.Trigger = Trigger;) y sinObject.assign. - Tipos root visuales renombrados a
AccordionProps,DrawerProps,DialogProps,TabsProps, etc. Eidos ya no defineXxxProviderProps;ProviderPropssolo aparece como alias importado desde Soma cuando la superficie headless lo llama asi. src/uix/eidos/components/README.mdactualizado con la convencion real.Toasterdeja de usar un alias internoProviderpara no reintroducir el modelo mental retirado.- Aniadido
src/uix/eidos/lib/style.tsconcomposeInlineStyle(...)y aplicado a wrappers que mezclan estilo del consumidor con custom properties de receta: overlay de Dialog/Drawer, Toast.Viewport, Checkbox.Group, RadioGroup, Tabs.Indicator, Icon y primitives SVG.
- Barrels multi-part normalizados a asignacion explicita per-property
(
- Validacion de esta pasada:
npm run check-> 0 errores, 0 warnings.npx vitest run src/uix/eidos-> 4 archivos, 56 tests OK.npm run test-> 233 archivos, 2270 tests OK.- SSR smoke de
web/routes/uix/components/{accordion,avatar,checkbox, collapsible,dialog,drawer,popover,radio-group,switch,tabs,toast,toggle, tooltip}-> HTTP 200.
- Siguiente foco recomendado en Eidos:
- Auditar recipes/CSS contra tokens generados por
ActiveEidosy decidir que CSS legacy queda como recipe por componente y que debe generarse. - Revisar componentes visuales que anaden partes eidos-only (
Header,Footer,Status,Main, SVG primitives) para documentar si necesitan morfo propio o si son recipe primitives privadas. - Revisar tests de componentes Eidos: hoy hay cobertura del runtime Eidos, pero no tests unitarios especificos para wrappers visuales.
- Auditar recipes/CSS contra tokens generados por
Actualizacion Eidos recipes 2026-05-16:
- Inicio del barrido recipe/CSS:
checkbox.cssconsumia--checkbox-stroke-durationy--checkbox-stroke-easesolo como fallback inline; ambos pasan aTHEME_BASE_RECIPE_TOKENS.checkbox.popover.cssconsumia--popover-overlay-zcon fallback; pasa aTHEME_BASE_RECIPE_TOKENS.popover.- Regenerado
src/uix/eidos/generated/base.cssconnpm run generate:eidos-css.
- Validacion:
npm run check-> 0 errores, 0 warnings.npx vitest run src/uix/eidos-> 4 archivos, 56 tests OK.
- Pendiente del mismo eje:
- Convertir el barrido recipe/CSS en test estable o script robusto (el parser rapido usado hoy no sirve con objetos TS complejos y comentarios).
- Revisar tokens declarados pero no usados para separar: reserva doctrinal intencional vs residuo de CSS legacy.
Actualizacion Eidos auditoria Kimi 2026-05-16:
- Hallazgos corregidos:
tabs-indicator.sveltepasa deonMounta$effectcon cleanup ligado alref. Nota:onMountno es incompatible con Svelte 5, pero$effectencaja mejor aqui porque el observer depende del elemento enlazado.- Icono
folder-root.svelteexportado comoFolderRooty catalogado comofolder-root/FolderRoot; se elimina el falsoFolderProvider. - Comentario de
toggle.sveltecorregido: Eidos expone<Toggle>, no<Toggle.Provider>. - Helpers repetidos de
eidos/libcentralizados enutils.ts:clonePlain,isPlainRecord,hasOwn,toKebab. isPlainRecordqueda unificado como objeto literal o null-prototype; no acepta arrays ni instancias de clase.
- Hallazgos evaluados pero no aplicados:
dialog.svelteydrawer.svelteno necesitandata-sizeen el root: sus props visuales viven enContent;variant/directionson headless y ya los proyecta Soma/Morfo.icon.sveltemantieneclasscomo prop DOM idiomatica; cambiar aclassNameseria menos natural en Svelte y no resuelve un bug real.StyleBlockManager, builder de recipes y action separada para Tabs quedan como refactors posibles, no P0/P1.
- Validacion:
npm run check-> 0 errores, 0 warnings.npx vitest run src/uix/eidos-> 4 archivos, 56 tests OK.npm run test-> 233 archivos, 2270 tests OK.
Actualizacion Eidos recipe contract 2026-05-16:
- Cerrado el barrido recipe/CSS con una guardia versionada:
src/uix/eidos/recipe-css-contract.test.ts.- Si un CSS de componente consume
--{component}-*, el alias debe existir enTHEME_BASE_RECIPE_TOKENS. - Si el theme base declara un alias publico, debe estar consumido por el componente, por sus fuentes Svelte/TS o por otro token compuesto.
- Si un CSS de componente consume
- Limpieza aplicada:
Toggleconsume sus tokens publicos de variante (solid,outline,ghost) en vez de duplicar formulas dentro del CSS. Se retira el naming residualsurface-*porque la variante publica essolid.Checkbox,RadioGroupySwitchya no publican tokens de intents que sus tipos no pueden activar.Toastelimina los tokens tipograficos demessage, parte que la propia recipe documenta como retirada; conservamessage-colorporque lo usa el item como color base.Accordion,Tabs,TooltipyRadioGroupconectan tokens que estaban declarados pero no consumidos (indicator-*,list-bg,content-z,indicator-bg-checked-disabled).Iconmantiene--icon-sizey--icon-stroke-width: son consumidos poricon.svelte, no por CSS.
- Regenerado
src/uix/eidos/generated/base.cssconnpm run generate:eidos-css. - Validacion:
npx vitest run src/uix/eidos/recipe-css-contract.test.ts-> 3 tests OK.npx vitest run src/uix/eidos-> 5 archivos, 59 tests OK.npm run check-> 0 errores, 0 warnings.
Actualizacion Eidos component API 2026-05-16:
- Corregida documentacion stale de
Collapsible: ya no describe dos shapes, ni flat con snippettrigger, ni<Collapsible.Provider>publico. La superficie vigente es<Collapsible>+.Trigger+.Content; el provider de Soma queda como detalle interno. - Corregido comentario stale en
Dialog.Close: no existe un auto-render flat de<Dialog>. - Guardia nueva
src/uix/eidos/component-api-contract.test.ts:- barrels de componentes sin
Object.assign; - sin export publico de
Provider; - sin imports publicos desde
*-provider.svelte; - cada componente publico, salvo
svgprimitives, tiene root{component}.svelte.
- barrels de componentes sin
- Validacion:
npx vitest run src/uix/eidos-> 6 archivos, 61 tests OK.npm run check-> 0 errores, 0 warnings.- Smoke local one-shot con Vite + Playwright sobre
/uixy/uix/components/{accordion,avatar,checkbox,collapsible,dialog,drawer, icon,popover,radio-group,switch,tabs,toast,toggle,tooltip}-> OK (sinpageerror,console.error,requestfailedrelevante ni__uix_lang_missing__).
scripts/check-eidos-recipes.tsactualizado: ya no apunta al arbol historico/test/eidos/*; ahora prueba/uix/components/toggle,/uix/components/switchy/uix/components/dialog, detectando puertos 5173-5180.scripts/eidos-lint-all.tsafinado: 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 smoke 2026-05-16:
scripts/smoke-check.mjsdeja de apuntar al arbol retiradosrc/routes/test/somay descubre rutas concretas+page.sveltebajoweb/routes.- Soporta
SMOKE_SCOPE=/uixpara limitar la pasada a UIX cuando no haga falta recorrer la documentacion de Active. - La prueba falla por
pageerror,console.errorreal, warnings de traduccion/contexto, request failures same-origin y__uix_lang_missing__renderizado. Los recursos externos opcionales se ignoran como request failures para que el smoke offline no confunda red bloqueada con regresion local. - Validado contra Vite local:
node scripts/smoke-check.mjs http://127.0.0.1:5181-> 41 rutas OK (/,/active/*,/uix/*). - Documentacion sincronizada:
src/uix/soma/COMPONENT_GUIDE.mdsrc/uix/morfo/README.mdsrc/uix/soma/components/calendar/README.mdsrc/uix/soma/components/range-calendar/README.md
scripts/probe-toast-dismiss.tsahora usa por defecto/uix/components/toast.scripts/morfo-check.tsqueda reconectado parcialmente: valida los morfos que tienen ruta concreta bajo/uix/components/{kebab}y marca el resto comoSKIPen vez de fallar por rutas inexistentes. Se puede cambiar el prefijo conMORFO_ROUTE_PREFIX.- Al volver a ejecutar
morfo-check, aparecieron y se corrigieron dos incoherencias de Morfo:fieldMorfodeclaraba los valores dedata-statecomostates, pero su fuente runtime real esstate; tambien se corrigearia-busypara mirarstate === 'loading'.schema.tspermite ahoraemit: 'value'sinvaluesource cuando el attr es declarativo/manual. Esto cubreForm.AutoFields, donde el componente escribe valores comodata-form-auto-fields-field={path}sin pasar porSomaRuntime.
- Validacion:
node --import tsx/esm scripts/morfo-check.ts http://127.0.0.1:5182-> 14 morfos con ruta OK, 53SKIP.npx vitest run src/uix/morfo/schema.test.ts src/uix/morfo/registry.test.ts src/uix/morfo/compile.test.ts-> 41 tests OK.npm run check-> 0 errores, 0 warnings.
- Pendiente deliberado:
scripts/permutation-check.tssigue siendo runner historico del arbol/test/soma; no usarlo como release gate hasta reconectarlo a una route map real del docs shell actual. scripts/permutation-check.tsreconectado al shell actual:- usa
/uix/components/{kebab}por defecto; - admite
PERM_ROUTE_PREFIXpara otros shells; - salta morfos sin ruta como
SKIP no route; - salta rutas sin
data-perm-stepniperm-axescomoSKIP no perm instrumentation; - si todavia no hay demos instrumentadas, sale limpio con "No instrumented routed demos found".
- usa
src/uix/morfo/PERMUTATION_RUNNER.mdactualizado: la antigua infraestructura_perms.svelte.tsqueda marcada como retirada; las paginas actuales deben leer?perm.*desde su ruta si optan a permutations.- Primeras rutas instrumentadas con
data-perm-step:/uix/components/toggle/uix/components/switch/uix/components/checkbox/uix/components/tabs
- Validacion:
node --import tsx/esm scripts/permutation-check.ts http://127.0.0.1:5184-> 4 demos instrumentadas OK, 9 pasos, 53 sin ruta, 10 sin instrumentacion. - Smoke actualizado para esperar
domcontentloaded+ settle en vez denetworkidle;/uix/components/iconpuede ser pesado y no debe fallar por actividad de red prolongada si no haypageerror, consola real ni fallbacks. - Validacion smoke posterior:
node scripts/smoke-check.mjs http://127.0.0.1:5185-> 41 rutas OK.
Actualizacion Eidos visual wrappers 2026-05-16:
- Nueva guardia
src/uix/eidos/component-visual-attrs.test.ts: asegura que los wrappers Eidos que publican props visuales sigan estampando losdata-*que consumen las recipes (data-size,data-variant,data-color,data-position,data-columns,data-motion, etc.). - Documentado en
src/uix/eidos/components/README.mdque esta guardia protege el cableado wrapper -> recipe sin convertir Eidos en runtime headless.
Actualizacion 2026-05-16:
-
Barrido de wrappers publicos Soma frente a providers cerrado:
DateField.ProvideryTimeField.Providervuelven a materializar su root publico por defecto (<div {...mergedProps}>) y aceptanref/restProps, coherente con su morfo (kind: public,defaultElement: 'div').DateFieldya respeta la propdir; la direccion efectiva se pasa al provider y a la navegacion de segmentos en vez de ignorarse y leer solosoma.prefs.DatePicker,DateRangePicker,TimePickeryTimeRangePickermantienen root virtual: sus props root ya no anuncianPrimitiveDivAttrsnichildconprops: {}.ColorPicker.Areaya aplica de verdad los overrides localesxChannel/yChannel; antes los tipos los exponian pero el wrapper los descartaba.- Guardias nuevas en
src/uix/contracts.test.tspara roots publicos Date/Time Field y roots virtuales picker. - Validado:
npx vitest run src/uix/contracts.test.ts+ tests focales de date/time pickers/fields -> 52 tests OK;color-picker-provider-> 5 tests OK;npm run check-> 0 errores / 0 warnings;npm run test-> 233 archivos, 2251 tests OK.
-
Soma queda en estado funcionalmente cubierto a nivel provider/runtime:
npm run check-> 0 errores / 0 warnings,npm run test-> 233 archivos, 2242 tests OK, y la guardia de*-provider.svelte.tssin test directo devuelveNO_MISSING_PROVIDER_TESTS. -
Lo que falta para cerrar Soma de verdad no es mas cobertura de providers, sino las capas exteriores:
- Auditar wrappers Svelte publicos (
*.svelte) frente a sus providers: props bindables, snippets, forwarding de attrs, eventos y defaults. - Auditar barrels publicos (
index.ts,exports.ts) para que no expongan clases runtime internas, reexports muertos ni fachadas sobre$libs. - Validar rutas
/uix/components/*con navegador: sinpageerror, sin errores de consola, sin warnings de traduccion inesperados y con flujos basicos interactivos. - Sincronizar inventario/documentacion Soma con el estado real: componente activo, visual-native, wrapper publico, provider runtime y tests.
- Mantener la doctrina DOM actual: escrituras gestionadas, listeners
globales, focus/scroll imperativos y portal/query global pasan por
ActiveDom; lecturas locales (getBoundingClientRect,contains,closest,scrollTop, etc.) siguen siendo responsabilidad del componente. - Dejar optimizaciones de rendimiento para despues de cerrar API publica y wrappers: virtualizacion compartida, datetime compartido y micro-churn del runtime solo si aparecen datos reales o tests que lo justifiquen.
- Cerrado: guia/documentacion Soma alineada con el estado actual:
pertenencia no-Soma apunta a Eidos, no Air;
{name}-provider.svelte.tscontiene clases provider/state concretas sin herencia;soma.runtime()es el camino canonico dentro de providers; demos viven enweb/routes/uix/components/{name}; Eidos consume Soma por subpaths publicos y Sema posee percepcion/eventos.
- Auditar wrappers Svelte publicos (
-
Auditoria
src/arts/sium/kimi-audit.mdleida y evaluada. Mi veredicto: buena auditoria, bastante alineada con el rol real de Sium como codec + validador + introspeccion para Active, pero con dos matices:- La prioridad critica correcta es integridad de datos, no ampliar Sium hasta parecerse a Zod.
- Algunos fixes descritos como "1 linea" no lo son si queremos mantener
contratos
decodeSync,~siumyForm.AutoFieldscoherentes.
-
Sium P0 cerrado, sin cambios breaking:
isPlainObjectRecord(...)acepta solo objetos planos o null-prototype; se rechazanDate,RegExpe instancias de clase.email()usa una regex conservadora de producto: dominio sin puntos dobles y TLD practico de 2+ caracteres.regex(pattern)clona una vez el patron sin flags mutablesg/y, de modo que no tocalastIndexdel regex recibido.- README y tipos de Sium aclaran que
ctx.rootValuees passthrough opcional; el core no lo sintetiza. Las validaciones cross-field sobre datos decodificados deben vivir en unrefine()delobject()y usar el valor decodificado recibido por ese refine. - Validado:
npx vitest run src/arts/sium/test-> 18 archivos, 366 tests OK;npm run check-> 0 errores, 0 warnings;npm run test-> 233 archivos, 2262 tests OK. - Cerrado:
optional/nullable/defaultedcon inner async conservan el short-circuit sync del sentinel (undefined,nullo default). Si el valor definido necesita entrar al inner async,decodeSync/validateSyncsiguen lanzandoSiumAsyncSchemaError. - Validado tras wrappers async:
npx vitest run src/arts/sium/test-> 18 archivos, 368 tests OK;npm run check-> 0 errores, 0 warnings;npm run test-> 233 archivos, 2264 tests OK.
-
Sium P1 coordinado con consumidores:
- No cambiar
lazy()akind: 'lazy'hasta quesrc/uix/soma/components/form/components/form-auto-fields.sveltesepa renderizar/posponer ese kind. HoySchemaKindno incluyelazy. - Anadir refinements pequenos y utiles:
finite,safe,positive,nonempty,uuidsolo si hay uso inmediato en Active/Form. - Anadir utilidades de objeto (
partial,pick,omit,extend) y estructuras (tuple,record) cuando AutoFields y~sium.shapetengan contrato de introspeccion claro. - Considerar
preprocessycoercecomo features de formularios, no como ampliacion generalista.
- No cambiar
-
Sium P2 interno:
- Cerrado:
types/_helpers.tsincorporacreateDomainValueSchema(...)ycreateDomainRangeSchema(...).colorValue,dateValue,timeValue,dateRangeytimeRangecomparten ahora el patron identity codec + guard + widget + range order sin mover esa logica acore. - Cerrado: combinadores (
object,array,union,discriminated) usan la misma semantica por ruta que wrappers. Un schema marcadoasyncpuede completardecodeSyncsi el input no necesita tocar trabajo async (por ejemplo field optional async ausente, array vacio o union sync-first). Si la ruta seleccionada necesita async, sigue lanzandoSiumAsyncSchemaError. - Cerrado:
lazy()documenta limites de datos runtime autociclicos y lanzaSiumLazyResolvingErrorcuando el thunk usa el proxy mientras resuelve o devuelve el mismo proxy como schema final. No se anadeWeakSetglobal porque la deteccion de ciclos de datos debe ser una capa de normalizacion del dominio si entran datos no confiables. - Validado tras
lazy():npx vitest run src/arts/sium/test-> 18 archivos, 370 tests OK;npm run check-> 0 errores, 0 warnings;npm run test-> 233 archivos, 2266 tests OK. - Validado tras paths sync/async de combinadores:
npx vitest run src/arts/sium/test-> 18 archivos, 374 tests OK;npm run check-> 0 errores, 0 warnings;npm run test-> 233 archivos, 2270 tests OK.
- Cerrado:
-
Validacion Sium domain factory:
npx vitest run src/arts/sium/test/color.test.ts src/arts/sium/test/date.test.ts src/arts/sium/test/time.test.ts src/arts/sium/test/standard-schema.test.ts-> 4 archivos, 122 tests OK.npm run check-> 0 errores, 0 warnings.
-
Criterio de cierre para Sium antes de tocar consumidores UI:
- Tests focales de
src/arts/siumverdes. npm run checksin warnings.- README y tipos
SchemaKind/SiumShapesincronizados. Form.AutoFieldsactualizado antes de cualquier kind nuevo visible en~sium.- Ninguna feature nueva entra si solo duplica Zod/Valibot sin consumidor propio de Active.
- Tests focales de
-
Soma public surface:
- Cerrado: el wrapper publico de Select pasa de
components/select-provider.svelteacomponents/select.svelte. El runtime interno sigue enselect-provider.svelte.ts. - Cerrado:
Command,FormyTableya no reexportan motores de$libs. Los consumidores deben importarcomputeFuzzyScoredesde$libs/strings,createFormdesde$libs/formsycreateTable/tipos desde$libs/datagrid. - Guardia nueva en
src/uix/contracts.test.ts: ningun barrel publico de Soma puede exportar desde*provider.svelteni desde$libs/*. - Guardia nueva adicional: cada
Providerpublico debe salir decomponents/{component}.svelte; no se permiten nombres especiales para el wrapper raiz. - Documentacion corregida:
AlertDialogya importacreateFormdesde$libs/forms, no desde$soma/components/form. - Documentacion corregida:
ColorFieldya no marcaColorPickercomo planned, y los links a docs planned inexistentes deColorRange*quedan como texto sin enlace. - Guardia nueva: los links relativos entre README de componentes Soma deben apuntar a documentos existentes.
- Cerrado: los imports internos de produccion de Soma ya no usan el alias
publico
$soma; Drawer, Toast, Toggle, Switch, Dismissal, Floating ytypespasan a imports relativos. - Guardia nueva:
src/uix/contracts.test.tsrechaza imports internos de Soma hacia su propio alias publico, dejando$soma/*para consumidores externos y tests de superficie. - Cerrado: el barrel raiz
$somaqueda limitado al scopeSomay su error de contexto. Helpers comoprovider,keyboard,runtime.svelte,types,css,id,props,components,layersydatetimese consumen desde sus subpaths explicitos. - Cerrado: eliminado
soma/core/langs.ts, que era una fachada muerta sobresrc/uix/langs.ts. El vocabulariocommon.*pertenece a UIX yActiveUixlo registra; Soma solo lo referencia mediantev.commonRef. - Guardia nueva: Sema no puede registrar listeners globales nativos
(
document/window.addEventListener) ni usarconsole.*en produccion; los canales deben pasar por servicios inyectados y logger. - Cerrado:
ScrollLockde Soma recibe ahoraActiveDomdel scope y lo pasa aBodyScrollLock; el helper de ADom resuelve document/window/listeners desde el runtime inyectado, con fallback nativo solo para uso standalone y tests. - Validacion global tras inyectar
ActiveDomenScrollLock:npm run test-> 233 archivos, 2248 tests OK.npm run check-> 0 errores, 0 warnings.
- Documentacion corregida: README, arquitectura y comentario de
core/soma.svelte.tsya no recomiendan que el propio Soma importe desde$soma/*. - Smoke Playwright de rutas
/uixactuales cerrado:/uix, Accordion, Checkbox, Collapsible, Dialog, Drawer, Popover, RadioGroup, Switch, Tabs, Toast, Toggle y Tooltip cargan con HTTP 200, sinpageerror, sin errores/warnings de consola y sinrequestfailed. - Smoke navegador actualizado para las rutas montadas bajo
web/routes/uix:/uix, Accordion, Avatar, Checkbox, Collapsible, Dialog, Drawer, Icon, Popover, RadioGroup, Switch, Tabs, Toast, Toggle y Tooltip cargan sin overlay de error, sin__uix_lang_missing__y sin errores/warnings de consola. La primera pasada produjo un falso positivo por HMR enIcony por textos legitimos500ms/5000msen Tooltip/Toast; la repeticion limpia en pestaña nueva quedo verde. - Validacion global posterior:
npm run test-> 233 archivos, 2245 tests OK.npm run check-> 0 errores, 0 warnings.
- Validacion global tras limpiar alias/barrels/fachadas:
npm run test-> 233 archivos, 2248 tests OK.npm run check-> 0 errores, 0 warnings.
- Cerrado: el wrapper publico de Select pasa de
Actualizacion 2026-05-15:
-
Auditoria Soma/Eidos ampliada aplicada por fases y empujada:
- Cobertura nueva para Select, Popover, Toast y RangeCalendar.
- Las clases runtime internas
DialogProvider,DrawerProvideryPopoverProviderdejan de exportarse desde los barrels publicos; los wrappers siguen usandolas por import directo. computeCommandScoreya no se reexporta desde Command; el algoritmo vive comocomputeFuzzyScoreensrc/libs/strings.table-corese mueve asrc/libs/datagridcon su test.form-corese mueve asrc/libs/forms, usa el Standard Schema comun desrc/libs/standard-schema.ts, elimina la copia local de Soma y anade tests de dirty/touched/reset, issues y submit async.- Inventario de Soma actualizado: ya no lista como planned componentes que existen en el arbol activo.
SelectType/ScrollAlignmenty el resto de tipos publicos de componentes salen detypes.ts; los barrels ya no exportan contratos desde*-provider.svelte.ts.DismissalySafePolygonusanuix.timerscuando Soma lo tiene disponible, con fallback nativo solo para uso standalone fuera de UIX.- Cobertura nueva para Combobox: selección single/multiple,
inputValuey filtrado de items disabled. - Cobertura nueva para DatePicker, DateRangePicker y TimePicker: registro runtime, cierre controlado tras selección y escritura de sliders de hora al valor compartido.
- Cobertura nueva para TimeRangePicker: valores por endpoint, sliders y cierre al completar ambos extremos.
- Cobertura nueva para TimeRangeField: validación de rango y foco de label
via
ActiveDom. - Cobertura nueva para TimeField: validación, sync de segmentos 12h y commit solo cuando los segmentos de tiempo renderizados estan completos.
- Correccion TimeField: el announcer se inicializa con
$effecten vez deonMount()dentro de la clase, ydatetimeseparaareAllTimeSegmentsFilledDOM(...)del helper de fecha. - Cobertura nueva para DateRangeField: validación de rango y foco de label
via
ActiveDom. - Cobertura ampliada para DateFieldProvider: validación, sync de segmentos date/time y commit solo cuando los segmentos renderizados estan completos.
- Correccion DateField: el announcer se inicializa con
$effecten vez deonMount()dentro de la clase. - Cobertura nueva para VirtualList: cálculo de ventana,
scrollToIndexy compensación anti-jump. - Correccion VirtualList: la compensación de mediciones dinámicas sobre
viewports internos pasa por
ActiveDom.scrollTo(...)y usascrollOffset + deltacomo fuente reactiva. - Cobertura nueva para VirtualGrid: cálculo de ventana 2D y
scrollToCellviaActiveDom. - Cobertura nueva para NumberField: parsing localizable, teclado spinbutton, triggers, props ARIA y scrubber.
- Correccion NumberField: el root expone
direfectivo (prop -> prefs) en lugar del prop crudo. - Cobertura nueva para FileUpload: aceptación/rechazo de ficheros, dropzone, input oculto, items, progress, remove y clear.
- Cobertura nueva para ColorField: commit por segmentos, edición hex con
teclado, selector de formato, input oculto y foco de label via
ActiveDom. - Cobertura nueva para ColorPicker: helpers de canales, trigger/value/hidden, area 2D, slider de canal y swatches con commit/cierre.
- Cobertura nueva para NavigationMenu: timers UIX de apertura/cierre, enlace item/trigger/content, foco por teclado, list y link props.
- Cobertura nueva para TreeGrid: expansión, selección/rango, filas visibles bajo ancestros colapsados, navegación, row/cell/header y expand trigger.
- Cobertura nueva para DropdownMenu: trigger open/close, scoping de items, item select, checkbox/radio groups, submenu delayed/open y group/separator.
- Cobertura nueva para ContextMenu: apertura por
contextmenucon anchor virtual, scoping de items, item select, checkbox/radio, submenu delayed/open y group/separator. - Cobertura nueva para Menubar: coordinación de menús hermanos, hover-follow, navegación horizontal entre triggers y cambio de menú desde content.
- Cobertura nueva para Listbox: props ARIA root, selección, navegación, typeahead, indicador de item y grupos.
- Cobertura nueva para TreeView: expansión/selección, navegación root, typeahead, props de ramas/hojas y partes auxiliares.
- Cobertura nueva para Accordion: modo single/multiple, eventos open/close por item, navegación de triggers y props de header/content.
- Cobertura nueva para Checkbox: commits check/uncheck, estado indeterminate, hidden input y sincronización con CheckboxGroup.
- Cobertura nueva para RadioGroup: roving tabindex, selección síncrona, navegación con auto-select, hidden input y guardas readonly/disabled.
- Cobertura nueva para Switch: commit-toggle runtime, keyboard, hidden input, integración con FieldProvider y thumb.
- Cobertura nueva para Toggle: commit-toggle runtime, attrs DOM via
ActiveDom, integración con FieldProvider y guardas readonly/disabled. - Cobertura nueva para ToggleGroup: modos single/multiple, roving tabindex y navegación de items saltando disabled.
- Cobertura nueva para Tabs: registro de trigger/content, activacion automatic/manual, navegacion roving, fallback tab stop y partes list/content/indicator.
- Cobertura nueva para Slider: contrato provider/range/thumb/tick, snapping/clamping, drag pointer confirmado y teclado de thumb.
- Cobertura nueva para Progress y Meter:
data-value/data-min/data-maxemitidos por morfo/runtime, estados derivados e indicador sincronizado. - Cobertura nueva para Collapsible: refs cruzadas trigger/content, eventos
expand/collapsey guardas disabled. - Cobertura nueva para Clipboard: copia via
uix.clipboard, reset conuix.timers, labels traducidos/override y erroresonError. - Cobertura nueva para Tooltip: delay/close con
uix.timers, skip-delay de grupo, focus/blur, disabled y partes trigger/content/arrow. - Cobertura nueva para Field: wiring de partes/ARIA, input guardado por disabled/readonly e integración con parent Form.
- Cobertura nueva para SearchField: props root/input/clear, input/submit/ clear, foco y OR-merge con Field.
- Cobertura nueva para Pagination: rangos/ellipsis, clamp reactivo, slice, triggers prev/next, item selected y disabled global.
- Cobertura nueva para Breadcrumb: label/labelledby, separator, link current con mirror al item y ellipsis decorativo/interactivo.
- Cobertura nueva para Toolbar: roving focus, focusin, group single/multiple y separator.
- Cobertura nueva para Stepper: conteo/estado de steps, attrs runtime, selección lineal/no lineal, teclado y prev/next/completed.
- Cobertura nueva para ScrollArea: medición de overflow, viewport, visibilidad/timers de scrollbar, track click, thumb y corner.
- Cobertura nueva para Splitter: registro de paneles, clamp, collapse/expand y resize por pointer/teclado con attrs ARIA/data.
- Cobertura nueva para PinInput: props del input oculto, merge con Field, patrón/paste, completion y estado de celdas/caret.
- Cobertura nueva para RatingGroup: slider attrs, merge con Field, half hover/click, clearable y teclado LTR/RTL.
- Cobertura nueva para TagGroup: labels/root grid, roving por DOM renderizado, selección/removal, link y remove button.
- Cobertura nueva para Announce: alternancia polite/assertive, timers UIX, regiones ARIA declarativas y uso standalone.
- Cobertura nueva para Feed: attrs APG feed/article/title, navegación PageUp/PageDown, threads anidados y sentinel IntersectionObserver.
- Cobertura nueva para TagsInput: add/paste/blur, navegación de tags, delete/clear triggers y props de input/control.
- Cobertura nueva para Editable: activación preview/trigger, foco via
ActiveDom, commit/cancel por teclado/blur y guards disabled/readonly. - Cobertura nueva para AlertDialog: contratos action/cancel, labels traducidos/override y cierre delegado al Dialog base.
- Cobertura nueva para Carousel: detección de slides, navegación por
trigger/teclado, props de partes e intervalos autoplay via
uix.timers. - Cobertura nueva para GridList: merge con Field, selección/rango básico, navegación/typeahead, celdas focusables y checkbox de fila.
- Cobertura nueva para LinkPreview: delays open/close con
uix.timers, touch guard, content hover/cancelClose y props Floating/Arrow. - Cobertura nueva para Table: root/section/header/cell props desde
$libs/datagrid, selección de fila y disclosureRowDetail. - Cobertura nueva para Form: submit inválido con foco via
ActiveDom, attrs runtime y partes Submit/Reset/ErrorSummary sobre$libs/forms. - Cobertura nueva para ToastProvider: viewport hotkey via
ActiveDom, runtime por item, ARIA/parts, auto-dismiss y close action. - Cobertura nueva para DragDrop: ruta de teclado start/nav/drop, filtros
accept, prevención de drag, cancel y preview. - Validado por fase:
npm run check-> 0 errores, 0 warnings.npm run test-> 233 archivos, 2242 tests OK.- tests focales de Select/Popover/Toast/RangeCalendar -> 11 tests OK.
- tests focales Dialog/Drawer/Popover/Select -> 10 tests OK.
command-provider.svelte.test.ts-> 2 tests OK.$libs/datagrid/table-core.svelte.test.ts-> 8 tests OK.$libs/forms/form-core.svelte.test.ts-> 3 tests OK.combobox-provider.svelte.test.ts-> 3 tests OK.- tests focales DatePicker/DateRangePicker/TimePicker -> 7 tests OK.
time-range-picker-provider.svelte.test.ts-> 3 tests OK.time-range-field-provider.svelte.test.ts-> 3 tests OK.time-field-provider.svelte.test.ts-> 3 tests OK.date-range-field-provider.svelte.test.ts-> 3 tests OK.date-field-provider.svelte.test.ts-> 7 tests OK.virtual-list-provider.svelte.test.ts-> 3 tests OK.virtual-grid-provider.svelte.test.ts-> 2 tests OK.number-field-provider.svelte.test.ts-> 4 tests OK.file-upload-provider.svelte.test.ts-> 4 tests OK.color-field-provider.svelte.test.ts-> 4 tests OK.color-picker-provider.svelte.test.ts-> 4 tests OK.navigation-menu-provider.svelte.test.ts-> 4 tests OK.tree-grid-provider.svelte.test.ts-> 4 tests OK.dropdown-menu-provider.svelte.test.ts-> 6 tests OK.context-menu-provider.svelte.test.ts-> 6 tests OK.menubar-provider.svelte.test.ts-> 4 tests OK.listbox-provider.svelte.test.ts-> 4 tests OK.tree-view-provider.svelte.test.ts-> 4 tests OK.accordion-provider.svelte.test.ts-> 4 tests OK.checkbox-provider.svelte.test.ts-> 4 tests OK.radio-group-provider.svelte.test.ts-> 4 tests OK.switch-provider.svelte.test.ts-> 5 tests OK.toggle-provider.svelte.test.ts-> 4 tests OK.toggle-group-provider.svelte.test.ts-> 4 tests OK.tabs-provider.svelte.test.ts-> 4 tests OK.slider-provider.svelte.test.ts-> 4 tests OK.progress-provider.svelte.test.ts+meter-provider.svelte.test.ts-> 4 tests OK.collapsible-provider.svelte.test.ts-> 3 tests OK.clipboard-provider.svelte.test.ts-> 2 tests OK.tooltip-provider.svelte.test.ts-> 3 tests OK.field-provider.svelte.test.ts-> 3 tests OK.search-field-provider.svelte.test.ts-> 3 tests OK.pagination-provider.svelte.test.ts-> 3 tests OK.breadcrumb-provider.svelte.test.ts-> 3 tests OK.toolbar-provider.svelte.test.ts-> 3 tests OK.stepper-provider.svelte.test.ts-> 3 tests OK.scroll-area-provider.svelte.test.ts-> 3 tests OK.splitter-provider.svelte.test.ts-> 3 tests OK.pin-input-provider.svelte.test.ts-> 3 tests OK.rating-group-provider.svelte.test.ts-> 3 tests OK.tag-group-provider.svelte.test.ts-> 3 tests OK.announce-provider.svelte.test.ts-> 3 tests OK.feed-provider.svelte.test.ts-> 3 tests OK.tags-input-provider.svelte.test.ts-> 3 tests OK.editable-provider.svelte.test.ts-> 3 tests OK.alert-dialog-provider.svelte.test.ts-> 2 tests OK.carousel-provider.svelte.test.ts-> 3 tests OK.grid-list-provider.svelte.test.ts-> 3 tests OK.link-preview-provider.svelte.test.ts-> 2 tests OK.table-provider.svelte.test.ts-> 2 tests OK.form-provider.svelte.test.ts-> 2 tests OK.toast-provider.svelte.test.ts-> 2 tests OK.drag-drop-provider.svelte.test.ts-> 2 tests OK.- guardia
*-provider.svelte.tssin test directo ->NO_MISSING_PROVIDER_TESTS. - guardia
rg "from './.*provider\\.svelte'" src/uix/soma/components -g 'exports.ts'-> 0 resultados; Select ya no conserva el wrapper publico con nombreselect-provider.svelte.
- Commits nuevos empujados:
a3bcb66c—Refresh UIX audit follow-up docs25870b4e—Expand Soma component coveragee1a21269—Hide internal Soma provider classes from barrels4829ce13—Move command scorer to shared strings lib02c1fb43—Move table core to datagrid libd319ec6b—Move form core to forms lib701f83d6—Document Soma coverage and domain lib split3050d273—Align Select public types and Soma inventoryeaeebd69—Route Soma layer timers through UIX scheduler9fa00fa2—Move Soma public types out of providers05f87dc4—Add Combobox provider coverage
-
Auditoria UIX post-Soma/Eidos aplicada parcialmente:
SoundChannelya no usadocument.addEventListener/removeEventListenerdirectamente para el unlock listener; consume una superficie DOM inyectada compatible conActiveDom.listen(...)yActiveDom.getDocument(...).- Se rompe el ciclo type-only
sema/types.ts <-> sema-map.tsmoviendo ids, signatures y overrides de canales asrc/uix/sema/channels.ts. - Se rompe el ciclo type-only de Floating moviendo
Side,Align,Boundary,SIDE_OPTIONSyALIGN_OPTIONSasrc/uix/soma/layers/floating/placement.ts. - Tests iniciales añadidos para los puntos de mayor riesgo de Soma: Dialog, Drawer, Command, Calendar y DateField.
- Validado:
npm run check-> 0 errores, 0 warnings.npx vitest run src/uix/sema src/uix/soma/layers/floating-> 117 tests OK.npx vitest runfocal de los 5 nuevos tests Soma -> 16 tests OK.
- Commits nuevos empujados:
802ebce6—Tighten sema channel and floating contractsc6d24eee—Add high-risk Soma provider tests
-
Intentqueda como vocabulario unico ensrc/uix/intent.ts. No existen aliasEidosIntent,UixIntent,ToastIntentniSemaIntent; Sema usaIntentBinding/IntentPolicycuando necesita especializar el contrato del evento, pero el intent canonico no pertenece a una capa concreta. -
MorfoDatavalida nombresdata-*: solo acepta atributos publicos lowercase kebab-case;data-_*queda reservado para estado privado del provider y no puede declararse en morfo. -
frontendqueda eliminado del arbol activo: no haysrc/arts/frontend, factorydefineActiveFrontend, alias$frontend, ruta/active/docs/fendni servicioservices.frontend. Las referencias documentales restantes son notas explicitas de retirada o usos genericos de la palabra frontend. -
themeDimension(...)ydensityDimension(...)fueron retiradas del catalogo publico de$prefs. Las preferencias visualestheme/mode/densityson entradas deActiveEidos;prefsmantiene solo dimensiones transversales o custom via primitivas genericas. -
SemaActiveChannelfue eliminado. La unica fuente publica para canales esSemaChannelId. -
Verificaciones ejecutadas despues de la retirada:
npm run check-> 0 errores, 0 warnings.npm run test-> 165 archivos, 2002 tests OK.
-
Commits nuevos empujados:
a4cbe0c0—Tighten intent and morfo contractsfbacd113—Remove frontend art68dd40ef—Remove visual prefs dimensions
Actualizacion 2026-05-14:
- Revision post-cambios aplicada. La supuesta perdida de proyeccion cross-modal
queda resuelta como aclaracion de ownership: la proyeccion vive en
arts/prefsmediantecreateActivePrefsDomProjection(...), no enActiveUix. - Documentacion de ecosistema actualizada en
src/uix/*ysrc/arts/*: ownership de prefs/proyeccion/Eidos, naming canonico (langs,events,active-app,storage,connection,session,cache,timer,logger) y marcas historicas en docs de diseno antiguas. - Archivos documentales de revision retirados. Las conclusiones vigentes quedan
absorbidas por
src/uix/active_architecture.md, los README de capa ysrc/uix/contracts.ts. - Limpieza Eidos CSS/runtime aplicada:
index.cssya solo importa fonts,generated/base.css,archetypes.css,events.cssy recipes activas. Se retiraron CSS historicos decontracts/,themes/base/,tokens/motion.css,tokens/index.cssy los token files de componentes. - Migracion Eidos recipe tokens aplicada: los aliases
--{component}-*viven enEidosConfig.recipes, el tema base los define ensrc/uix/eidos/lib/recipes/base.ts, ygenerated/base.csslos publica desdenpm run generate:eidos-css. - Superficie de consulta de recipes aplicada:
ActiveEidos.listRecipes()ygetRecipeTokens(component)exponen aliases para editores de theme sin inspeccionar CSS ni devolver handles mutables del config interno. - La shell
/uixya no carga fuentes remotas; reutiliza las fuentes locales de Eidos (Instrument Sans,Azeret Mono) para que las validaciones Playwright no dependan de red externa. src/uix/contracts.test.tsahora incluye guardias de regresion para queActiveUixno vuelva a bootear Soma/Eidos, los providers Soma no usenregisterContract/registerPart, y la shell/uixno escribaprefs.theme.- Naming
langs: constantes runtime y diagnosticos ya usanlangs/langs.mono; se corrigieron menciones documentales residuales[lang]ylang.mono. - Contrato directo fuera de
ActiveUixaclarado:EngineSemanticcon visual activo necesitadomoprojectory falla conSemaConfigErrorsi faltan;ADomdirecto solo usadisabledDomcuando el caller lo pide. src/arts/prefs/README.mdreescrito al modelo actual schema-based. Se elimina la arquitectura historica de capabilities como guia principal; las dimensiones visualestheme/mode/densitypertenecen aActiveEidos.src/uix/morfo/README.mdactualizado: fijatranslations,commonRef, registro viaregisterMorfoysoma.runtime(...)como contrato vigente.frontendretirado como artefacto: no queda factory, alias ni ruta activa.- Validacion global ejecutada:
npm run check, tests focales UIX/arts ynpm run buildpasan. Solo queda el warning de chunks grandes del build. - Eidos general queda cerrado sin tocar componentes: no hay
EngineEidos, wrapperEidos,eidos/enginenieidos/core/headless; se anade guardia de regresion encontracts.test.ts. recipesqueda comoRecipeTokenSetplano por decision: subir a tipo estructurado solo cuando exista builder/consumer real que lo necesite.- Commits nuevos empujados:
694eb5c5—Clarify prefs projection contract223cdf9e—Align sema docs with channel ownership3dc775f4—Update UIX architecture notesb1215549—Fix UIX docs theme and popover dismiss6da10987—Prune legacy Eidos CSS runtimed822597f—Generate Eidos recipe tokens from config65958538—Expose Eidos recipe token queries4233be62—Update UIX continuation notes2df58074—Use local fonts in UIX docs8ad04714—Refresh UIX architecture docse2ba371b—Add UIX architecture regression guards71e05765—Align langs diagnostic wording607dfdbb—Clarify direct UIX service contracts475ac775—Refresh prefs architecture docs35958a49—Clarify morfo translation contractbd37e5dd—Clarify legacy frontend density docs
- Validado de nuevo:
npx vitest run src/uix/contracts.test.ts src/arts/prefs/test/dom-projection.test.ts src/uix/active-uix/active-uix.svelte.test.ts src/uix/eidos/active-eidos.test.ts src/uix/soma/runtime.svelte.test.ts-> 79 tests OK.npx vitest run src/uix/sema/engine.test.ts src/uix/soma/runtime.svelte.test.ts-> 48 tests OK.npx vitest run src/uix/eidos/active-eidos-config.test.ts src/uix/eidos/generated-css.test.ts src/uix/eidos/active-eidos.test.ts src/uix/contracts.test.ts-> 52 tests OK.npm run check-> 0 errores, 0 warnings.npx vitest run src/uix/contracts.test.ts-> 12 tests OK.npm run checktras wordinglangs-> 0 errores, 0 warnings.- Playwright
/uix: toggle dark actualizahtml[data-theme="base-dark"],html[data-mode="dark"]y mantienehtml[data-density="comfortable"]; sinpageerror, sin errores de consola y sinrequestfailed.
Estado validado
ActiveUixya no crea ni conoceSomaniEidos.- Solo
ActiveAppycreateActiveUix(...)standalone crean servicios compartidos. attachActiveUix(app)reutiliza servicios deActiveAppy falla temprano si faltanlangsodom.- El servicio runtime de traducciones se llama
langs. No confundir:prefs.languagealimentalangs.prefs.localealimentaformat.prefs.direction,prefs.motion,prefs.soundyprefs.hapticse proyectan mediantecreateActivePrefsDomProjection(...).
eventses el nombre publico del motor perceptivo enActiveUix;semanticqueda solo como payload demorfo.events[].semantic.ActiveEidosqueda aplanado: no existe engine visual separado ni directorioenginebajo Eidos.- Los helpers de configuracion/render/persistencia de Eidos viven en
src/uix/eidos/lib. ActiveEidosasume configuracion, validacion, contrato CSS, render, persistencia y scope visual.- Shells UIX deben pasar modo/densidad visuales a
ActiveEidosmediantemodeSource/densitySource; no escribirprefs.theme. - Los componentes Eidos siguen congelados salvo orden explicita.
Validaciones ejecutadas en esta fase:
npx vitest run src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts-> 37 tests OK.npx vitest run src/arts/adom/test/active-dom.test.ts src/uix/soma/runtime.svelte.test.ts src/uix/morfo/registry.test.ts src/uix/sema/resolver.test.ts src/uix/sema/chans/sound.test.ts src/uix/sema/chans/visual.test.ts src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts src/uix/contracts.test.ts-> 115 tests OK.npm run check-> 0 errores, 0 warnings.
Arquitectura acordada
La regla central queda asi:
ActiveApp o ActiveUix standalone crean servicios.
ActiveUix expone servicios y prefs.
Morfo declara contrato y translations.
Soma consume ActiveUix/Soma scope y transcribe morfo al DOM via uix.dom.
Sema/events emite ocurrencias perceptivas; no debe inventar servicios.
ActiveEidos consume ActiveUix y resuelve config/tokens/CSS runtime.
Los componentes no crean servicios compartidos.
portal queda como preferencia/target generico de ActiveUix; Soma lo adapta
a su portalTo. No usar nombres como somaPortalTo en ActiveUix.
P1 cerrado
- Ownership DOM P1 cerrado.
- Corregido:
TextSelectionya escribe/restaurauser-selectviaActiveDom.apply. - Corregido: announcers/live regions de Soma y descripciones ocultas de date/time
usan
ActiveDom.writeNode/writeText/removeNode. - Correcto:
ActiveUixprefs,SomaRuntime,VisualChannel/DomSignalProjectoryActiveEidosusanActiveDom. - Barrido P1 sin escrituras directas de produccion restantes; quedan lecturas DOM y fixtures de tests.
- Corregido:
- Tabla de contratos minimos cerrada como codigo/tests:
src/uix/contracts.ts+src/uix/contracts.test.tscubrenActiveUix,SomaRuntime,EngineSemantic/events,ActiveEidosyMorfo. - Sema queda purgado de las slices visuales
motion,colorypresence. El mapa canonico resuelve solohold,soundyhaptic; Eidos reacciona visualmente adata-event-*y a sus propios tokens CSS. - Naming
langsrevisado en mensajes/docs/tipos principales. Quedan solo usos tecnicos validos (<script lang="ts">,v.langRef(...)) o menciones historicas explicitas. attachActiveUix(app)no crea sustitutos si faltan servicios requeridos.SoundChannelya no registra listeners globales en el constructor; prima el contexto enprepare()solo cuando una senal sonora entra en el gesto.createActivePrefsDomProjection(...)proyectadir,data-motion,data-soundydata-haptic;ActiveEidosproyectadata-theme,data-modeydata-density.SomaRuntime,registerMorfoyapplyMapOverridestienen optimizaciones basicas de churn/copia aplicadas.frontendretirado;ActiveAppya no puede declarar un servicio visual shell heredado.themeDimension/densityDimensionretiradas; el catalogo$prefsno ofrece dimensiones visuales UIX.
Pendiente P2
- Soma: la API canonica publica de parte es
runtime.part(...).registerContract(...)ya no se llama desde Soma;registerMorfo(...)lo registra todo.createAttrs(...)queda solo como helper tipado paraquerySelector/tooling, no como mecanismo runtime. - Morfo: los atributos
data-*con valor libre ya se modelan conemit: 'value';progress/meterdeclarandata-value,data-minydata-maxen morfo ySomaRuntimelo cubre con test dedicado. - Morfo translations: mantener
translationsen el morfo,commonRefpara textos compartidos ylangs.tssolo como constantes imperativas legacy. - Frontend/ActiveApp: cerrado.
frontendno existe como artefacto activo ni como servicio opt-in. Las preferencias transversales se proyectan desdearts/prefs; las visuales pertenecen aActiveEidos. - ActiveApp docs: actualizado que
langs,dom,formatyeventsson servicios opt-in; no hay servicio visual shell heredado.
Eidos cerrado para modulo general
- Primitivas visuales sin tocar componentes:
layoutya queda incorporado alEidosConfigconcontainerWidth,containerPaddingInline,contentWidthyaspectRatio, y se genera en CSS/contrato como--container-width-*,--container-padding-inline,--content-width-*y--aspect-ratio-*. - Mantener
EidosConfigcomo authoring object persistible y CSS-only como modo valido mediantethemeSource: 'css'. - Density queda como primitive bridge:
scale,spaceScale,controlScaleycontentScaleparacompact,comfortable,spacious;ActiveEidosproyectadata-densityy Eidos publica aliases activos como--density-space-scale. src/uix/eidos/generated/base.cssqueda como primer artefacto CSS generado desdeEidosConfigbase mediantenpm run generate:eidos-css;index.csslo importa como foundation estatica.- Cerrado: los tokens per-component de las recipes activas quedan como
aliases estables y authorables en
EidosConfig.recipes. - Los CSS historicos de
contracts/ythemes/base/quedan retirados del arbol activo. El contrato se publica desdeActiveEidos.getCssContract()/renderContractCss()y el base desdegenerated/base.css. tokens/ya no forma parte del entrypoint estatico. Las recipes CSS consumen los mismos custom properties, pero los valores salen degenerated/base.css.ActiveEidos.listRecipes()ygetRecipeTokens(component)exponen los aliases para editores de theme sin leer CSS. El tipado plano derecipeses intencional mientras no haya builder/consumer estructurado.- No reintroducir engine visual separado, carpeta
engine, ni wrapperEidossin contrato propio.
Pendiente de limpieza
- Validacion navegador
/uixcerrada despues de mover recipe tokens y retirar fuentes remotas: carga sinrequestfailed, sin errores de consola y el toggle dark sigue aplicandodata-theme,data-modey estilos visuales. - Siguiente foco autorizado: Eidos components. Empezar por auditoria Option C
contra
src/uix/eidos/components/README.md; no mezclar esa fase con runtime general,ActiveUix,ActiveEidosni Soma salvo que aparezca una regresion concreta. - Warnings de toast resueltos;
npm run checkqueda en 0 errores / 0 warnings. - No commitear logs temporales:
.codex-vite-dialog*.log,debug.log,md. - Antes de seguir con componentes, releer
src/uix/active_architecture.md,src/uix/active-uix/README.md,src/uix/eidos/README.md,src/uix/soma/README.mdy este archivo.