From e9fc493823d392d28569c26253526312f031d1d6 Mon Sep 17 00:00:00 2001 From: dev Date: Mon, 15 Jun 2026 14:41:47 +0200 Subject: [PATCH] feat(motion): M5 naming type-safe + reversa fluida JS + demo de presets + docs de convivencia MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Continuación del servicio de motion-coordination (sobre M1–M6 ya commiteado). - M5 — naming `animation` / `motion` SEPARADAS por rol (no unificar: tras M6 son sistemas distintos — `motion`=momento `--state`/`data-state`/eidos; `animation`=coordinado/`data-starting-ending-style`/soma). `animation` gana type-safety vía el registry augmentable `MotionCoordinatedPresets` + `CoordinatedPresetName` en `$motion` (la capa compartida, para que soma lo tipe sin importar eidos); eidos lo puebla con `cascade-slide/-fade/-scale` por declaration-merging — espejo de `EidosMotionPresets`. - Reversa fluida — JS handoff (§8.3). El motor expone `MotionHandle.peek()` (posición + velocidad por propiedad) y la reinyecta en la fase inversa vía `MotionContext.handoff`: el `spring` continúa desde la posición/velocidad actual en vez de reiniciar desde el `from`. Orquestado enteramente en el engine (`takeHandoff` — captura en `cancel`, consume en `run`, y cancela un run en vuelo cuando el caller no pre-cancela): cubre el camino island (overlay-spring) y elimina un apilamiento preexistente. La reversa de los coordinados (transiciones CSS) ya era fluida. - Demo `/temas/animations/compuesto` — un `Rail` de ` + +``` + +- **entrada del item** → `cascade-slide`, eje `[data-starting-style]`, tokens `--motion-cascade-*` _(coordinado)_ +- **press del button** → `press-squeeze`, eje `[data-event-*]`, tokens `--duration-fast`/`--ease-default` _(firma)_ + +Son **dos nodos** (el `Rail.Item` que se anima vs el ` +
+ {#each STYLES as s (s.value)} + + {/each} +
+ +
+ + +
+ + Para la cascada fluida, abre esta página enfocada en el browser (en preview de fondo el rAF se + throttlea). La animación NO está aquí — sale de la foundation generada. + + + + +
+ + {#each ITEMS as item (item.label)} + + + + {/each} + +
+ +
{`   
+  {#each items as item}
+    
+      
+    
+  {/each}
+`}
+ + +