diff --git a/src/uix/eidos/MOTION_SERVICE_RFC.md b/src/uix/eidos/MOTION_SERVICE_RFC.md index 659935826..7d8706902 100644 --- a/src/uix/eidos/MOTION_SERVICE_RFC.md +++ b/src/uix/eidos/MOTION_SERVICE_RFC.md @@ -1507,8 +1507,23 @@ eje exige **estrenar el driver `spring`** con un primer preset JS — trabajo ap directa), NO de si el trigger CSS es `data-state`: el contenido es "siempre mostrado" (un `data-state` constante), sin máquina que lo conmute. Flash-free al spreadear en markup (attrs en la inserción, `backwards` fill). `'none'`/undefined → sin attrs (opt-out explícito). - - **Paso 2 (pendiente):** un wrapper `` (con `out:` retención → exit en desmontaje, + su morfo) y - cablear el prop `motion` en componentes reales. Loops (contenido infinito) = variante posterior. + - **Paso 2 — ✅ HECHO.** Cableado el prop `motion` en un componente real (piloto ``, + commit `0a6d112c`) + el wrapper `` (enter on-mount + exit on-unmount con retención `out:` estilo + ``, + su morfo `scope:['eidos']`, commit `54268717`). Dos vías para el diseñador: el prop en + un componente, o el wrapper para contenido crudo (in/out). Loops (contenido infinito) = variante posterior. + - **Hallazgo — el helper solo sirve en componentes SIN `data-state` propio.** `motionAttrs`/`` fuerzan + `data-state="open"` → clobbearían la máquina de estado de un componente que tenga la suya (Card + `selected`/`idle`, checkbox `checked`). La universalidad se parte: **contenido** (sin estado) = el helper; + **estado** (máquina propia) = OTRO camino — su `motion` ataría a SUS transiciones, pero los presets keyean en + `open`/`closed` específicamente, así que un `selected`/`idle` ni dispararía el preset. El state-domain es + trabajo aparte (desbloquea la universalidad para componentes con estado). + - **Hallazgo — colisión `data-motion`.** Ese attr es del sistema de **reduced-motion**: + `arts/prefs/dom-projection.ts` proyecta la pref `motion` (intent `system|allow|reduce` → effective + `allow|reduce`, vía `resolveMotion` + el OS) como `data-motion` en ``; `render-css.ts` + (`renderReducedMotionRules`) emite `[data-motion='reduce'] [data-animation-style][data-state]` + el + `@media (prefers-reduced-motion: reduce)`. Por eso `` **NO emite marcador de part** (un + `closest('[data-motion]')` del prefs lo matchearía) — solo los attrs funcionales. **Confirma:** el contenido + es reduced-motion-safe GRATIS (las overrides keyean en `data-state`, que `motionAttrs` ya pone). - **(c) El guard.** Tipos/lint: un componente con evento-que-posee-la-animación marca el prop como override; los demás, primario. - Cierra §6 (routing) en su parte vigente: el enrutado a superficie sigue siendo la idea (el dev nombra, el