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-festival.js","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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-festival.js","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":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-focus.cjs","sources":["../../src/components/fx2/focus.ts"],"sourcesContent":["/**\n * 6.9 — Focus & feedback (`motionary/components/fx-focus`), registered\n * through `registerEffect()`:\n *\n * - `focus-draw` (kind `attention`) — a rounded ring draws itself around the\n * element, then fades (great on `focus`).\n * - `marching-ants` (kind `loop`) — a dashed selection border that marches\n * (drop targets, selections).\n * - `success-check` (kind `click`) — a check mark draws over the element on a\n * soft green disc, then fades away.\n * - `highlight-sweep` (kind `attention`) — a highlighter stroke sweeps\n * behind the element's text.\n *\n * Overlays are SVG / spans marked `aria-hidden` and removed when done.\n * Reduced motion: a plain fade of the final state (marching-ants is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst NS = 'http://www.w3.org/2000/svg';\n\nfunction overlay(el: HTMLElement, z = 1): HTMLSpanElement {\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n o.setAttribute('data-usa-fx-layer', '');\n o.style.cssText = `position:absolute;inset:0;pointer-events:none;z-index:${z};border-radius:inherit`;\n el.appendChild(o);\n return o;\n}\n\nfunction ring(el: HTMLElement, pad: number, color: string, width: number, dash = ''): { o: HTMLSpanElement; rect: SVGRectElement; len: number } {\n const o = overlay(el, 2);\n o.style.inset = `-${pad}px`;\n const r = el.getBoundingClientRect();\n const w = Math.max(1, r.width + pad * 2);\n const h = Math.max(1, r.height + pad * 2);\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`);\n svg.style.overflow = 'visible';\n const rect = document.createElementNS(NS, 'rect');\n const rad = Math.min(16, h / 2);\n for (const [k, v] of Object.entries({ x: width / 2, y: width / 2, width: w - width, height: h - width, rx: rad, fill: 'none', stroke: color, 'stroke-width': width, 'stroke-linecap': 'round' })) rect.setAttribute(k, String(v));\n if (dash) rect.setAttribute('stroke-dasharray', dash);\n svg.appendChild(rect);\n o.appendChild(svg);\n return { o, rect, len: 2 * (w + h) };\n}\n\nconst after = (a: Animation | null, fn: () => void) => (a ? a.finished.then(fn, fn) : fn());\n\nexport const FOCUS_FX: EffectDefinition[] = [\n {\n name: 'focus-draw',\n kind: 'attention',\n description: 'A rounded ring draws itself around the element, then fades (`color`, `width`, `pad`, `duration`).',\n defaults: { color: '#7c5cff', width: 2.5, pad: 4, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect, len } = ring(el, o.pad, o.color, o.width);\n const done = () => layer.remove();\n if (ctx.reduced) {\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 0 }], { duration: 600 });\n after(a, done);\n return a;\n }\n rect.setAttribute('stroke-dasharray', String(len));\n const a = ctx.animate(rect, [{ strokeDashoffset: len }, { strokeDashoffset: 0, offset: 0.6 }, { strokeDashoffset: 0 }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration + 500 });\n after(f, done);\n return a;\n },\n },\n {\n name: 'marching-ants',\n kind: 'loop',\n description: 'A dashed selection border that marches around the element (`color`, `width`, `pad`, `speed`).',\n defaults: { color: '#7c5cff', width: 2, pad: 3, speed: 1 },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect } = ring(el, o.pad, o.color, o.width, '7 5');\n if (!ctx.reduced) ctx.animate(rect, [{ strokeDashoffset: 0 }, { strokeDashoffset: -24 }], { duration: 700 / Math.max(0.1, o.speed), iterations: Infinity });\n const stop = () => layer.remove();\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'success-check',\n kind: 'click',\n description: 'A check mark draws over the element on a soft green disc, then fades away (`color`, `duration`).',\n defaults: { color: '#22c55e', duration: 1100 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, 3);\n layer.style.display = 'grid';\n layer.style.placeItems = 'center';\n layer.innerHTML = `<svg viewBox=\"0 0 52 52\" width=\"52\" height=\"52\"><circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"${o.color}\" opacity=\".18\"/><path d=\"M15 27l7 7 15-16\" fill=\"none\" stroke=\"${o.color}\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-dasharray=\"36\" stroke-dashoffset=\"36\"/></svg>`;\n const svg = layer.firstElementChild as SVGElement;\n const path = layer.querySelector('path')!;\n const done = () => layer.remove();\n if (ctx.reduced) {\n path.setAttribute('stroke-dashoffset', '0');\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration });\n after(a, done);\n return a;\n }\n ctx.animate(svg, [{ transform: 'scale(.4)', opacity: 0 }, { transform: 'scale(1.1)', opacity: 1, offset: 0.35 }, { transform: 'scale(1)', opacity: 1 }], { duration: 420, easing: 'ease-out' });\n ctx.animate(path, [{ strokeDashoffset: 36 }, { strokeDashoffset: 36, offset: 0.25 }, { strokeDashoffset: 0 }], { duration: 600, easing: 'ease-out', fill: 'forwards' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.75 }, { opacity: 0 }], { duration: o.duration });\n after(f, done);\n return f;\n },\n },\n {\n name: 'highlight-sweep',\n kind: 'attention',\n description: \"A highlighter stroke sweeps behind the element's text and stays (`color`, `duration`, `keep`).\",\n defaults: { color: 'rgba(250,204,21,.55)', duration: 700, keep: true },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, -1);\n el.style.isolation = 'isolate';\n layer.style.cssText += `;inset:15% -4px 5% -4px;background:${o.color};border-radius:4px;transform-origin:0 50%`;\n const a = ctx.reduced ? ctx.animate(layer, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 }) : ctx.animate(layer, [{ transform: 'scaleX(0) skewX(-12deg)' }, { transform: 'scaleX(1) skewX(-6deg)' }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'forwards' });\n if (!o.keep) after(a, () => layer.remove());\n ctx.onCleanup(() => layer.remove());\n return a;\n },\n },\n];\n\n/** Register the 6.9 focus & feedback pack (idempotent). */\nexport function registerFocusPack(): void {\n registerEffects(FOCUS_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-focus.cjs","sources":["../../src/components/fx2/focus.ts"],"sourcesContent":["/**\n * 6.9 — Focus & feedback (`motionary/components/fx-focus`), registered\n * through `registerEffect()`:\n *\n * - `focus-draw` (kind `attention`) — a rounded ring draws itself around the\n * element, then fades (great on `focus`).\n * - `marching-ants` (kind `loop`) — a dashed selection border that marches\n * (drop targets, selections).\n * - `success-check` (kind `click`) — a check mark draws over the element on a\n * soft green disc, then fades away.\n * - `highlight-sweep` (kind `attention`) — a highlighter stroke sweeps\n * behind the element's text.\n *\n * Overlays are SVG / spans marked `aria-hidden` and removed when done.\n * Reduced motion: a plain fade of the final state (marching-ants is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst NS = 'http://www.w3.org/2000/svg';\n\nfunction overlay(el: HTMLElement, z = 1): HTMLSpanElement {\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n o.setAttribute('data-usa-fx-layer', '');\n o.style.cssText = `position:absolute;inset:0;pointer-events:none;z-index:${z};border-radius:inherit`;\n el.appendChild(o);\n return o;\n}\n\nfunction ring(el: HTMLElement, pad: number, color: string, width: number, dash = ''): { o: HTMLSpanElement; rect: SVGRectElement; len: number } {\n const o = overlay(el, 2);\n o.style.inset = `-${pad}px`;\n const r = el.getBoundingClientRect();\n const w = Math.max(1, r.width + pad * 2);\n const h = Math.max(1, r.height + pad * 2);\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`);\n svg.style.overflow = 'visible';\n const rect = document.createElementNS(NS, 'rect');\n const rad = Math.min(16, h / 2);\n for (const [k, v] of Object.entries({ x: width / 2, y: width / 2, width: w - width, height: h - width, rx: rad, fill: 'none', stroke: color, 'stroke-width': width, 'stroke-linecap': 'round' })) rect.setAttribute(k, String(v));\n if (dash) rect.setAttribute('stroke-dasharray', dash);\n svg.appendChild(rect);\n o.appendChild(svg);\n return { o, rect, len: 2 * (w + h) };\n}\n\nconst after = (a: Animation | null, fn: () => void) => (a ? a.finished.then(fn, fn) : fn());\n\nexport const FOCUS_FX: EffectDefinition[] = [\n {\n name: 'focus-draw',\n kind: 'attention',\n description: 'A rounded ring draws itself around the element, then fades (`color`, `width`, `pad`, `duration`).',\n defaults: { color: '#7c5cff', width: 2.5, pad: 4, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect, len } = ring(el, o.pad, o.color, o.width);\n const done = () => layer.remove();\n if (ctx.reduced) {\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 0 }], { duration: 600 });\n after(a, done);\n return a;\n }\n rect.setAttribute('stroke-dasharray', String(len));\n const a = ctx.animate(rect, [{ strokeDashoffset: len }, { strokeDashoffset: 0, offset: 0.6 }, { strokeDashoffset: 0 }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration + 500 });\n after(f, done);\n return a;\n },\n },\n {\n name: 'marching-ants',\n kind: 'loop',\n description: 'A dashed selection border that marches around the element (`color`, `width`, `pad`, `speed`).',\n defaults: { color: '#7c5cff', width: 2, pad: 3, speed: 1 },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect } = ring(el, o.pad, o.color, o.width, '7 5');\n if (!ctx.reduced) ctx.animate(rect, [{ strokeDashoffset: 0 }, { strokeDashoffset: -24 }], { duration: 700 / Math.max(0.1, o.speed), iterations: Infinity });\n const stop = () => layer.remove();\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'success-check',\n kind: 'click',\n description: 'A check mark draws over the element on a soft green disc, then fades away (`color`, `duration`).',\n defaults: { color: '#22c55e', duration: 1100 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, 3);\n layer.style.display = 'grid';\n layer.style.placeItems = 'center';\n layer.innerHTML = `<svg viewBox=\"0 0 52 52\" width=\"52\" height=\"52\"><circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"${o.color}\" opacity=\".18\"/><path d=\"M15 27l7 7 15-16\" fill=\"none\" stroke=\"${o.color}\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-dasharray=\"36\" stroke-dashoffset=\"36\"/></svg>`;\n const svg = layer.firstElementChild as SVGElement;\n const path = layer.querySelector('path')!;\n const done = () => layer.remove();\n if (ctx.reduced) {\n path.setAttribute('stroke-dashoffset', '0');\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration });\n after(a, done);\n return a;\n }\n ctx.animate(svg, [{ transform: 'scale(.4)', opacity: 0 }, { transform: 'scale(1.1)', opacity: 1, offset: 0.35 }, { transform: 'scale(1)', opacity: 1 }], { duration: 420, easing: 'ease-out' });\n ctx.animate(path, [{ strokeDashoffset: 36 }, { strokeDashoffset: 36, offset: 0.25 }, { strokeDashoffset: 0 }], { duration: 600, easing: 'ease-out', fill: 'forwards' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.75 }, { opacity: 0 }], { duration: o.duration });\n after(f, done);\n return f;\n },\n },\n {\n name: 'highlight-sweep',\n kind: 'attention',\n description: \"A highlighter stroke sweeps behind the element's text and stays (`color`, `duration`, `keep`).\",\n defaults: { color: 'rgba(250,204,21,.55)', duration: 700, keep: true },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, -1);\n el.style.isolation = 'isolate';\n layer.style.cssText += `;inset:15% -4px 5% -4px;background:${o.color};border-radius:4px;transform-origin:0 50%`;\n const a = ctx.reduced ? ctx.animate(layer, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 }) : ctx.animate(layer, [{ transform: 'scaleX(0) skewX(-12deg)' }, { transform: 'scaleX(1) skewX(-6deg)' }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'forwards' });\n if (!o.keep) after(a, () => layer.remove());\n ctx.onCleanup(() => layer.remove());\n return a;\n },\n },\n];\n\n/** Register the 6.9 focus & feedback pack (idempotent). */\nexport function registerFocusPack(): void {\n registerEffects(FOCUS_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 NS = 'http://www.w3.org/2000/svg';
|
|
5
5
|
function overlay(el, z = 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-focus.js","sources":["../../src/components/fx2/focus.ts"],"sourcesContent":["/**\n * 6.9 — Focus & feedback (`motionary/components/fx-focus`), registered\n * through `registerEffect()`:\n *\n * - `focus-draw` (kind `attention`) — a rounded ring draws itself around the\n * element, then fades (great on `focus`).\n * - `marching-ants` (kind `loop`) — a dashed selection border that marches\n * (drop targets, selections).\n * - `success-check` (kind `click`) — a check mark draws over the element on a\n * soft green disc, then fades away.\n * - `highlight-sweep` (kind `attention`) — a highlighter stroke sweeps\n * behind the element's text.\n *\n * Overlays are SVG / spans marked `aria-hidden` and removed when done.\n * Reduced motion: a plain fade of the final state (marching-ants is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst NS = 'http://www.w3.org/2000/svg';\n\nfunction overlay(el: HTMLElement, z = 1): HTMLSpanElement {\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n o.setAttribute('data-usa-fx-layer', '');\n o.style.cssText = `position:absolute;inset:0;pointer-events:none;z-index:${z};border-radius:inherit`;\n el.appendChild(o);\n return o;\n}\n\nfunction ring(el: HTMLElement, pad: number, color: string, width: number, dash = ''): { o: HTMLSpanElement; rect: SVGRectElement; len: number } {\n const o = overlay(el, 2);\n o.style.inset = `-${pad}px`;\n const r = el.getBoundingClientRect();\n const w = Math.max(1, r.width + pad * 2);\n const h = Math.max(1, r.height + pad * 2);\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`);\n svg.style.overflow = 'visible';\n const rect = document.createElementNS(NS, 'rect');\n const rad = Math.min(16, h / 2);\n for (const [k, v] of Object.entries({ x: width / 2, y: width / 2, width: w - width, height: h - width, rx: rad, fill: 'none', stroke: color, 'stroke-width': width, 'stroke-linecap': 'round' })) rect.setAttribute(k, String(v));\n if (dash) rect.setAttribute('stroke-dasharray', dash);\n svg.appendChild(rect);\n o.appendChild(svg);\n return { o, rect, len: 2 * (w + h) };\n}\n\nconst after = (a: Animation | null, fn: () => void) => (a ? a.finished.then(fn, fn) : fn());\n\nexport const FOCUS_FX: EffectDefinition[] = [\n {\n name: 'focus-draw',\n kind: 'attention',\n description: 'A rounded ring draws itself around the element, then fades (`color`, `width`, `pad`, `duration`).',\n defaults: { color: '#7c5cff', width: 2.5, pad: 4, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect, len } = ring(el, o.pad, o.color, o.width);\n const done = () => layer.remove();\n if (ctx.reduced) {\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 0 }], { duration: 600 });\n after(a, done);\n return a;\n }\n rect.setAttribute('stroke-dasharray', String(len));\n const a = ctx.animate(rect, [{ strokeDashoffset: len }, { strokeDashoffset: 0, offset: 0.6 }, { strokeDashoffset: 0 }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration + 500 });\n after(f, done);\n return a;\n },\n },\n {\n name: 'marching-ants',\n kind: 'loop',\n description: 'A dashed selection border that marches around the element (`color`, `width`, `pad`, `speed`).',\n defaults: { color: '#7c5cff', width: 2, pad: 3, speed: 1 },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect } = ring(el, o.pad, o.color, o.width, '7 5');\n if (!ctx.reduced) ctx.animate(rect, [{ strokeDashoffset: 0 }, { strokeDashoffset: -24 }], { duration: 700 / Math.max(0.1, o.speed), iterations: Infinity });\n const stop = () => layer.remove();\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'success-check',\n kind: 'click',\n description: 'A check mark draws over the element on a soft green disc, then fades away (`color`, `duration`).',\n defaults: { color: '#22c55e', duration: 1100 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, 3);\n layer.style.display = 'grid';\n layer.style.placeItems = 'center';\n layer.innerHTML = `<svg viewBox=\"0 0 52 52\" width=\"52\" height=\"52\"><circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"${o.color}\" opacity=\".18\"/><path d=\"M15 27l7 7 15-16\" fill=\"none\" stroke=\"${o.color}\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-dasharray=\"36\" stroke-dashoffset=\"36\"/></svg>`;\n const svg = layer.firstElementChild as SVGElement;\n const path = layer.querySelector('path')!;\n const done = () => layer.remove();\n if (ctx.reduced) {\n path.setAttribute('stroke-dashoffset', '0');\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration });\n after(a, done);\n return a;\n }\n ctx.animate(svg, [{ transform: 'scale(.4)', opacity: 0 }, { transform: 'scale(1.1)', opacity: 1, offset: 0.35 }, { transform: 'scale(1)', opacity: 1 }], { duration: 420, easing: 'ease-out' });\n ctx.animate(path, [{ strokeDashoffset: 36 }, { strokeDashoffset: 36, offset: 0.25 }, { strokeDashoffset: 0 }], { duration: 600, easing: 'ease-out', fill: 'forwards' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.75 }, { opacity: 0 }], { duration: o.duration });\n after(f, done);\n return f;\n },\n },\n {\n name: 'highlight-sweep',\n kind: 'attention',\n description: \"A highlighter stroke sweeps behind the element's text and stays (`color`, `duration`, `keep`).\",\n defaults: { color: 'rgba(250,204,21,.55)', duration: 700, keep: true },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, -1);\n el.style.isolation = 'isolate';\n layer.style.cssText += `;inset:15% -4px 5% -4px;background:${o.color};border-radius:4px;transform-origin:0 50%`;\n const a = ctx.reduced ? ctx.animate(layer, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 }) : ctx.animate(layer, [{ transform: 'scaleX(0) skewX(-12deg)' }, { transform: 'scaleX(1) skewX(-6deg)' }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'forwards' });\n if (!o.keep) after(a, () => layer.remove());\n ctx.onCleanup(() => layer.remove());\n return a;\n },\n },\n];\n\n/** Register the 6.9 focus & feedback pack (idempotent). */\nexport function registerFocusPack(): void {\n registerEffects(FOCUS_FX);\n}\n"],"names":[],"mappings":";;;AAmBA,MAAM,EAAE,GAAG,4BAA4B;AAEvC,SAAS,OAAO,CAAC,EAAe,EAAE,CAAC,GAAG,CAAC,EAAA;AACrC,IAAA,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ;AAAE,QAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;IAC9E,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,IAAA,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AACrC,IAAA,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACvC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA,sDAAA,EAAyD,CAAC,wBAAwB;AACpG,IAAA,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AACjB,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,IAAI,CAAC,EAAe,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAE,IAAI,GAAG,EAAE,EAAA;IACjF,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI;AAC3B,IAAA,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACpC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AACxC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC;AAC/C,IAAA,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AACjC,IAAA,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;AAC5C,IAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC;AACjD,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACjO,IAAA,IAAI,IAAI;AAAE,QAAA,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC;AACrD,IAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;AACrB,IAAA,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;AAClB,IAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACtC;AAEA,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAE,EAAc,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;AAEpF,MAAM,QAAQ,GAAuB;AAC1C,IAAA;AACE,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,mGAAmG;AAChH,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACjE,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;YACjE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,gBAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjF,gBAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,gBAAA,OAAO,CAAC;YACV;YACA,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;AACtL,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;AAC3H,YAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,+FAA+F;AAC5G,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AAC1D,QAAA,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,OAAO;AAAE,gBAAA,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAC3J,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,YAAA,OAAO,IAAI;QACb,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,kGAAkG;QAC/G,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC9C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5B,YAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC5B,YAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACjC,YAAA,KAAK,CAAC,SAAS,GAAG,CAAA,qFAAA,EAAwF,CAAC,CAAC,KAAK,CAAA,gEAAA,EAAmE,CAAC,CAAC,KAAK,CAAA,wHAAA,CAA0H;AACrT,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,iBAA+B;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAE;YACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,GAAG,CAAC;AAC3C,gBAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrH,gBAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,gBAAA,OAAO,CAAC;YACV;YACA,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC/L,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACvK,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtH,YAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,gGAAgG;AAC7G,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;QACtE,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;AAC7B,YAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS;YAC9B,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,sCAAsC,CAAC,CAAC,KAAK,CAAA,yCAAA,CAA2C;AAC/G,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC1R,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;AACnC,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;;AAGH;SACgB,iBAAiB,GAAA;IAC/B,eAAe,CAAC,QAAQ,CAAC;AAC3B;;;;"}
|
|
1
|
+
{"version":3,"file":"fx-focus.js","sources":["../../src/components/fx2/focus.ts"],"sourcesContent":["/**\n * 6.9 — Focus & feedback (`motionary/components/fx-focus`), registered\n * through `registerEffect()`:\n *\n * - `focus-draw` (kind `attention`) — a rounded ring draws itself around the\n * element, then fades (great on `focus`).\n * - `marching-ants` (kind `loop`) — a dashed selection border that marches\n * (drop targets, selections).\n * - `success-check` (kind `click`) — a check mark draws over the element on a\n * soft green disc, then fades away.\n * - `highlight-sweep` (kind `attention`) — a highlighter stroke sweeps\n * behind the element's text.\n *\n * Overlays are SVG / spans marked `aria-hidden` and removed when done.\n * Reduced motion: a plain fade of the final state (marching-ants is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\nconst NS = 'http://www.w3.org/2000/svg';\n\nfunction overlay(el: HTMLElement, z = 1): HTMLSpanElement {\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const o = document.createElement('span');\n o.setAttribute('aria-hidden', 'true');\n o.setAttribute('data-usa-fx-layer', '');\n o.style.cssText = `position:absolute;inset:0;pointer-events:none;z-index:${z};border-radius:inherit`;\n el.appendChild(o);\n return o;\n}\n\nfunction ring(el: HTMLElement, pad: number, color: string, width: number, dash = ''): { o: HTMLSpanElement; rect: SVGRectElement; len: number } {\n const o = overlay(el, 2);\n o.style.inset = `-${pad}px`;\n const r = el.getBoundingClientRect();\n const w = Math.max(1, r.width + pad * 2);\n const h = Math.max(1, r.height + pad * 2);\n const svg = document.createElementNS(NS, 'svg');\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`);\n svg.style.overflow = 'visible';\n const rect = document.createElementNS(NS, 'rect');\n const rad = Math.min(16, h / 2);\n for (const [k, v] of Object.entries({ x: width / 2, y: width / 2, width: w - width, height: h - width, rx: rad, fill: 'none', stroke: color, 'stroke-width': width, 'stroke-linecap': 'round' })) rect.setAttribute(k, String(v));\n if (dash) rect.setAttribute('stroke-dasharray', dash);\n svg.appendChild(rect);\n o.appendChild(svg);\n return { o, rect, len: 2 * (w + h) };\n}\n\nconst after = (a: Animation | null, fn: () => void) => (a ? a.finished.then(fn, fn) : fn());\n\nexport const FOCUS_FX: EffectDefinition[] = [\n {\n name: 'focus-draw',\n kind: 'attention',\n description: 'A rounded ring draws itself around the element, then fades (`color`, `width`, `pad`, `duration`).',\n defaults: { color: '#7c5cff', width: 2.5, pad: 4, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect, len } = ring(el, o.pad, o.color, o.width);\n const done = () => layer.remove();\n if (ctx.reduced) {\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 0 }], { duration: 600 });\n after(a, done);\n return a;\n }\n rect.setAttribute('stroke-dasharray', String(len));\n const a = ctx.animate(rect, [{ strokeDashoffset: len }, { strokeDashoffset: 0, offset: 0.6 }, { strokeDashoffset: 0 }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration + 500 });\n after(f, done);\n return a;\n },\n },\n {\n name: 'marching-ants',\n kind: 'loop',\n description: 'A dashed selection border that marches around the element (`color`, `width`, `pad`, `speed`).',\n defaults: { color: '#7c5cff', width: 2, pad: 3, speed: 1 },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const { o: layer, rect } = ring(el, o.pad, o.color, o.width, '7 5');\n if (!ctx.reduced) ctx.animate(rect, [{ strokeDashoffset: 0 }, { strokeDashoffset: -24 }], { duration: 700 / Math.max(0.1, o.speed), iterations: Infinity });\n const stop = () => layer.remove();\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'success-check',\n kind: 'click',\n description: 'A check mark draws over the element on a soft green disc, then fades away (`color`, `duration`).',\n defaults: { color: '#22c55e', duration: 1100 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, 3);\n layer.style.display = 'grid';\n layer.style.placeItems = 'center';\n layer.innerHTML = `<svg viewBox=\"0 0 52 52\" width=\"52\" height=\"52\"><circle cx=\"26\" cy=\"26\" r=\"24\" fill=\"${o.color}\" opacity=\".18\"/><path d=\"M15 27l7 7 15-16\" fill=\"none\" stroke=\"${o.color}\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-dasharray=\"36\" stroke-dashoffset=\"36\"/></svg>`;\n const svg = layer.firstElementChild as SVGElement;\n const path = layer.querySelector('path')!;\n const done = () => layer.remove();\n if (ctx.reduced) {\n path.setAttribute('stroke-dashoffset', '0');\n const a = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.7 }, { opacity: 0 }], { duration: o.duration });\n after(a, done);\n return a;\n }\n ctx.animate(svg, [{ transform: 'scale(.4)', opacity: 0 }, { transform: 'scale(1.1)', opacity: 1, offset: 0.35 }, { transform: 'scale(1)', opacity: 1 }], { duration: 420, easing: 'ease-out' });\n ctx.animate(path, [{ strokeDashoffset: 36 }, { strokeDashoffset: 36, offset: 0.25 }, { strokeDashoffset: 0 }], { duration: 600, easing: 'ease-out', fill: 'forwards' });\n const f = ctx.animate(layer, [{ opacity: 1 }, { opacity: 1, offset: 0.75 }, { opacity: 0 }], { duration: o.duration });\n after(f, done);\n return f;\n },\n },\n {\n name: 'highlight-sweep',\n kind: 'attention',\n description: \"A highlighter stroke sweeps behind the element's text and stays (`color`, `duration`, `keep`).\",\n defaults: { color: 'rgba(250,204,21,.55)', duration: 700, keep: true },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const layer = overlay(el, -1);\n el.style.isolation = 'isolate';\n layer.style.cssText += `;inset:15% -4px 5% -4px;background:${o.color};border-radius:4px;transform-origin:0 50%`;\n const a = ctx.reduced ? ctx.animate(layer, [{ opacity: 0 }, { opacity: 1 }], { duration: 300 }) : ctx.animate(layer, [{ transform: 'scaleX(0) skewX(-12deg)' }, { transform: 'scaleX(1) skewX(-6deg)' }], { duration: o.duration, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'forwards' });\n if (!o.keep) after(a, () => layer.remove());\n ctx.onCleanup(() => layer.remove());\n return a;\n },\n },\n];\n\n/** Register the 6.9 focus & feedback pack (idempotent). */\nexport function registerFocusPack(): void {\n registerEffects(FOCUS_FX);\n}\n"],"names":[],"mappings":";;;AAmBA,MAAM,EAAE,GAAG,4BAA4B;AAEvC,SAAS,OAAO,CAAC,EAAe,EAAE,CAAC,GAAG,CAAC,EAAA;AACrC,IAAA,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ;AAAE,QAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;IAC9E,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACxC,IAAA,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AACrC,IAAA,CAAC,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACvC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAA,sDAAA,EAAyD,CAAC,wBAAwB;AACpG,IAAA,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AACjB,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,IAAI,CAAC,EAAe,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAE,IAAI,GAAG,EAAE,EAAA;IACjF,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI;AAC3B,IAAA,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACpC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AACxC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC;AAC/C,IAAA,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;AACjC,IAAA,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;AAC5C,IAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC;AACjD,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACjO,IAAA,IAAI,IAAI;AAAE,QAAA,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC;AACrD,IAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;AACrB,IAAA,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;AAClB,IAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACtC;AAEA,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAE,EAAc,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;AAEpF,MAAM,QAAQ,GAAuB;AAC1C,IAAA;AACE,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,mGAAmG;AAChH,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QACjE,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;YACjE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,gBAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjF,gBAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,gBAAA,OAAO,CAAC;YACV;YACA,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;AACtL,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;AAC3H,YAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,+FAA+F;AAC5G,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AAC1D,QAAA,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,OAAO;AAAE,gBAAA,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAC3J,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,YAAA,OAAO,IAAI;QACb,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,kGAAkG;QAC/G,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC9C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5B,YAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC5B,YAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACjC,YAAA,KAAK,CAAC,SAAS,GAAG,CAAA,qFAAA,EAAwF,CAAC,CAAC,KAAK,CAAA,gEAAA,EAAmE,CAAC,CAAC,KAAK,CAAA,wHAAA,CAA0H;AACrT,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,iBAA+B;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAE;YACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,GAAG,CAAC;AAC3C,gBAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrH,gBAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,gBAAA,OAAO,CAAC;YACV;YACA,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC/L,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACvK,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtH,YAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AACd,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,WAAW,EAAE,gGAAgG;AAC7G,QAAA,QAAQ,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;QACtE,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC;AAC7B,YAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS;YAC9B,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,sCAAsC,CAAC,CAAC,KAAK,CAAA,yCAAA,CAA2C;AAC/G,YAAA,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC1R,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;AACnC,YAAA,OAAO,CAAC;QACV,CAAC;AACF,KAAA;;AAGH;SACgB,iBAAiB,GAAA;IAC/B,eAAe,CAAC,QAAQ,CAAC;AAC3B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-form.cjs","sources":["../../src/components/fx2/form.ts"],"sourcesContent":["/**\n * 7.7 — Form motion (`motionary/fx/form`, also `motionary/components/fx-form`):\n *\n * - `field-shake` (attention) — the element shakes sideways with a red\n * outline flash, the classic \"invalid\" cue (`distance`, `color`).\n * - `field-success` (attention) — a green glow pulses round the element and a\n * small check badge pops on its corner (`color`).\n * - `label-float` (enter) — every `label` (or `[data-label]`) inside rises and\n * settles, one after another, like floating labels (`stagger`).\n * - `form-cascade` (enter) — the element's children (fields, buttons) slide\n * in one after another (`stagger`, `distance`).\n *\n * Reduced motion: field-shake / field-success only flash the outline colour,\n * label-float and form-cascade fade in.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Decaying sideways shake keyframes (7.7). */\nexport function shakeFrames(distance = 8, steps = 5): Keyframe[] {\n const f: Keyframe[] = [{ transform: 'none' }];\n for (let i = 0; i < steps; i++) {\n const d = Math.round(distance * (1 - i / steps) * 10) / 10;\n f.push({ transform: `translateX(${i % 2 ? d : -d}px)` });\n }\n f.push({ transform: 'none' });\n return f;\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\nconst ring = (el: HTMLElement, color: string, ctx: EffectContext, duration: number) =>\n ctx.animate(el, [{ boxShadow: `0 0 0 0 ${color}` }, { boxShadow: `0 0 0 4px ${color}`, offset: 0.3 }, { boxShadow: '0 0 0 0 transparent' }], { duration })?.finished.catch(() => undefined);\n\nexport const FORM_FX: EffectDefinition[] = [\n {\n name: 'field-shake',\n kind: 'attention',\n description: 'Shakes the element sideways with a red outline flash — the \"invalid\" cue (`distance`, `color`).',\n defaults: { distance: 8, color: 'rgba(225,29,72,.55)', duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration + 200);\n if (ctx.reduced) return r;\n return ctx.animate(el, shakeFrames(Number(o.distance) || 8), { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'field-success',\n kind: 'attention',\n description: 'A green glow pulses round the element and a check badge pops on its corner (`color`).',\n defaults: { color: 'rgba(22,163,74,.5)', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration);\n if (ctx.reduced) return r;\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 b = document.createElement('span');\n b.setAttribute('aria-hidden', 'true');\n b.textContent = '✓';\n Object.assign(b.style, { position: 'absolute', right: '-6px', top: '-6px', width: '18px', height: '18px', borderRadius: '50%', background: '#16a34a', color: '#fff', font: '700 12px/18px system-ui,sans-serif', textAlign: 'center', pointerEvents: 'none' });\n el.appendChild(b);\n const end = () => b.remove();\n ctx.onCleanup(end);\n const a = ctx.animate(b, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.25)', opacity: 1, offset: 0.25 }, { transform: 'scale(1)', opacity: 1, offset: 0.4 }, { transform: 'scale(1)', opacity: 1, offset: 0.85 }, { transform: 'scale(.6)', opacity: 0 }], { duration: o.duration + 500, easing: 'ease-out' });\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'label-float',\n kind: 'enter',\n description: 'Every `label` (or `[data-label]`) inside rises and settles one after another, like floating labels (`stagger`).',\n defaults: { stagger: 80, duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const marked = Array.from(el.querySelectorAll<HTMLElement>('[data-label]'));\n const labels = marked.length ? marked : Array.from(el.querySelectorAll<HTMLElement>('label'));\n const items = labels.length ? labels : [el];\n return Promise.all(\n items.map((l, i) =>\n ctx.reduced\n ? fade(l, ctx)\n : ctx.animate(l, [{ transform: 'translateY(14px) scale(1.12)', opacity: 0, transformOrigin: '0 50%' }, { transform: 'translateY(-3px) scale(.96)', opacity: 1, offset: 0.7 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n {\n name: 'form-cascade',\n kind: 'enter',\n description: \"The element's children (fields, buttons) slide in one after another (`stagger`, `distance`).\",\n defaults: { stagger: 70, distance: 18, duration: 500 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const kids = Array.from(el.children) as HTMLElement[];\n const items = kids.length ? kids : [el];\n return Promise.all(\n items.map((k, i) =>\n ctx.reduced\n ? fade(k, ctx)\n : ctx.animate(k, [{ transform: `translateY(${Number(o.distance) || 18}px)`, opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n];\n\n/** Register field-shake, field-success, label-float and form-cascade (7.7). */\nexport function registerFormPack(): void {\n registerEffects(FORM_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-form.cjs","sources":["../../src/components/fx2/form.ts"],"sourcesContent":["/**\n * 7.7 — Form motion (`motionary/fx/form`, also `motionary/components/fx-form`):\n *\n * - `field-shake` (attention) — the element shakes sideways with a red\n * outline flash, the classic \"invalid\" cue (`distance`, `color`).\n * - `field-success` (attention) — a green glow pulses round the element and a\n * small check badge pops on its corner (`color`).\n * - `label-float` (enter) — every `label` (or `[data-label]`) inside rises and\n * settles, one after another, like floating labels (`stagger`).\n * - `form-cascade` (enter) — the element's children (fields, buttons) slide\n * in one after another (`stagger`, `distance`).\n *\n * Reduced motion: field-shake / field-success only flash the outline colour,\n * label-float and form-cascade fade in.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Decaying sideways shake keyframes (7.7). */\nexport function shakeFrames(distance = 8, steps = 5): Keyframe[] {\n const f: Keyframe[] = [{ transform: 'none' }];\n for (let i = 0; i < steps; i++) {\n const d = Math.round(distance * (1 - i / steps) * 10) / 10;\n f.push({ transform: `translateX(${i % 2 ? d : -d}px)` });\n }\n f.push({ transform: 'none' });\n return f;\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\nconst ring = (el: HTMLElement, color: string, ctx: EffectContext, duration: number) =>\n ctx.animate(el, [{ boxShadow: `0 0 0 0 ${color}` }, { boxShadow: `0 0 0 4px ${color}`, offset: 0.3 }, { boxShadow: '0 0 0 0 transparent' }], { duration })?.finished.catch(() => undefined);\n\nexport const FORM_FX: EffectDefinition[] = [\n {\n name: 'field-shake',\n kind: 'attention',\n description: 'Shakes the element sideways with a red outline flash — the \"invalid\" cue (`distance`, `color`).',\n defaults: { distance: 8, color: 'rgba(225,29,72,.55)', duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration + 200);\n if (ctx.reduced) return r;\n return ctx.animate(el, shakeFrames(Number(o.distance) || 8), { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'field-success',\n kind: 'attention',\n description: 'A green glow pulses round the element and a check badge pops on its corner (`color`).',\n defaults: { color: 'rgba(22,163,74,.5)', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration);\n if (ctx.reduced) return r;\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 b = document.createElement('span');\n b.setAttribute('aria-hidden', 'true');\n b.textContent = '✓';\n Object.assign(b.style, { position: 'absolute', right: '-6px', top: '-6px', width: '18px', height: '18px', borderRadius: '50%', background: '#16a34a', color: '#fff', font: '700 12px/18px system-ui,sans-serif', textAlign: 'center', pointerEvents: 'none' });\n el.appendChild(b);\n const end = () => b.remove();\n ctx.onCleanup(end);\n const a = ctx.animate(b, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.25)', opacity: 1, offset: 0.25 }, { transform: 'scale(1)', opacity: 1, offset: 0.4 }, { transform: 'scale(1)', opacity: 1, offset: 0.85 }, { transform: 'scale(.6)', opacity: 0 }], { duration: o.duration + 500, easing: 'ease-out' });\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'label-float',\n kind: 'enter',\n description: 'Every `label` (or `[data-label]`) inside rises and settles one after another, like floating labels (`stagger`).',\n defaults: { stagger: 80, duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const marked = Array.from(el.querySelectorAll<HTMLElement>('[data-label]'));\n const labels = marked.length ? marked : Array.from(el.querySelectorAll<HTMLElement>('label'));\n const items = labels.length ? labels : [el];\n return Promise.all(\n items.map((l, i) =>\n ctx.reduced\n ? fade(l, ctx)\n : ctx.animate(l, [{ transform: 'translateY(14px) scale(1.12)', opacity: 0, transformOrigin: '0 50%' }, { transform: 'translateY(-3px) scale(.96)', opacity: 1, offset: 0.7 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n {\n name: 'form-cascade',\n kind: 'enter',\n description: \"The element's children (fields, buttons) slide in one after another (`stagger`, `distance`).\",\n defaults: { stagger: 70, distance: 18, duration: 500 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const kids = Array.from(el.children) as HTMLElement[];\n const items = kids.length ? kids : [el];\n return Promise.all(\n items.map((k, i) =>\n ctx.reduced\n ? fade(k, ctx)\n : ctx.animate(k, [{ transform: `translateY(${Number(o.distance) || 18}px)`, opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n];\n\n/** Register field-shake, field-success, label-float and form-cascade (7.7). */\nexport function registerFormPack(): void {\n registerEffects(FORM_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
|
/** Decaying sideways shake keyframes (7.7). */
|
|
5
5
|
function shakeFrames(distance = 8, steps = 5) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-form.js","sources":["../../src/components/fx2/form.ts"],"sourcesContent":["/**\n * 7.7 — Form motion (`motionary/fx/form`, also `motionary/components/fx-form`):\n *\n * - `field-shake` (attention) — the element shakes sideways with a red\n * outline flash, the classic \"invalid\" cue (`distance`, `color`).\n * - `field-success` (attention) — a green glow pulses round the element and a\n * small check badge pops on its corner (`color`).\n * - `label-float` (enter) — every `label` (or `[data-label]`) inside rises and\n * settles, one after another, like floating labels (`stagger`).\n * - `form-cascade` (enter) — the element's children (fields, buttons) slide\n * in one after another (`stagger`, `distance`).\n *\n * Reduced motion: field-shake / field-success only flash the outline colour,\n * label-float and form-cascade fade in.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Decaying sideways shake keyframes (7.7). */\nexport function shakeFrames(distance = 8, steps = 5): Keyframe[] {\n const f: Keyframe[] = [{ transform: 'none' }];\n for (let i = 0; i < steps; i++) {\n const d = Math.round(distance * (1 - i / steps) * 10) / 10;\n f.push({ transform: `translateX(${i % 2 ? d : -d}px)` });\n }\n f.push({ transform: 'none' });\n return f;\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\nconst ring = (el: HTMLElement, color: string, ctx: EffectContext, duration: number) =>\n ctx.animate(el, [{ boxShadow: `0 0 0 0 ${color}` }, { boxShadow: `0 0 0 4px ${color}`, offset: 0.3 }, { boxShadow: '0 0 0 0 transparent' }], { duration })?.finished.catch(() => undefined);\n\nexport const FORM_FX: EffectDefinition[] = [\n {\n name: 'field-shake',\n kind: 'attention',\n description: 'Shakes the element sideways with a red outline flash — the \"invalid\" cue (`distance`, `color`).',\n defaults: { distance: 8, color: 'rgba(225,29,72,.55)', duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration + 200);\n if (ctx.reduced) return r;\n return ctx.animate(el, shakeFrames(Number(o.distance) || 8), { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'field-success',\n kind: 'attention',\n description: 'A green glow pulses round the element and a check badge pops on its corner (`color`).',\n defaults: { color: 'rgba(22,163,74,.5)', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration);\n if (ctx.reduced) return r;\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 b = document.createElement('span');\n b.setAttribute('aria-hidden', 'true');\n b.textContent = '✓';\n Object.assign(b.style, { position: 'absolute', right: '-6px', top: '-6px', width: '18px', height: '18px', borderRadius: '50%', background: '#16a34a', color: '#fff', font: '700 12px/18px system-ui,sans-serif', textAlign: 'center', pointerEvents: 'none' });\n el.appendChild(b);\n const end = () => b.remove();\n ctx.onCleanup(end);\n const a = ctx.animate(b, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.25)', opacity: 1, offset: 0.25 }, { transform: 'scale(1)', opacity: 1, offset: 0.4 }, { transform: 'scale(1)', opacity: 1, offset: 0.85 }, { transform: 'scale(.6)', opacity: 0 }], { duration: o.duration + 500, easing: 'ease-out' });\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'label-float',\n kind: 'enter',\n description: 'Every `label` (or `[data-label]`) inside rises and settles one after another, like floating labels (`stagger`).',\n defaults: { stagger: 80, duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const marked = Array.from(el.querySelectorAll<HTMLElement>('[data-label]'));\n const labels = marked.length ? marked : Array.from(el.querySelectorAll<HTMLElement>('label'));\n const items = labels.length ? labels : [el];\n return Promise.all(\n items.map((l, i) =>\n ctx.reduced\n ? fade(l, ctx)\n : ctx.animate(l, [{ transform: 'translateY(14px) scale(1.12)', opacity: 0, transformOrigin: '0 50%' }, { transform: 'translateY(-3px) scale(.96)', opacity: 1, offset: 0.7 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n {\n name: 'form-cascade',\n kind: 'enter',\n description: \"The element's children (fields, buttons) slide in one after another (`stagger`, `distance`).\",\n defaults: { stagger: 70, distance: 18, duration: 500 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const kids = Array.from(el.children) as HTMLElement[];\n const items = kids.length ? kids : [el];\n return Promise.all(\n items.map((k, i) =>\n ctx.reduced\n ? fade(k, ctx)\n : ctx.animate(k, [{ transform: `translateY(${Number(o.distance) || 18}px)`, opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n];\n\n/** Register field-shake, field-success, label-float and form-cascade (7.7). */\nexport function registerFormPack(): void {\n registerEffects(FORM_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-form.js","sources":["../../src/components/fx2/form.ts"],"sourcesContent":["/**\n * 7.7 — Form motion (`motionary/fx/form`, also `motionary/components/fx-form`):\n *\n * - `field-shake` (attention) — the element shakes sideways with a red\n * outline flash, the classic \"invalid\" cue (`distance`, `color`).\n * - `field-success` (attention) — a green glow pulses round the element and a\n * small check badge pops on its corner (`color`).\n * - `label-float` (enter) — every `label` (or `[data-label]`) inside rises and\n * settles, one after another, like floating labels (`stagger`).\n * - `form-cascade` (enter) — the element's children (fields, buttons) slide\n * in one after another (`stagger`, `distance`).\n *\n * Reduced motion: field-shake / field-success only flash the outline colour,\n * label-float and form-cascade fade in.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Decaying sideways shake keyframes (7.7). */\nexport function shakeFrames(distance = 8, steps = 5): Keyframe[] {\n const f: Keyframe[] = [{ transform: 'none' }];\n for (let i = 0; i < steps; i++) {\n const d = Math.round(distance * (1 - i / steps) * 10) / 10;\n f.push({ transform: `translateX(${i % 2 ? d : -d}px)` });\n }\n f.push({ transform: 'none' });\n return f;\n}\n\nconst fade = (el: HTMLElement, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\nconst ring = (el: HTMLElement, color: string, ctx: EffectContext, duration: number) =>\n ctx.animate(el, [{ boxShadow: `0 0 0 0 ${color}` }, { boxShadow: `0 0 0 4px ${color}`, offset: 0.3 }, { boxShadow: '0 0 0 0 transparent' }], { duration })?.finished.catch(() => undefined);\n\nexport const FORM_FX: EffectDefinition[] = [\n {\n name: 'field-shake',\n kind: 'attention',\n description: 'Shakes the element sideways with a red outline flash — the \"invalid\" cue (`distance`, `color`).',\n defaults: { distance: 8, color: 'rgba(225,29,72,.55)', duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration + 200);\n if (ctx.reduced) return r;\n return ctx.animate(el, shakeFrames(Number(o.distance) || 8), { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'field-success',\n kind: 'attention',\n description: 'A green glow pulses round the element and a check badge pops on its corner (`color`).',\n defaults: { color: 'rgba(22,163,74,.5)', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const r = ring(el, o.color, ctx, o.duration);\n if (ctx.reduced) return r;\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 b = document.createElement('span');\n b.setAttribute('aria-hidden', 'true');\n b.textContent = '✓';\n Object.assign(b.style, { position: 'absolute', right: '-6px', top: '-6px', width: '18px', height: '18px', borderRadius: '50%', background: '#16a34a', color: '#fff', font: '700 12px/18px system-ui,sans-serif', textAlign: 'center', pointerEvents: 'none' });\n el.appendChild(b);\n const end = () => b.remove();\n ctx.onCleanup(end);\n const a = ctx.animate(b, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.25)', opacity: 1, offset: 0.25 }, { transform: 'scale(1)', opacity: 1, offset: 0.4 }, { transform: 'scale(1)', opacity: 1, offset: 0.85 }, { transform: 'scale(.6)', opacity: 0 }], { duration: o.duration + 500, easing: 'ease-out' });\n return a ? a.finished.then(end, end) : (end(), undefined);\n },\n },\n {\n name: 'label-float',\n kind: 'enter',\n description: 'Every `label` (or `[data-label]`) inside rises and settles one after another, like floating labels (`stagger`).',\n defaults: { stagger: 80, duration: 450 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const marked = Array.from(el.querySelectorAll<HTMLElement>('[data-label]'));\n const labels = marked.length ? marked : Array.from(el.querySelectorAll<HTMLElement>('label'));\n const items = labels.length ? labels : [el];\n return Promise.all(\n items.map((l, i) =>\n ctx.reduced\n ? fade(l, ctx)\n : ctx.animate(l, [{ transform: 'translateY(14px) scale(1.12)', opacity: 0, transformOrigin: '0 50%' }, { transform: 'translateY(-3px) scale(.96)', opacity: 1, offset: 0.7 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n {\n name: 'form-cascade',\n kind: 'enter',\n description: \"The element's children (fields, buttons) slide in one after another (`stagger`, `distance`).\",\n defaults: { stagger: 70, distance: 18, duration: 500 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const kids = Array.from(el.children) as HTMLElement[];\n const items = kids.length ? kids : [el];\n return Promise.all(\n items.map((k, i) =>\n ctx.reduced\n ? fade(k, ctx)\n : ctx.animate(k, [{ transform: `translateY(${Number(o.distance) || 18}px)`, opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'backwards' })?.finished.catch(() => undefined)\n )\n ).then(() => undefined);\n },\n },\n];\n\n/** Register field-shake, field-success, label-float and form-cascade (7.7). */\nexport function registerFormPack(): void {\n registerEffects(FORM_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-game.cjs","sources":["../../src/components/fx2/game.ts"],"sourcesContent":["/**\n * 7.5 — Gamification motion (`motionary/fx/game`, also\n * `motionary/components/fx-game`):\n *\n * - `achievement-unlock` (attention) — the element slides in, a light sweep\n * crosses it and its icon (`[data-icon]` or first child) pops.\n * - `level-up` (attention) — a scale-up with a ring shockwave.\n * - `chest-open` (click) — the lid (`[data-lid]` or first child) flips open\n * and sparks fly out.\n * - `coin-burst` (click) — coins (`coin`, default 🪙) arc up and fall.\n * - `xp-gain` (enter) — a “+50 XP” label (`text` or `data-xp`) floats up and\n * fades.\n *\n * Reduced motion: unlock / level-up fade, chest-open sets the lid open,\n * coin-burst and xp-gain do nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */\nexport function throwPath(deg: number, power = 120, steps = 6, g = 2.2): { x: number; y: number }[] {\n const r = (deg * Math.PI) / 180;\n const vx = Math.sin(r) * power;\n const vy = -Math.cos(r) * power;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps;\n return { x: Math.round(vx * t), y: Math.round(vy * t + g * power * t * t * 0.5) };\n });\n}\n\nconst floater = (el: HTMLElement, text: string, css: Partial<CSSStyleDeclaration>): HTMLSpanElement => {\n const r = el.getBoundingClientRect();\n const s = document.createElement('span');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = text;\n Object.assign(s.style, { position: 'fixed', left: `${r.left + r.width / 2}px`, top: `${r.top + r.height / 2}px`, pointerEvents: 'none', zIndex: '2147483000', translate: '-50% -50%' }, css);\n document.body.appendChild(s);\n return s;\n};\n\nconst fin = (a: Animation | null | undefined, el: Element, ctx: EffectContext) => {\n const end = () => el.remove();\n if (a) a.finished.then(end, end);\n else end();\n ctx.onCleanup(end);\n return a?.finished.catch(() => undefined);\n};\n\nexport const GAME_FX: EffectDefinition[] = [\n {\n name: 'achievement-unlock',\n kind: 'attention',\n description: 'The element slides in, a light sweep crosses it and its icon (`[data-icon]` or first child) pops (`duration`).',\n defaults: { duration: 900 },\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 icon = (el.querySelector('[data-icon]') || el.firstElementChild) as HTMLElement | null;\n const a = ctx.animate(el, [{ transform: 'translateY(30px) scale(.9)', opacity: 0 }, { transform: 'translateY(-4px) scale(1.02)', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1 }], { duration: o.duration * 0.6, easing: 'cubic-bezier(.2,.9,.3,1)' });\n if (icon) ctx.animate(icon, [{ transform: 'scale(0) rotate(-30deg)' }, { transform: 'scale(1.4) rotate(10deg)', offset: 0.6 }, { transform: 'none' }], { duration: o.duration * 0.6, delay: o.duration * 0.3, easing: 'ease-out', fill: 'backwards' });\n const pos = getComputedStyle(el).position;\n if (pos === 'static') el.style.position = 'relative';\n const sh = document.createElement('span');\n sh.setAttribute('aria-hidden', 'true');\n Object.assign(sh.style, { position: 'absolute', inset: '0', borderRadius: 'inherit', pointerEvents: 'none', background: 'linear-gradient(110deg,transparent 35%,rgba(255,255,255,.7) 50%,transparent 65%)', backgroundSize: '250% 100%' });\n el.appendChild(sh);\n fin(ctx.animate(sh, [{ backgroundPosition: '120% 0' }, { backgroundPosition: '-20% 0' }], { duration: o.duration * 0.6, delay: o.duration * 0.4, easing: 'ease-in-out', fill: 'backwards' }), sh, ctx);\n return a?.finished.catch(() => undefined);\n },\n },\n {\n name: 'level-up',\n kind: 'attention',\n description: 'A scale-up with a ring shockwave in `color` (`color`, `duration`).',\n defaults: { color: '#facc15', duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0.5 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const r = el.getBoundingClientRect();\n const ring = floater(el, '', { width: `${Math.max(r.width, r.height)}px`, height: `${Math.max(r.width, r.height)}px`, borderRadius: '50%', border: `3px solid ${o.color}` });\n fin(ctx.animate(ring, [{ transform: 'scale(.4)', opacity: 1 }, { transform: 'scale(1.8)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), ring, ctx);\n return ctx.animate(el, [{ transform: 'scale(1)' }, { transform: 'scale(1.25)', offset: 0.3 }, { transform: 'scale(.95)', offset: 0.6 }, { transform: 'scale(1)' }], { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'chest-open',\n kind: 'click',\n description: 'The lid (`[data-lid]` or first child) flips open and sparks (`spark`) fly out (`count`).',\n defaults: { spark: '✨', count: 6, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lid = (el.querySelector('[data-lid]') || el.firstElementChild) as HTMLElement | null;\n el.setAttribute('data-open', '');\n if (lid) lid.style.transformOrigin = '50% 100%';\n if (ctx.reduced) return void (lid && (lid.style.transform = 'rotateX(110deg)'));\n if (lid) ctx.animate(lid, [{ transform: 'rotateX(0)' }, { transform: 'rotateX(125deg)', offset: 0.6 }, { transform: 'rotateX(110deg)' }], { duration: o.duration, easing: 'cubic-bezier(.3,1.5,.6,1)', fill: 'forwards' });\n const parts = Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.spark, { fontSize: '18px' });\n const deg = -60 + (120 * i) / Math.max(1, o.count - 1);\n const p = throwPath(deg, 90, 6, 1.2);\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) scale(${(1 - k / 12).toFixed(2)})`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: 150 + i * 30, easing: 'linear' }), s, ctx);\n });\n return Promise.all(parts);\n },\n },\n {\n name: 'coin-burst',\n kind: 'click',\n description: 'Coins (`coin`) arc up out of the element and fall away (`count`, `power`).',\n defaults: { coin: '🪙', count: 8, power: 140, duration: 900 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) =>\n Promise.all(\n Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.coin, { fontSize: '20px' });\n const p = throwPath(-50 + (100 * i) / Math.max(1, o.count - 1) + (Math.random() * 10 - 5), o.power * (0.8 + Math.random() * 0.4));\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) rotate(${k * 60}deg)`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: i * 25, easing: 'linear' }), s, ctx);\n })\n ),\n },\n {\n name: 'xp-gain',\n kind: 'enter',\n description: 'A “+50 XP” label (`text`, or `data-xp`) floats up from the element and fades (`color`).',\n defaults: { text: '', color: '#7c5cff', duration: 1100 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const s = floater(el, o.text || `+${el.dataset.xp || 10} XP`, { font: '800 16px/1 system-ui,sans-serif', color: o.color, textShadow: '0 1px 0 #fff' });\n return fin(ctx.animate(s, [{ transform: 'translateY(0) scale(.6)', opacity: 0 }, { transform: 'translateY(-18px) scale(1.15)', opacity: 1, offset: 0.25 }, { transform: 'translateY(-50px) scale(1)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), s, ctx);\n },\n },\n];\n\n/** Register the 7.5 gamification pack (idempotent). */\nexport function registerGamePack(): void {\n registerEffects(GAME_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-game.cjs","sources":["../../src/components/fx2/game.ts"],"sourcesContent":["/**\n * 7.5 — Gamification motion (`motionary/fx/game`, also\n * `motionary/components/fx-game`):\n *\n * - `achievement-unlock` (attention) — the element slides in, a light sweep\n * crosses it and its icon (`[data-icon]` or first child) pops.\n * - `level-up` (attention) — a scale-up with a ring shockwave.\n * - `chest-open` (click) — the lid (`[data-lid]` or first child) flips open\n * and sparks fly out.\n * - `coin-burst` (click) — coins (`coin`, default 🪙) arc up and fall.\n * - `xp-gain` (enter) — a “+50 XP” label (`text` or `data-xp`) floats up and\n * fades.\n *\n * Reduced motion: unlock / level-up fade, chest-open sets the lid open,\n * coin-burst and xp-gain do nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */\nexport function throwPath(deg: number, power = 120, steps = 6, g = 2.2): { x: number; y: number }[] {\n const r = (deg * Math.PI) / 180;\n const vx = Math.sin(r) * power;\n const vy = -Math.cos(r) * power;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps;\n return { x: Math.round(vx * t), y: Math.round(vy * t + g * power * t * t * 0.5) };\n });\n}\n\nconst floater = (el: HTMLElement, text: string, css: Partial<CSSStyleDeclaration>): HTMLSpanElement => {\n const r = el.getBoundingClientRect();\n const s = document.createElement('span');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = text;\n Object.assign(s.style, { position: 'fixed', left: `${r.left + r.width / 2}px`, top: `${r.top + r.height / 2}px`, pointerEvents: 'none', zIndex: '2147483000', translate: '-50% -50%' }, css);\n document.body.appendChild(s);\n return s;\n};\n\nconst fin = (a: Animation | null | undefined, el: Element, ctx: EffectContext) => {\n const end = () => el.remove();\n if (a) a.finished.then(end, end);\n else end();\n ctx.onCleanup(end);\n return a?.finished.catch(() => undefined);\n};\n\nexport const GAME_FX: EffectDefinition[] = [\n {\n name: 'achievement-unlock',\n kind: 'attention',\n description: 'The element slides in, a light sweep crosses it and its icon (`[data-icon]` or first child) pops (`duration`).',\n defaults: { duration: 900 },\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 icon = (el.querySelector('[data-icon]') || el.firstElementChild) as HTMLElement | null;\n const a = ctx.animate(el, [{ transform: 'translateY(30px) scale(.9)', opacity: 0 }, { transform: 'translateY(-4px) scale(1.02)', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1 }], { duration: o.duration * 0.6, easing: 'cubic-bezier(.2,.9,.3,1)' });\n if (icon) ctx.animate(icon, [{ transform: 'scale(0) rotate(-30deg)' }, { transform: 'scale(1.4) rotate(10deg)', offset: 0.6 }, { transform: 'none' }], { duration: o.duration * 0.6, delay: o.duration * 0.3, easing: 'ease-out', fill: 'backwards' });\n const pos = getComputedStyle(el).position;\n if (pos === 'static') el.style.position = 'relative';\n const sh = document.createElement('span');\n sh.setAttribute('aria-hidden', 'true');\n Object.assign(sh.style, { position: 'absolute', inset: '0', borderRadius: 'inherit', pointerEvents: 'none', background: 'linear-gradient(110deg,transparent 35%,rgba(255,255,255,.7) 50%,transparent 65%)', backgroundSize: '250% 100%' });\n el.appendChild(sh);\n fin(ctx.animate(sh, [{ backgroundPosition: '120% 0' }, { backgroundPosition: '-20% 0' }], { duration: o.duration * 0.6, delay: o.duration * 0.4, easing: 'ease-in-out', fill: 'backwards' }), sh, ctx);\n return a?.finished.catch(() => undefined);\n },\n },\n {\n name: 'level-up',\n kind: 'attention',\n description: 'A scale-up with a ring shockwave in `color` (`color`, `duration`).',\n defaults: { color: '#facc15', duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0.5 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const r = el.getBoundingClientRect();\n const ring = floater(el, '', { width: `${Math.max(r.width, r.height)}px`, height: `${Math.max(r.width, r.height)}px`, borderRadius: '50%', border: `3px solid ${o.color}` });\n fin(ctx.animate(ring, [{ transform: 'scale(.4)', opacity: 1 }, { transform: 'scale(1.8)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), ring, ctx);\n return ctx.animate(el, [{ transform: 'scale(1)' }, { transform: 'scale(1.25)', offset: 0.3 }, { transform: 'scale(.95)', offset: 0.6 }, { transform: 'scale(1)' }], { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'chest-open',\n kind: 'click',\n description: 'The lid (`[data-lid]` or first child) flips open and sparks (`spark`) fly out (`count`).',\n defaults: { spark: '✨', count: 6, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lid = (el.querySelector('[data-lid]') || el.firstElementChild) as HTMLElement | null;\n el.setAttribute('data-open', '');\n if (lid) lid.style.transformOrigin = '50% 100%';\n if (ctx.reduced) return void (lid && (lid.style.transform = 'rotateX(110deg)'));\n if (lid) ctx.animate(lid, [{ transform: 'rotateX(0)' }, { transform: 'rotateX(125deg)', offset: 0.6 }, { transform: 'rotateX(110deg)' }], { duration: o.duration, easing: 'cubic-bezier(.3,1.5,.6,1)', fill: 'forwards' });\n const parts = Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.spark, { fontSize: '18px' });\n const deg = -60 + (120 * i) / Math.max(1, o.count - 1);\n const p = throwPath(deg, 90, 6, 1.2);\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) scale(${(1 - k / 12).toFixed(2)})`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: 150 + i * 30, easing: 'linear' }), s, ctx);\n });\n return Promise.all(parts);\n },\n },\n {\n name: 'coin-burst',\n kind: 'click',\n description: 'Coins (`coin`) arc up out of the element and fall away (`count`, `power`).',\n defaults: { coin: '🪙', count: 8, power: 140, duration: 900 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) =>\n Promise.all(\n Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.coin, { fontSize: '20px' });\n const p = throwPath(-50 + (100 * i) / Math.max(1, o.count - 1) + (Math.random() * 10 - 5), o.power * (0.8 + Math.random() * 0.4));\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) rotate(${k * 60}deg)`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: i * 25, easing: 'linear' }), s, ctx);\n })\n ),\n },\n {\n name: 'xp-gain',\n kind: 'enter',\n description: 'A “+50 XP” label (`text`, or `data-xp`) floats up from the element and fades (`color`).',\n defaults: { text: '', color: '#7c5cff', duration: 1100 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const s = floater(el, o.text || `+${el.dataset.xp || 10} XP`, { font: '800 16px/1 system-ui,sans-serif', color: o.color, textShadow: '0 1px 0 #fff' });\n return fin(ctx.animate(s, [{ transform: 'translateY(0) scale(.6)', opacity: 0 }, { transform: 'translateY(-18px) scale(1.15)', opacity: 1, offset: 0.25 }, { transform: 'translateY(-50px) scale(1)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), s, ctx);\n },\n },\n];\n\n/** Register the 7.5 gamification pack (idempotent). */\nexport function registerGamePack(): void {\n registerEffects(GAME_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
|
/** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */
|
|
5
5
|
function throwPath(deg, power = 120, steps = 6, g = 2.2) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-game.js","sources":["../../src/components/fx2/game.ts"],"sourcesContent":["/**\n * 7.5 — Gamification motion (`motionary/fx/game`, also\n * `motionary/components/fx-game`):\n *\n * - `achievement-unlock` (attention) — the element slides in, a light sweep\n * crosses it and its icon (`[data-icon]` or first child) pops.\n * - `level-up` (attention) — a scale-up with a ring shockwave.\n * - `chest-open` (click) — the lid (`[data-lid]` or first child) flips open\n * and sparks fly out.\n * - `coin-burst` (click) — coins (`coin`, default 🪙) arc up and fall.\n * - `xp-gain` (enter) — a “+50 XP” label (`text` or `data-xp`) floats up and\n * fades.\n *\n * Reduced motion: unlock / level-up fade, chest-open sets the lid open,\n * coin-burst and xp-gain do nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */\nexport function throwPath(deg: number, power = 120, steps = 6, g = 2.2): { x: number; y: number }[] {\n const r = (deg * Math.PI) / 180;\n const vx = Math.sin(r) * power;\n const vy = -Math.cos(r) * power;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps;\n return { x: Math.round(vx * t), y: Math.round(vy * t + g * power * t * t * 0.5) };\n });\n}\n\nconst floater = (el: HTMLElement, text: string, css: Partial<CSSStyleDeclaration>): HTMLSpanElement => {\n const r = el.getBoundingClientRect();\n const s = document.createElement('span');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = text;\n Object.assign(s.style, { position: 'fixed', left: `${r.left + r.width / 2}px`, top: `${r.top + r.height / 2}px`, pointerEvents: 'none', zIndex: '2147483000', translate: '-50% -50%' }, css);\n document.body.appendChild(s);\n return s;\n};\n\nconst fin = (a: Animation | null | undefined, el: Element, ctx: EffectContext) => {\n const end = () => el.remove();\n if (a) a.finished.then(end, end);\n else end();\n ctx.onCleanup(end);\n return a?.finished.catch(() => undefined);\n};\n\nexport const GAME_FX: EffectDefinition[] = [\n {\n name: 'achievement-unlock',\n kind: 'attention',\n description: 'The element slides in, a light sweep crosses it and its icon (`[data-icon]` or first child) pops (`duration`).',\n defaults: { duration: 900 },\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 icon = (el.querySelector('[data-icon]') || el.firstElementChild) as HTMLElement | null;\n const a = ctx.animate(el, [{ transform: 'translateY(30px) scale(.9)', opacity: 0 }, { transform: 'translateY(-4px) scale(1.02)', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1 }], { duration: o.duration * 0.6, easing: 'cubic-bezier(.2,.9,.3,1)' });\n if (icon) ctx.animate(icon, [{ transform: 'scale(0) rotate(-30deg)' }, { transform: 'scale(1.4) rotate(10deg)', offset: 0.6 }, { transform: 'none' }], { duration: o.duration * 0.6, delay: o.duration * 0.3, easing: 'ease-out', fill: 'backwards' });\n const pos = getComputedStyle(el).position;\n if (pos === 'static') el.style.position = 'relative';\n const sh = document.createElement('span');\n sh.setAttribute('aria-hidden', 'true');\n Object.assign(sh.style, { position: 'absolute', inset: '0', borderRadius: 'inherit', pointerEvents: 'none', background: 'linear-gradient(110deg,transparent 35%,rgba(255,255,255,.7) 50%,transparent 65%)', backgroundSize: '250% 100%' });\n el.appendChild(sh);\n fin(ctx.animate(sh, [{ backgroundPosition: '120% 0' }, { backgroundPosition: '-20% 0' }], { duration: o.duration * 0.6, delay: o.duration * 0.4, easing: 'ease-in-out', fill: 'backwards' }), sh, ctx);\n return a?.finished.catch(() => undefined);\n },\n },\n {\n name: 'level-up',\n kind: 'attention',\n description: 'A scale-up with a ring shockwave in `color` (`color`, `duration`).',\n defaults: { color: '#facc15', duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0.5 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const r = el.getBoundingClientRect();\n const ring = floater(el, '', { width: `${Math.max(r.width, r.height)}px`, height: `${Math.max(r.width, r.height)}px`, borderRadius: '50%', border: `3px solid ${o.color}` });\n fin(ctx.animate(ring, [{ transform: 'scale(.4)', opacity: 1 }, { transform: 'scale(1.8)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), ring, ctx);\n return ctx.animate(el, [{ transform: 'scale(1)' }, { transform: 'scale(1.25)', offset: 0.3 }, { transform: 'scale(.95)', offset: 0.6 }, { transform: 'scale(1)' }], { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'chest-open',\n kind: 'click',\n description: 'The lid (`[data-lid]` or first child) flips open and sparks (`spark`) fly out (`count`).',\n defaults: { spark: '✨', count: 6, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lid = (el.querySelector('[data-lid]') || el.firstElementChild) as HTMLElement | null;\n el.setAttribute('data-open', '');\n if (lid) lid.style.transformOrigin = '50% 100%';\n if (ctx.reduced) return void (lid && (lid.style.transform = 'rotateX(110deg)'));\n if (lid) ctx.animate(lid, [{ transform: 'rotateX(0)' }, { transform: 'rotateX(125deg)', offset: 0.6 }, { transform: 'rotateX(110deg)' }], { duration: o.duration, easing: 'cubic-bezier(.3,1.5,.6,1)', fill: 'forwards' });\n const parts = Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.spark, { fontSize: '18px' });\n const deg = -60 + (120 * i) / Math.max(1, o.count - 1);\n const p = throwPath(deg, 90, 6, 1.2);\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) scale(${(1 - k / 12).toFixed(2)})`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: 150 + i * 30, easing: 'linear' }), s, ctx);\n });\n return Promise.all(parts);\n },\n },\n {\n name: 'coin-burst',\n kind: 'click',\n description: 'Coins (`coin`) arc up out of the element and fall away (`count`, `power`).',\n defaults: { coin: '🪙', count: 8, power: 140, duration: 900 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) =>\n Promise.all(\n Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.coin, { fontSize: '20px' });\n const p = throwPath(-50 + (100 * i) / Math.max(1, o.count - 1) + (Math.random() * 10 - 5), o.power * (0.8 + Math.random() * 0.4));\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) rotate(${k * 60}deg)`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: i * 25, easing: 'linear' }), s, ctx);\n })\n ),\n },\n {\n name: 'xp-gain',\n kind: 'enter',\n description: 'A “+50 XP” label (`text`, or `data-xp`) floats up from the element and fades (`color`).',\n defaults: { text: '', color: '#7c5cff', duration: 1100 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const s = floater(el, o.text || `+${el.dataset.xp || 10} XP`, { font: '800 16px/1 system-ui,sans-serif', color: o.color, textShadow: '0 1px 0 #fff' });\n return fin(ctx.animate(s, [{ transform: 'translateY(0) scale(.6)', opacity: 0 }, { transform: 'translateY(-18px) scale(1.15)', opacity: 1, offset: 0.25 }, { transform: 'translateY(-50px) scale(1)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), s, ctx);\n },\n },\n];\n\n/** Register the 7.5 gamification pack (idempotent). */\nexport function registerGamePack(): void {\n registerEffects(GAME_FX);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fx-game.js","sources":["../../src/components/fx2/game.ts"],"sourcesContent":["/**\n * 7.5 — Gamification motion (`motionary/fx/game`, also\n * `motionary/components/fx-game`):\n *\n * - `achievement-unlock` (attention) — the element slides in, a light sweep\n * crosses it and its icon (`[data-icon]` or first child) pops.\n * - `level-up` (attention) — a scale-up with a ring shockwave.\n * - `chest-open` (click) — the lid (`[data-lid]` or first child) flips open\n * and sparks fly out.\n * - `coin-burst` (click) — coins (`coin`, default 🪙) arc up and fall.\n * - `xp-gain` (enter) — a “+50 XP” label (`text` or `data-xp`) floats up and\n * fades.\n *\n * Reduced motion: unlock / level-up fade, chest-open sets the lid open,\n * coin-burst and xp-gain do nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */\nexport function throwPath(deg: number, power = 120, steps = 6, g = 2.2): { x: number; y: number }[] {\n const r = (deg * Math.PI) / 180;\n const vx = Math.sin(r) * power;\n const vy = -Math.cos(r) * power;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps;\n return { x: Math.round(vx * t), y: Math.round(vy * t + g * power * t * t * 0.5) };\n });\n}\n\nconst floater = (el: HTMLElement, text: string, css: Partial<CSSStyleDeclaration>): HTMLSpanElement => {\n const r = el.getBoundingClientRect();\n const s = document.createElement('span');\n s.setAttribute('aria-hidden', 'true');\n s.textContent = text;\n Object.assign(s.style, { position: 'fixed', left: `${r.left + r.width / 2}px`, top: `${r.top + r.height / 2}px`, pointerEvents: 'none', zIndex: '2147483000', translate: '-50% -50%' }, css);\n document.body.appendChild(s);\n return s;\n};\n\nconst fin = (a: Animation | null | undefined, el: Element, ctx: EffectContext) => {\n const end = () => el.remove();\n if (a) a.finished.then(end, end);\n else end();\n ctx.onCleanup(end);\n return a?.finished.catch(() => undefined);\n};\n\nexport const GAME_FX: EffectDefinition[] = [\n {\n name: 'achievement-unlock',\n kind: 'attention',\n description: 'The element slides in, a light sweep crosses it and its icon (`[data-icon]` or first child) pops (`duration`).',\n defaults: { duration: 900 },\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 icon = (el.querySelector('[data-icon]') || el.firstElementChild) as HTMLElement | null;\n const a = ctx.animate(el, [{ transform: 'translateY(30px) scale(.9)', opacity: 0 }, { transform: 'translateY(-4px) scale(1.02)', opacity: 1, offset: 0.5 }, { transform: 'none', opacity: 1 }], { duration: o.duration * 0.6, easing: 'cubic-bezier(.2,.9,.3,1)' });\n if (icon) ctx.animate(icon, [{ transform: 'scale(0) rotate(-30deg)' }, { transform: 'scale(1.4) rotate(10deg)', offset: 0.6 }, { transform: 'none' }], { duration: o.duration * 0.6, delay: o.duration * 0.3, easing: 'ease-out', fill: 'backwards' });\n const pos = getComputedStyle(el).position;\n if (pos === 'static') el.style.position = 'relative';\n const sh = document.createElement('span');\n sh.setAttribute('aria-hidden', 'true');\n Object.assign(sh.style, { position: 'absolute', inset: '0', borderRadius: 'inherit', pointerEvents: 'none', background: 'linear-gradient(110deg,transparent 35%,rgba(255,255,255,.7) 50%,transparent 65%)', backgroundSize: '250% 100%' });\n el.appendChild(sh);\n fin(ctx.animate(sh, [{ backgroundPosition: '120% 0' }, { backgroundPosition: '-20% 0' }], { duration: o.duration * 0.6, delay: o.duration * 0.4, easing: 'ease-in-out', fill: 'backwards' }), sh, ctx);\n return a?.finished.catch(() => undefined);\n },\n },\n {\n name: 'level-up',\n kind: 'attention',\n description: 'A scale-up with a ring shockwave in `color` (`color`, `duration`).',\n defaults: { color: '#facc15', duration: 800 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0.5 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const r = el.getBoundingClientRect();\n const ring = floater(el, '', { width: `${Math.max(r.width, r.height)}px`, height: `${Math.max(r.width, r.height)}px`, borderRadius: '50%', border: `3px solid ${o.color}` });\n fin(ctx.animate(ring, [{ transform: 'scale(.4)', opacity: 1 }, { transform: 'scale(1.8)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), ring, ctx);\n return ctx.animate(el, [{ transform: 'scale(1)' }, { transform: 'scale(1.25)', offset: 0.3 }, { transform: 'scale(.95)', offset: 0.6 }, { transform: 'scale(1)' }], { duration: o.duration, easing: 'ease-out' })?.finished.catch(() => undefined);\n },\n },\n {\n name: 'chest-open',\n kind: 'click',\n description: 'The lid (`[data-lid]` or first child) flips open and sparks (`spark`) fly out (`count`).',\n defaults: { spark: '✨', count: 6, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lid = (el.querySelector('[data-lid]') || el.firstElementChild) as HTMLElement | null;\n el.setAttribute('data-open', '');\n if (lid) lid.style.transformOrigin = '50% 100%';\n if (ctx.reduced) return void (lid && (lid.style.transform = 'rotateX(110deg)'));\n if (lid) ctx.animate(lid, [{ transform: 'rotateX(0)' }, { transform: 'rotateX(125deg)', offset: 0.6 }, { transform: 'rotateX(110deg)' }], { duration: o.duration, easing: 'cubic-bezier(.3,1.5,.6,1)', fill: 'forwards' });\n const parts = Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.spark, { fontSize: '18px' });\n const deg = -60 + (120 * i) / Math.max(1, o.count - 1);\n const p = throwPath(deg, 90, 6, 1.2);\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) scale(${(1 - k / 12).toFixed(2)})`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: 150 + i * 30, easing: 'linear' }), s, ctx);\n });\n return Promise.all(parts);\n },\n },\n {\n name: 'coin-burst',\n kind: 'click',\n description: 'Coins (`coin`) arc up out of the element and fall away (`count`, `power`).',\n defaults: { coin: '🪙', count: 8, power: 140, duration: 900 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) =>\n Promise.all(\n Array.from({ length: o.count }, (_, i) => {\n const s = floater(el, o.coin, { fontSize: '20px' });\n const p = throwPath(-50 + (100 * i) / Math.max(1, o.count - 1) + (Math.random() * 10 - 5), o.power * (0.8 + Math.random() * 0.4));\n return fin(ctx.animate(s, p.map((q, k) => ({ transform: `translate(${q.x}px,${q.y}px) rotate(${k * 60}deg)`, opacity: k === p.length - 1 ? 0 : 1 })), { duration: o.duration, delay: i * 25, easing: 'linear' }), s, ctx);\n })\n ),\n },\n {\n name: 'xp-gain',\n kind: 'enter',\n description: 'A “+50 XP” label (`text`, or `data-xp`) floats up from the element and fades (`color`).',\n defaults: { text: '', color: '#7c5cff', duration: 1100 },\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const s = floater(el, o.text || `+${el.dataset.xp || 10} XP`, { font: '800 16px/1 system-ui,sans-serif', color: o.color, textShadow: '0 1px 0 #fff' });\n return fin(ctx.animate(s, [{ transform: 'translateY(0) scale(.6)', opacity: 0 }, { transform: 'translateY(-18px) scale(1.15)', opacity: 1, offset: 0.25 }, { transform: 'translateY(-50px) scale(1)', opacity: 0 }], { duration: o.duration, easing: 'ease-out' }), s, ctx);\n },\n },\n];\n\n/** Register the 7.5 gamification pack (idempotent). */\nexport function registerGamePack(): void {\n registerEffects(GAME_FX);\n}\n"],"names":[],"mappings":"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"}
|