use-scroll-animate 10.2.0 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +35 -0
- package/README.md +67 -0
- package/bin/motionary-mcp.mjs +265 -0
- package/dist/chunks/anim-image-DDdb9q3X.js +166 -0
- package/dist/chunks/anim-image-DDdb9q3X.js.map +1 -0
- package/dist/chunks/anim-image-blQgPFFS.cjs +174 -0
- package/dist/chunks/anim-image-blQgPFFS.cjs.map +1 -0
- package/dist/chunks/audio-BpU-A1m1.cjs.map +1 -1
- package/dist/chunks/{audio-D95jwlOh.js → audio-CWt1xdZB.js} +3 -3
- package/dist/chunks/{audio-D95jwlOh.js.map → audio-CWt1xdZB.js.map} +1 -1
- package/dist/chunks/{base-BnRyfuyM.js → base-BTev8qxg.js} +2 -2
- package/dist/chunks/{base-BnRyfuyM.js.map → base-BTev8qxg.js.map} +1 -1
- package/dist/chunks/base-DBheNxJu.cjs.map +1 -1
- package/dist/chunks/bind-B_CTL6Qn.js.map +1 -1
- package/dist/chunks/bind-Ui43-n2d.cjs.map +1 -1
- package/dist/chunks/builtins-CKKZNR95.cjs.map +1 -1
- package/dist/chunks/{builtins-CqIq1zBv.js → builtins-CPmS6aDB.js} +3 -3
- package/dist/chunks/{builtins-CqIq1zBv.js.map → builtins-CPmS6aDB.js.map} +1 -1
- package/dist/chunks/core-B5T0dhFH.cjs.map +1 -1
- package/dist/chunks/{core-DsGoL9EY.js → core-BviA7nFa.js} +2 -2
- package/dist/chunks/{core-DsGoL9EY.js.map → core-BviA7nFa.js.map} +1 -1
- package/dist/chunks/core-D74Fz-dL.cjs.map +1 -1
- package/dist/chunks/core-D7cVumUu.js.map +1 -1
- package/dist/chunks/{core-XA2yhn1b.js → core-KiM7MXjL.js} +2 -2
- package/dist/chunks/{core-XA2yhn1b.js.map → core-KiM7MXjL.js.map} +1 -1
- package/dist/chunks/core-MQlXZKUG.cjs.map +1 -1
- package/dist/chunks/ease-HwYZnZat.cjs +94 -0
- package/dist/chunks/ease-HwYZnZat.cjs.map +1 -0
- package/dist/chunks/ease-XN8_0sXu.js +89 -0
- package/dist/chunks/ease-XN8_0sXu.js.map +1 -0
- package/dist/chunks/fx-B_pbhpDp.cjs.map +1 -1
- package/dist/chunks/{fx-CtnrFEg9.js → fx-CgWKqVsn.js} +2 -2
- package/dist/chunks/{fx-CtnrFEg9.js.map → fx-CgWKqVsn.js.map} +1 -1
- package/dist/chunks/generative-2LhxG5BJ.js.map +1 -1
- package/dist/chunks/generative-BHIj-NU0.cjs.map +1 -1
- package/dist/chunks/{gpu-CDcXiNA8.js → gpu-BWfgYWMY.js} +2 -2
- package/dist/chunks/{gpu-CDcXiNA8.js.map → gpu-BWfgYWMY.js.map} +1 -1
- package/dist/chunks/gpu-cUixt7kT.cjs.map +1 -1
- package/dist/chunks/index-tags-B-JBecYg.js.map +1 -1
- package/dist/chunks/index-tags-hLIF2Clq.cjs.map +1 -1
- package/dist/chunks/{keyframes-W-474DMc.js → keyframes-B5PWe5bU.js} +3 -2
- package/dist/chunks/keyframes-B5PWe5bU.js.map +1 -0
- package/dist/chunks/{keyframes-ZheOkpt0.cjs → keyframes-tC3I7anQ.cjs} +4 -3
- package/dist/chunks/keyframes-tC3I7anQ.cjs.map +1 -0
- package/dist/chunks/{manifest-D58HXVY-.js → manifest-BHx5yPN6.js} +2 -2
- package/dist/chunks/{manifest-D58HXVY-.js.map → manifest-BHx5yPN6.js.map} +1 -1
- package/dist/chunks/manifest-PaF9B8Vt.cjs.map +1 -1
- package/dist/chunks/{player-48Zy_NBG.js → player-BfHMNtiM.js} +4 -4
- package/dist/chunks/{player-48Zy_NBG.js.map → player-BfHMNtiM.js.map} +1 -1
- package/dist/chunks/player-C4y4jXSv.cjs.map +1 -1
- package/dist/chunks/presets-BYBVJVeP.js.map +1 -1
- package/dist/chunks/presets-CUHys3sK.cjs.map +1 -1
- package/dist/chunks/{registry-gFJRpPES.js → registry-BKzyg1JV.js} +2 -2
- package/dist/chunks/{registry-gFJRpPES.js.map → registry-BKzyg1JV.js.map} +1 -1
- package/dist/chunks/{registry-BIEjKngP.js → registry-CT-TT_bx.js} +3 -3
- package/dist/chunks/{registry-BIEjKngP.js.map → registry-CT-TT_bx.js.map} +1 -1
- package/dist/chunks/{registry-eJgpFAzI.cjs → registry-tzwKkldE.cjs} +2 -2
- package/dist/chunks/{registry-eJgpFAzI.cjs.map → registry-tzwKkldE.cjs.map} +1 -1
- package/dist/chunks/registry-xQZnSqqV.cjs.map +1 -1
- package/dist/chunks/shared-CkKHWrtJ.js.map +1 -1
- package/dist/chunks/shared-jkgRH-Hx.cjs.map +1 -1
- package/dist/chunks/{spring-CZDNyqWp.js → spring-BHuP55DR.js} +2 -2
- package/dist/chunks/{spring-CZDNyqWp.js.map → spring-BHuP55DR.js.map} +1 -1
- package/dist/chunks/spring-BlTQD2AV.cjs.map +1 -1
- package/dist/chunks/stagger-CCFyhzSw.cjs.map +1 -1
- package/dist/chunks/stagger-DtMKo2SK.js.map +1 -1
- package/dist/chunks/{ticker-CM_56oVy.js → ticker-C8lSGml9.js} +2 -2
- package/dist/chunks/{ticker-CM_56oVy.js.map → ticker-C8lSGml9.js.map} +1 -1
- package/dist/chunks/{ticker-D4o6enH0.cjs → ticker-Un0bvTWR.cjs} +2 -2
- package/dist/chunks/{ticker-D4o6enH0.cjs.map → ticker-Un0bvTWR.cjs.map} +1 -1
- package/dist/chunks/{tween-CqX1JBuj.js → tween-BcejKpsx.js} +15 -91
- package/dist/chunks/tween-BcejKpsx.js.map +1 -0
- package/dist/chunks/{tween-CBuWYpI-.cjs → tween-CwLLC3Ko.cjs} +15 -95
- package/dist/chunks/tween-CwLLC3Ko.cjs.map +1 -0
- package/dist/chunks/variants-CrDDJoYK.cjs.map +1 -1
- package/dist/chunks/{variants-GU3yIL4F.js → variants-CsRGUIyA.js} +2 -2
- package/dist/chunks/{variants-GU3yIL4F.js.map → variants-CsRGUIyA.js.map} +1 -1
- package/dist/components/a11y.cjs.map +1 -1
- package/dist/components/a11y.js +2 -2
- package/dist/components/a11y.js.map +1 -1
- package/dist/components/angular.cjs.map +1 -1
- package/dist/components/angular.js +8 -8
- package/dist/components/angular.js.map +1 -1
- package/dist/components/background.cjs.map +1 -1
- package/dist/components/background.js +2 -2
- package/dist/components/background.js.map +1 -1
- package/dist/components/bridge.cjs.map +1 -1
- package/dist/components/bridge.js +1 -1
- package/dist/components/bridge.js.map +1 -1
- package/dist/components/cards.cjs.map +1 -1
- package/dist/components/cards.js +2 -2
- package/dist/components/cards.js.map +1 -1
- package/dist/components/click.cjs.map +1 -1
- package/dist/components/click.js +3 -3
- package/dist/components/click.js.map +1 -1
- package/dist/components/core.cjs.map +1 -1
- package/dist/components/core.js.map +1 -1
- package/dist/components/depth.cjs.map +1 -1
- package/dist/components/depth.js +3 -3
- package/dist/components/depth.js.map +1 -1
- package/dist/components/design.cjs.map +1 -1
- package/dist/components/design.js +3 -3
- package/dist/components/design.js.map +1 -1
- package/dist/components/dsl.cjs.map +1 -1
- package/dist/components/dsl.js +2 -2
- package/dist/components/dsl.js.map +1 -1
- package/dist/components/effects.cjs.map +1 -1
- package/dist/components/effects.js +9 -9
- package/dist/components/effects.js.map +1 -1
- package/dist/components/engine.cjs.map +1 -1
- package/dist/components/engine.js +2 -2
- package/dist/components/engine.js.map +1 -1
- package/dist/components/feedback.cjs.map +1 -1
- package/dist/components/feedback.js +1 -1
- package/dist/components/feedback.js.map +1 -1
- package/dist/components/fx-3d.cjs.map +1 -1
- package/dist/components/fx-3d.js +2 -2
- package/dist/components/fx-3d.js.map +1 -1
- package/dist/components/fx-ai.cjs.map +1 -1
- package/dist/components/fx-ai.js +2 -2
- package/dist/components/fx-ai.js.map +1 -1
- package/dist/components/fx-chart.cjs.map +1 -1
- package/dist/components/fx-chart.js +2 -2
- package/dist/components/fx-chart.js.map +1 -1
- package/dist/components/fx-cinema.cjs.map +1 -1
- package/dist/components/fx-cinema.js +2 -2
- package/dist/components/fx-cinema.js.map +1 -1
- package/dist/components/fx-cyber.cjs.map +1 -1
- package/dist/components/fx-cyber.js +2 -2
- package/dist/components/fx-cyber.js.map +1 -1
- package/dist/components/fx-festival.cjs.map +1 -1
- package/dist/components/fx-festival.js +2 -2
- package/dist/components/fx-festival.js.map +1 -1
- package/dist/components/fx-focus.cjs.map +1 -1
- package/dist/components/fx-focus.js +2 -2
- package/dist/components/fx-focus.js.map +1 -1
- package/dist/components/fx-form.cjs.map +1 -1
- package/dist/components/fx-form.js +2 -2
- package/dist/components/fx-form.js.map +1 -1
- package/dist/components/fx-game.cjs.map +1 -1
- package/dist/components/fx-game.js +2 -2
- package/dist/components/fx-game.js.map +1 -1
- package/dist/components/fx-genart.cjs.map +1 -1
- package/dist/components/fx-genart.js +2 -2
- package/dist/components/fx-genart.js.map +1 -1
- package/dist/components/fx-geo.cjs.map +1 -1
- package/dist/components/fx-geo.js +2 -2
- package/dist/components/fx-geo.js.map +1 -1
- package/dist/components/fx-gesture.cjs.map +1 -1
- package/dist/components/fx-gesture.js +2 -2
- package/dist/components/fx-gesture.js.map +1 -1
- package/dist/components/fx-gpu.js +3 -3
- package/dist/components/fx-light.cjs.map +1 -1
- package/dist/components/fx-light.js +2 -2
- package/dist/components/fx-light.js.map +1 -1
- package/dist/components/fx-lottie.cjs.map +1 -1
- package/dist/components/fx-lottie.js +2 -2
- package/dist/components/fx-lottie.js.map +1 -1
- package/dist/components/fx-morph.cjs.map +1 -1
- package/dist/components/fx-morph.js +2 -2
- package/dist/components/fx-morph.js.map +1 -1
- package/dist/components/fx-music.cjs.map +1 -1
- package/dist/components/fx-music.js +3 -3
- package/dist/components/fx-music.js.map +1 -1
- package/dist/components/fx-organic.cjs.map +1 -1
- package/dist/components/fx-organic.js +2 -2
- package/dist/components/fx-organic.js.map +1 -1
- package/dist/components/fx-paper.cjs.map +1 -1
- package/dist/components/fx-paper.js +2 -2
- package/dist/components/fx-paper.js.map +1 -1
- package/dist/components/fx-perf.cjs.map +1 -1
- package/dist/components/fx-perf.js +2 -2
- package/dist/components/fx-perf.js.map +1 -1
- package/dist/components/fx-physics.cjs.map +1 -1
- package/dist/components/fx-physics.js +2 -2
- package/dist/components/fx-physics.js.map +1 -1
- package/dist/components/fx-retro.cjs.map +1 -1
- package/dist/components/fx-retro.js +2 -2
- package/dist/components/fx-retro.js.map +1 -1
- package/dist/components/fx-safe.cjs.map +1 -1
- package/dist/components/fx-safe.js +2 -2
- package/dist/components/fx-safe.js.map +1 -1
- package/dist/components/fx-shop.cjs.map +1 -1
- package/dist/components/fx-shop.js +2 -2
- package/dist/components/fx-shop.js.map +1 -1
- package/dist/components/fx-social.cjs.map +1 -1
- package/dist/components/fx-social.js +2 -2
- package/dist/components/fx-social.js.map +1 -1
- package/dist/components/fx-spatial.cjs.map +1 -1
- package/dist/components/fx-spatial.js +2 -2
- package/dist/components/fx-spatial.js.map +1 -1
- package/dist/components/fx-surface.cjs.map +1 -1
- package/dist/components/fx-surface.js +2 -2
- package/dist/components/fx-surface.js.map +1 -1
- package/dist/components/fx-text.cjs.map +1 -1
- package/dist/components/fx-text.js +2 -2
- package/dist/components/fx-text.js.map +1 -1
- package/dist/components/fx-transitions.cjs.map +1 -1
- package/dist/components/fx-transitions.js +3 -3
- package/dist/components/fx-transitions.js.map +1 -1
- package/dist/components/fx-video.cjs.map +1 -1
- package/dist/components/fx-video.js +2 -2
- package/dist/components/fx-video.js.map +1 -1
- package/dist/components/fx-weather.cjs.map +1 -1
- package/dist/components/fx-weather.js +2 -2
- package/dist/components/fx-weather.js.map +1 -1
- package/dist/components/fx.cjs.map +1 -1
- package/dist/components/fx.js +6 -6
- package/dist/components/fx.js.map +1 -1
- package/dist/components/fx2.cjs.map +1 -1
- package/dist/components/fx2.js +6 -6
- package/dist/components/fx2.js.map +1 -1
- package/dist/components/gesture.cjs.map +1 -1
- package/dist/components/gesture.js +4 -4
- package/dist/components/gesture.js.map +1 -1
- package/dist/components/interaction.cjs.map +1 -1
- package/dist/components/interaction.js +1 -1
- package/dist/components/interaction.js.map +1 -1
- package/dist/components/layout.cjs.map +1 -1
- package/dist/components/layout.js +1 -1
- package/dist/components/layout.js.map +1 -1
- package/dist/components/lazy.cjs.map +1 -1
- package/dist/components/lazy.js.map +1 -1
- package/dist/components/lite.cjs.map +1 -1
- package/dist/components/lite.js.map +1 -1
- package/dist/components/marketplace.cjs.map +1 -1
- package/dist/components/marketplace.js +4 -4
- package/dist/components/marketplace.js.map +1 -1
- package/dist/components/native.cjs.map +1 -1
- package/dist/components/native.js +3 -3
- package/dist/components/native.js.map +1 -1
- package/dist/components/packs.cjs.map +1 -1
- package/dist/components/packs.js +1 -1
- package/dist/components/packs.js.map +1 -1
- package/dist/components/page.cjs.map +1 -1
- package/dist/components/page.js +3 -3
- package/dist/components/page.js.map +1 -1
- package/dist/components/perf.cjs.map +1 -1
- package/dist/components/perf.js +2 -2
- package/dist/components/perf.js.map +1 -1
- package/dist/components/physics.cjs.map +1 -1
- package/dist/components/physics.js +3 -3
- package/dist/components/physics.js.map +1 -1
- package/dist/components/plugins.cjs.map +1 -1
- package/dist/components/plugins.js +4 -4
- package/dist/components/plugins.js.map +1 -1
- package/dist/components/react.cjs.map +1 -1
- package/dist/components/react.js.map +1 -1
- package/dist/components/reveal.cjs.map +1 -1
- package/dist/components/reveal.js +1 -1
- package/dist/components/reveal.js.map +1 -1
- package/dist/components/solid.cjs.map +1 -1
- package/dist/components/solid.js +8 -8
- package/dist/components/solid.js.map +1 -1
- package/dist/components/svelte.cjs.map +1 -1
- package/dist/components/svelte.js +8 -8
- package/dist/components/svelte.js.map +1 -1
- package/dist/components/svg.cjs.map +1 -1
- package/dist/components/svg.js +1 -1
- package/dist/components/svg.js.map +1 -1
- package/dist/components/text.cjs.map +1 -1
- package/dist/components/text.js +2 -2
- package/dist/components/text.js.map +1 -1
- package/dist/components/timeline.cjs.map +1 -1
- package/dist/components/timeline.js +3 -3
- package/dist/components/timeline.js.map +1 -1
- package/dist/components/tokens.cjs.map +1 -1
- package/dist/components/tokens.js.map +1 -1
- package/dist/components/transitions.cjs.map +1 -1
- package/dist/components/transitions.js +1 -1
- package/dist/components/transitions.js.map +1 -1
- package/dist/components/ui.cjs.map +1 -1
- package/dist/components/ui.js +4 -4
- package/dist/components/ui.js.map +1 -1
- package/dist/components/vue.cjs.map +1 -1
- package/dist/components/vue.js +8 -8
- package/dist/components/vue.js.map +1 -1
- package/dist/components/webgl.cjs.map +1 -1
- package/dist/components/webgl.js +1 -1
- package/dist/components/webgl.js.map +1 -1
- package/dist/components/widgets.cjs +766 -212
- package/dist/components/widgets.cjs.map +1 -1
- package/dist/components/widgets.d.cts +207 -2
- package/dist/components/widgets.d.ts +207 -2
- package/dist/components/widgets.js +770 -221
- package/dist/components/widgets.js.map +1 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +10 -10
- package/dist/components.js.map +1 -1
- package/dist/element.cjs.map +1 -1
- package/dist/element.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +250 -1
- package/dist/llms.txt +13 -2
- package/dist/manifest.json +646 -1
- package/dist/presets/extended.cjs.map +1 -1
- package/dist/presets/extended.js.map +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.js.map +1 -1
- package/dist/runtime/format-apng.cjs +131 -0
- package/dist/runtime/format-apng.cjs.map +1 -0
- package/dist/runtime/format-apng.d.cts +250 -0
- package/dist/runtime/format-apng.d.ts +250 -0
- package/dist/runtime/format-apng.iife.js +2 -0
- package/dist/runtime/format-apng.iife.js.map +1 -0
- package/dist/runtime/format-apng.js +123 -0
- package/dist/runtime/format-apng.js.map +1 -0
- package/dist/runtime/format-css.cjs +5 -4
- package/dist/runtime/format-css.cjs.map +1 -1
- package/dist/runtime/format-css.js +5 -4
- package/dist/runtime/format-css.js.map +1 -1
- package/dist/runtime/format-gif.cjs +206 -0
- package/dist/runtime/format-gif.cjs.map +1 -0
- package/dist/runtime/format-gif.d.cts +223 -0
- package/dist/runtime/format-gif.d.ts +223 -0
- package/dist/runtime/format-gif.iife.js +2 -0
- package/dist/runtime/format-gif.iife.js.map +1 -0
- package/dist/runtime/format-gif.js +199 -0
- package/dist/runtime/format-gif.js.map +1 -0
- package/dist/runtime/format-motion.cjs +9 -8
- package/dist/runtime/format-motion.cjs.map +1 -1
- package/dist/runtime/format-motion.js +5 -4
- package/dist/runtime/format-motion.js.map +1 -1
- package/dist/runtime/format-sprite.cjs +226 -0
- package/dist/runtime/format-sprite.cjs.map +1 -0
- package/dist/runtime/format-sprite.d.cts +224 -0
- package/dist/runtime/format-sprite.d.ts +224 -0
- package/dist/runtime/format-sprite.iife.js +2 -0
- package/dist/runtime/format-sprite.iife.js.map +1 -0
- package/dist/runtime/format-sprite.js +216 -0
- package/dist/runtime/format-sprite.js.map +1 -0
- package/dist/runtime/format-svg.cjs +5 -4
- package/dist/runtime/format-svg.cjs.map +1 -1
- package/dist/runtime/format-svg.iife.js.map +1 -1
- package/dist/runtime/format-svg.js +4 -3
- package/dist/runtime/format-svg.js.map +1 -1
- package/dist/runtime/format-webp.cjs +123 -0
- package/dist/runtime/format-webp.cjs.map +1 -0
- package/dist/runtime/format-webp.d.cts +245 -0
- package/dist/runtime/format-webp.d.ts +245 -0
- package/dist/runtime/format-webp.iife.js +2 -0
- package/dist/runtime/format-webp.iife.js.map +1 -0
- package/dist/runtime/format-webp.js +115 -0
- package/dist/runtime/format-webp.js.map +1 -0
- package/dist/runtime/scroll.cjs +2 -2
- package/dist/runtime/scroll.cjs.map +1 -1
- package/dist/runtime/scroll.js +2 -2
- package/dist/runtime/scroll.js.map +1 -1
- package/dist/runtime/smooth.cjs +284 -0
- package/dist/runtime/smooth.cjs.map +1 -0
- package/dist/runtime/smooth.d.cts +137 -0
- package/dist/runtime/smooth.d.ts +137 -0
- package/dist/runtime/smooth.iife.js +2 -0
- package/dist/runtime/smooth.iife.js.map +1 -0
- package/dist/runtime/smooth.js +279 -0
- package/dist/runtime/smooth.js.map +1 -0
- package/dist/runtime/text.cjs +147 -0
- package/dist/runtime/text.cjs.map +1 -0
- package/dist/runtime/text.d.cts +65 -0
- package/dist/runtime/text.d.ts +65 -0
- package/dist/runtime/text.iife.js +2 -0
- package/dist/runtime/text.iife.js.map +1 -0
- package/dist/runtime/text.js +143 -0
- package/dist/runtime/text.js.map +1 -0
- package/dist/runtime.cjs +9 -8
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.cts +9 -2
- package/dist/runtime.d.ts +9 -2
- package/dist/runtime.iife.js +1 -1
- package/dist/runtime.iife.js.map +1 -1
- package/dist/runtime.js +6 -5
- package/dist/runtime.js.map +1 -1
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.js.map +1 -1
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.js.map +1 -1
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js.map +1 -1
- package/dist/widgets.umd.js +1 -1
- package/dist/widgets.umd.js.map +1 -1
- package/docs/ROADMAP.md +2 -2
- package/docs/components/README.md +12 -7
- package/docs/components/usa-parallax-layers.md +38 -0
- package/docs/components/usa-route-transition.md +38 -0
- package/docs/components/usa-scroll-ring.md +32 -0
- package/docs/components/usa-smooth-scroll.md +60 -0
- package/docs/components/usa-text-splitter.md +60 -0
- package/docs/components.md +94 -0
- package/docs/mcp.md +50 -0
- package/docs/runtime/format-apng.md +59 -0
- package/docs/runtime/format-gif.md +60 -0
- package/docs/runtime/format-sprite.md +60 -0
- package/docs/runtime/format-webp.md +58 -0
- package/docs/runtime/smooth.md +60 -0
- package/docs/runtime/text.md +59 -0
- package/package.json +64 -2
- package/dist/chunks/keyframes-W-474DMc.js.map +0 -1
- package/dist/chunks/keyframes-ZheOkpt0.cjs.map +0 -1
- package/dist/chunks/tween-CBuWYpI-.cjs.map +0 -1
- package/dist/chunks/tween-CqX1JBuj.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-chart.cjs","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":["all","registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-chart.cjs","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":["all","registerEffects"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { registerEffects } from '../chunks/registry-
|
|
1
|
+
import { registerEffects } from '../chunks/registry-BKzyg1JV.js';
|
|
2
2
|
import { a as all } from '../chunks/shared-CkKHWrtJ.js';
|
|
3
|
-
import '../chunks/base-
|
|
3
|
+
import '../chunks/base-BTev8qxg.js';
|
|
4
4
|
|
|
5
5
|
const fade = (el, ctx) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });
|
|
6
6
|
const pick = (el, sel) => Array.from(el.querySelectorAll(sel));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-chart.js","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-chart.js","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-cinema.cjs","sources":["../../src/components/fx2/cinema.ts"],"sourcesContent":["/**\n * 9.1 — Cinematic pack (`motionary/fx/cinema`, also `motionary/components/fx-cinema`):\n *\n * - `dolly-in` (enter) — a slow camera push: the element starts slightly\n * large and soft and settles sharp, like a dolly shot (`duration`).\n * - `pan-reveal` (enter) — the camera pans across the element while a\n * wipe uncovers it (`from` left|right).\n * - `letterbox` (enter) — cinema bars slide in, hold, then open up to\n * reveal the element (`hold`).\n * - `rack-focus` (attention) — focus pulls from the element's first child\n * to the rest and back, like a focus puller racking between subjects.\n *\n * `cameraFrame(move, p)` gives the transform of a camera move at progress\n * 0–1 (used by `<usa-scene>`). Reduced motion: entrances fade, rack-focus\n * does nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nexport const CAMERA_MOVES = ['dolly-in', 'dolly-out', 'pan-left', 'pan-right', 'tilt-up', 'tilt-down', 'zoom-in', 'zoom-out', 'orbit'] as const;\nexport type CameraMove = (typeof CAMERA_MOVES)[number];\n\n/** Transform of camera `move` at progress `p` (0–1, clamped), `strength` 0–2 (9.1). */\nexport function cameraFrame(move: string, p: number, strength = 1): string {\n const t = Math.min(1, Math.max(0, p));\n const k = Math.min(2, Math.max(0, strength));\n const f = (n: number) => Math.round(n * 1000) / 1000;\n switch (move) {\n case 'dolly-in':\n return `scale(${f(1 + 0.18 * k * t)})`;\n case 'dolly-out':\n return `scale(${f(1 + 0.18 * k * (1 - t))})`;\n case 'pan-left':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(6 * k - 12 * k * t)}%)`;\n case 'pan-right':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-up':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-down':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(6 * k - 12 * k * t)}%)`;\n case 'zoom-in':\n return `scale(${f(1 + 0.4 * k * t * t)})`;\n case 'zoom-out':\n return `scale(${f(1 + 0.4 * k * (1 - t) * (1 - t))})`;\n case 'orbit':\n return `perspective(900px) rotateY(${f(-12 * k + 24 * k * t)}deg) scale(${f(1 + 0.08 * k)})`;\n default:\n return 'none';\n }\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 })?.finished.catch(() => undefined);\n\nexport const CINEMA_FX: EffectDefinition[] = [\n {\n name: 'dolly-in',\n kind: 'enter',\n description: 'A slow camera push: starts slightly large and soft, settles sharp (`duration`).',\n defaults: { duration: 1600 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n return ctx.animate(el, [{ transform: 'scale(1.14)', filter: 'blur(6px)', opacity: 0 }, { opacity: 1, offset: 0.3 }, { transform: 'scale(1)', filter: 'blur(0)', opacity: 1 }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.16,.84,.3,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'pan-reveal',\n kind: 'enter',\n description: 'The camera pans across the element while a wipe uncovers it (`from`).',\n defaults: { from: 'left', duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const r = o.from === 'right';\n return ctx.animate(el, [{ clipPath: r ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)', transform: `translateX(${r ? 4 : -4}%) scale(1.06)` }, { clipPath: 'inset(0 0 0 0)', transform: 'none' }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.65,0,.35,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'letterbox',\n kind: 'enter',\n description: 'Cinema bars slide in, hold, then open up to reveal the element (`hold`).',\n defaults: { duration: 1400, hold: 0.35 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const h = Math.min(0.8, Math.max(0, Number(o.hold) || 0));\n const a = 0.25;\n const b = Math.min(0.95, a + h);\n return ctx.animate(el, [{ clipPath: 'inset(50% 0 50% 0)', opacity: 0.6 }, { clipPath: 'inset(12% 0 12% 0)', opacity: 1, offset: a }, { clipPath: 'inset(12% 0 12% 0)', offset: b }, { clipPath: 'inset(0 0 0 0)' }], { duration: o.duration, delay: o.delay, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'rack-focus',\n kind: 'attention',\n description: \"Focus pulls from the element's first child to the rest and back, like racking focus between subjects.\",\n defaults: { duration: 1800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const kids = Array.from(el.children) as HTMLElement[];\n if (kids.length < 2) return ctx.animate(el, [{ filter: 'blur(0)' }, { filter: 'blur(4px)', offset: 0.5 }, { filter: 'blur(0)' }], { duration: o.duration })?.finished.catch(() => undefined);\n const [first, ...rest] = kids;\n const runs = [ctx.animate(first, [{ filter: 'blur(0)' }, { filter: 'blur(5px)', offset: 0.35 }, { filter: 'blur(5px)', offset: 0.65 }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }), ...rest.map((k) => ctx.animate(k, [{ filter: 'blur(5px)' }, { filter: 'blur(0)', offset: 0.35 }, { filter: 'blur(0)', offset: 0.65 }, { filter: 'blur(5px)' }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }))];\n return Promise.all(runs.map((r) => r?.finished.catch(() => undefined))).then(() => undefined);\n },\n },\n];\n\n/** Register dolly-in, pan-reveal, letterbox and rack-focus (9.1). */\nexport function registerCinemaPack(): void {\n registerEffects(CINEMA_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-cinema.cjs","sources":["../../src/components/fx2/cinema.ts"],"sourcesContent":["/**\n * 9.1 — Cinematic pack (`motionary/fx/cinema`, also `motionary/components/fx-cinema`):\n *\n * - `dolly-in` (enter) — a slow camera push: the element starts slightly\n * large and soft and settles sharp, like a dolly shot (`duration`).\n * - `pan-reveal` (enter) — the camera pans across the element while a\n * wipe uncovers it (`from` left|right).\n * - `letterbox` (enter) — cinema bars slide in, hold, then open up to\n * reveal the element (`hold`).\n * - `rack-focus` (attention) — focus pulls from the element's first child\n * to the rest and back, like a focus puller racking between subjects.\n *\n * `cameraFrame(move, p)` gives the transform of a camera move at progress\n * 0–1 (used by `<usa-scene>`). Reduced motion: entrances fade, rack-focus\n * does nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nexport const CAMERA_MOVES = ['dolly-in', 'dolly-out', 'pan-left', 'pan-right', 'tilt-up', 'tilt-down', 'zoom-in', 'zoom-out', 'orbit'] as const;\nexport type CameraMove = (typeof CAMERA_MOVES)[number];\n\n/** Transform of camera `move` at progress `p` (0–1, clamped), `strength` 0–2 (9.1). */\nexport function cameraFrame(move: string, p: number, strength = 1): string {\n const t = Math.min(1, Math.max(0, p));\n const k = Math.min(2, Math.max(0, strength));\n const f = (n: number) => Math.round(n * 1000) / 1000;\n switch (move) {\n case 'dolly-in':\n return `scale(${f(1 + 0.18 * k * t)})`;\n case 'dolly-out':\n return `scale(${f(1 + 0.18 * k * (1 - t))})`;\n case 'pan-left':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(6 * k - 12 * k * t)}%)`;\n case 'pan-right':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-up':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-down':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(6 * k - 12 * k * t)}%)`;\n case 'zoom-in':\n return `scale(${f(1 + 0.4 * k * t * t)})`;\n case 'zoom-out':\n return `scale(${f(1 + 0.4 * k * (1 - t) * (1 - t))})`;\n case 'orbit':\n return `perspective(900px) rotateY(${f(-12 * k + 24 * k * t)}deg) scale(${f(1 + 0.08 * k)})`;\n default:\n return 'none';\n }\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 })?.finished.catch(() => undefined);\n\nexport const CINEMA_FX: EffectDefinition[] = [\n {\n name: 'dolly-in',\n kind: 'enter',\n description: 'A slow camera push: starts slightly large and soft, settles sharp (`duration`).',\n defaults: { duration: 1600 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n return ctx.animate(el, [{ transform: 'scale(1.14)', filter: 'blur(6px)', opacity: 0 }, { opacity: 1, offset: 0.3 }, { transform: 'scale(1)', filter: 'blur(0)', opacity: 1 }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.16,.84,.3,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'pan-reveal',\n kind: 'enter',\n description: 'The camera pans across the element while a wipe uncovers it (`from`).',\n defaults: { from: 'left', duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const r = o.from === 'right';\n return ctx.animate(el, [{ clipPath: r ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)', transform: `translateX(${r ? 4 : -4}%) scale(1.06)` }, { clipPath: 'inset(0 0 0 0)', transform: 'none' }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.65,0,.35,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'letterbox',\n kind: 'enter',\n description: 'Cinema bars slide in, hold, then open up to reveal the element (`hold`).',\n defaults: { duration: 1400, hold: 0.35 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const h = Math.min(0.8, Math.max(0, Number(o.hold) || 0));\n const a = 0.25;\n const b = Math.min(0.95, a + h);\n return ctx.animate(el, [{ clipPath: 'inset(50% 0 50% 0)', opacity: 0.6 }, { clipPath: 'inset(12% 0 12% 0)', opacity: 1, offset: a }, { clipPath: 'inset(12% 0 12% 0)', offset: b }, { clipPath: 'inset(0 0 0 0)' }], { duration: o.duration, delay: o.delay, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'rack-focus',\n kind: 'attention',\n description: \"Focus pulls from the element's first child to the rest and back, like racking focus between subjects.\",\n defaults: { duration: 1800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const kids = Array.from(el.children) as HTMLElement[];\n if (kids.length < 2) return ctx.animate(el, [{ filter: 'blur(0)' }, { filter: 'blur(4px)', offset: 0.5 }, { filter: 'blur(0)' }], { duration: o.duration })?.finished.catch(() => undefined);\n const [first, ...rest] = kids;\n const runs = [ctx.animate(first, [{ filter: 'blur(0)' }, { filter: 'blur(5px)', offset: 0.35 }, { filter: 'blur(5px)', offset: 0.65 }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }), ...rest.map((k) => ctx.animate(k, [{ filter: 'blur(5px)' }, { filter: 'blur(0)', offset: 0.35 }, { filter: 'blur(0)', offset: 0.65 }, { filter: 'blur(5px)' }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }))];\n return Promise.all(runs.map((r) => r?.finished.catch(() => undefined))).then(() => undefined);\n },\n },\n];\n\n/** Register dolly-in, pan-reveal, letterbox and rack-focus (9.1). */\nexport function registerCinemaPack(): void {\n registerEffects(CINEMA_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { registerEffects } from '../chunks/registry-
|
|
2
|
-
import '../chunks/base-
|
|
1
|
+
import { registerEffects } from '../chunks/registry-BKzyg1JV.js';
|
|
2
|
+
import '../chunks/base-BTev8qxg.js';
|
|
3
3
|
|
|
4
4
|
const CAMERA_MOVES = ['dolly-in', 'dolly-out', 'pan-left', 'pan-right', 'tilt-up', 'tilt-down', 'zoom-in', 'zoom-out', 'orbit'];
|
|
5
5
|
/** Transform of camera `move` at progress `p` (0–1, clamped), `strength` 0–2 (9.1). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-cinema.js","sources":["../../src/components/fx2/cinema.ts"],"sourcesContent":["/**\n * 9.1 — Cinematic pack (`motionary/fx/cinema`, also `motionary/components/fx-cinema`):\n *\n * - `dolly-in` (enter) — a slow camera push: the element starts slightly\n * large and soft and settles sharp, like a dolly shot (`duration`).\n * - `pan-reveal` (enter) — the camera pans across the element while a\n * wipe uncovers it (`from` left|right).\n * - `letterbox` (enter) — cinema bars slide in, hold, then open up to\n * reveal the element (`hold`).\n * - `rack-focus` (attention) — focus pulls from the element's first child\n * to the rest and back, like a focus puller racking between subjects.\n *\n * `cameraFrame(move, p)` gives the transform of a camera move at progress\n * 0–1 (used by `<usa-scene>`). Reduced motion: entrances fade, rack-focus\n * does nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nexport const CAMERA_MOVES = ['dolly-in', 'dolly-out', 'pan-left', 'pan-right', 'tilt-up', 'tilt-down', 'zoom-in', 'zoom-out', 'orbit'] as const;\nexport type CameraMove = (typeof CAMERA_MOVES)[number];\n\n/** Transform of camera `move` at progress `p` (0–1, clamped), `strength` 0–2 (9.1). */\nexport function cameraFrame(move: string, p: number, strength = 1): string {\n const t = Math.min(1, Math.max(0, p));\n const k = Math.min(2, Math.max(0, strength));\n const f = (n: number) => Math.round(n * 1000) / 1000;\n switch (move) {\n case 'dolly-in':\n return `scale(${f(1 + 0.18 * k * t)})`;\n case 'dolly-out':\n return `scale(${f(1 + 0.18 * k * (1 - t))})`;\n case 'pan-left':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(6 * k - 12 * k * t)}%)`;\n case 'pan-right':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-up':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-down':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(6 * k - 12 * k * t)}%)`;\n case 'zoom-in':\n return `scale(${f(1 + 0.4 * k * t * t)})`;\n case 'zoom-out':\n return `scale(${f(1 + 0.4 * k * (1 - t) * (1 - t))})`;\n case 'orbit':\n return `perspective(900px) rotateY(${f(-12 * k + 24 * k * t)}deg) scale(${f(1 + 0.08 * k)})`;\n default:\n return 'none';\n }\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 })?.finished.catch(() => undefined);\n\nexport const CINEMA_FX: EffectDefinition[] = [\n {\n name: 'dolly-in',\n kind: 'enter',\n description: 'A slow camera push: starts slightly large and soft, settles sharp (`duration`).',\n defaults: { duration: 1600 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n return ctx.animate(el, [{ transform: 'scale(1.14)', filter: 'blur(6px)', opacity: 0 }, { opacity: 1, offset: 0.3 }, { transform: 'scale(1)', filter: 'blur(0)', opacity: 1 }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.16,.84,.3,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'pan-reveal',\n kind: 'enter',\n description: 'The camera pans across the element while a wipe uncovers it (`from`).',\n defaults: { from: 'left', duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const r = o.from === 'right';\n return ctx.animate(el, [{ clipPath: r ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)', transform: `translateX(${r ? 4 : -4}%) scale(1.06)` }, { clipPath: 'inset(0 0 0 0)', transform: 'none' }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.65,0,.35,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'letterbox',\n kind: 'enter',\n description: 'Cinema bars slide in, hold, then open up to reveal the element (`hold`).',\n defaults: { duration: 1400, hold: 0.35 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const h = Math.min(0.8, Math.max(0, Number(o.hold) || 0));\n const a = 0.25;\n const b = Math.min(0.95, a + h);\n return ctx.animate(el, [{ clipPath: 'inset(50% 0 50% 0)', opacity: 0.6 }, { clipPath: 'inset(12% 0 12% 0)', opacity: 1, offset: a }, { clipPath: 'inset(12% 0 12% 0)', offset: b }, { clipPath: 'inset(0 0 0 0)' }], { duration: o.duration, delay: o.delay, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'rack-focus',\n kind: 'attention',\n description: \"Focus pulls from the element's first child to the rest and back, like racking focus between subjects.\",\n defaults: { duration: 1800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const kids = Array.from(el.children) as HTMLElement[];\n if (kids.length < 2) return ctx.animate(el, [{ filter: 'blur(0)' }, { filter: 'blur(4px)', offset: 0.5 }, { filter: 'blur(0)' }], { duration: o.duration })?.finished.catch(() => undefined);\n const [first, ...rest] = kids;\n const runs = [ctx.animate(first, [{ filter: 'blur(0)' }, { filter: 'blur(5px)', offset: 0.35 }, { filter: 'blur(5px)', offset: 0.65 }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }), ...rest.map((k) => ctx.animate(k, [{ filter: 'blur(5px)' }, { filter: 'blur(0)', offset: 0.35 }, { filter: 'blur(0)', offset: 0.65 }, { filter: 'blur(5px)' }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }))];\n return Promise.all(runs.map((r) => r?.finished.catch(() => undefined))).then(() => undefined);\n },\n },\n];\n\n/** Register dolly-in, pan-reveal, letterbox and rack-focus (9.1). */\nexport function registerCinemaPack(): void {\n registerEffects(CINEMA_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-cinema.js","sources":["../../src/components/fx2/cinema.ts"],"sourcesContent":["/**\n * 9.1 — Cinematic pack (`motionary/fx/cinema`, also `motionary/components/fx-cinema`):\n *\n * - `dolly-in` (enter) — a slow camera push: the element starts slightly\n * large and soft and settles sharp, like a dolly shot (`duration`).\n * - `pan-reveal` (enter) — the camera pans across the element while a\n * wipe uncovers it (`from` left|right).\n * - `letterbox` (enter) — cinema bars slide in, hold, then open up to\n * reveal the element (`hold`).\n * - `rack-focus` (attention) — focus pulls from the element's first child\n * to the rest and back, like a focus puller racking between subjects.\n *\n * `cameraFrame(move, p)` gives the transform of a camera move at progress\n * 0–1 (used by `<usa-scene>`). Reduced motion: entrances fade, rack-focus\n * does nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nexport const CAMERA_MOVES = ['dolly-in', 'dolly-out', 'pan-left', 'pan-right', 'tilt-up', 'tilt-down', 'zoom-in', 'zoom-out', 'orbit'] as const;\nexport type CameraMove = (typeof CAMERA_MOVES)[number];\n\n/** Transform of camera `move` at progress `p` (0–1, clamped), `strength` 0–2 (9.1). */\nexport function cameraFrame(move: string, p: number, strength = 1): string {\n const t = Math.min(1, Math.max(0, p));\n const k = Math.min(2, Math.max(0, strength));\n const f = (n: number) => Math.round(n * 1000) / 1000;\n switch (move) {\n case 'dolly-in':\n return `scale(${f(1 + 0.18 * k * t)})`;\n case 'dolly-out':\n return `scale(${f(1 + 0.18 * k * (1 - t))})`;\n case 'pan-left':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(6 * k - 12 * k * t)}%)`;\n case 'pan-right':\n return `scale(${f(1 + 0.12 * k)}) translateX(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-up':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(-6 * k + 12 * k * t)}%)`;\n case 'tilt-down':\n return `scale(${f(1 + 0.12 * k)}) translateY(${f(6 * k - 12 * k * t)}%)`;\n case 'zoom-in':\n return `scale(${f(1 + 0.4 * k * t * t)})`;\n case 'zoom-out':\n return `scale(${f(1 + 0.4 * k * (1 - t) * (1 - t))})`;\n case 'orbit':\n return `perspective(900px) rotateY(${f(-12 * k + 24 * k * t)}deg) scale(${f(1 + 0.08 * k)})`;\n default:\n return 'none';\n }\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 })?.finished.catch(() => undefined);\n\nexport const CINEMA_FX: EffectDefinition[] = [\n {\n name: 'dolly-in',\n kind: 'enter',\n description: 'A slow camera push: starts slightly large and soft, settles sharp (`duration`).',\n defaults: { duration: 1600 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n return ctx.animate(el, [{ transform: 'scale(1.14)', filter: 'blur(6px)', opacity: 0 }, { opacity: 1, offset: 0.3 }, { transform: 'scale(1)', filter: 'blur(0)', opacity: 1 }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.16,.84,.3,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'pan-reveal',\n kind: 'enter',\n description: 'The camera pans across the element while a wipe uncovers it (`from`).',\n defaults: { from: 'left', duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const r = o.from === 'right';\n return ctx.animate(el, [{ clipPath: r ? 'inset(0 0 0 100%)' : 'inset(0 100% 0 0)', transform: `translateX(${r ? 4 : -4}%) scale(1.06)` }, { clipPath: 'inset(0 0 0 0)', transform: 'none' }], { duration: o.duration, delay: o.delay, easing: 'cubic-bezier(.65,0,.35,1)', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'letterbox',\n kind: 'enter',\n description: 'Cinema bars slide in, hold, then open up to reveal the element (`hold`).',\n defaults: { duration: 1400, hold: 0.35 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return fade(el, ctx);\n const h = Math.min(0.8, Math.max(0, Number(o.hold) || 0));\n const a = 0.25;\n const b = Math.min(0.95, a + h);\n return ctx.animate(el, [{ clipPath: 'inset(50% 0 50% 0)', opacity: 0.6 }, { clipPath: 'inset(12% 0 12% 0)', opacity: 1, offset: a }, { clipPath: 'inset(12% 0 12% 0)', offset: b }, { clipPath: 'inset(0 0 0 0)' }], { duration: o.duration, delay: o.delay, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'rack-focus',\n kind: 'attention',\n description: \"Focus pulls from the element's first child to the rest and back, like racking focus between subjects.\",\n defaults: { duration: 1800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const kids = Array.from(el.children) as HTMLElement[];\n if (kids.length < 2) return ctx.animate(el, [{ filter: 'blur(0)' }, { filter: 'blur(4px)', offset: 0.5 }, { filter: 'blur(0)' }], { duration: o.duration })?.finished.catch(() => undefined);\n const [first, ...rest] = kids;\n const runs = [ctx.animate(first, [{ filter: 'blur(0)' }, { filter: 'blur(5px)', offset: 0.35 }, { filter: 'blur(5px)', offset: 0.65 }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }), ...rest.map((k) => ctx.animate(k, [{ filter: 'blur(5px)' }, { filter: 'blur(0)', offset: 0.35 }, { filter: 'blur(0)', offset: 0.65 }, { filter: 'blur(5px)' }, { filter: 'blur(0)' }], { duration: o.duration, easing: 'ease-in-out' }))];\n return Promise.all(runs.map((r) => r?.finished.catch(() => undefined))).then(() => undefined);\n },\n },\n];\n\n/** Register dolly-in, pan-reveal, letterbox and rack-focus (9.1). */\nexport function registerCinemaPack(): void {\n registerEffects(CINEMA_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-cyber.cjs","sources":["../../src/components/fx2/cyber.ts"],"sourcesContent":["/**\n * 8.4 — Cyber / sci-fi pack (`motionary/fx/cyber`, also `motionary/components/fx-cyber`):\n *\n * - `hud-frame` (enter) — corner brackets draw in around the element and a\n * scan bar sweeps across it, like a HUD locking on (`color`).\n * - `scanline-sweep` (attention) — a bright horizontal scanline runs down\n * the element (`color`, `passes`).\n * - `hologram` (loop) — a flickering, translucent cyan hologram look with\n * drifting scan bands; the cleanup restores the element (`color`).\n * - `data-decode` (enter) — the text resolves from random glyphs to the real\n * characters, left to right (`speed`).\n *\n * Reduced motion: hud-frame / data-decode just show, scanline-sweep does\n * nothing, hologram is skipped. Overlays are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst GLYPHS = '01<>/\\\\[]{}#$%&*+=ABCDEFXYZ';\n/** The `k`-th frame of decoding `text` over `n` frames: resolved prefix + random glyphs (8.4). */\nexport function decodeFrame(text: string, k: number, n: number, rnd: () => number = Math.random): string {\n const done = Math.floor((Math.min(n, Math.max(0, k)) / n) * text.length);\n let out = text.slice(0, done);\n for (let i = done; i < text.length; i++) out += /\\s/.test(text[i]) ? text[i] : GLYPHS[Math.floor(rnd() * GLYPHS.length)];\n return out;\n}\n\nconst overlay = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n Object.assign(o.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'hidden', borderRadius: 'inherit' });\n el.appendChild(o);\n ctx.onCleanup(() => o.remove());\n return o;\n};\nconst bar = (o: HTMLElement, color: string, h = '2px') => {\n const b = document.createElement('span');\n Object.assign(b.style, { position: 'absolute', left: '0', right: '0', top: '0', height: h, background: color, boxShadow: `0 0 10px 2px ${color}` });\n o.appendChild(b);\n return b;\n};\n\nexport const CYBER_FX: EffectDefinition[] = [\n {\n name: 'hud-frame',\n kind: 'enter',\n description: 'Corner brackets draw in around the element and a scan bar sweeps across it, like a HUD locking on (`color`).',\n defaults: { color: '#22d3ee', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n ov.style.overflow = 'visible';\n const runs: (Promise<unknown> | undefined)[] = [];\n ['0 0', '100% 0', '0 100%', '100% 100%'].forEach((pos, i) => {\n const c = document.createElement('span');\n const [x, y] = pos.split(' ');\n Object.assign(c.style, { position: 'absolute', width: '14px', height: '14px', left: x === '0' ? '-4px' : 'calc(100% - 10px)', top: y === '0' ? '-4px' : 'calc(100% - 10px)', borderColor: o.color, borderStyle: 'solid', borderWidth: `${y === '0' ? 2 : 0}px ${x !== '0' ? 2 : 0}px ${y !== '0' ? 2 : 0}px ${x === '0' ? 2 : 0}px` });\n ov.appendChild(c);\n const dx = x === '0' ? -14 : 14;\n const dy = y === '0' ? -14 : 14;\n runs.push(ctx.animate(c, [{ transform: `translate(${dx}px,${dy}px)`, opacity: 0 }, { transform: 'none', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1, offset: 0.85 }, { transform: 'none', opacity: 0 }], { duration: o.duration + 500, delay: i * 60, easing: 'ease-out', fill: 'backwards' })?.finished.catch(() => undefined));\n });\n const b = bar(ov, o.color);\n runs.push(ctx.animate(b, [{ transform: 'translateY(0)', opacity: 0 }, { opacity: 1, offset: 0.1 }, { transform: `translateY(${el.clientHeight || 80}px)`, opacity: 0 }], { duration: o.duration, delay: 250, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined));\n runs.push(ctx.animate(el, [{ opacity: 0, filter: 'brightness(2) saturate(0)' }, { opacity: 1, filter: 'none' }], { duration: o.duration, easing: 'steps(6, end)', fill: 'backwards' })?.finished.catch(() => undefined));\n return Promise.all(runs).then(() => ov.remove());\n },\n },\n {\n name: 'scanline-sweep',\n kind: 'attention',\n description: 'A bright horizontal scanline runs down the element (`color`, `passes`).',\n defaults: { color: 'rgba(34,211,238,.9)', passes: 1, duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n const b = bar(ov, o.color, '3px');\n const a = ctx.animate(b, [{ transform: 'translateY(-4px)' }, { transform: `translateY(${(el.clientHeight || 80) + 4}px)` }], { duration: o.duration, iterations: Math.max(1, Math.min(5, Number(o.passes) || 1)), easing: 'linear' });\n const end = () => ov.remove();\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'hologram',\n kind: 'loop',\n description: 'A flickering, translucent hologram look with drifting scan bands until the cleanup runs (`color`).',\n defaults: { color: '#22d3ee', duration: 2400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const ov = overlay(el, ctx);\n ov.style.background = `repeating-linear-gradient(0deg, transparent 0 3px, ${o.color}33 3px 4px)`;\n ov.style.mixBlendMode = 'screen';\n const prev = el.style.filter;\n el.style.filter = `drop-shadow(0 0 6px ${o.color}) saturate(1.4)`;\n const a = ctx.animate(el, [{ opacity: 0.85 }, { opacity: 0.6, offset: 0.08 }, { opacity: 0.9, offset: 0.12 }, { opacity: 0.8, offset: 0.5 }, { opacity: 0.55, offset: 0.52 }, { opacity: 0.85 }], { duration: o.duration, iterations: Infinity });\n const b = ctx.animate(ov, [{ backgroundPosition: '0 0' }, { backgroundPosition: '0 40px' }], { duration: 1600, iterations: Infinity, easing: 'linear' });\n return () => {\n a?.cancel();\n b?.cancel();\n ov.remove();\n el.style.filter = prev;\n };\n },\n },\n {\n name: 'data-decode',\n kind: 'enter',\n description: 'The text resolves from random glyphs to the real characters, left to right (`speed` ms per frame).',\n defaults: { speed: 40, frames: 16 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const text = el.textContent || '';\n if (!text.trim() || el.children.length) return;\n const n = Math.max(4, Math.min(60, Number(o.frames) || 16));\n el.setAttribute('aria-label', text);\n let k = 0;\n let timer = 0 as unknown as ReturnType<typeof setTimeout>;\n const restore = () => {\n clearTimeout(timer);\n el.textContent = text;\n el.removeAttribute('aria-label');\n };\n ctx.onCleanup(restore);\n return new Promise<void>((resolve) => {\n const step = () => {\n if (k > n) {\n restore();\n return resolve();\n }\n el.textContent = decodeFrame(text, k++, n);\n timer = setTimeout(step, Math.max(10, Number(o.speed) || 40));\n };\n step();\n });\n },\n },\n];\n\n/** Register hud-frame, scanline-sweep, hologram and data-decode (8.4). */\nexport function registerCyberPack(): void {\n registerEffects(CYBER_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-cyber.cjs","sources":["../../src/components/fx2/cyber.ts"],"sourcesContent":["/**\n * 8.4 — Cyber / sci-fi pack (`motionary/fx/cyber`, also `motionary/components/fx-cyber`):\n *\n * - `hud-frame` (enter) — corner brackets draw in around the element and a\n * scan bar sweeps across it, like a HUD locking on (`color`).\n * - `scanline-sweep` (attention) — a bright horizontal scanline runs down\n * the element (`color`, `passes`).\n * - `hologram` (loop) — a flickering, translucent cyan hologram look with\n * drifting scan bands; the cleanup restores the element (`color`).\n * - `data-decode` (enter) — the text resolves from random glyphs to the real\n * characters, left to right (`speed`).\n *\n * Reduced motion: hud-frame / data-decode just show, scanline-sweep does\n * nothing, hologram is skipped. Overlays are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst GLYPHS = '01<>/\\\\[]{}#$%&*+=ABCDEFXYZ';\n/** The `k`-th frame of decoding `text` over `n` frames: resolved prefix + random glyphs (8.4). */\nexport function decodeFrame(text: string, k: number, n: number, rnd: () => number = Math.random): string {\n const done = Math.floor((Math.min(n, Math.max(0, k)) / n) * text.length);\n let out = text.slice(0, done);\n for (let i = done; i < text.length; i++) out += /\\s/.test(text[i]) ? text[i] : GLYPHS[Math.floor(rnd() * GLYPHS.length)];\n return out;\n}\n\nconst overlay = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n Object.assign(o.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'hidden', borderRadius: 'inherit' });\n el.appendChild(o);\n ctx.onCleanup(() => o.remove());\n return o;\n};\nconst bar = (o: HTMLElement, color: string, h = '2px') => {\n const b = document.createElement('span');\n Object.assign(b.style, { position: 'absolute', left: '0', right: '0', top: '0', height: h, background: color, boxShadow: `0 0 10px 2px ${color}` });\n o.appendChild(b);\n return b;\n};\n\nexport const CYBER_FX: EffectDefinition[] = [\n {\n name: 'hud-frame',\n kind: 'enter',\n description: 'Corner brackets draw in around the element and a scan bar sweeps across it, like a HUD locking on (`color`).',\n defaults: { color: '#22d3ee', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n ov.style.overflow = 'visible';\n const runs: (Promise<unknown> | undefined)[] = [];\n ['0 0', '100% 0', '0 100%', '100% 100%'].forEach((pos, i) => {\n const c = document.createElement('span');\n const [x, y] = pos.split(' ');\n Object.assign(c.style, { position: 'absolute', width: '14px', height: '14px', left: x === '0' ? '-4px' : 'calc(100% - 10px)', top: y === '0' ? '-4px' : 'calc(100% - 10px)', borderColor: o.color, borderStyle: 'solid', borderWidth: `${y === '0' ? 2 : 0}px ${x !== '0' ? 2 : 0}px ${y !== '0' ? 2 : 0}px ${x === '0' ? 2 : 0}px` });\n ov.appendChild(c);\n const dx = x === '0' ? -14 : 14;\n const dy = y === '0' ? -14 : 14;\n runs.push(ctx.animate(c, [{ transform: `translate(${dx}px,${dy}px)`, opacity: 0 }, { transform: 'none', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1, offset: 0.85 }, { transform: 'none', opacity: 0 }], { duration: o.duration + 500, delay: i * 60, easing: 'ease-out', fill: 'backwards' })?.finished.catch(() => undefined));\n });\n const b = bar(ov, o.color);\n runs.push(ctx.animate(b, [{ transform: 'translateY(0)', opacity: 0 }, { opacity: 1, offset: 0.1 }, { transform: `translateY(${el.clientHeight || 80}px)`, opacity: 0 }], { duration: o.duration, delay: 250, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined));\n runs.push(ctx.animate(el, [{ opacity: 0, filter: 'brightness(2) saturate(0)' }, { opacity: 1, filter: 'none' }], { duration: o.duration, easing: 'steps(6, end)', fill: 'backwards' })?.finished.catch(() => undefined));\n return Promise.all(runs).then(() => ov.remove());\n },\n },\n {\n name: 'scanline-sweep',\n kind: 'attention',\n description: 'A bright horizontal scanline runs down the element (`color`, `passes`).',\n defaults: { color: 'rgba(34,211,238,.9)', passes: 1, duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n const b = bar(ov, o.color, '3px');\n const a = ctx.animate(b, [{ transform: 'translateY(-4px)' }, { transform: `translateY(${(el.clientHeight || 80) + 4}px)` }], { duration: o.duration, iterations: Math.max(1, Math.min(5, Number(o.passes) || 1)), easing: 'linear' });\n const end = () => ov.remove();\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'hologram',\n kind: 'loop',\n description: 'A flickering, translucent hologram look with drifting scan bands until the cleanup runs (`color`).',\n defaults: { color: '#22d3ee', duration: 2400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const ov = overlay(el, ctx);\n ov.style.background = `repeating-linear-gradient(0deg, transparent 0 3px, ${o.color}33 3px 4px)`;\n ov.style.mixBlendMode = 'screen';\n const prev = el.style.filter;\n el.style.filter = `drop-shadow(0 0 6px ${o.color}) saturate(1.4)`;\n const a = ctx.animate(el, [{ opacity: 0.85 }, { opacity: 0.6, offset: 0.08 }, { opacity: 0.9, offset: 0.12 }, { opacity: 0.8, offset: 0.5 }, { opacity: 0.55, offset: 0.52 }, { opacity: 0.85 }], { duration: o.duration, iterations: Infinity });\n const b = ctx.animate(ov, [{ backgroundPosition: '0 0' }, { backgroundPosition: '0 40px' }], { duration: 1600, iterations: Infinity, easing: 'linear' });\n return () => {\n a?.cancel();\n b?.cancel();\n ov.remove();\n el.style.filter = prev;\n };\n },\n },\n {\n name: 'data-decode',\n kind: 'enter',\n description: 'The text resolves from random glyphs to the real characters, left to right (`speed` ms per frame).',\n defaults: { speed: 40, frames: 16 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const text = el.textContent || '';\n if (!text.trim() || el.children.length) return;\n const n = Math.max(4, Math.min(60, Number(o.frames) || 16));\n el.setAttribute('aria-label', text);\n let k = 0;\n let timer = 0 as unknown as ReturnType<typeof setTimeout>;\n const restore = () => {\n clearTimeout(timer);\n el.textContent = text;\n el.removeAttribute('aria-label');\n };\n ctx.onCleanup(restore);\n return new Promise<void>((resolve) => {\n const step = () => {\n if (k > n) {\n restore();\n return resolve();\n }\n el.textContent = decodeFrame(text, k++, n);\n timer = setTimeout(step, Math.max(10, Number(o.speed) || 40));\n };\n step();\n });\n },\n },\n];\n\n/** Register hud-frame, scanline-sweep, hologram and data-decode (8.4). */\nexport function registerCyberPack(): void {\n registerEffects(CYBER_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { registerEffects } from '../chunks/registry-
|
|
2
|
-
import '../chunks/base-
|
|
1
|
+
import { registerEffects } from '../chunks/registry-BKzyg1JV.js';
|
|
2
|
+
import '../chunks/base-BTev8qxg.js';
|
|
3
3
|
|
|
4
4
|
const GLYPHS = '01<>/\\[]{}#$%&*+=ABCDEFXYZ';
|
|
5
5
|
/** The `k`-th frame of decoding `text` over `n` frames: resolved prefix + random glyphs (8.4). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-cyber.js","sources":["../../src/components/fx2/cyber.ts"],"sourcesContent":["/**\n * 8.4 — Cyber / sci-fi pack (`motionary/fx/cyber`, also `motionary/components/fx-cyber`):\n *\n * - `hud-frame` (enter) — corner brackets draw in around the element and a\n * scan bar sweeps across it, like a HUD locking on (`color`).\n * - `scanline-sweep` (attention) — a bright horizontal scanline runs down\n * the element (`color`, `passes`).\n * - `hologram` (loop) — a flickering, translucent cyan hologram look with\n * drifting scan bands; the cleanup restores the element (`color`).\n * - `data-decode` (enter) — the text resolves from random glyphs to the real\n * characters, left to right (`speed`).\n *\n * Reduced motion: hud-frame / data-decode just show, scanline-sweep does\n * nothing, hologram is skipped. Overlays are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst GLYPHS = '01<>/\\\\[]{}#$%&*+=ABCDEFXYZ';\n/** The `k`-th frame of decoding `text` over `n` frames: resolved prefix + random glyphs (8.4). */\nexport function decodeFrame(text: string, k: number, n: number, rnd: () => number = Math.random): string {\n const done = Math.floor((Math.min(n, Math.max(0, k)) / n) * text.length);\n let out = text.slice(0, done);\n for (let i = done; i < text.length; i++) out += /\\s/.test(text[i]) ? text[i] : GLYPHS[Math.floor(rnd() * GLYPHS.length)];\n return out;\n}\n\nconst overlay = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n Object.assign(o.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'hidden', borderRadius: 'inherit' });\n el.appendChild(o);\n ctx.onCleanup(() => o.remove());\n return o;\n};\nconst bar = (o: HTMLElement, color: string, h = '2px') => {\n const b = document.createElement('span');\n Object.assign(b.style, { position: 'absolute', left: '0', right: '0', top: '0', height: h, background: color, boxShadow: `0 0 10px 2px ${color}` });\n o.appendChild(b);\n return b;\n};\n\nexport const CYBER_FX: EffectDefinition[] = [\n {\n name: 'hud-frame',\n kind: 'enter',\n description: 'Corner brackets draw in around the element and a scan bar sweeps across it, like a HUD locking on (`color`).',\n defaults: { color: '#22d3ee', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n ov.style.overflow = 'visible';\n const runs: (Promise<unknown> | undefined)[] = [];\n ['0 0', '100% 0', '0 100%', '100% 100%'].forEach((pos, i) => {\n const c = document.createElement('span');\n const [x, y] = pos.split(' ');\n Object.assign(c.style, { position: 'absolute', width: '14px', height: '14px', left: x === '0' ? '-4px' : 'calc(100% - 10px)', top: y === '0' ? '-4px' : 'calc(100% - 10px)', borderColor: o.color, borderStyle: 'solid', borderWidth: `${y === '0' ? 2 : 0}px ${x !== '0' ? 2 : 0}px ${y !== '0' ? 2 : 0}px ${x === '0' ? 2 : 0}px` });\n ov.appendChild(c);\n const dx = x === '0' ? -14 : 14;\n const dy = y === '0' ? -14 : 14;\n runs.push(ctx.animate(c, [{ transform: `translate(${dx}px,${dy}px)`, opacity: 0 }, { transform: 'none', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1, offset: 0.85 }, { transform: 'none', opacity: 0 }], { duration: o.duration + 500, delay: i * 60, easing: 'ease-out', fill: 'backwards' })?.finished.catch(() => undefined));\n });\n const b = bar(ov, o.color);\n runs.push(ctx.animate(b, [{ transform: 'translateY(0)', opacity: 0 }, { opacity: 1, offset: 0.1 }, { transform: `translateY(${el.clientHeight || 80}px)`, opacity: 0 }], { duration: o.duration, delay: 250, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined));\n runs.push(ctx.animate(el, [{ opacity: 0, filter: 'brightness(2) saturate(0)' }, { opacity: 1, filter: 'none' }], { duration: o.duration, easing: 'steps(6, end)', fill: 'backwards' })?.finished.catch(() => undefined));\n return Promise.all(runs).then(() => ov.remove());\n },\n },\n {\n name: 'scanline-sweep',\n kind: 'attention',\n description: 'A bright horizontal scanline runs down the element (`color`, `passes`).',\n defaults: { color: 'rgba(34,211,238,.9)', passes: 1, duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n const b = bar(ov, o.color, '3px');\n const a = ctx.animate(b, [{ transform: 'translateY(-4px)' }, { transform: `translateY(${(el.clientHeight || 80) + 4}px)` }], { duration: o.duration, iterations: Math.max(1, Math.min(5, Number(o.passes) || 1)), easing: 'linear' });\n const end = () => ov.remove();\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'hologram',\n kind: 'loop',\n description: 'A flickering, translucent hologram look with drifting scan bands until the cleanup runs (`color`).',\n defaults: { color: '#22d3ee', duration: 2400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const ov = overlay(el, ctx);\n ov.style.background = `repeating-linear-gradient(0deg, transparent 0 3px, ${o.color}33 3px 4px)`;\n ov.style.mixBlendMode = 'screen';\n const prev = el.style.filter;\n el.style.filter = `drop-shadow(0 0 6px ${o.color}) saturate(1.4)`;\n const a = ctx.animate(el, [{ opacity: 0.85 }, { opacity: 0.6, offset: 0.08 }, { opacity: 0.9, offset: 0.12 }, { opacity: 0.8, offset: 0.5 }, { opacity: 0.55, offset: 0.52 }, { opacity: 0.85 }], { duration: o.duration, iterations: Infinity });\n const b = ctx.animate(ov, [{ backgroundPosition: '0 0' }, { backgroundPosition: '0 40px' }], { duration: 1600, iterations: Infinity, easing: 'linear' });\n return () => {\n a?.cancel();\n b?.cancel();\n ov.remove();\n el.style.filter = prev;\n };\n },\n },\n {\n name: 'data-decode',\n kind: 'enter',\n description: 'The text resolves from random glyphs to the real characters, left to right (`speed` ms per frame).',\n defaults: { speed: 40, frames: 16 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const text = el.textContent || '';\n if (!text.trim() || el.children.length) return;\n const n = Math.max(4, Math.min(60, Number(o.frames) || 16));\n el.setAttribute('aria-label', text);\n let k = 0;\n let timer = 0 as unknown as ReturnType<typeof setTimeout>;\n const restore = () => {\n clearTimeout(timer);\n el.textContent = text;\n el.removeAttribute('aria-label');\n };\n ctx.onCleanup(restore);\n return new Promise<void>((resolve) => {\n const step = () => {\n if (k > n) {\n restore();\n return resolve();\n }\n el.textContent = decodeFrame(text, k++, n);\n timer = setTimeout(step, Math.max(10, Number(o.speed) || 40));\n };\n step();\n });\n },\n },\n];\n\n/** Register hud-frame, scanline-sweep, hologram and data-decode (8.4). */\nexport function registerCyberPack(): void {\n registerEffects(CYBER_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-cyber.js","sources":["../../src/components/fx2/cyber.ts"],"sourcesContent":["/**\n * 8.4 — Cyber / sci-fi pack (`motionary/fx/cyber`, also `motionary/components/fx-cyber`):\n *\n * - `hud-frame` (enter) — corner brackets draw in around the element and a\n * scan bar sweeps across it, like a HUD locking on (`color`).\n * - `scanline-sweep` (attention) — a bright horizontal scanline runs down\n * the element (`color`, `passes`).\n * - `hologram` (loop) — a flickering, translucent cyan hologram look with\n * drifting scan bands; the cleanup restores the element (`color`).\n * - `data-decode` (enter) — the text resolves from random glyphs to the real\n * characters, left to right (`speed`).\n *\n * Reduced motion: hud-frame / data-decode just show, scanline-sweep does\n * nothing, hologram is skipped. Overlays are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst GLYPHS = '01<>/\\\\[]{}#$%&*+=ABCDEFXYZ';\n/** The `k`-th frame of decoding `text` over `n` frames: resolved prefix + random glyphs (8.4). */\nexport function decodeFrame(text: string, k: number, n: number, rnd: () => number = Math.random): string {\n const done = Math.floor((Math.min(n, Math.max(0, k)) / n) * text.length);\n let out = text.slice(0, done);\n for (let i = done; i < text.length; i++) out += /\\s/.test(text[i]) ? text[i] : GLYPHS[Math.floor(rnd() * GLYPHS.length)];\n return out;\n}\n\nconst overlay = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n Object.assign(o.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'hidden', borderRadius: 'inherit' });\n el.appendChild(o);\n ctx.onCleanup(() => o.remove());\n return o;\n};\nconst bar = (o: HTMLElement, color: string, h = '2px') => {\n const b = document.createElement('span');\n Object.assign(b.style, { position: 'absolute', left: '0', right: '0', top: '0', height: h, background: color, boxShadow: `0 0 10px 2px ${color}` });\n o.appendChild(b);\n return b;\n};\n\nexport const CYBER_FX: EffectDefinition[] = [\n {\n name: 'hud-frame',\n kind: 'enter',\n description: 'Corner brackets draw in around the element and a scan bar sweeps across it, like a HUD locking on (`color`).',\n defaults: { color: '#22d3ee', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n ov.style.overflow = 'visible';\n const runs: (Promise<unknown> | undefined)[] = [];\n ['0 0', '100% 0', '0 100%', '100% 100%'].forEach((pos, i) => {\n const c = document.createElement('span');\n const [x, y] = pos.split(' ');\n Object.assign(c.style, { position: 'absolute', width: '14px', height: '14px', left: x === '0' ? '-4px' : 'calc(100% - 10px)', top: y === '0' ? '-4px' : 'calc(100% - 10px)', borderColor: o.color, borderStyle: 'solid', borderWidth: `${y === '0' ? 2 : 0}px ${x !== '0' ? 2 : 0}px ${y !== '0' ? 2 : 0}px ${x === '0' ? 2 : 0}px` });\n ov.appendChild(c);\n const dx = x === '0' ? -14 : 14;\n const dy = y === '0' ? -14 : 14;\n runs.push(ctx.animate(c, [{ transform: `translate(${dx}px,${dy}px)`, opacity: 0 }, { transform: 'none', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1, offset: 0.85 }, { transform: 'none', opacity: 0 }], { duration: o.duration + 500, delay: i * 60, easing: 'ease-out', fill: 'backwards' })?.finished.catch(() => undefined));\n });\n const b = bar(ov, o.color);\n runs.push(ctx.animate(b, [{ transform: 'translateY(0)', opacity: 0 }, { opacity: 1, offset: 0.1 }, { transform: `translateY(${el.clientHeight || 80}px)`, opacity: 0 }], { duration: o.duration, delay: 250, easing: 'ease-in-out', fill: 'backwards' })?.finished.catch(() => undefined));\n runs.push(ctx.animate(el, [{ opacity: 0, filter: 'brightness(2) saturate(0)' }, { opacity: 1, filter: 'none' }], { duration: o.duration, easing: 'steps(6, end)', fill: 'backwards' })?.finished.catch(() => undefined));\n return Promise.all(runs).then(() => ov.remove());\n },\n },\n {\n name: 'scanline-sweep',\n kind: 'attention',\n description: 'A bright horizontal scanline runs down the element (`color`, `passes`).',\n defaults: { color: 'rgba(34,211,238,.9)', passes: 1, duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const ov = overlay(el, ctx);\n const b = bar(ov, o.color, '3px');\n const a = ctx.animate(b, [{ transform: 'translateY(-4px)' }, { transform: `translateY(${(el.clientHeight || 80) + 4}px)` }], { duration: o.duration, iterations: Math.max(1, Math.min(5, Number(o.passes) || 1)), easing: 'linear' });\n const end = () => ov.remove();\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'hologram',\n kind: 'loop',\n description: 'A flickering, translucent hologram look with drifting scan bands until the cleanup runs (`color`).',\n defaults: { color: '#22d3ee', duration: 2400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const ov = overlay(el, ctx);\n ov.style.background = `repeating-linear-gradient(0deg, transparent 0 3px, ${o.color}33 3px 4px)`;\n ov.style.mixBlendMode = 'screen';\n const prev = el.style.filter;\n el.style.filter = `drop-shadow(0 0 6px ${o.color}) saturate(1.4)`;\n const a = ctx.animate(el, [{ opacity: 0.85 }, { opacity: 0.6, offset: 0.08 }, { opacity: 0.9, offset: 0.12 }, { opacity: 0.8, offset: 0.5 }, { opacity: 0.55, offset: 0.52 }, { opacity: 0.85 }], { duration: o.duration, iterations: Infinity });\n const b = ctx.animate(ov, [{ backgroundPosition: '0 0' }, { backgroundPosition: '0 40px' }], { duration: 1600, iterations: Infinity, easing: 'linear' });\n return () => {\n a?.cancel();\n b?.cancel();\n ov.remove();\n el.style.filter = prev;\n };\n },\n },\n {\n name: 'data-decode',\n kind: 'enter',\n description: 'The text resolves from random glyphs to the real characters, left to right (`speed` ms per frame).',\n defaults: { speed: 40, frames: 16 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const text = el.textContent || '';\n if (!text.trim() || el.children.length) return;\n const n = Math.max(4, Math.min(60, Number(o.frames) || 16));\n el.setAttribute('aria-label', text);\n let k = 0;\n let timer = 0 as unknown as ReturnType<typeof setTimeout>;\n const restore = () => {\n clearTimeout(timer);\n el.textContent = text;\n el.removeAttribute('aria-label');\n };\n ctx.onCleanup(restore);\n return new Promise<void>((resolve) => {\n const step = () => {\n if (k > n) {\n restore();\n return resolve();\n }\n el.textContent = decodeFrame(text, k++, n);\n timer = setTimeout(step, Math.max(10, Number(o.speed) || 40));\n };\n step();\n });\n },\n },\n];\n\n/** Register hud-frame, scanline-sweep, hologram and data-decode (8.4). */\nexport function registerCyberPack(): void {\n registerEffects(CYBER_FX);\n}\n"],"names":[],"mappings":";;;AAkBA,MAAM,MAAM,GAAG,6BAA6B;AAC5C;AACM,SAAU,WAAW,CAAC,IAAY,EAAE,CAAS,EAAE,CAAS,EAAE,GAAA,GAAoB,IAAI,CAAC,MAAM,EAAA;AAC7F,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;IACxE,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAC7B,IAAA,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,QAAA,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxH,IAAA,OAAO,GAAG;AACZ;AAEA,MAAM,OAAO,GAAG,CAAC,EAAe,EAAE,GAAkB,KAAI;IACtD,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC9C,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ;AAC9B,QAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC9B,QAAA,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACjD;IACA,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,IAAA,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AACrC,IAAA,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAChI,IAAA,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;AAC/B,IAAA,OAAO,CAAC;AACV,CAAC;AACD,MAAM,GAAG,GAAG,CAAC,CAAc,EAAE,KAAa,EAAE,CAAC,GAAG,KAAK,KAAI;IACvD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,IAAA,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAE,EAAE,CAAC;AACnJ,IAAA,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAChB,IAAA,OAAO,CAAC;AACV,CAAC;AAEM,MAAM,QAAQ,GAAuB;AAC1C,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,8GAA8G;QAC3H,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC7C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,GAAG,CAAC,OAAO;gBAAE;YACjB,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;AAC3B,YAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS;YAC7B,MAAM,IAAI,GAAqC,EAAE;AACjD,YAAA,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;gBAC1D,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,gBAAA,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,GAAG,MAAM,GAAG,mBAAmB,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,MAAM,GAAG,mBAAmB,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA,EAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI,EAAE,CAAC;AACtU,gBAAA,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AACjB,gBAAA,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE;AAC/B,gBAAA,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE;gBAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,GAAA,CAAK,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACjV,YAAA,CAAC,CAAC;YACF,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,YAAY,IAAI,EAAE,CAAA,GAAA,CAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YAC1R,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,2BAA2B,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACxN,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QAClD,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,gBAAgB;AACtB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,yEAAyE;AACtF,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACpE,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,GAAG,CAAC,OAAO;gBAAE;YACjB,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;AAC3B,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;AACjC,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,EAAE,CAAA,WAAA,EAAc,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,IAAI,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrO,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,SAAS,CAAC;QAC3D,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,oGAAoG;QACjH,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC9C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;YAC3B,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,sDAAsD,CAAC,CAAC,KAAK,CAAA,WAAA,CAAa;AAChG,YAAA,EAAE,CAAC,KAAK,CAAC,YAAY,GAAG,QAAQ;AAChC,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM;YAC5B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,uBAAuB,CAAC,CAAC,KAAK,CAAA,eAAA,CAAiB;AACjE,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AACjP,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxJ,YAAA,OAAO,MAAK;gBACV,CAAC,EAAE,MAAM,EAAE;gBACX,CAAC,EAAE,MAAM,EAAE;gBACX,EAAE,CAAC,MAAM,EAAE;AACX,gBAAA,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;AACxB,YAAA,CAAC;QACH,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,oGAAoG;QACjH,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnC,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,GAAG,CAAC,OAAO;gBAAE;AACjB,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,IAAI,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM;gBAAE;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3D,YAAA,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC;YACT,IAAI,KAAK,GAAG,CAA6C;YACzD,MAAM,OAAO,GAAG,MAAK;gBACnB,YAAY,CAAC,KAAK,CAAC;AACnB,gBAAA,EAAE,CAAC,WAAW,GAAG,IAAI;AACrB,gBAAA,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC;AAClC,YAAA,CAAC;AACD,YAAA,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;AACtB,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;gBACnC,MAAM,IAAI,GAAG,MAAK;AAChB,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE;AACT,wBAAA,OAAO,EAAE;wBACT,OAAO,OAAO,EAAE;oBAClB;AACA,oBAAA,EAAE,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1C,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/D,gBAAA,CAAC;AACD,gBAAA,IAAI,EAAE;AACR,YAAA,CAAC,CAAC;QACJ,CAAC;AACF,KAAA;;AAGH;SACgB,iBAAiB,GAAA;IAC/B,eAAe,CAAC,QAAQ,CAAC;AAC3B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-festival.cjs","sources":["../../src/components/fx2/festival.ts"],"sourcesContent":["/**\n * 8.1 — Festival packs (`motionary/fx/festival`, also `motionary/components/fx-festival`):\n *\n * - `firework-burst` (attention) — rockets of sparks burst out of the element\n * in festive colours (`bursts`, `colors`).\n * - `lantern-rise` (enter) — the element floats up and sways in like a\n * Lunar New Year lantern (`sway`).\n * - `xmas-snow` (loop) — snowflakes drift down over the element; the cleanup\n * stops them (`flakes`).\n * - `spooky-float` (attention) — the element wobbles and fades like a\n * Halloween ghost (`cycles`).\n *\n * Reduced motion: firework-burst / spooky-float do nothing, xmas-snow is\n * skipped, lantern-rise fades in. Particles are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Evenly spread spark directions with a little jitter (8.1). */\nexport function sparkVectors(n: number, radius: number, seed = 1): { x: number; y: number }[] {\n let s = seed;\n const rnd = () => ((s = (s * 9301 + 49297) % 233280) / 233280);\n return Array.from({ length: n }, (_, i) => {\n const a = (i / n) * Math.PI * 2 + (rnd() - 0.5) * 0.3;\n const r = radius * (0.7 + rnd() * 0.3);\n return { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r) };\n });\n}\n\nconst layer = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const l = document.createElement('span');\n l.setAttribute('aria-hidden', 'true');\n Object.assign(l.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible' });\n el.appendChild(l);\n ctx.onCleanup(() => l.remove());\n return l;\n};\nconst dot = (parent: HTMLElement, css: Partial<CSSStyleDeclaration>, text = '') => {\n const d = document.createElement('span');\n d.textContent = text;\n Object.assign(d.style, { position: 'absolute', left: '50%', top: '50%', ...css });\n parent.appendChild(d);\n return d;\n};\n\nexport const FESTIVAL_FX: EffectDefinition[] = [\n {\n name: 'firework-burst',\n kind: 'attention',\n description: 'Rockets of sparks burst out of the element in festive colours (`bursts`, `colors`).',\n defaults: { bursts: 3, colors: '#f43f5e,#f59e0b,#22d3ee,#a855f7,#facc15', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const l = layer(el, ctx);\n const colors = String(o.colors).split(',');\n const r = el.getBoundingClientRect();\n const runs: Promise<unknown>[] = [];\n const n = Math.max(1, Math.min(6, Number(o.bursts) || 3));\n for (let b = 0; b < n; b++) {\n const cx = (b - (n - 1) / 2) * Math.min(60, (r.width || 120) / n);\n const cy = -((r.height || 60) * 0.25) - (b % 2) * 18;\n const col = colors[b % colors.length];\n sparkVectors(14, 46 + b * 6, b + 3).forEach((v) => {\n const s = dot(l, { width: '5px', height: '5px', marginLeft: '-2.5px', marginTop: '-2.5px', borderRadius: '50%', background: col, boxShadow: `0 0 6px ${col}` });\n const a = ctx.animate(s, [{ transform: `translate(${cx}px,${cy + 40}px) scale(.4)`, opacity: 0 }, { transform: `translate(${cx}px,${cy}px) scale(1)`, opacity: 1, offset: 0.25 }, { transform: `translate(${cx + v.x}px,${cy + v.y + 18}px) scale(.3)`, opacity: 0 }], { duration: o.duration, delay: b * 220, easing: 'cubic-bezier(.2,.7,.3,1)', fill: 'backwards' });\n runs.push(a ? a.finished.then(() => s.remove(), () => s.remove()) : Promise.resolve(s.remove()));\n });\n }\n return Promise.all(runs).then(() => l.remove());\n },\n },\n {\n name: 'lantern-rise',\n kind: 'enter',\n description: 'The element floats up and sways in like a Lunar New Year lantern (`sway` degrees).',\n defaults: { sway: 8, duration: 1400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const w = Number(o.sway) || 8;\n return ctx\n .animate(el, [{ transform: `translateY(60px) rotate(${-w}deg)`, opacity: 0, transformOrigin: '50% 0' }, { transform: `translateY(-6px) rotate(${w * 0.6}deg)`, opacity: 1, offset: 0.55, transformOrigin: '50% 0' }, { transform: `translateY(0) rotate(${-w * 0.3}deg)`, offset: 0.8, transformOrigin: '50% 0' }, { transform: 'none', opacity: 1, transformOrigin: '50% 0' }], { duration: o.duration, easing: 'ease-out', fill: 'backwards' })\n ?.finished.catch(() => undefined);\n },\n },\n {\n name: 'xmas-snow',\n kind: 'loop',\n description: 'Snowflakes drift down over the element until the cleanup runs (`flakes`).',\n defaults: { flakes: 18, duration: 4000 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const l = layer(el, ctx);\n l.style.overflow = 'hidden';\n const n = Math.max(4, Math.min(60, Number(o.flakes) || 18));\n const anims = Array.from({ length: n }, (_, i) => {\n const x = (i * 37) % 100;\n const size = 8 + ((i * 7) % 9);\n const f = dot(l, { left: `${x}%`, top: '-14px', fontSize: `${size}px`, color: '#fff', textShadow: '0 0 3px rgba(148,163,184,.9)', lineHeight: '1' }, '❄');\n const drift = ((i % 5) - 2) * 12;\n return ctx.animate(f, [{ transform: 'translate(0,0) rotate(0)' }, { transform: `translate(${drift}px, calc(${el.clientHeight || 160}px + 20px)) rotate(180deg)` }], { duration: o.duration * (0.7 + ((i * 13) % 6) / 10), delay: -((i * 331) % o.duration), iterations: Infinity, easing: 'linear' });\n });\n return () => {\n anims.forEach((a) => a?.cancel());\n l.remove();\n };\n },\n },\n {\n name: 'spooky-float',\n kind: 'attention',\n description: 'The element wobbles, rises and flickers like a Halloween ghost (`cycles`).',\n defaults: { cycles: 2, duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n return ctx\n .animate(el, [{ transform: 'none', opacity: 1 }, { transform: 'translate(-4px,-10px) rotate(-4deg) skewX(3deg)', opacity: 0.55, offset: 0.3 }, { transform: 'translate(4px,-14px) rotate(4deg) skewX(-3deg)', opacity: 0.85, offset: 0.65 }, { transform: 'none', opacity: 1 }], { duration: o.duration, iterations: Math.max(1, Math.min(6, Number(o.cycles) || 2)), easing: 'ease-in-out' })\n ?.finished.catch(() => undefined);\n },\n },\n];\n\n/** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */\nexport function registerFestivalPack(): void {\n registerEffects(FESTIVAL_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-festival.cjs","sources":["../../src/components/fx2/festival.ts"],"sourcesContent":["/**\n * 8.1 — Festival packs (`motionary/fx/festival`, also `motionary/components/fx-festival`):\n *\n * - `firework-burst` (attention) — rockets of sparks burst out of the element\n * in festive colours (`bursts`, `colors`).\n * - `lantern-rise` (enter) — the element floats up and sways in like a\n * Lunar New Year lantern (`sway`).\n * - `xmas-snow` (loop) — snowflakes drift down over the element; the cleanup\n * stops them (`flakes`).\n * - `spooky-float` (attention) — the element wobbles and fades like a\n * Halloween ghost (`cycles`).\n *\n * Reduced motion: firework-burst / spooky-float do nothing, xmas-snow is\n * skipped, lantern-rise fades in. Particles are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Evenly spread spark directions with a little jitter (8.1). */\nexport function sparkVectors(n: number, radius: number, seed = 1): { x: number; y: number }[] {\n let s = seed;\n const rnd = () => ((s = (s * 9301 + 49297) % 233280) / 233280);\n return Array.from({ length: n }, (_, i) => {\n const a = (i / n) * Math.PI * 2 + (rnd() - 0.5) * 0.3;\n const r = radius * (0.7 + rnd() * 0.3);\n return { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r) };\n });\n}\n\nconst layer = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const l = document.createElement('span');\n l.setAttribute('aria-hidden', 'true');\n Object.assign(l.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible' });\n el.appendChild(l);\n ctx.onCleanup(() => l.remove());\n return l;\n};\nconst dot = (parent: HTMLElement, css: Partial<CSSStyleDeclaration>, text = '') => {\n const d = document.createElement('span');\n d.textContent = text;\n Object.assign(d.style, { position: 'absolute', left: '50%', top: '50%', ...css });\n parent.appendChild(d);\n return d;\n};\n\nexport const FESTIVAL_FX: EffectDefinition[] = [\n {\n name: 'firework-burst',\n kind: 'attention',\n description: 'Rockets of sparks burst out of the element in festive colours (`bursts`, `colors`).',\n defaults: { bursts: 3, colors: '#f43f5e,#f59e0b,#22d3ee,#a855f7,#facc15', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const l = layer(el, ctx);\n const colors = String(o.colors).split(',');\n const r = el.getBoundingClientRect();\n const runs: Promise<unknown>[] = [];\n const n = Math.max(1, Math.min(6, Number(o.bursts) || 3));\n for (let b = 0; b < n; b++) {\n const cx = (b - (n - 1) / 2) * Math.min(60, (r.width || 120) / n);\n const cy = -((r.height || 60) * 0.25) - (b % 2) * 18;\n const col = colors[b % colors.length];\n sparkVectors(14, 46 + b * 6, b + 3).forEach((v) => {\n const s = dot(l, { width: '5px', height: '5px', marginLeft: '-2.5px', marginTop: '-2.5px', borderRadius: '50%', background: col, boxShadow: `0 0 6px ${col}` });\n const a = ctx.animate(s, [{ transform: `translate(${cx}px,${cy + 40}px) scale(.4)`, opacity: 0 }, { transform: `translate(${cx}px,${cy}px) scale(1)`, opacity: 1, offset: 0.25 }, { transform: `translate(${cx + v.x}px,${cy + v.y + 18}px) scale(.3)`, opacity: 0 }], { duration: o.duration, delay: b * 220, easing: 'cubic-bezier(.2,.7,.3,1)', fill: 'backwards' });\n runs.push(a ? a.finished.then(() => s.remove(), () => s.remove()) : Promise.resolve(s.remove()));\n });\n }\n return Promise.all(runs).then(() => l.remove());\n },\n },\n {\n name: 'lantern-rise',\n kind: 'enter',\n description: 'The element floats up and sways in like a Lunar New Year lantern (`sway` degrees).',\n defaults: { sway: 8, duration: 1400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const w = Number(o.sway) || 8;\n return ctx\n .animate(el, [{ transform: `translateY(60px) rotate(${-w}deg)`, opacity: 0, transformOrigin: '50% 0' }, { transform: `translateY(-6px) rotate(${w * 0.6}deg)`, opacity: 1, offset: 0.55, transformOrigin: '50% 0' }, { transform: `translateY(0) rotate(${-w * 0.3}deg)`, offset: 0.8, transformOrigin: '50% 0' }, { transform: 'none', opacity: 1, transformOrigin: '50% 0' }], { duration: o.duration, easing: 'ease-out', fill: 'backwards' })\n ?.finished.catch(() => undefined);\n },\n },\n {\n name: 'xmas-snow',\n kind: 'loop',\n description: 'Snowflakes drift down over the element until the cleanup runs (`flakes`).',\n defaults: { flakes: 18, duration: 4000 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const l = layer(el, ctx);\n l.style.overflow = 'hidden';\n const n = Math.max(4, Math.min(60, Number(o.flakes) || 18));\n const anims = Array.from({ length: n }, (_, i) => {\n const x = (i * 37) % 100;\n const size = 8 + ((i * 7) % 9);\n const f = dot(l, { left: `${x}%`, top: '-14px', fontSize: `${size}px`, color: '#fff', textShadow: '0 0 3px rgba(148,163,184,.9)', lineHeight: '1' }, '❄');\n const drift = ((i % 5) - 2) * 12;\n return ctx.animate(f, [{ transform: 'translate(0,0) rotate(0)' }, { transform: `translate(${drift}px, calc(${el.clientHeight || 160}px + 20px)) rotate(180deg)` }], { duration: o.duration * (0.7 + ((i * 13) % 6) / 10), delay: -((i * 331) % o.duration), iterations: Infinity, easing: 'linear' });\n });\n return () => {\n anims.forEach((a) => a?.cancel());\n l.remove();\n };\n },\n },\n {\n name: 'spooky-float',\n kind: 'attention',\n description: 'The element wobbles, rises and flickers like a Halloween ghost (`cycles`).',\n defaults: { cycles: 2, duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n return ctx\n .animate(el, [{ transform: 'none', opacity: 1 }, { transform: 'translate(-4px,-10px) rotate(-4deg) skewX(3deg)', opacity: 0.55, offset: 0.3 }, { transform: 'translate(4px,-14px) rotate(4deg) skewX(-3deg)', opacity: 0.85, offset: 0.65 }, { transform: 'none', opacity: 1 }], { duration: o.duration, iterations: Math.max(1, Math.min(6, Number(o.cycles) || 2)), easing: 'ease-in-out' })\n ?.finished.catch(() => undefined);\n },\n },\n];\n\n/** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */\nexport function registerFestivalPack(): void {\n registerEffects(FESTIVAL_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { registerEffects } from '../chunks/registry-
|
|
2
|
-
import '../chunks/base-
|
|
1
|
+
import { registerEffects } from '../chunks/registry-BKzyg1JV.js';
|
|
2
|
+
import '../chunks/base-BTev8qxg.js';
|
|
3
3
|
|
|
4
4
|
/** Evenly spread spark directions with a little jitter (8.1). */
|
|
5
5
|
function sparkVectors(n, radius, seed = 1) {
|