motionary 7.9.0 → 8.1.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.
Files changed (219) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +1 -1
  3. package/README_ja.md +1 -1
  4. package/README_zh.md +1 -1
  5. package/dist/chunks/{audio-DcPvT2Kh.js → audio-CynhhWDi.js} +3 -3
  6. package/dist/chunks/{audio-DcPvT2Kh.js.map → audio-CynhhWDi.js.map} +1 -1
  7. package/dist/chunks/{audio-EXUoijsG.cjs → audio-cgWbDkoY.cjs} +3 -3
  8. package/dist/chunks/{audio-EXUoijsG.cjs.map → audio-cgWbDkoY.cjs.map} +1 -1
  9. package/dist/chunks/{base-2-yYc93C.js → base-CLuqlLfG.js} +63 -6
  10. package/dist/chunks/base-CLuqlLfG.js.map +1 -0
  11. package/dist/chunks/{base-BaQV-2ha.cjs → base-DoRUZBy-.cjs} +66 -5
  12. package/dist/chunks/base-DoRUZBy-.cjs.map +1 -0
  13. package/dist/chunks/{builtins-HlqAkK0f.js → builtins-Bs4smevg.js} +3 -3
  14. package/dist/chunks/{builtins-HlqAkK0f.js.map → builtins-Bs4smevg.js.map} +1 -1
  15. package/dist/chunks/{builtins-xalxV2d5.cjs → builtins-ClXshqj-.cjs} +3 -3
  16. package/dist/chunks/{builtins-xalxV2d5.cjs.map → builtins-ClXshqj-.cjs.map} +1 -1
  17. package/dist/chunks/{core-DuO-AVXL.js → core-C3Taz-ew.js} +2 -2
  18. package/dist/chunks/{core-DuO-AVXL.js.map → core-C3Taz-ew.js.map} +1 -1
  19. package/dist/chunks/{core-D5rU0CV6.js → core-CiN5sqxB.js} +2 -2
  20. package/dist/chunks/{core-D5rU0CV6.js.map → core-CiN5sqxB.js.map} +1 -1
  21. package/dist/chunks/{core-BGAyaY6L.cjs → core-CwO835Wm.cjs} +2 -2
  22. package/dist/chunks/{core-BGAyaY6L.cjs.map → core-CwO835Wm.cjs.map} +1 -1
  23. package/dist/chunks/{core-zq17EeCI.cjs → core-O4grKHSa.cjs} +2 -2
  24. package/dist/chunks/{core-zq17EeCI.cjs.map → core-O4grKHSa.cjs.map} +1 -1
  25. package/dist/chunks/{fx-lBGVtQO1.cjs → fx-C-XjLOTc.cjs} +2 -2
  26. package/dist/chunks/{fx-lBGVtQO1.cjs.map → fx-C-XjLOTc.cjs.map} +1 -1
  27. package/dist/chunks/{fx-CMxWNwH8.js → fx-CQv3IxMf.js} +2 -2
  28. package/dist/chunks/{fx-CMxWNwH8.js.map → fx-CQv3IxMf.js.map} +1 -1
  29. package/dist/chunks/{gpu-DLPghVWr.js → gpu-CB8frFOD.js} +2 -2
  30. package/dist/chunks/{gpu-DLPghVWr.js.map → gpu-CB8frFOD.js.map} +1 -1
  31. package/dist/chunks/{gpu-Dx0H875w.cjs → gpu-CcdA2D2i.cjs} +2 -2
  32. package/dist/chunks/{gpu-Dx0H875w.cjs.map → gpu-CcdA2D2i.cjs.map} +1 -1
  33. package/dist/chunks/{index-tags-C04JP8g4.js → index-tags-B-JBecYg.js} +2 -2
  34. package/dist/chunks/index-tags-B-JBecYg.js.map +1 -0
  35. package/dist/chunks/{index-tags-BTMwrfgV.cjs → index-tags-hLIF2Clq.cjs} +2 -2
  36. package/dist/chunks/index-tags-hLIF2Clq.cjs.map +1 -0
  37. package/dist/chunks/{player-PS6_FzNw.cjs → player-C2n17sdH.cjs} +4 -4
  38. package/dist/chunks/{player-PS6_FzNw.cjs.map → player-C2n17sdH.cjs.map} +1 -1
  39. package/dist/chunks/{player-DxvCYo7Q.js → player-YzQGkKaW.js} +4 -4
  40. package/dist/chunks/{player-DxvCYo7Q.js.map → player-YzQGkKaW.js.map} +1 -1
  41. package/dist/chunks/{registry-DehBVRDV.cjs → registry-BVklOepd.cjs} +2 -2
  42. package/dist/chunks/{registry-DehBVRDV.cjs.map → registry-BVklOepd.cjs.map} +1 -1
  43. package/dist/chunks/{registry-CyKExAmE.js → registry-CnO7ZVPK.js} +2 -2
  44. package/dist/chunks/{registry-CyKExAmE.js.map → registry-CnO7ZVPK.js.map} +1 -1
  45. package/dist/chunks/{spring-BK8DiezC.js → spring-BFKNHmfl.js} +2 -2
  46. package/dist/chunks/{spring-BK8DiezC.js.map → spring-BFKNHmfl.js.map} +1 -1
  47. package/dist/chunks/{spring-Dgx187Vh.cjs → spring-uQMVJTj9.cjs} +2 -2
  48. package/dist/chunks/{spring-Dgx187Vh.cjs.map → spring-uQMVJTj9.cjs.map} +1 -1
  49. package/dist/chunks/{variants-BQ6bhzn4.js → variants-B-zKORvt.js} +2 -2
  50. package/dist/chunks/{variants-BQ6bhzn4.js.map → variants-B-zKORvt.js.map} +1 -1
  51. package/dist/chunks/{variants-BhjyddG8.cjs → variants-DagykrKH.cjs} +2 -2
  52. package/dist/chunks/{variants-BhjyddG8.cjs.map → variants-DagykrKH.cjs.map} +1 -1
  53. package/dist/components/a11y.cjs +2 -2
  54. package/dist/components/a11y.d.cts +1 -1
  55. package/dist/components/a11y.d.ts +1 -1
  56. package/dist/components/a11y.js +3 -3
  57. package/dist/components/angular.cjs +9 -9
  58. package/dist/components/angular.d.cts +2 -18
  59. package/dist/components/angular.d.ts +2 -18
  60. package/dist/components/angular.js +9 -9
  61. package/dist/components/background.cjs +2 -2
  62. package/dist/components/background.js +2 -2
  63. package/dist/components/bridge.cjs +1 -1
  64. package/dist/components/bridge.js +1 -1
  65. package/dist/components/cards.cjs +2 -2
  66. package/dist/components/cards.js +2 -2
  67. package/dist/components/click.cjs +3 -3
  68. package/dist/components/click.js +3 -3
  69. package/dist/components/depth.cjs +3 -3
  70. package/dist/components/depth.js +3 -3
  71. package/dist/components/effects.cjs +7 -7
  72. package/dist/components/effects.js +9 -9
  73. package/dist/components/engine.cjs +266 -0
  74. package/dist/components/engine.cjs.map +1 -0
  75. package/dist/components/engine.d.cts +105 -0
  76. package/dist/components/engine.d.ts +105 -0
  77. package/dist/components/engine.js +255 -0
  78. package/dist/components/engine.js.map +1 -0
  79. package/dist/components/feedback.cjs +1 -1
  80. package/dist/components/feedback.js +1 -1
  81. package/dist/components/fx-3d.cjs +2 -2
  82. package/dist/components/fx-3d.js +2 -2
  83. package/dist/components/fx-ai.cjs +2 -2
  84. package/dist/components/fx-ai.js +2 -2
  85. package/dist/components/fx-chart.cjs +2 -2
  86. package/dist/components/fx-chart.js +2 -2
  87. package/dist/components/fx-festival.cjs +121 -0
  88. package/dist/components/fx-festival.cjs.map +1 -0
  89. package/dist/components/fx-festival.d.cts +69 -0
  90. package/dist/components/fx-festival.d.ts +69 -0
  91. package/dist/components/fx-festival.js +117 -0
  92. package/dist/components/fx-festival.js.map +1 -0
  93. package/dist/components/fx-focus.cjs +2 -2
  94. package/dist/components/fx-focus.js +2 -2
  95. package/dist/components/fx-form.cjs +2 -2
  96. package/dist/components/fx-form.js +2 -2
  97. package/dist/components/fx-game.cjs +2 -2
  98. package/dist/components/fx-game.js +2 -2
  99. package/dist/components/fx-geo.cjs +2 -2
  100. package/dist/components/fx-geo.js +2 -2
  101. package/dist/components/fx-gpu.cjs +3 -3
  102. package/dist/components/fx-gpu.js +3 -3
  103. package/dist/components/fx-light.cjs +2 -2
  104. package/dist/components/fx-light.js +2 -2
  105. package/dist/components/fx-morph.cjs +2 -2
  106. package/dist/components/fx-morph.js +2 -2
  107. package/dist/components/fx-music.cjs +3 -3
  108. package/dist/components/fx-music.js +3 -3
  109. package/dist/components/fx-physics.cjs +2 -2
  110. package/dist/components/fx-physics.js +2 -2
  111. package/dist/components/fx-shop.cjs +2 -2
  112. package/dist/components/fx-shop.js +2 -2
  113. package/dist/components/fx-social.cjs +2 -2
  114. package/dist/components/fx-social.js +2 -2
  115. package/dist/components/fx-text.cjs +2 -2
  116. package/dist/components/fx-text.js +2 -2
  117. package/dist/components/fx-transitions.cjs +3 -3
  118. package/dist/components/fx-transitions.js +3 -3
  119. package/dist/components/fx-weather.cjs +2 -2
  120. package/dist/components/fx-weather.js +2 -2
  121. package/dist/components/fx.cjs +5 -5
  122. package/dist/components/fx.js +6 -6
  123. package/dist/components/fx2.cjs +10 -4
  124. package/dist/components/fx2.cjs.map +1 -1
  125. package/dist/components/fx2.d.cts +26 -1
  126. package/dist/components/fx2.d.ts +26 -1
  127. package/dist/components/fx2.js +10 -6
  128. package/dist/components/fx2.js.map +1 -1
  129. package/dist/components/gesture.cjs +3 -3
  130. package/dist/components/gesture.js +4 -4
  131. package/dist/components/interaction.cjs +1 -1
  132. package/dist/components/interaction.js +1 -1
  133. package/dist/components/jsx.d.cts +1 -1
  134. package/dist/components/jsx.d.ts +1 -1
  135. package/dist/components/layout.cjs +1 -1
  136. package/dist/components/layout.js +1 -1
  137. package/dist/components/lazy.cjs +1 -1
  138. package/dist/components/lazy.d.cts +1 -1
  139. package/dist/components/lazy.d.ts +1 -1
  140. package/dist/components/lazy.js +1 -1
  141. package/dist/components/lite.cjs +151 -206
  142. package/dist/components/lite.cjs.map +1 -1
  143. package/dist/components/lite.js +152 -206
  144. package/dist/components/lite.js.map +1 -1
  145. package/dist/components/marketplace.cjs +2 -2
  146. package/dist/components/marketplace.js +2 -2
  147. package/dist/components/packs.cjs +1 -1
  148. package/dist/components/packs.js +1 -1
  149. package/dist/components/page.cjs +2 -2
  150. package/dist/components/page.js +3 -3
  151. package/dist/components/perf.cjs +2 -2
  152. package/dist/components/perf.d.cts +1 -1
  153. package/dist/components/perf.d.ts +1 -1
  154. package/dist/components/perf.js +3 -3
  155. package/dist/components/physics.cjs +2 -2
  156. package/dist/components/physics.js +3 -3
  157. package/dist/components/react.cjs +1 -1
  158. package/dist/components/react.js +1 -1
  159. package/dist/components/reveal.cjs +1 -1
  160. package/dist/components/reveal.js +1 -1
  161. package/dist/components/solid.cjs +9 -9
  162. package/dist/components/solid.d.cts +2 -18
  163. package/dist/components/solid.d.ts +2 -18
  164. package/dist/components/solid.js +9 -9
  165. package/dist/components/svelte.cjs +9 -9
  166. package/dist/components/svelte.d.cts +2 -18
  167. package/dist/components/svelte.d.ts +2 -18
  168. package/dist/components/svelte.js +9 -9
  169. package/dist/components/svg.cjs +1 -1
  170. package/dist/components/svg.js +1 -1
  171. package/dist/components/text.cjs +2 -2
  172. package/dist/components/text.js +2 -2
  173. package/dist/components/timeline.cjs +2 -2
  174. package/dist/components/timeline.js +3 -3
  175. package/dist/components/transitions.cjs +1 -1
  176. package/dist/components/transitions.js +1 -1
  177. package/dist/components/ui.cjs +17 -108
  178. package/dist/components/ui.cjs.map +1 -1
  179. package/dist/components/ui.css +0 -1
  180. package/dist/components/ui.d.cts +3 -20
  181. package/dist/components/ui.d.ts +3 -20
  182. package/dist/components/ui.js +19 -109
  183. package/dist/components/ui.js.map +1 -1
  184. package/dist/components/vue.cjs +9 -9
  185. package/dist/components/vue.d.cts +2 -18
  186. package/dist/components/vue.d.ts +2 -18
  187. package/dist/components/vue.js +9 -9
  188. package/dist/components/webgl.cjs +1 -1
  189. package/dist/components/webgl.js +1 -1
  190. package/dist/components/widgets.cjs +373 -146
  191. package/dist/components/widgets.cjs.map +1 -1
  192. package/dist/components/widgets.d.cts +110 -2
  193. package/dist/components/widgets.d.ts +110 -2
  194. package/dist/components/widgets.js +369 -147
  195. package/dist/components/widgets.js.map +1 -1
  196. package/dist/components.cjs +9 -10
  197. package/dist/components.cjs.map +1 -1
  198. package/dist/components.css +0 -1
  199. package/dist/components.d.cts +4 -21
  200. package/dist/components.d.ts +4 -21
  201. package/dist/components.js +12 -12
  202. package/dist/components.umd.js +2 -2
  203. package/dist/components.umd.js.map +1 -1
  204. package/dist/index.cjs +2 -2
  205. package/dist/index.js +2 -2
  206. package/dist/index.umd.js +2 -2
  207. package/dist/index.umd.js.map +1 -1
  208. package/dist/widgets.umd.js +1 -1
  209. package/dist/widgets.umd.js.map +1 -1
  210. package/docs/ROADMAP.md +14 -12
  211. package/docs/accessibility.md +1 -2
  212. package/docs/components.md +44 -1
  213. package/docs/deprecations.md +1 -1
  214. package/docs/upgrading-8.md +9 -6
  215. package/package.json +41 -1
  216. package/dist/chunks/base-2-yYc93C.js.map +0 -1
  217. package/dist/chunks/base-BaQV-2ha.cjs.map +0 -1
  218. package/dist/chunks/index-tags-BTMwrfgV.cjs.map +0 -1
  219. package/dist/chunks/index-tags-C04JP8g4.js.map +0 -1
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
+ require('../chunks/base-DoRUZBy-.cjs');
5
+
6
+ /** Evenly spread spark directions with a little jitter (8.1). */
7
+ function sparkVectors(n, radius, seed = 1) {
8
+ let s = seed;
9
+ const rnd = () => ((s = (s * 9301 + 49297) % 233280) / 233280);
10
+ return Array.from({ length: n }, (_, i) => {
11
+ const a = (i / n) * Math.PI * 2 + (rnd() - 0.5) * 0.3;
12
+ const r = radius * (0.7 + rnd() * 0.3);
13
+ return { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r) };
14
+ });
15
+ }
16
+ const layer = (el, ctx) => {
17
+ if (getComputedStyle(el).position === 'static') {
18
+ const prev = el.style.position;
19
+ el.style.position = 'relative';
20
+ ctx.onCleanup(() => (el.style.position = prev));
21
+ }
22
+ const l = document.createElement('span');
23
+ l.setAttribute('aria-hidden', 'true');
24
+ Object.assign(l.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible' });
25
+ el.appendChild(l);
26
+ ctx.onCleanup(() => l.remove());
27
+ return l;
28
+ };
29
+ const dot = (parent, css, text = '') => {
30
+ const d = document.createElement('span');
31
+ d.textContent = text;
32
+ Object.assign(d.style, { position: 'absolute', left: '50%', top: '50%', ...css });
33
+ parent.appendChild(d);
34
+ return d;
35
+ };
36
+ const FESTIVAL_FX = [
37
+ {
38
+ name: 'firework-burst',
39
+ kind: 'attention',
40
+ description: 'Rockets of sparks burst out of the element in festive colours (`bursts`, `colors`).',
41
+ defaults: { bursts: 3, colors: '#f43f5e,#f59e0b,#22d3ee,#a855f7,#facc15', duration: 900 },
42
+ run: (el, o, ctx) => {
43
+ if (ctx.reduced)
44
+ return;
45
+ const l = layer(el, ctx);
46
+ const colors = String(o.colors).split(',');
47
+ const r = el.getBoundingClientRect();
48
+ const runs = [];
49
+ const n = Math.max(1, Math.min(6, Number(o.bursts) || 3));
50
+ for (let b = 0; b < n; b++) {
51
+ const cx = (b - (n - 1) / 2) * Math.min(60, (r.width || 120) / n);
52
+ const cy = -((r.height || 60) * 0.25) - (b % 2) * 18;
53
+ const col = colors[b % colors.length];
54
+ sparkVectors(14, 46 + b * 6, b + 3).forEach((v) => {
55
+ const s = dot(l, { width: '5px', height: '5px', marginLeft: '-2.5px', marginTop: '-2.5px', borderRadius: '50%', background: col, boxShadow: `0 0 6px ${col}` });
56
+ 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' });
57
+ runs.push(a ? a.finished.then(() => s.remove(), () => s.remove()) : Promise.resolve(s.remove()));
58
+ });
59
+ }
60
+ return Promise.all(runs).then(() => l.remove());
61
+ },
62
+ },
63
+ {
64
+ name: 'lantern-rise',
65
+ kind: 'enter',
66
+ description: 'The element floats up and sways in like a Lunar New Year lantern (`sway` degrees).',
67
+ defaults: { sway: 8, duration: 1400 },
68
+ run: (el, o, ctx) => {
69
+ if (ctx.reduced)
70
+ return ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);
71
+ const w = Number(o.sway) || 8;
72
+ return ctx
73
+ .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' })
74
+ ?.finished.catch(() => undefined);
75
+ },
76
+ },
77
+ {
78
+ name: 'xmas-snow',
79
+ kind: 'loop',
80
+ description: 'Snowflakes drift down over the element until the cleanup runs (`flakes`).',
81
+ defaults: { flakes: 18, duration: 4000 },
82
+ run: (el, o, ctx) => {
83
+ const l = layer(el, ctx);
84
+ l.style.overflow = 'hidden';
85
+ const n = Math.max(4, Math.min(60, Number(o.flakes) || 18));
86
+ const anims = Array.from({ length: n }, (_, i) => {
87
+ const x = (i * 37) % 100;
88
+ const size = 8 + ((i * 7) % 9);
89
+ const f = dot(l, { left: `${x}%`, top: '-14px', fontSize: `${size}px`, color: '#fff', textShadow: '0 0 3px rgba(148,163,184,.9)', lineHeight: '1' }, '❄');
90
+ const drift = ((i % 5) - 2) * 12;
91
+ 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' });
92
+ });
93
+ return () => {
94
+ anims.forEach((a) => a?.cancel());
95
+ l.remove();
96
+ };
97
+ },
98
+ },
99
+ {
100
+ name: 'spooky-float',
101
+ kind: 'attention',
102
+ description: 'The element wobbles, rises and flickers like a Halloween ghost (`cycles`).',
103
+ defaults: { cycles: 2, duration: 1200 },
104
+ run: (el, o, ctx) => {
105
+ if (ctx.reduced)
106
+ return;
107
+ return ctx
108
+ .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' })
109
+ ?.finished.catch(() => undefined);
110
+ },
111
+ },
112
+ ];
113
+ /** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */
114
+ function registerFestivalPack() {
115
+ registry.registerEffects(FESTIVAL_FX);
116
+ }
117
+
118
+ exports.FESTIVAL_FX = FESTIVAL_FX;
119
+ exports.registerFestivalPack = registerFestivalPack;
120
+ exports.sparkVectors = sparkVectors;
121
+ //# sourceMappingURL=fx-festival.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-festival.cjs","sources":["../../src/components/fx2/festival.ts"],"sourcesContent":["/**\n * 8.1 — Festival packs (`motionary/fx/festival`, also `motionary/components/fx-festival`):\n *\n * - `firework-burst` (attention) — rockets of sparks burst out of the element\n * in festive colours (`bursts`, `colors`).\n * - `lantern-rise` (enter) — the element floats up and sways in like a\n * Lunar New Year lantern (`sway`).\n * - `xmas-snow` (loop) — snowflakes drift down over the element; the cleanup\n * stops them (`flakes`).\n * - `spooky-float` (attention) — the element wobbles and fades like a\n * Halloween ghost (`cycles`).\n *\n * Reduced motion: firework-burst / spooky-float do nothing, xmas-snow is\n * skipped, lantern-rise fades in. Particles are `aria-hidden` and removed.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\n\n/** Evenly spread spark directions with a little jitter (8.1). */\nexport function sparkVectors(n: number, radius: number, seed = 1): { x: number; y: number }[] {\n let s = seed;\n const rnd = () => ((s = (s * 9301 + 49297) % 233280) / 233280);\n return Array.from({ length: n }, (_, i) => {\n const a = (i / n) * Math.PI * 2 + (rnd() - 0.5) * 0.3;\n const r = radius * (0.7 + rnd() * 0.3);\n return { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r) };\n });\n}\n\nconst layer = (el: HTMLElement, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') {\n const prev = el.style.position;\n el.style.position = 'relative';\n ctx.onCleanup(() => (el.style.position = prev));\n }\n const l = document.createElement('span');\n l.setAttribute('aria-hidden', 'true');\n Object.assign(l.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible' });\n el.appendChild(l);\n ctx.onCleanup(() => l.remove());\n return l;\n};\nconst dot = (parent: HTMLElement, css: Partial<CSSStyleDeclaration>, text = '') => {\n const d = document.createElement('span');\n d.textContent = text;\n Object.assign(d.style, { position: 'absolute', left: '50%', top: '50%', ...css });\n parent.appendChild(d);\n return d;\n};\n\nexport const FESTIVAL_FX: EffectDefinition[] = [\n {\n name: 'firework-burst',\n kind: 'attention',\n description: 'Rockets of sparks burst out of the element in festive colours (`bursts`, `colors`).',\n defaults: { bursts: 3, colors: '#f43f5e,#f59e0b,#22d3ee,#a855f7,#facc15', duration: 900 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n const l = layer(el, ctx);\n const colors = String(o.colors).split(',');\n const r = el.getBoundingClientRect();\n const runs: Promise<unknown>[] = [];\n const n = Math.max(1, Math.min(6, Number(o.bursts) || 3));\n for (let b = 0; b < n; b++) {\n const cx = (b - (n - 1) / 2) * Math.min(60, (r.width || 120) / n);\n const cy = -((r.height || 60) * 0.25) - (b % 2) * 18;\n const col = colors[b % colors.length];\n sparkVectors(14, 46 + b * 6, b + 3).forEach((v) => {\n const s = dot(l, { width: '5px', height: '5px', marginLeft: '-2.5px', marginTop: '-2.5px', borderRadius: '50%', background: col, boxShadow: `0 0 6px ${col}` });\n const a = ctx.animate(s, [{ transform: `translate(${cx}px,${cy + 40}px) scale(.4)`, opacity: 0 }, { transform: `translate(${cx}px,${cy}px) scale(1)`, opacity: 1, offset: 0.25 }, { transform: `translate(${cx + v.x}px,${cy + v.y + 18}px) scale(.3)`, opacity: 0 }], { duration: o.duration, delay: b * 220, easing: 'cubic-bezier(.2,.7,.3,1)', fill: 'backwards' });\n runs.push(a ? a.finished.then(() => s.remove(), () => s.remove()) : Promise.resolve(s.remove()));\n });\n }\n return Promise.all(runs).then(() => l.remove());\n },\n },\n {\n name: 'lantern-rise',\n kind: 'enter',\n description: 'The element floats up and sways in like a Lunar New Year lantern (`sway` degrees).',\n defaults: { sway: 8, duration: 1400 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);\n const w = Number(o.sway) || 8;\n return ctx\n .animate(el, [{ transform: `translateY(60px) rotate(${-w}deg)`, opacity: 0, transformOrigin: '50% 0' }, { transform: `translateY(-6px) rotate(${w * 0.6}deg)`, opacity: 1, offset: 0.55, transformOrigin: '50% 0' }, { transform: `translateY(0) rotate(${-w * 0.3}deg)`, offset: 0.8, transformOrigin: '50% 0' }, { transform: 'none', opacity: 1, transformOrigin: '50% 0' }], { duration: o.duration, easing: 'ease-out', fill: 'backwards' })\n ?.finished.catch(() => undefined);\n },\n },\n {\n name: 'xmas-snow',\n kind: 'loop',\n description: 'Snowflakes drift down over the element until the cleanup runs (`flakes`).',\n defaults: { flakes: 18, duration: 4000 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const l = layer(el, ctx);\n l.style.overflow = 'hidden';\n const n = Math.max(4, Math.min(60, Number(o.flakes) || 18));\n const anims = Array.from({ length: n }, (_, i) => {\n const x = (i * 37) % 100;\n const size = 8 + ((i * 7) % 9);\n const f = dot(l, { left: `${x}%`, top: '-14px', fontSize: `${size}px`, color: '#fff', textShadow: '0 0 3px rgba(148,163,184,.9)', lineHeight: '1' }, '❄');\n const drift = ((i % 5) - 2) * 12;\n return ctx.animate(f, [{ transform: 'translate(0,0) rotate(0)' }, { transform: `translate(${drift}px, calc(${el.clientHeight || 160}px + 20px)) rotate(180deg)` }], { duration: o.duration * (0.7 + ((i * 13) % 6) / 10), delay: -((i * 331) % o.duration), iterations: Infinity, easing: 'linear' });\n });\n return () => {\n anims.forEach((a) => a?.cancel());\n l.remove();\n };\n },\n },\n {\n name: 'spooky-float',\n kind: 'attention',\n description: 'The element wobbles, rises and flickers like a Halloween ghost (`cycles`).',\n defaults: { cycles: 2, duration: 1200 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (ctx.reduced) return;\n return ctx\n .animate(el, [{ transform: 'none', opacity: 1 }, { transform: 'translate(-4px,-10px) rotate(-4deg) skewX(3deg)', opacity: 0.55, offset: 0.3 }, { transform: 'translate(4px,-14px) rotate(4deg) skewX(-3deg)', opacity: 0.85, offset: 0.65 }, { transform: 'none', opacity: 1 }], { duration: o.duration, iterations: Math.max(1, Math.min(6, Number(o.cycles) || 2)), easing: 'ease-in-out' })\n ?.finished.catch(() => undefined);\n },\n },\n];\n\n/** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */\nexport function registerFestivalPack(): void {\n registerEffects(FESTIVAL_FX);\n}\n"],"names":["registerEffects"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ type MotionSensitivity = 'full' | 'gentle' | 'minimal' | 'static';
2
+ type Cleanup = () => void;
3
+
4
+ /**
5
+ * 5.0 — unified plugin-style effect registration. Every effect (built-in or
6
+ * yours) is a plain object registered once and played the same way:
7
+ * `playEffect(el, name)`, `bindEffect(el, name, { trigger })` or
8
+ * `<usa-fx effect="name" trigger="click">`. Effects get a context that
9
+ * already applies reduced motion, motion sensitivity, intensity and the
10
+ * animation budget.
11
+ */
12
+
13
+ declare const EFFECT_KINDS: readonly ["enter", "exit", "attention", "click", "hover", "card", "loop", "page", "background", "text", "cursor", "scroll"];
14
+ type EffectKind = (typeof EFFECT_KINDS)[number];
15
+ interface EffectContext {
16
+ /** Reduced motion applies (OS setting, `minimal` / `static` sensitivity). */
17
+ readonly reduced: boolean;
18
+ readonly sensitivity: MotionSensitivity;
19
+ /** The triggering event (pointer position for click effects), if any. */
20
+ readonly event?: Event;
21
+ /** `el.animate()` with the library's motion rules (may return `null`). */
22
+ animate(el: Element, keyframes: Keyframe[], options: KeyframeAnimationOptions): Animation | null;
23
+ /** Register teardown for long-running effects (loops, listeners). */
24
+ onCleanup(fn: Cleanup): void;
25
+ }
26
+ interface EffectDefinition<O extends Record<string, unknown> = Record<string, any>> {
27
+ /** Unique, kebab-case. */
28
+ name: string;
29
+ kind: EffectKind;
30
+ /** One line for docs and the gallery. */
31
+ description?: string;
32
+ /** Option defaults (merged under the caller's options). */
33
+ defaults?: Partial<O>;
34
+ /**
35
+ * Under reduced motion: `'skip'` (do nothing — default for loop, background
36
+ * and cursor effects) or `'run'` (run with `ctx.reduced === true`, the
37
+ * effect degrades itself — default for everything else).
38
+ */
39
+ reduced?: 'skip' | 'run';
40
+ /** Play the effect. Return an Animation / Promise to be awaited, or a cleanup. */
41
+ run(el: HTMLElement, options: O, ctx: EffectContext): void | Cleanup | Animation | null | Promise<unknown>;
42
+ }
43
+
44
+ /**
45
+ * 8.1 — Festival packs (`motionary/fx/festival`, also `motionary/components/fx-festival`):
46
+ *
47
+ * - `firework-burst` (attention) — rockets of sparks burst out of the element
48
+ * in festive colours (`bursts`, `colors`).
49
+ * - `lantern-rise` (enter) — the element floats up and sways in like a
50
+ * Lunar New Year lantern (`sway`).
51
+ * - `xmas-snow` (loop) — snowflakes drift down over the element; the cleanup
52
+ * stops them (`flakes`).
53
+ * - `spooky-float` (attention) — the element wobbles and fades like a
54
+ * Halloween ghost (`cycles`).
55
+ *
56
+ * Reduced motion: firework-burst / spooky-float do nothing, xmas-snow is
57
+ * skipped, lantern-rise fades in. Particles are `aria-hidden` and removed.
58
+ */
59
+
60
+ /** Evenly spread spark directions with a little jitter (8.1). */
61
+ declare function sparkVectors(n: number, radius: number, seed?: number): {
62
+ x: number;
63
+ y: number;
64
+ }[];
65
+ declare const FESTIVAL_FX: EffectDefinition[];
66
+ /** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */
67
+ declare function registerFestivalPack(): void;
68
+
69
+ export { FESTIVAL_FX, registerFestivalPack, sparkVectors };
@@ -0,0 +1,69 @@
1
+ type MotionSensitivity = 'full' | 'gentle' | 'minimal' | 'static';
2
+ type Cleanup = () => void;
3
+
4
+ /**
5
+ * 5.0 — unified plugin-style effect registration. Every effect (built-in or
6
+ * yours) is a plain object registered once and played the same way:
7
+ * `playEffect(el, name)`, `bindEffect(el, name, { trigger })` or
8
+ * `<usa-fx effect="name" trigger="click">`. Effects get a context that
9
+ * already applies reduced motion, motion sensitivity, intensity and the
10
+ * animation budget.
11
+ */
12
+
13
+ declare const EFFECT_KINDS: readonly ["enter", "exit", "attention", "click", "hover", "card", "loop", "page", "background", "text", "cursor", "scroll"];
14
+ type EffectKind = (typeof EFFECT_KINDS)[number];
15
+ interface EffectContext {
16
+ /** Reduced motion applies (OS setting, `minimal` / `static` sensitivity). */
17
+ readonly reduced: boolean;
18
+ readonly sensitivity: MotionSensitivity;
19
+ /** The triggering event (pointer position for click effects), if any. */
20
+ readonly event?: Event;
21
+ /** `el.animate()` with the library's motion rules (may return `null`). */
22
+ animate(el: Element, keyframes: Keyframe[], options: KeyframeAnimationOptions): Animation | null;
23
+ /** Register teardown for long-running effects (loops, listeners). */
24
+ onCleanup(fn: Cleanup): void;
25
+ }
26
+ interface EffectDefinition<O extends Record<string, unknown> = Record<string, any>> {
27
+ /** Unique, kebab-case. */
28
+ name: string;
29
+ kind: EffectKind;
30
+ /** One line for docs and the gallery. */
31
+ description?: string;
32
+ /** Option defaults (merged under the caller's options). */
33
+ defaults?: Partial<O>;
34
+ /**
35
+ * Under reduced motion: `'skip'` (do nothing — default for loop, background
36
+ * and cursor effects) or `'run'` (run with `ctx.reduced === true`, the
37
+ * effect degrades itself — default for everything else).
38
+ */
39
+ reduced?: 'skip' | 'run';
40
+ /** Play the effect. Return an Animation / Promise to be awaited, or a cleanup. */
41
+ run(el: HTMLElement, options: O, ctx: EffectContext): void | Cleanup | Animation | null | Promise<unknown>;
42
+ }
43
+
44
+ /**
45
+ * 8.1 — Festival packs (`motionary/fx/festival`, also `motionary/components/fx-festival`):
46
+ *
47
+ * - `firework-burst` (attention) — rockets of sparks burst out of the element
48
+ * in festive colours (`bursts`, `colors`).
49
+ * - `lantern-rise` (enter) — the element floats up and sways in like a
50
+ * Lunar New Year lantern (`sway`).
51
+ * - `xmas-snow` (loop) — snowflakes drift down over the element; the cleanup
52
+ * stops them (`flakes`).
53
+ * - `spooky-float` (attention) — the element wobbles and fades like a
54
+ * Halloween ghost (`cycles`).
55
+ *
56
+ * Reduced motion: firework-burst / spooky-float do nothing, xmas-snow is
57
+ * skipped, lantern-rise fades in. Particles are `aria-hidden` and removed.
58
+ */
59
+
60
+ /** Evenly spread spark directions with a little jitter (8.1). */
61
+ declare function sparkVectors(n: number, radius: number, seed?: number): {
62
+ x: number;
63
+ y: number;
64
+ }[];
65
+ declare const FESTIVAL_FX: EffectDefinition[];
66
+ /** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */
67
+ declare function registerFestivalPack(): void;
68
+
69
+ export { FESTIVAL_FX, registerFestivalPack, sparkVectors };
@@ -0,0 +1,117 @@
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
+ import '../chunks/base-CLuqlLfG.js';
3
+
4
+ /** Evenly spread spark directions with a little jitter (8.1). */
5
+ function sparkVectors(n, radius, seed = 1) {
6
+ let s = seed;
7
+ const rnd = () => ((s = (s * 9301 + 49297) % 233280) / 233280);
8
+ return Array.from({ length: n }, (_, i) => {
9
+ const a = (i / n) * Math.PI * 2 + (rnd() - 0.5) * 0.3;
10
+ const r = radius * (0.7 + rnd() * 0.3);
11
+ return { x: Math.round(Math.cos(a) * r), y: Math.round(Math.sin(a) * r) };
12
+ });
13
+ }
14
+ const layer = (el, ctx) => {
15
+ if (getComputedStyle(el).position === 'static') {
16
+ const prev = el.style.position;
17
+ el.style.position = 'relative';
18
+ ctx.onCleanup(() => (el.style.position = prev));
19
+ }
20
+ const l = document.createElement('span');
21
+ l.setAttribute('aria-hidden', 'true');
22
+ Object.assign(l.style, { position: 'absolute', inset: '0', pointerEvents: 'none', overflow: 'visible' });
23
+ el.appendChild(l);
24
+ ctx.onCleanup(() => l.remove());
25
+ return l;
26
+ };
27
+ const dot = (parent, css, text = '') => {
28
+ const d = document.createElement('span');
29
+ d.textContent = text;
30
+ Object.assign(d.style, { position: 'absolute', left: '50%', top: '50%', ...css });
31
+ parent.appendChild(d);
32
+ return d;
33
+ };
34
+ const FESTIVAL_FX = [
35
+ {
36
+ name: 'firework-burst',
37
+ kind: 'attention',
38
+ description: 'Rockets of sparks burst out of the element in festive colours (`bursts`, `colors`).',
39
+ defaults: { bursts: 3, colors: '#f43f5e,#f59e0b,#22d3ee,#a855f7,#facc15', duration: 900 },
40
+ run: (el, o, ctx) => {
41
+ if (ctx.reduced)
42
+ return;
43
+ const l = layer(el, ctx);
44
+ const colors = String(o.colors).split(',');
45
+ const r = el.getBoundingClientRect();
46
+ const runs = [];
47
+ const n = Math.max(1, Math.min(6, Number(o.bursts) || 3));
48
+ for (let b = 0; b < n; b++) {
49
+ const cx = (b - (n - 1) / 2) * Math.min(60, (r.width || 120) / n);
50
+ const cy = -((r.height || 60) * 0.25) - (b % 2) * 18;
51
+ const col = colors[b % colors.length];
52
+ sparkVectors(14, 46 + b * 6, b + 3).forEach((v) => {
53
+ const s = dot(l, { width: '5px', height: '5px', marginLeft: '-2.5px', marginTop: '-2.5px', borderRadius: '50%', background: col, boxShadow: `0 0 6px ${col}` });
54
+ 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' });
55
+ runs.push(a ? a.finished.then(() => s.remove(), () => s.remove()) : Promise.resolve(s.remove()));
56
+ });
57
+ }
58
+ return Promise.all(runs).then(() => l.remove());
59
+ },
60
+ },
61
+ {
62
+ name: 'lantern-rise',
63
+ kind: 'enter',
64
+ description: 'The element floats up and sways in like a Lunar New Year lantern (`sway` degrees).',
65
+ defaults: { sway: 8, duration: 1400 },
66
+ run: (el, o, ctx) => {
67
+ if (ctx.reduced)
68
+ return ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 })?.finished.catch(() => undefined);
69
+ const w = Number(o.sway) || 8;
70
+ return ctx
71
+ .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' })
72
+ ?.finished.catch(() => undefined);
73
+ },
74
+ },
75
+ {
76
+ name: 'xmas-snow',
77
+ kind: 'loop',
78
+ description: 'Snowflakes drift down over the element until the cleanup runs (`flakes`).',
79
+ defaults: { flakes: 18, duration: 4000 },
80
+ run: (el, o, ctx) => {
81
+ const l = layer(el, ctx);
82
+ l.style.overflow = 'hidden';
83
+ const n = Math.max(4, Math.min(60, Number(o.flakes) || 18));
84
+ const anims = Array.from({ length: n }, (_, i) => {
85
+ const x = (i * 37) % 100;
86
+ const size = 8 + ((i * 7) % 9);
87
+ const f = dot(l, { left: `${x}%`, top: '-14px', fontSize: `${size}px`, color: '#fff', textShadow: '0 0 3px rgba(148,163,184,.9)', lineHeight: '1' }, '❄');
88
+ const drift = ((i % 5) - 2) * 12;
89
+ 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' });
90
+ });
91
+ return () => {
92
+ anims.forEach((a) => a?.cancel());
93
+ l.remove();
94
+ };
95
+ },
96
+ },
97
+ {
98
+ name: 'spooky-float',
99
+ kind: 'attention',
100
+ description: 'The element wobbles, rises and flickers like a Halloween ghost (`cycles`).',
101
+ defaults: { cycles: 2, duration: 1200 },
102
+ run: (el, o, ctx) => {
103
+ if (ctx.reduced)
104
+ return;
105
+ return ctx
106
+ .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' })
107
+ ?.finished.catch(() => undefined);
108
+ },
109
+ },
110
+ ];
111
+ /** Register firework-burst, lantern-rise, xmas-snow and spooky-float (8.1). */
112
+ function registerFestivalPack() {
113
+ registerEffects(FESTIVAL_FX);
114
+ }
115
+
116
+ export { FESTIVAL_FX, registerFestivalPack, sparkVectors };
117
+ //# sourceMappingURL=fx-festival.js.map
@@ -0,0 +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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
4
- require('../chunks/base-BaQV-2ha.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
+ require('../chunks/base-DoRUZBy-.cjs');
5
5
 
6
6
  const NS = 'http://www.w3.org/2000/svg';
7
7
  function overlay(el, z = 1) {
@@ -1,5 +1,5 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
- import '../chunks/base-2-yYc93C.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
+ import '../chunks/base-CLuqlLfG.js';
3
3
 
4
4
  const NS = 'http://www.w3.org/2000/svg';
5
5
  function overlay(el, z = 1) {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
4
- require('../chunks/base-BaQV-2ha.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
+ require('../chunks/base-DoRUZBy-.cjs');
5
5
 
6
6
  /** Decaying sideways shake keyframes (7.7). */
7
7
  function shakeFrames(distance = 8, steps = 5) {
@@ -1,5 +1,5 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
- import '../chunks/base-2-yYc93C.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
+ import '../chunks/base-CLuqlLfG.js';
3
3
 
4
4
  /** Decaying sideways shake keyframes (7.7). */
5
5
  function shakeFrames(distance = 8, steps = 5) {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
4
- require('../chunks/base-BaQV-2ha.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
+ require('../chunks/base-DoRUZBy-.cjs');
5
5
 
6
6
  /** Ballistic keyframe points for a coin thrown at `deg` with `power` (7.5). */
7
7
  function throwPath(deg, power = 120, steps = 6, g = 2.2) {
@@ -1,5 +1,5 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
- import '../chunks/base-2-yYc93C.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
+ import '../chunks/base-CLuqlLfG.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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
4
- require('../chunks/base-BaQV-2ha.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
+ require('../chunks/base-DoRUZBy-.cjs');
5
5
 
6
6
  /** Length of a polyline through `points` (7.6). */
7
7
  function routeLength(points) {
@@ -1,5 +1,5 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
- import '../chunks/base-2-yYc93C.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
+ import '../chunks/base-CLuqlLfG.js';
3
3
 
4
4
  /** Length of a polyline through `points` (7.6). */
5
5
  function routeLength(points) {
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- require('../chunks/registry-DehBVRDV.cjs');
3
+ require('../chunks/registry-BVklOepd.cjs');
4
4
  require('../chunks/generative-BHIj-NU0.cjs');
5
5
  require('../chunks/shared-jkgRH-Hx.cjs');
6
- var components_fxGpu = require('../chunks/gpu-Dx0H875w.cjs');
7
- require('../chunks/base-BaQV-2ha.cjs');
6
+ var components_fxGpu = require('../chunks/gpu-CcdA2D2i.cjs');
7
+ require('../chunks/base-DoRUZBy-.cjs');
8
8
 
9
9
 
10
10
 
@@ -1,6 +1,6 @@
1
- import '../chunks/registry-CyKExAmE.js';
1
+ import '../chunks/registry-CnO7ZVPK.js';
2
2
  import '../chunks/generative-2LhxG5BJ.js';
3
3
  import '../chunks/shared-CkKHWrtJ.js';
4
- export { G as GPU_FX, r as registerGpuPack } from '../chunks/gpu-DLPghVWr.js';
5
- import '../chunks/base-2-yYc93C.js';
4
+ export { G as GPU_FX, r as registerGpuPack } from '../chunks/gpu-CB8frFOD.js';
5
+ import '../chunks/base-CLuqlLfG.js';
6
6
  //# sourceMappingURL=fx-gpu.js.map
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
4
  var generative = require('../chunks/generative-BHIj-NU0.cjs');
5
5
  var shared = require('../chunks/shared-jkgRH-Hx.cjs');
6
- require('../chunks/base-BaQV-2ha.cjs');
6
+ require('../chunks/base-DoRUZBy-.cjs');
7
7
 
8
8
  /** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */
9
9
  function trackPointer(el, ctx, fn, x0 = 0.3, y0 = 0.25) {
@@ -1,7 +1,7 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
2
  import { c as canvasBackground, h as hexRgb } from '../chunks/generative-2LhxG5BJ.js';
3
3
  import { o as overlay } from '../chunks/shared-CkKHWrtJ.js';
4
- import '../chunks/base-2-yYc93C.js';
4
+ import '../chunks/base-CLuqlLfG.js';
5
5
 
6
6
  /** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */
7
7
  function trackPointer(el, ctx, fn, x0 = 0.3, y0 = 0.25) {
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
4
  var shared = require('../chunks/shared-jkgRH-Hx.cjs');
5
- require('../chunks/base-BaQV-2ha.cjs');
5
+ require('../chunks/base-DoRUZBy-.cjs');
6
6
 
7
7
  const NS = 'http://www.w3.org/2000/svg';
8
8
  const raf = (f) => (typeof requestAnimationFrame === 'function' ? requestAnimationFrame(f) : 0);
@@ -1,6 +1,6 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
2
  import { a as all } from '../chunks/shared-CkKHWrtJ.js';
3
- import '../chunks/base-2-yYc93C.js';
3
+ import '../chunks/base-CLuqlLfG.js';
4
4
 
5
5
  const NS = 'http://www.w3.org/2000/svg';
6
6
  const raf = (f) => (typeof requestAnimationFrame === 'function' ? requestAnimationFrame(f) : 0);
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var registry = require('../chunks/registry-DehBVRDV.cjs');
3
+ var registry = require('../chunks/registry-BVklOepd.cjs');
4
4
  var generative = require('../chunks/generative-BHIj-NU0.cjs');
5
- var audio = require('../chunks/audio-EXUoijsG.cjs');
6
- require('../chunks/base-BaQV-2ha.cjs');
5
+ var audio = require('../chunks/audio-cgWbDkoY.cjs');
6
+ require('../chunks/base-DoRUZBy-.cjs');
7
7
  require('../chunks/shared-jkgRH-Hx.cjs');
8
8
 
9
9
  /** A smooth, deterministic fake analyser frame at time `t` (s). */
@@ -1,7 +1,7 @@
1
- import { registerEffects } from '../chunks/registry-CyKExAmE.js';
1
+ import { registerEffects } from '../chunks/registry-CnO7ZVPK.js';
2
2
  import { c as canvasBackground } from '../chunks/generative-2LhxG5BJ.js';
3
- import { g as getAudio } from '../chunks/audio-DcPvT2Kh.js';
4
- import '../chunks/base-2-yYc93C.js';
3
+ import { g as getAudio } from '../chunks/audio-CynhhWDi.js';
4
+ import '../chunks/base-CLuqlLfG.js';
5
5
  import '../chunks/shared-CkKHWrtJ.js';
6
6
 
7
7
  /** A smooth, deterministic fake analyser frame at time `t` (s). */