motionary 7.0.0 → 7.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 (88) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/chunks/audio-DcPvT2Kh.js +333 -0
  3. package/dist/chunks/audio-DcPvT2Kh.js.map +1 -0
  4. package/dist/chunks/audio-EXUoijsG.cjs +342 -0
  5. package/dist/chunks/audio-EXUoijsG.cjs.map +1 -0
  6. package/dist/chunks/{base-DchG4q_S.js → base-2-yYc93C.js} +2 -2
  7. package/dist/chunks/{base-DchG4q_S.js.map → base-2-yYc93C.js.map} +1 -1
  8. package/dist/chunks/{core-DVyTlo9Q.js → core-D5rU0CV6.js} +2 -2
  9. package/dist/chunks/{core-DVyTlo9Q.js.map → core-D5rU0CV6.js.map} +1 -1
  10. package/dist/chunks/{core-D2vF8kZb.js → core-DuO-AVXL.js} +2 -2
  11. package/dist/chunks/{core-D2vF8kZb.js.map → core-DuO-AVXL.js.map} +1 -1
  12. package/dist/chunks/{fx-DUMVKSvg.js → fx-CMxWNwH8.js} +2 -2
  13. package/dist/chunks/{fx-DUMVKSvg.js.map → fx-CMxWNwH8.js.map} +1 -1
  14. package/dist/chunks/{gpu-Bkw605Ds.js → gpu-DLPghVWr.js} +2 -2
  15. package/dist/chunks/{gpu-Bkw605Ds.js.map → gpu-DLPghVWr.js.map} +1 -1
  16. package/dist/chunks/{player-C-TwEEy6.js → player-DxvCYo7Q.js} +4 -4
  17. package/dist/chunks/{player-C-TwEEy6.js.map → player-DxvCYo7Q.js.map} +1 -1
  18. package/dist/chunks/{registry-D23neB4M.js → registry-CyKExAmE.js} +2 -2
  19. package/dist/chunks/{registry-D23neB4M.js.map → registry-CyKExAmE.js.map} +1 -1
  20. package/dist/chunks/{spring-BhoT09Qb.js → spring-BK8DiezC.js} +2 -2
  21. package/dist/chunks/{spring-BhoT09Qb.js.map → spring-BK8DiezC.js.map} +1 -1
  22. package/dist/chunks/{variants-C_hv_s23.js → variants-BQ6bhzn4.js} +2 -2
  23. package/dist/chunks/{variants-C_hv_s23.js.map → variants-BQ6bhzn4.js.map} +1 -1
  24. package/dist/components/a11y.js +2 -2
  25. package/dist/components/angular.js +7 -7
  26. package/dist/components/background.js +2 -2
  27. package/dist/components/bridge.js +1 -1
  28. package/dist/components/cards.js +2 -2
  29. package/dist/components/click.js +3 -3
  30. package/dist/components/depth.js +3 -3
  31. package/dist/components/effects.cjs +11 -336
  32. package/dist/components/effects.cjs.map +1 -1
  33. package/dist/components/effects.js +9 -333
  34. package/dist/components/effects.js.map +1 -1
  35. package/dist/components/feedback.js +1 -1
  36. package/dist/components/fx-3d.js +2 -2
  37. package/dist/components/fx-focus.js +2 -2
  38. package/dist/components/fx-gpu.js +3 -3
  39. package/dist/components/fx-light.js +2 -2
  40. package/dist/components/fx-morph.js +2 -2
  41. package/dist/components/fx-music.cjs +179 -0
  42. package/dist/components/fx-music.cjs.map +1 -0
  43. package/dist/components/fx-music.d.cts +102 -0
  44. package/dist/components/fx-music.d.ts +102 -0
  45. package/dist/components/fx-music.js +174 -0
  46. package/dist/components/fx-music.js.map +1 -0
  47. package/dist/components/fx-physics.js +2 -2
  48. package/dist/components/fx-text.js +2 -2
  49. package/dist/components/fx-transitions.js +3 -3
  50. package/dist/components/fx-weather.js +2 -2
  51. package/dist/components/fx.js +5 -5
  52. package/dist/components/fx2.cjs +8 -0
  53. package/dist/components/fx2.cjs.map +1 -1
  54. package/dist/components/fx2.d.cts +59 -1
  55. package/dist/components/fx2.d.ts +59 -1
  56. package/dist/components/fx2.js +10 -5
  57. package/dist/components/fx2.js.map +1 -1
  58. package/dist/components/gesture.js +4 -4
  59. package/dist/components/interaction.js +1 -1
  60. package/dist/components/layout.js +1 -1
  61. package/dist/components/marketplace.js +2 -2
  62. package/dist/components/packs.js +1 -1
  63. package/dist/components/page.js +3 -3
  64. package/dist/components/perf.js +2 -2
  65. package/dist/components/physics.js +3 -3
  66. package/dist/components/reveal.js +1 -1
  67. package/dist/components/solid.js +7 -7
  68. package/dist/components/svelte.js +7 -7
  69. package/dist/components/svg.js +1 -1
  70. package/dist/components/text.js +2 -2
  71. package/dist/components/timeline.js +3 -3
  72. package/dist/components/transitions.js +1 -1
  73. package/dist/components/ui.js +4 -4
  74. package/dist/components/vue.js +7 -7
  75. package/dist/components/webgl.js +1 -1
  76. package/dist/components/widgets.cjs +542 -61
  77. package/dist/components/widgets.cjs.map +1 -1
  78. package/dist/components/widgets.d.cts +79 -2
  79. package/dist/components/widgets.d.ts +79 -2
  80. package/dist/components/widgets.js +542 -67
  81. package/dist/components/widgets.js.map +1 -1
  82. package/dist/components.js +9 -9
  83. package/dist/index.js +2 -2
  84. package/dist/widgets.umd.js +1 -1
  85. package/dist/widgets.umd.js.map +1 -1
  86. package/docs/ROADMAP.md +1 -1
  87. package/docs/components.md +25 -0
  88. package/package.json +21 -1
@@ -0,0 +1,174 @@
1
+ import { registerEffects } from '../chunks/registry-CyKExAmE.js';
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';
5
+ import '../chunks/shared-CkKHWrtJ.js';
6
+
7
+ /** A smooth, deterministic fake analyser frame at time `t` (s). */
8
+ function syntheticSample(t, bins = 64) {
9
+ const freq = new Uint8Array(bins);
10
+ const wave = new Uint8Array(128);
11
+ const beat = Math.pow(Math.max(0, Math.sin(t * Math.PI * 2 * 1.9)), 8);
12
+ for (let i = 0; i < bins; i++) {
13
+ const k = i / bins;
14
+ const v = (0.75 - k * 0.55) * (0.55 + 0.25 * Math.sin(t * 3.1 + i * 0.45) + 0.2 * Math.sin(t * 5.3 - i * 0.9)) + (k < 0.12 ? beat * 0.45 : 0);
15
+ freq[i] = Math.max(0, Math.min(255, Math.round(v * 255)));
16
+ }
17
+ for (let i = 0; i < 128; i++)
18
+ wave[i] = Math.round(128 + 70 * (0.6 * Math.sin(i * 0.19 + t * 9) + 0.3 * Math.sin(i * 0.53 - t * 13) + 0.25 * beat * Math.sin(i * 0.05)));
19
+ const bass = Array.from(freq.slice(0, Math.max(1, Math.round(bins * 0.08)))).reduce((a, b) => a + b, 0) / (Math.max(1, Math.round(bins * 0.08)) * 255);
20
+ return { level: 0.35 + beat * 0.3, bass, freq, wave };
21
+ }
22
+ /** The live analyser frame, or the synthetic one. */
23
+ const musicSample = (t) => getAudio()?.sample() ?? syntheticSample(t);
24
+ const bg = (name, description, defaults, spec) => ({
25
+ name,
26
+ kind: 'background',
27
+ description,
28
+ reduced: 'run',
29
+ defaults: { speed: 1, quality: 1, colors: ['#22d3ee', '#7c5cff', '#f472b6'], ...defaults },
30
+ run: (el, o, ctx) => {
31
+ const stop = canvasBackground(el, ctx, spec, o);
32
+ ctx.onCleanup(stop);
33
+ return stop;
34
+ },
35
+ });
36
+ const grad = (ctx, x0, y0, x1, y1, colors) => {
37
+ const g = ctx.createLinearGradient(x0, y0, x1, y1);
38
+ colors.forEach((c, i) => g.addColorStop(i / Math.max(1, colors.length - 1), c));
39
+ return g;
40
+ };
41
+ /** A loop effect driven by the music sample each frame. */
42
+ const loop = (name, description, defaults, apply) => ({
43
+ name,
44
+ kind: 'loop',
45
+ description,
46
+ defaults,
47
+ reduced: 'skip',
48
+ run: (el, o, ctx) => {
49
+ const prev = el.style.transform;
50
+ const st = {};
51
+ let raf = 0;
52
+ const t0 = performance.now();
53
+ const f = (now) => {
54
+ const t = (now - t0) / 1000;
55
+ apply(el, musicSample(t), t, o, st);
56
+ raf = requestAnimationFrame(f);
57
+ };
58
+ if (typeof requestAnimationFrame === 'function')
59
+ raf = requestAnimationFrame(f);
60
+ const stop = () => {
61
+ cancelAnimationFrame(raf);
62
+ el.style.transform = prev;
63
+ };
64
+ ctx.onCleanup(stop);
65
+ return stop;
66
+ },
67
+ });
68
+ const MUSIC_FX = [
69
+ bg('waveform-scope', 'An oscilloscope line of the waveform with a soft glow (Canvas 2D; live analyser or synthetic).', { width: 2.5 }, {
70
+ draw: ({ ctx, w, h, t, o }) => {
71
+ const s = musicSample(t);
72
+ ctx.clearRect(0, 0, w, h);
73
+ ctx.lineWidth = o.width;
74
+ ctx.strokeStyle = grad(ctx, 0, 0, w, 0, o.colors);
75
+ ctx.shadowColor = o.colors[0];
76
+ ctx.shadowBlur = 10;
77
+ ctx.beginPath();
78
+ const n = s.wave.length;
79
+ for (let i = 0; i < n; i++) {
80
+ const x = (i / (n - 1)) * w;
81
+ const y = h / 2 + ((s.wave[i] - 128) / 128) * h * 0.4;
82
+ if (i)
83
+ ctx.lineTo(x, y);
84
+ else
85
+ ctx.moveTo(x, y);
86
+ }
87
+ ctx.stroke();
88
+ ctx.shadowBlur = 0;
89
+ },
90
+ }),
91
+ bg('radial-spectrum', 'Spectrum bars around a circle that breathes with the bass (Canvas 2D).', { bars: 48 }, {
92
+ draw: ({ ctx, w, h, t, o }) => {
93
+ const s = musicSample(t);
94
+ ctx.clearRect(0, 0, w, h);
95
+ const cx = w / 2;
96
+ const cy = h / 2;
97
+ const r0 = Math.min(w, h) * (0.18 + s.bass * 0.06);
98
+ const n = o.bars;
99
+ ctx.lineCap = 'round';
100
+ ctx.lineWidth = Math.max(2, (Math.PI * 2 * r0) / n / 2);
101
+ for (let i = 0; i < n; i++) {
102
+ const v = s.freq[Math.floor((i / n) * s.freq.length * 0.8)] / 255;
103
+ const a = (i / n) * Math.PI * 2 - Math.PI / 2;
104
+ const len = Math.min(w, h) * 0.28 * v + 2;
105
+ ctx.strokeStyle = o.colors[i % o.colors.length];
106
+ ctx.beginPath();
107
+ ctx.moveTo(cx + Math.cos(a) * r0, cy + Math.sin(a) * r0);
108
+ ctx.lineTo(cx + Math.cos(a) * (r0 + len), cy + Math.sin(a) * (r0 + len));
109
+ ctx.stroke();
110
+ }
111
+ },
112
+ }),
113
+ bg('spectrum-mirror', 'Mirrored spectrum bars with a reflection on the floor (Canvas 2D).', { bars: 32, gap: 3 }, {
114
+ draw: ({ ctx, w, h, t, o }) => {
115
+ const s = musicSample(t);
116
+ ctx.clearRect(0, 0, w, h);
117
+ const n = o.bars;
118
+ const bw = Math.max(1, (w - o.gap * (n - 1)) / n);
119
+ const base = h * 0.68;
120
+ ctx.fillStyle = grad(ctx, 0, base - h * 0.6, 0, base, o.colors);
121
+ for (let i = 0; i < n; i++) {
122
+ const v = s.freq[Math.floor((Math.abs(i - n / 2) / (n / 2)) * s.freq.length * 0.7)] / 255;
123
+ const bh = Math.max(2, v * h * 0.6);
124
+ const x = i * (bw + o.gap);
125
+ ctx.globalAlpha = 1;
126
+ ctx.fillRect(x, base - bh, bw, bh);
127
+ ctx.globalAlpha = 0.22;
128
+ ctx.fillRect(x, base + 2, bw, bh * 0.45);
129
+ }
130
+ ctx.globalAlpha = 1;
131
+ },
132
+ }),
133
+ bg('sound-particles', 'Particles launched upward by the bass, coloured by pitch (Canvas 2D).', { max: 140 }, {
134
+ init: () => ({ p: [] }),
135
+ draw: ({ ctx, w, h, t, state, o }) => {
136
+ const s = musicSample(t);
137
+ const dt = state.last ? Math.min(0.05, t - state.last) : 0;
138
+ state.last = t;
139
+ ctx.clearRect(0, 0, w, h);
140
+ const spawn = Math.round(s.bass * 6);
141
+ for (let i = 0; i < spawn && state.p.length < o.max; i++)
142
+ state.p.push({ x: Math.random() * w, y: h + 4, vx: (Math.random() - 0.5) * 40, vy: -(80 + s.bass * 260 + Math.random() * 60), life: 1, c: o.colors[Math.floor(Math.random() * o.colors.length)] });
143
+ state.p = state.p.filter((p) => {
144
+ p.x += p.vx * dt;
145
+ p.y += p.vy * dt;
146
+ p.vy += 120 * dt;
147
+ p.life -= dt * 0.6;
148
+ ctx.globalAlpha = Math.max(0, p.life);
149
+ ctx.fillStyle = p.c;
150
+ ctx.beginPath();
151
+ ctx.arc(p.x, p.y, 2.5, 0, Math.PI * 2);
152
+ ctx.fill();
153
+ return p.life > 0 && p.y < h + 10;
154
+ });
155
+ ctx.globalAlpha = 1;
156
+ },
157
+ }),
158
+ loop('beat-bounce', 'The element pumps with the bass (`amount`).', { amount: 0.12 }, (el, s, _t, o) => {
159
+ el.style.transform = `scale(${(1 + s.bass * o.amount).toFixed(4)})`;
160
+ }),
161
+ loop('vinyl-spin', 'The element turns like a record at 33⅓ rpm; the level speeds it up (`rpm`).', { rpm: 33.3 }, (el, s, t, o, st) => {
162
+ const dt = st.last ? Math.min(0.05, t - st.last) : 0;
163
+ st.last = t;
164
+ st.a = ((st.a || 0) + (o.rpm / 60) * 360 * dt * (0.8 + s.level * 0.6)) % 360;
165
+ el.style.transform = `rotate(${st.a.toFixed(2)}deg)`;
166
+ }),
167
+ ];
168
+ /** Register the 7.1 music visualization pack (idempotent). */
169
+ function registerMusicPack() {
170
+ registerEffects(MUSIC_FX);
171
+ }
172
+
173
+ export { MUSIC_FX, musicSample, registerMusicPack, syntheticSample };
174
+ //# sourceMappingURL=fx-music.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-music.js","sources":["../../src/components/fx2/music.ts"],"sourcesContent":["/**\n * 7.1 — Music visualization (`motionary/fx/music`, also\n * `motionary/components/fx-music`), registered through `registerEffect()`.\n * Every effect reads the running analyser (`enableAudio()` / `<usa-audio>`);\n * without one it plays a gentle synthetic signal (`syntheticSample()`), so\n * the visuals work as decoration too.\n *\n * - `waveform-scope` (background) — an oscilloscope line of the waveform.\n * - `radial-spectrum` (background) — spectrum bars around a circle.\n * - `spectrum-mirror` (background) — mirrored bars with a reflection.\n * - `sound-particles` (background) — particles launched by the bass.\n * - `beat-bounce` (loop) — the element pumps with the bass.\n * - `vinyl-spin` (loop) — the element turns like a record; level speeds it.\n *\n * Reduced motion: backgrounds draw one static frame, loops do nothing.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { canvasBackground, type GenerativeSpec } from '../effects/generative';\nimport { getAudio, type AudioSample } from '../effects/audio';\n\n/** A smooth, deterministic fake analyser frame at time `t` (s). */\nexport function syntheticSample(t: number, bins = 64): AudioSample {\n const freq = new Uint8Array(bins);\n const wave = new Uint8Array(128);\n const beat = Math.pow(Math.max(0, Math.sin(t * Math.PI * 2 * 1.9)), 8);\n for (let i = 0; i < bins; i++) {\n const k = i / bins;\n const v = (0.75 - k * 0.55) * (0.55 + 0.25 * Math.sin(t * 3.1 + i * 0.45) + 0.2 * Math.sin(t * 5.3 - i * 0.9)) + (k < 0.12 ? beat * 0.45 : 0);\n freq[i] = Math.max(0, Math.min(255, Math.round(v * 255)));\n }\n for (let i = 0; i < 128; i++) wave[i] = Math.round(128 + 70 * (0.6 * Math.sin(i * 0.19 + t * 9) + 0.3 * Math.sin(i * 0.53 - t * 13) + 0.25 * beat * Math.sin(i * 0.05)));\n const bass = Array.from(freq.slice(0, Math.max(1, Math.round(bins * 0.08)))).reduce((a, b) => a + b, 0) / (Math.max(1, Math.round(bins * 0.08)) * 255);\n return { level: 0.35 + beat * 0.3, bass, freq, wave };\n}\n\n/** The live analyser frame, or the synthetic one. */\nexport const musicSample = (t: number): AudioSample => getAudio()?.sample() ?? syntheticSample(t);\n\nconst bg = (name: string, description: string, defaults: Record<string, unknown>, spec: GenerativeSpec): EffectDefinition => ({\n name,\n kind: 'background',\n description,\n reduced: 'run',\n defaults: { speed: 1, quality: 1, colors: ['#22d3ee', '#7c5cff', '#f472b6'], ...defaults },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const stop = canvasBackground(el, ctx, spec, o);\n ctx.onCleanup(stop);\n return stop;\n },\n});\n\nconst grad = (ctx: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number, colors: string[]) => {\n const g = ctx.createLinearGradient(x0, y0, x1, y1);\n colors.forEach((c, i) => g.addColorStop(i / Math.max(1, colors.length - 1), c));\n return g;\n};\n\n/** A loop effect driven by the music sample each frame. */\nconst loop = (name: string, description: string, defaults: Record<string, unknown>, apply: (el: HTMLElement, s: AudioSample, t: number, o: any, st: any) => void): EffectDefinition => ({\n name,\n kind: 'loop',\n description,\n defaults,\n reduced: 'skip',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const prev = el.style.transform;\n const st: any = {};\n let raf = 0;\n const t0 = performance.now();\n const f = (now: number) => {\n const t = (now - t0) / 1000;\n apply(el, musicSample(t), t, o, st);\n raf = requestAnimationFrame(f);\n };\n if (typeof requestAnimationFrame === 'function') raf = requestAnimationFrame(f);\n const stop = () => {\n cancelAnimationFrame(raf);\n el.style.transform = prev;\n };\n ctx.onCleanup(stop);\n return stop;\n },\n});\n\nexport const MUSIC_FX: EffectDefinition[] = [\n bg('waveform-scope', 'An oscilloscope line of the waveform with a soft glow (Canvas 2D; live analyser or synthetic).', { width: 2.5 }, {\n draw: ({ ctx, w, h, t, o }) => {\n const s = musicSample(t);\n ctx.clearRect(0, 0, w, h);\n ctx.lineWidth = o.width;\n ctx.strokeStyle = grad(ctx, 0, 0, w, 0, o.colors);\n ctx.shadowColor = o.colors[0];\n ctx.shadowBlur = 10;\n ctx.beginPath();\n const n = s.wave.length;\n for (let i = 0; i < n; i++) {\n const x = (i / (n - 1)) * w;\n const y = h / 2 + ((s.wave[i] - 128) / 128) * h * 0.4;\n if (i) ctx.lineTo(x, y);\n else ctx.moveTo(x, y);\n }\n ctx.stroke();\n ctx.shadowBlur = 0;\n },\n }),\n bg('radial-spectrum', 'Spectrum bars around a circle that breathes with the bass (Canvas 2D).', { bars: 48 }, {\n draw: ({ ctx, w, h, t, o }) => {\n const s = musicSample(t);\n ctx.clearRect(0, 0, w, h);\n const cx = w / 2;\n const cy = h / 2;\n const r0 = Math.min(w, h) * (0.18 + s.bass * 0.06);\n const n = o.bars;\n ctx.lineCap = 'round';\n ctx.lineWidth = Math.max(2, (Math.PI * 2 * r0) / n / 2);\n for (let i = 0; i < n; i++) {\n const v = s.freq[Math.floor((i / n) * s.freq.length * 0.8)] / 255;\n const a = (i / n) * Math.PI * 2 - Math.PI / 2;\n const len = Math.min(w, h) * 0.28 * v + 2;\n ctx.strokeStyle = o.colors[i % o.colors.length];\n ctx.beginPath();\n ctx.moveTo(cx + Math.cos(a) * r0, cy + Math.sin(a) * r0);\n ctx.lineTo(cx + Math.cos(a) * (r0 + len), cy + Math.sin(a) * (r0 + len));\n ctx.stroke();\n }\n },\n }),\n bg('spectrum-mirror', 'Mirrored spectrum bars with a reflection on the floor (Canvas 2D).', { bars: 32, gap: 3 }, {\n draw: ({ ctx, w, h, t, o }) => {\n const s = musicSample(t);\n ctx.clearRect(0, 0, w, h);\n const n = o.bars;\n const bw = Math.max(1, (w - o.gap * (n - 1)) / n);\n const base = h * 0.68;\n ctx.fillStyle = grad(ctx, 0, base - h * 0.6, 0, base, o.colors);\n for (let i = 0; i < n; i++) {\n const v = s.freq[Math.floor((Math.abs(i - n / 2) / (n / 2)) * s.freq.length * 0.7)] / 255;\n const bh = Math.max(2, v * h * 0.6);\n const x = i * (bw + o.gap);\n ctx.globalAlpha = 1;\n ctx.fillRect(x, base - bh, bw, bh);\n ctx.globalAlpha = 0.22;\n ctx.fillRect(x, base + 2, bw, bh * 0.45);\n }\n ctx.globalAlpha = 1;\n },\n }),\n bg('sound-particles', 'Particles launched upward by the bass, coloured by pitch (Canvas 2D).', { max: 140 }, {\n init: () => ({ p: [] as { x: number; y: number; vx: number; vy: number; life: number; c: string }[] }),\n draw: ({ ctx, w, h, t, state, o }) => {\n const s = musicSample(t);\n const dt = state.last ? Math.min(0.05, t - state.last) : 0;\n state.last = t;\n ctx.clearRect(0, 0, w, h);\n const spawn = Math.round(s.bass * 6);\n for (let i = 0; i < spawn && state.p.length < o.max; i++) state.p.push({ x: Math.random() * w, y: h + 4, vx: (Math.random() - 0.5) * 40, vy: -(80 + s.bass * 260 + Math.random() * 60), life: 1, c: o.colors[Math.floor(Math.random() * o.colors.length)] });\n state.p = state.p.filter((p: any) => {\n p.x += p.vx * dt;\n p.y += p.vy * dt;\n p.vy += 120 * dt;\n p.life -= dt * 0.6;\n ctx.globalAlpha = Math.max(0, p.life);\n ctx.fillStyle = p.c;\n ctx.beginPath();\n ctx.arc(p.x, p.y, 2.5, 0, Math.PI * 2);\n ctx.fill();\n return p.life > 0 && p.y < h + 10;\n });\n ctx.globalAlpha = 1;\n },\n }),\n loop('beat-bounce', 'The element pumps with the bass (`amount`).', { amount: 0.12 }, (el, s, _t, o) => {\n el.style.transform = `scale(${(1 + s.bass * o.amount).toFixed(4)})`;\n }),\n loop('vinyl-spin', 'The element turns like a record at 33⅓ rpm; the level speeds it up (`rpm`).', { rpm: 33.3 }, (el, s, t, o, st) => {\n const dt = st.last ? Math.min(0.05, t - st.last) : 0;\n st.last = t;\n st.a = ((st.a || 0) + (o.rpm / 60) * 360 * dt * (0.8 + s.level * 0.6)) % 360;\n el.style.transform = `rotate(${st.a.toFixed(2)}deg)`;\n }),\n];\n\n/** Register the 7.1 music visualization pack (idempotent). */\nexport function registerMusicPack(): void {\n registerEffects(MUSIC_FX);\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { registerEffects } from '../chunks/registry-D23neB4M.js';
1
+ import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
2
  import { c as canvasBackground } from '../chunks/generative-2LhxG5BJ.js';
3
- import '../chunks/base-DchG4q_S.js';
3
+ import '../chunks/base-2-yYc93C.js';
4
4
  import '../chunks/shared-CkKHWrtJ.js';
5
5
 
6
6
  /** A minimal Verlet world: points, distance sticks, gravity, damping. */
@@ -1,5 +1,5 @@
1
- import { registerEffects } from '../chunks/registry-D23neB4M.js';
2
- import { u as srText } from '../chunks/base-DchG4q_S.js';
1
+ import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
+ import { v as srText } from '../chunks/base-2-yYc93C.js';
3
3
  import { a as all, r as rand, f as fxLayer, s as spawn } from '../chunks/shared-CkKHWrtJ.js';
4
4
 
5
5
  /** Split `el`'s text into `aria-hidden` inline-block characters (idempotent). Returns them. */
@@ -1,5 +1,5 @@
1
- import { getEffect, registerEffects } from '../chunks/registry-D23neB4M.js';
2
- import { p as prefersReducedMotion } from '../chunks/base-DchG4q_S.js';
1
+ import { getEffect, registerEffects } from '../chunks/registry-CyKExAmE.js';
2
+ import { p as prefersReducedMotion } from '../chunks/base-2-yYc93C.js';
3
3
  import { b as origin, a as all } from '../chunks/shared-CkKHWrtJ.js';
4
4
 
5
5
  const fade = (el, ctx, out) => ctx.animate(el, out ? [{ opacity: 1 }, { opacity: 0 }] : [{ opacity: 0 }, { opacity: 1 }], { duration: 200, fill: out ? 'forwards' : 'none' });
@@ -222,7 +222,7 @@ async function pageTransition(update, effect = 'ripple-dissolve', options = {},
222
222
  await update();
223
223
  const el = target || document.body.firstElementChild;
224
224
  if (el && def) {
225
- const { playEffect } = await import('../chunks/registry-D23neB4M.js');
225
+ const { playEffect } = await import('../chunks/registry-CyKExAmE.js');
226
226
  await playEffect(el, effect, { ...options, mode: 'in' });
227
227
  }
228
228
  }
@@ -1,7 +1,7 @@
1
- import { registerEffects } from '../chunks/registry-D23neB4M.js';
1
+ import { registerEffects } from '../chunks/registry-CyKExAmE.js';
2
2
  import { c as canvasBackground } from '../chunks/generative-2LhxG5BJ.js';
3
3
  import { r as rand } from '../chunks/shared-CkKHWrtJ.js';
4
- import '../chunks/base-DchG4q_S.js';
4
+ import '../chunks/base-2-yYc93C.js';
5
5
 
6
6
  const bg = (name, description, defaults, spec) => ({
7
7
  name,
@@ -1,8 +1,8 @@
1
- import { y as defineElement } from '../chunks/base-DchG4q_S.js';
2
- import { playEffect, bindEffect, EFFECT_TRIGGERS, registerEffects } from '../chunks/registry-D23neB4M.js';
3
- export { EFFECT_KINDS, getEffect, hasEffect, listEffects, registerEffect } from '../chunks/registry-D23neB4M.js';
4
- import { T as TIMELINE_PRESETS } from '../chunks/core-DVyTlo9Q.js';
5
- import { b as burst, c as confetti, s as shake } from '../chunks/fx-DUMVKSvg.js';
1
+ import { u as defineElement } from '../chunks/base-2-yYc93C.js';
2
+ import { playEffect, bindEffect, EFFECT_TRIGGERS, registerEffects } from '../chunks/registry-CyKExAmE.js';
3
+ export { EFFECT_KINDS, getEffect, hasEffect, listEffects, registerEffect } from '../chunks/registry-CyKExAmE.js';
4
+ import { T as TIMELINE_PRESETS } from '../chunks/core-D5rU0CV6.js';
5
+ import { b as burst, c as confetti, s as shake } from '../chunks/fx-CMxWNwH8.js';
6
6
  import './tokens.js';
7
7
 
8
8
  function defineFx(tag = 'usa-fx') {
@@ -10,10 +10,12 @@ var components_fxTransitions = require('./fx-transitions.cjs');
10
10
  var components_fxWeather = require('./fx-weather.cjs');
11
11
  var components_fxPhysics = require('./fx-physics.cjs');
12
12
  var components_fxFocus = require('./fx-focus.cjs');
13
+ var components_fxMusic = require('./fx-music.cjs');
13
14
  require('../chunks/registry-DehBVRDV.cjs');
14
15
  require('../chunks/base-BaQV-2ha.cjs');
15
16
  require('../chunks/generative-BHIj-NU0.cjs');
16
17
  require('../chunks/shared-jkgRH-Hx.cjs');
18
+ require('../chunks/audio-EXUoijsG.cjs');
17
19
 
18
20
  /** The 6.x effect packs by name. */
19
21
  const EFFECT_PACKS = {
@@ -26,6 +28,7 @@ const EFFECT_PACKS = {
26
28
  weather: components_fxWeather.WEATHER_FX,
27
29
  physics: components_fxPhysics.PHYSICS2_FX,
28
30
  focus: components_fxFocus.FOCUS_FX,
31
+ music: components_fxMusic.MUSIC_FX,
29
32
  };
30
33
  /** Register every 6.x effect pack (idempotent). */
31
34
  function registerEffectPacks() {
@@ -38,6 +41,7 @@ function registerEffectPacks() {
38
41
  components_fxWeather.registerWeatherPack();
39
42
  components_fxPhysics.registerPhysicsPack();
40
43
  components_fxFocus.registerFocusPack();
44
+ components_fxMusic.registerMusicPack();
41
45
  }
42
46
 
43
47
  exports.EFFECT_PACK_FORMAT = components_marketplace.EFFECT_PACK_FORMAT;
@@ -79,6 +83,10 @@ exports.VerletWorld = components_fxPhysics.VerletWorld;
79
83
  exports.registerPhysicsPack = components_fxPhysics.registerPhysicsPack;
80
84
  exports.FOCUS_FX = components_fxFocus.FOCUS_FX;
81
85
  exports.registerFocusPack = components_fxFocus.registerFocusPack;
86
+ exports.MUSIC_FX = components_fxMusic.MUSIC_FX;
87
+ exports.musicSample = components_fxMusic.musicSample;
88
+ exports.registerMusicPack = components_fxMusic.registerMusicPack;
89
+ exports.syntheticSample = components_fxMusic.syntheticSample;
82
90
  exports.EFFECT_PACKS = EFFECT_PACKS;
83
91
  exports.registerEffectPacks = registerEffectPacks;
84
92
  //# sourceMappingURL=fx2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fx2.cjs","sources":["../../src/components/fx2/index.ts"],"sourcesContent":["/**\n * The 6.x effect packs, one entry each (`motionary/components/fx-gpu`, …) so\n * their size budgets stay separate. This module (`registerFx2()`) registers\n * them all — used by dist/widgets.umd.js and the showcase.\n */\nimport type { EffectDefinition } from '../fx/registry';\nexport { EFFECT_PACK_FORMAT, packManifest, validateManifest, loadEffectPack } from './manifest';\nexport type { EffectPackManifest } from './manifest';\nimport { GPU_FX, registerGpuPack } from './gpu';\nimport { TEXT3_FX, registerTextPack, splitChars } from './text3';\nimport { LIGHT_FX, registerLightPack, trackPointer } from './light';\nimport { DEPTH3_FX, register3dPack } from './depth3';\nimport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath } from './morph2';\nimport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions } from './transitions2';\nimport { WEATHER_FX, registerWeatherPack, skyAt } from './weather';\nimport { PHYSICS2_FX, registerPhysicsPack, VerletWorld } from './physics2';\nimport { FOCUS_FX, registerFocusPack } from './focus';\n\nexport { GPU_FX, registerGpuPack, TEXT3_FX, registerTextPack, splitChars };\nexport { shaderBackground, supportsWebGL2, fieldFallback, GLSL_HEAD } from './gl';\nexport { supportsWebGPU, glslToWgsl, wgslModule, webgpuBackground, WGSL_HEAD } from './webgpu';\nexport type { ShaderSpec } from './gl';\n\nexport { LIGHT_FX, registerLightPack, trackPointer };\n\nexport { DEPTH3_FX, register3dPack };\n\nexport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath };\n\nexport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions };\n\nexport { WEATHER_FX, registerWeatherPack, skyAt };\n\nexport { PHYSICS2_FX, registerPhysicsPack, VerletWorld };\n\nexport { FOCUS_FX, registerFocusPack };\n\n/** The 6.x effect packs by name. */\nexport const EFFECT_PACKS: Record<string, EffectDefinition[]> = {\n gpu: GPU_FX,\n text: TEXT3_FX,\n light: LIGHT_FX,\n depth: DEPTH3_FX,\n morph: MORPH2_FX,\n transitions: TRANSITIONS2_FX,\n weather: WEATHER_FX,\n physics: PHYSICS2_FX,\n focus: FOCUS_FX,\n};\n\n/** Register every 6.x effect pack (idempotent). */\nexport function registerEffectPacks(): void {\n registerGpuPack();\n registerTextPack();\n registerLightPack();\n register3dPack();\n registerMorphPack();\n registerTransitionsPack();\n registerWeatherPack();\n registerPhysicsPack();\n registerFocusPack();\n}\n\n\n"],"names":["GPU_FX","TEXT3_FX","LIGHT_FX","DEPTH3_FX","MORPH2_FX","TRANSITIONS2_FX","WEATHER_FX","PHYSICS2_FX","FOCUS_FX","registerGpuPack","registerTextPack","registerLightPack","register3dPack","registerMorphPack","registerTransitionsPack","registerWeatherPack","registerPhysicsPack","registerFocusPack"],"mappings":";;;;;;;;;;;;;;;;;AAqCA;AACO,MAAM,YAAY,GAAuC;AAC9D,IAAA,GAAG,EAAEA,uBAAM;AACX,IAAA,IAAI,EAAEC,0BAAQ;AACd,IAAA,KAAK,EAAEC,2BAAQ;AACf,IAAA,KAAK,EAAEC,yBAAS;AAChB,IAAA,KAAK,EAAEC,4BAAS;AAChB,IAAA,WAAW,EAAEC,wCAAe;AAC5B,IAAA,OAAO,EAAEC,+BAAU;AACnB,IAAA,OAAO,EAAEC,gCAAW;AACpB,IAAA,KAAK,EAAEC,2BAAQ;;AAGjB;SACgB,mBAAmB,GAAA;AACjC,IAAAC,gCAAe,EAAE;AACjB,IAAAC,kCAAgB,EAAE;AAClB,IAAAC,oCAAiB,EAAE;AACnB,IAAAC,8BAAc,EAAE;AAChB,IAAAC,oCAAiB,EAAE;AACnB,IAAAC,gDAAuB,EAAE;AACzB,IAAAC,wCAAmB,EAAE;AACrB,IAAAC,wCAAmB,EAAE;AACrB,IAAAC,oCAAiB,EAAE;AACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fx2.cjs","sources":["../../src/components/fx2/index.ts"],"sourcesContent":["/**\n * The 6.x effect packs, one entry each (`motionary/components/fx-gpu`, …) so\n * their size budgets stay separate. This module (`registerFx2()`) registers\n * them all — used by dist/widgets.umd.js and the showcase.\n */\nimport type { EffectDefinition } from '../fx/registry';\nexport { EFFECT_PACK_FORMAT, packManifest, validateManifest, loadEffectPack } from './manifest';\nexport type { EffectPackManifest } from './manifest';\nimport { GPU_FX, registerGpuPack } from './gpu';\nimport { TEXT3_FX, registerTextPack, splitChars } from './text3';\nimport { LIGHT_FX, registerLightPack, trackPointer } from './light';\nimport { DEPTH3_FX, register3dPack } from './depth3';\nimport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath } from './morph2';\nimport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions } from './transitions2';\nimport { WEATHER_FX, registerWeatherPack, skyAt } from './weather';\nimport { PHYSICS2_FX, registerPhysicsPack, VerletWorld } from './physics2';\nimport { FOCUS_FX, registerFocusPack } from './focus';\nimport { MUSIC_FX, registerMusicPack, syntheticSample, musicSample } from './music';\n\nexport { GPU_FX, registerGpuPack, TEXT3_FX, registerTextPack, splitChars };\nexport { shaderBackground, supportsWebGL2, fieldFallback, GLSL_HEAD } from './gl';\nexport { supportsWebGPU, glslToWgsl, wgslModule, webgpuBackground, WGSL_HEAD } from './webgpu';\nexport type { ShaderSpec } from './gl';\n\nexport { LIGHT_FX, registerLightPack, trackPointer };\n\nexport { DEPTH3_FX, register3dPack };\n\nexport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath };\n\nexport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions };\n\nexport { WEATHER_FX, registerWeatherPack, skyAt };\n\nexport { PHYSICS2_FX, registerPhysicsPack, VerletWorld };\n\nexport { FOCUS_FX, registerFocusPack };\n\nexport { MUSIC_FX, registerMusicPack, syntheticSample, musicSample };\n\n/** The 6.x effect packs by name. */\nexport const EFFECT_PACKS: Record<string, EffectDefinition[]> = {\n gpu: GPU_FX,\n text: TEXT3_FX,\n light: LIGHT_FX,\n depth: DEPTH3_FX,\n morph: MORPH2_FX,\n transitions: TRANSITIONS2_FX,\n weather: WEATHER_FX,\n physics: PHYSICS2_FX,\n focus: FOCUS_FX,\n music: MUSIC_FX,\n};\n\n/** Register every 6.x effect pack (idempotent). */\nexport function registerEffectPacks(): void {\n registerGpuPack();\n registerTextPack();\n registerLightPack();\n register3dPack();\n registerMorphPack();\n registerTransitionsPack();\n registerWeatherPack();\n registerPhysicsPack();\n registerFocusPack();\n registerMusicPack();\n}\n\n\n"],"names":["GPU_FX","TEXT3_FX","LIGHT_FX","DEPTH3_FX","MORPH2_FX","TRANSITIONS2_FX","WEATHER_FX","PHYSICS2_FX","FOCUS_FX","MUSIC_FX","registerGpuPack","registerTextPack","registerLightPack","register3dPack","registerMorphPack","registerTransitionsPack","registerWeatherPack","registerPhysicsPack","registerFocusPack","registerMusicPack"],"mappings":";;;;;;;;;;;;;;;;;;;AAwCA;AACO,MAAM,YAAY,GAAuC;AAC9D,IAAA,GAAG,EAAEA,uBAAM;AACX,IAAA,IAAI,EAAEC,0BAAQ;AACd,IAAA,KAAK,EAAEC,2BAAQ;AACf,IAAA,KAAK,EAAEC,yBAAS;AAChB,IAAA,KAAK,EAAEC,4BAAS;AAChB,IAAA,WAAW,EAAEC,wCAAe;AAC5B,IAAA,OAAO,EAAEC,+BAAU;AACnB,IAAA,OAAO,EAAEC,gCAAW;AACpB,IAAA,KAAK,EAAEC,2BAAQ;AACf,IAAA,KAAK,EAAEC,2BAAQ;;AAGjB;SACgB,mBAAmB,GAAA;AACjC,IAAAC,gCAAe,EAAE;AACjB,IAAAC,kCAAgB,EAAE;AAClB,IAAAC,oCAAiB,EAAE;AACnB,IAAAC,8BAAc,EAAE;AAChB,IAAAC,oCAAiB,EAAE;AACnB,IAAAC,gDAAuB,EAAE;AACzB,IAAAC,wCAAmB,EAAE;AACrB,IAAAC,wCAAmB,EAAE;AACrB,IAAAC,oCAAiB,EAAE;AACnB,IAAAC,oCAAiB,EAAE;AACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -354,6 +354,64 @@ declare const FOCUS_FX: EffectDefinition[];
354
354
  /** Register the 6.9 focus & feedback pack (idempotent). */
355
355
  declare function registerFocusPack(): void;
356
356
 
357
+ /**
358
+ * 5.6 — sound-reactive effects (Web Audio).
359
+ *
360
+ * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an
361
+ * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.
362
+ * Browsers only allow an `AudioContext` to start inside a user gesture, so
363
+ * call it from a click handler (or use `<usa-audio>`, which renders the
364
+ * toggle button for you).
365
+ * - Background effects (kind `background`, Canvas 2D through
366
+ * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before
367
+ * audio is enabled they idle gently.
368
+ * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`
369
+ * and `bindBeat(el, effect, options)`, which plays any registered effect on
370
+ * every beat. `<usa-audio>` does the same for `[data-usa-beat="effect"]`
371
+ * children and emits `usa-beat`.
372
+ * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set
373
+ * on `<html>` for CSS-driven reactions.
374
+ *
375
+ * Reduced motion: the visual effects are skipped, beats play no effects and
376
+ * the CSS variables stay at 0 — audio itself keeps playing.
377
+ */
378
+
379
+ interface AudioSample {
380
+ /** Overall loudness (RMS of the waveform), 0–1. */
381
+ level: number;
382
+ /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */
383
+ bass: number;
384
+ /** Frequency bins, 0–255 each. */
385
+ freq: Uint8Array;
386
+ /** Time-domain waveform, 0–255 (128 = silence). */
387
+ wave: Uint8Array;
388
+ }
389
+
390
+ /**
391
+ * 7.1 — Music visualization (`motionary/fx/music`, also
392
+ * `motionary/components/fx-music`), registered through `registerEffect()`.
393
+ * Every effect reads the running analyser (`enableAudio()` / `<usa-audio>`);
394
+ * without one it plays a gentle synthetic signal (`syntheticSample()`), so
395
+ * the visuals work as decoration too.
396
+ *
397
+ * - `waveform-scope` (background) — an oscilloscope line of the waveform.
398
+ * - `radial-spectrum` (background) — spectrum bars around a circle.
399
+ * - `spectrum-mirror` (background) — mirrored bars with a reflection.
400
+ * - `sound-particles` (background) — particles launched by the bass.
401
+ * - `beat-bounce` (loop) — the element pumps with the bass.
402
+ * - `vinyl-spin` (loop) — the element turns like a record; level speeds it.
403
+ *
404
+ * Reduced motion: backgrounds draw one static frame, loops do nothing.
405
+ */
406
+
407
+ /** A smooth, deterministic fake analyser frame at time `t` (s). */
408
+ declare function syntheticSample(t: number, bins?: number): AudioSample;
409
+ /** The live analyser frame, or the synthetic one. */
410
+ declare const musicSample: (t: number) => AudioSample;
411
+ declare const MUSIC_FX: EffectDefinition[];
412
+ /** Register the 7.1 music visualization pack (idempotent). */
413
+ declare function registerMusicPack(): void;
414
+
357
415
  /**
358
416
  * 5.5 — generative backgrounds on Canvas 2D, registered through
359
417
  * `registerEffect()` (kind `background`): `flow-field`, `voronoi`,
@@ -463,5 +521,5 @@ declare const EFFECT_PACKS: Record<string, EffectDefinition[]>;
463
521
  /** Register every 6.x effect pack (idempotent). */
464
522
  declare function registerEffectPacks(): void;
465
523
 
466
- export { DEPTH3_FX, EFFECT_PACKS, EFFECT_PACK_FORMAT, FOCUS_FX, GLSL_HEAD, GPU_FX, LIGHT_FX, MORPH2_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, VerletWorld, WEATHER_FX, WGSL_HEAD, crossDocumentTransitions, fieldFallback, glslToWgsl, loadEffectPack, packManifest, pageTransition, pointsToPath, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack, samplePath, shaderBackground, skyAt, splitChars, supportsWebGL2, supportsWebGPU, trackPointer, validateManifest, webgpuBackground, wgslModule };
524
+ export { DEPTH3_FX, EFFECT_PACKS, EFFECT_PACK_FORMAT, FOCUS_FX, GLSL_HEAD, GPU_FX, LIGHT_FX, MORPH2_FX, MUSIC_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, VerletWorld, WEATHER_FX, WGSL_HEAD, crossDocumentTransitions, fieldFallback, glslToWgsl, loadEffectPack, musicSample, packManifest, pageTransition, pointsToPath, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerMusicPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack, samplePath, shaderBackground, skyAt, splitChars, supportsWebGL2, supportsWebGPU, syntheticSample, trackPointer, validateManifest, webgpuBackground, wgslModule };
467
525
  export type { EffectPackManifest, ShaderSpec };
@@ -354,6 +354,64 @@ declare const FOCUS_FX: EffectDefinition[];
354
354
  /** Register the 6.9 focus & feedback pack (idempotent). */
355
355
  declare function registerFocusPack(): void;
356
356
 
357
+ /**
358
+ * 5.6 — sound-reactive effects (Web Audio).
359
+ *
360
+ * - `enableAudio(input)` — start analysing the microphone (`'mic'`), an
361
+ * `<audio>` / `<video>` element (or a selector for one) or a `MediaStream`.
362
+ * Browsers only allow an `AudioContext` to start inside a user gesture, so
363
+ * call it from a click handler (or use `<usa-audio>`, which renders the
364
+ * toggle button for you).
365
+ * - Background effects (kind `background`, Canvas 2D through
366
+ * `canvasBackground()`): `spectrum-bars`, `pulse-ring`, `wave-ring`. Before
367
+ * audio is enabled they idle gently.
368
+ * - Beat detection: `createBeatDetector()` (pure: energy → beat?), `onBeat(cb)`
369
+ * and `bindBeat(el, effect, options)`, which plays any registered effect on
370
+ * every beat. `<usa-audio>` does the same for `[data-usa-beat="effect"]`
371
+ * children and emits `usa-beat`.
372
+ * - While audio runs, `--usa-audio-level` and `--usa-audio-bass` (0–1) are set
373
+ * on `<html>` for CSS-driven reactions.
374
+ *
375
+ * Reduced motion: the visual effects are skipped, beats play no effects and
376
+ * the CSS variables stay at 0 — audio itself keeps playing.
377
+ */
378
+
379
+ interface AudioSample {
380
+ /** Overall loudness (RMS of the waveform), 0–1. */
381
+ level: number;
382
+ /** Low-frequency energy (first ~8 % of the spectrum), 0–1. */
383
+ bass: number;
384
+ /** Frequency bins, 0–255 each. */
385
+ freq: Uint8Array;
386
+ /** Time-domain waveform, 0–255 (128 = silence). */
387
+ wave: Uint8Array;
388
+ }
389
+
390
+ /**
391
+ * 7.1 — Music visualization (`motionary/fx/music`, also
392
+ * `motionary/components/fx-music`), registered through `registerEffect()`.
393
+ * Every effect reads the running analyser (`enableAudio()` / `<usa-audio>`);
394
+ * without one it plays a gentle synthetic signal (`syntheticSample()`), so
395
+ * the visuals work as decoration too.
396
+ *
397
+ * - `waveform-scope` (background) — an oscilloscope line of the waveform.
398
+ * - `radial-spectrum` (background) — spectrum bars around a circle.
399
+ * - `spectrum-mirror` (background) — mirrored bars with a reflection.
400
+ * - `sound-particles` (background) — particles launched by the bass.
401
+ * - `beat-bounce` (loop) — the element pumps with the bass.
402
+ * - `vinyl-spin` (loop) — the element turns like a record; level speeds it.
403
+ *
404
+ * Reduced motion: backgrounds draw one static frame, loops do nothing.
405
+ */
406
+
407
+ /** A smooth, deterministic fake analyser frame at time `t` (s). */
408
+ declare function syntheticSample(t: number, bins?: number): AudioSample;
409
+ /** The live analyser frame, or the synthetic one. */
410
+ declare const musicSample: (t: number) => AudioSample;
411
+ declare const MUSIC_FX: EffectDefinition[];
412
+ /** Register the 7.1 music visualization pack (idempotent). */
413
+ declare function registerMusicPack(): void;
414
+
357
415
  /**
358
416
  * 5.5 — generative backgrounds on Canvas 2D, registered through
359
417
  * `registerEffect()` (kind `background`): `flow-field`, `voronoi`,
@@ -463,5 +521,5 @@ declare const EFFECT_PACKS: Record<string, EffectDefinition[]>;
463
521
  /** Register every 6.x effect pack (idempotent). */
464
522
  declare function registerEffectPacks(): void;
465
523
 
466
- export { DEPTH3_FX, EFFECT_PACKS, EFFECT_PACK_FORMAT, FOCUS_FX, GLSL_HEAD, GPU_FX, LIGHT_FX, MORPH2_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, VerletWorld, WEATHER_FX, WGSL_HEAD, crossDocumentTransitions, fieldFallback, glslToWgsl, loadEffectPack, packManifest, pageTransition, pointsToPath, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack, samplePath, shaderBackground, skyAt, splitChars, supportsWebGL2, supportsWebGPU, trackPointer, validateManifest, webgpuBackground, wgslModule };
524
+ export { DEPTH3_FX, EFFECT_PACKS, EFFECT_PACK_FORMAT, FOCUS_FX, GLSL_HEAD, GPU_FX, LIGHT_FX, MORPH2_FX, MUSIC_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, VerletWorld, WEATHER_FX, WGSL_HEAD, crossDocumentTransitions, fieldFallback, glslToWgsl, loadEffectPack, musicSample, packManifest, pageTransition, pointsToPath, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerMusicPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack, samplePath, shaderBackground, skyAt, splitChars, supportsWebGL2, supportsWebGPU, syntheticSample, trackPointer, validateManifest, webgpuBackground, wgslModule };
467
525
  export type { EffectPackManifest, ShaderSpec };
@@ -1,6 +1,6 @@
1
1
  export { EFFECT_PACK_FORMAT, loadEffectPack, packManifest, validateManifest } from './marketplace.js';
2
- import { G as GPU_FX, r as registerGpuPack } from '../chunks/gpu-Bkw605Ds.js';
3
- export { a as GLSL_HEAD, W as WGSL_HEAD, f as fieldFallback, g as glslToWgsl, s as shaderBackground, b as supportsWebGL2, c as supportsWebGPU, w as webgpuBackground, d as wgslModule } from '../chunks/gpu-Bkw605Ds.js';
2
+ import { G as GPU_FX, r as registerGpuPack } from '../chunks/gpu-DLPghVWr.js';
3
+ export { a as GLSL_HEAD, W as WGSL_HEAD, f as fieldFallback, g as glslToWgsl, s as shaderBackground, b as supportsWebGL2, c as supportsWebGPU, w as webgpuBackground, d as wgslModule } from '../chunks/gpu-DLPghVWr.js';
4
4
  import { TEXT3_FX, registerTextPack } from './fx-text.js';
5
5
  export { splitChars } from './fx-text.js';
6
6
  import { LIGHT_FX, registerLightPack } from './fx-light.js';
@@ -15,10 +15,13 @@ export { skyAt } from './fx-weather.js';
15
15
  import { PHYSICS2_FX, registerPhysicsPack } from './fx-physics.js';
16
16
  export { VerletWorld } from './fx-physics.js';
17
17
  import { FOCUS_FX, registerFocusPack } from './fx-focus.js';
18
- import '../chunks/registry-D23neB4M.js';
19
- import '../chunks/base-DchG4q_S.js';
18
+ import { MUSIC_FX, registerMusicPack } from './fx-music.js';
19
+ export { musicSample, syntheticSample } from './fx-music.js';
20
+ import '../chunks/registry-CyKExAmE.js';
21
+ import '../chunks/base-2-yYc93C.js';
20
22
  import '../chunks/generative-2LhxG5BJ.js';
21
23
  import '../chunks/shared-CkKHWrtJ.js';
24
+ import '../chunks/audio-DcPvT2Kh.js';
22
25
 
23
26
  /** The 6.x effect packs by name. */
24
27
  const EFFECT_PACKS = {
@@ -31,6 +34,7 @@ const EFFECT_PACKS = {
31
34
  weather: WEATHER_FX,
32
35
  physics: PHYSICS2_FX,
33
36
  focus: FOCUS_FX,
37
+ music: MUSIC_FX,
34
38
  };
35
39
  /** Register every 6.x effect pack (idempotent). */
36
40
  function registerEffectPacks() {
@@ -43,7 +47,8 @@ function registerEffectPacks() {
43
47
  registerWeatherPack();
44
48
  registerPhysicsPack();
45
49
  registerFocusPack();
50
+ registerMusicPack();
46
51
  }
47
52
 
48
- export { DEPTH3_FX, EFFECT_PACKS, FOCUS_FX, GPU_FX, LIGHT_FX, MORPH2_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, WEATHER_FX, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack };
53
+ export { DEPTH3_FX, EFFECT_PACKS, FOCUS_FX, GPU_FX, LIGHT_FX, MORPH2_FX, MUSIC_FX, PHYSICS2_FX, TEXT3_FX, TRANSITIONS2_FX, WEATHER_FX, register3dPack, registerEffectPacks, registerFocusPack, registerGpuPack, registerLightPack, registerMorphPack, registerMusicPack, registerPhysicsPack, registerTextPack, registerTransitionsPack, registerWeatherPack };
49
54
  //# sourceMappingURL=fx2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fx2.js","sources":["../../src/components/fx2/index.ts"],"sourcesContent":["/**\n * The 6.x effect packs, one entry each (`motionary/components/fx-gpu`, …) so\n * their size budgets stay separate. This module (`registerFx2()`) registers\n * them all — used by dist/widgets.umd.js and the showcase.\n */\nimport type { EffectDefinition } from '../fx/registry';\nexport { EFFECT_PACK_FORMAT, packManifest, validateManifest, loadEffectPack } from './manifest';\nexport type { EffectPackManifest } from './manifest';\nimport { GPU_FX, registerGpuPack } from './gpu';\nimport { TEXT3_FX, registerTextPack, splitChars } from './text3';\nimport { LIGHT_FX, registerLightPack, trackPointer } from './light';\nimport { DEPTH3_FX, register3dPack } from './depth3';\nimport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath } from './morph2';\nimport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions } from './transitions2';\nimport { WEATHER_FX, registerWeatherPack, skyAt } from './weather';\nimport { PHYSICS2_FX, registerPhysicsPack, VerletWorld } from './physics2';\nimport { FOCUS_FX, registerFocusPack } from './focus';\n\nexport { GPU_FX, registerGpuPack, TEXT3_FX, registerTextPack, splitChars };\nexport { shaderBackground, supportsWebGL2, fieldFallback, GLSL_HEAD } from './gl';\nexport { supportsWebGPU, glslToWgsl, wgslModule, webgpuBackground, WGSL_HEAD } from './webgpu';\nexport type { ShaderSpec } from './gl';\n\nexport { LIGHT_FX, registerLightPack, trackPointer };\n\nexport { DEPTH3_FX, register3dPack };\n\nexport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath };\n\nexport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions };\n\nexport { WEATHER_FX, registerWeatherPack, skyAt };\n\nexport { PHYSICS2_FX, registerPhysicsPack, VerletWorld };\n\nexport { FOCUS_FX, registerFocusPack };\n\n/** The 6.x effect packs by name. */\nexport const EFFECT_PACKS: Record<string, EffectDefinition[]> = {\n gpu: GPU_FX,\n text: TEXT3_FX,\n light: LIGHT_FX,\n depth: DEPTH3_FX,\n morph: MORPH2_FX,\n transitions: TRANSITIONS2_FX,\n weather: WEATHER_FX,\n physics: PHYSICS2_FX,\n focus: FOCUS_FX,\n};\n\n/** Register every 6.x effect pack (idempotent). */\nexport function registerEffectPacks(): void {\n registerGpuPack();\n registerTextPack();\n registerLightPack();\n register3dPack();\n registerMorphPack();\n registerTransitionsPack();\n registerWeatherPack();\n registerPhysicsPack();\n registerFocusPack();\n}\n\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqCA;AACO,MAAM,YAAY,GAAuC;AAC9D,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,OAAO,EAAE,WAAW;AACpB,IAAA,KAAK,EAAE,QAAQ;;AAGjB;SACgB,mBAAmB,GAAA;AACjC,IAAA,eAAe,EAAE;AACjB,IAAA,gBAAgB,EAAE;AAClB,IAAA,iBAAiB,EAAE;AACnB,IAAA,cAAc,EAAE;AAChB,IAAA,iBAAiB,EAAE;AACnB,IAAA,uBAAuB,EAAE;AACzB,IAAA,mBAAmB,EAAE;AACrB,IAAA,mBAAmB,EAAE;AACrB,IAAA,iBAAiB,EAAE;AACrB;;;;"}
1
+ {"version":3,"file":"fx2.js","sources":["../../src/components/fx2/index.ts"],"sourcesContent":["/**\n * The 6.x effect packs, one entry each (`motionary/components/fx-gpu`, …) so\n * their size budgets stay separate. This module (`registerFx2()`) registers\n * them all — used by dist/widgets.umd.js and the showcase.\n */\nimport type { EffectDefinition } from '../fx/registry';\nexport { EFFECT_PACK_FORMAT, packManifest, validateManifest, loadEffectPack } from './manifest';\nexport type { EffectPackManifest } from './manifest';\nimport { GPU_FX, registerGpuPack } from './gpu';\nimport { TEXT3_FX, registerTextPack, splitChars } from './text3';\nimport { LIGHT_FX, registerLightPack, trackPointer } from './light';\nimport { DEPTH3_FX, register3dPack } from './depth3';\nimport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath } from './morph2';\nimport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions } from './transitions2';\nimport { WEATHER_FX, registerWeatherPack, skyAt } from './weather';\nimport { PHYSICS2_FX, registerPhysicsPack, VerletWorld } from './physics2';\nimport { FOCUS_FX, registerFocusPack } from './focus';\nimport { MUSIC_FX, registerMusicPack, syntheticSample, musicSample } from './music';\n\nexport { GPU_FX, registerGpuPack, TEXT3_FX, registerTextPack, splitChars };\nexport { shaderBackground, supportsWebGL2, fieldFallback, GLSL_HEAD } from './gl';\nexport { supportsWebGPU, glslToWgsl, wgslModule, webgpuBackground, WGSL_HEAD } from './webgpu';\nexport type { ShaderSpec } from './gl';\n\nexport { LIGHT_FX, registerLightPack, trackPointer };\n\nexport { DEPTH3_FX, register3dPack };\n\nexport { MORPH2_FX, registerMorphPack, samplePath, pointsToPath };\n\nexport { TRANSITIONS2_FX, registerTransitionsPack, pageTransition, crossDocumentTransitions };\n\nexport { WEATHER_FX, registerWeatherPack, skyAt };\n\nexport { PHYSICS2_FX, registerPhysicsPack, VerletWorld };\n\nexport { FOCUS_FX, registerFocusPack };\n\nexport { MUSIC_FX, registerMusicPack, syntheticSample, musicSample };\n\n/** The 6.x effect packs by name. */\nexport const EFFECT_PACKS: Record<string, EffectDefinition[]> = {\n gpu: GPU_FX,\n text: TEXT3_FX,\n light: LIGHT_FX,\n depth: DEPTH3_FX,\n morph: MORPH2_FX,\n transitions: TRANSITIONS2_FX,\n weather: WEATHER_FX,\n physics: PHYSICS2_FX,\n focus: FOCUS_FX,\n music: MUSIC_FX,\n};\n\n/** Register every 6.x effect pack (idempotent). */\nexport function registerEffectPacks(): void {\n registerGpuPack();\n registerTextPack();\n registerLightPack();\n register3dPack();\n registerMorphPack();\n registerTransitionsPack();\n registerWeatherPack();\n registerPhysicsPack();\n registerFocusPack();\n registerMusicPack();\n}\n\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAwCA;AACO,MAAM,YAAY,GAAuC;AAC9D,IAAA,GAAG,EAAE,MAAM;AACX,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,WAAW,EAAE,eAAe;AAC5B,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,OAAO,EAAE,WAAW;AACpB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,QAAQ;;AAGjB;SACgB,mBAAmB,GAAA;AACjC,IAAA,eAAe,EAAE;AACjB,IAAA,gBAAgB,EAAE;AAClB,IAAA,iBAAiB,EAAE;AACnB,IAAA,cAAc,EAAE;AAChB,IAAA,iBAAiB,EAAE;AACnB,IAAA,uBAAuB,EAAE;AACzB,IAAA,mBAAmB,EAAE;AACrB,IAAA,mBAAmB,EAAE;AACrB,IAAA,iBAAiB,EAAE;AACnB,IAAA,iBAAiB,EAAE;AACrB;;;;"}
@@ -1,7 +1,7 @@
1
- import { y as defineElement, k as clamp } from '../chunks/base-DchG4q_S.js';
2
- import { c as createSpring } from '../chunks/spring-BhoT09Qb.js';
3
- import { g as gesture } from '../chunks/core-D2vF8kZb.js';
4
- export { p as pinchScale, s as swipeDirection } from '../chunks/core-D2vF8kZb.js';
1
+ import { u as defineElement, k as clamp } from '../chunks/base-2-yYc93C.js';
2
+ import { c as createSpring } from '../chunks/spring-BK8DiezC.js';
3
+ import { g as gesture } from '../chunks/core-DuO-AVXL.js';
4
+ export { p as pinchScale, s as swipeDirection } from '../chunks/core-DuO-AVXL.js';
5
5
 
6
6
  var css = "usa-swipeable{display:block;touch-action:pan-y;user-select:none;-webkit-user-select:none}usa-swipeable[axis=\"y\"]{touch-action:pan-x}usa-swipeable>*{transform:translate3d(var(--usa-swipe,0px),0,0);opacity:calc(1 - var(--usa-swipe-p,0) * 0.5)}usa-swipeable[axis=\"y\"]>*{transform:translate3d(0,var(--usa-swipe,0px),0)}usa-swipeable:focus-visible{outline:2px solid currentColor;outline-offset:2px}usa-pinch-zoom{display:block;overflow:hidden;touch-action:none;position:relative}usa-pinch-zoom>*{transform:translate3d(var(--usa-zoom-x,0px),var(--usa-zoom-y,0px),0) scale(var(--usa-zoom,1));transform-origin:50% 50%}usa-pinch-zoom[data-zoomed]{cursor:grab}usa-pinch-zoom:focus-visible{outline:2px solid currentColor;outline-offset:2px}";
7
7
 
@@ -1,4 +1,4 @@
1
- import { y as defineElement, z as EASE_OUT, r as raf, l as caf, k as clamp, E as EASE_SPRING } from '../chunks/base-DchG4q_S.js';
1
+ import { u as defineElement, z as EASE_OUT, r as raf, l as caf, k as clamp, E as EASE_SPRING } from '../chunks/base-2-yYc93C.js';
2
2
 
3
3
  var css$4 = "usa-ripple{position:relative;display:inline-block;overflow:hidden;isolation:isolate;border-radius:inherit;-webkit-tap-highlight-color:transparent}usa-ripple[block]{display:block}usa-ripple .usa-ripple-wave{position:absolute;border-radius:50%;pointer-events:none;transform:scale(0);z-index:-1;will-change:transform,opacity}";
4
4
 
@@ -1,4 +1,4 @@
1
- import { p as prefersReducedMotion, z as EASE_OUT, m as motionScale, y as defineElement } from '../chunks/base-DchG4q_S.js';
1
+ import { p as prefersReducedMotion, z as EASE_OUT, m as motionScale, u as defineElement } from '../chunks/base-2-yYc93C.js';
2
2
 
3
3
  /** FLIP keyframes from a previous box to the current one (pure). */
4
4
  function flipFrames(from, to, scale = true) {
@@ -1,5 +1,5 @@
1
- import { hasEffect, registerEffect, EFFECT_KINDS } from '../chunks/registry-D23neB4M.js';
2
- import '../chunks/base-DchG4q_S.js';
1
+ import { hasEffect, registerEffect, EFFECT_KINDS } from '../chunks/registry-CyKExAmE.js';
2
+ import '../chunks/base-2-yYc93C.js';
3
3
 
4
4
  const EFFECT_PACK_FORMAT = 'motionary/effect-pack';
5
5
  const SEMVER = /^\d+\.\d+\.\d+(?:-[\w.]+)?$/;
@@ -1,4 +1,4 @@
1
- import { p as prefersReducedMotion, q as now, m as motionScale, r as raf, z as EASE_OUT, k as clamp, E as EASE_SPRING, y as defineElement } from '../chunks/base-DchG4q_S.js';
1
+ import { p as prefersReducedMotion, q as now, m as motionScale, r as raf, z as EASE_OUT, k as clamp, E as EASE_SPRING, u as defineElement } from '../chunks/base-2-yYc93C.js';
2
2
 
3
3
  const anim = (el, frames, o) => {
4
4
  if (typeof el.animate !== 'function')
@@ -1,6 +1,6 @@
1
- import { y as defineElement, l as caf, r as raf, p as prefersReducedMotion, q as now, i as getMotionSensitivity, h as getMotionIntensity, g as configureComponents, v as adoptStyles } from '../chunks/base-DchG4q_S.js';
2
- export { M as MOTION_SCALE } from '../chunks/base-DchG4q_S.js';
3
- import { e as springSamples } from '../chunks/spring-BhoT09Qb.js';
1
+ import { u as defineElement, l as caf, r as raf, p as prefersReducedMotion, q as now, i as getMotionSensitivity, h as getMotionIntensity, g as configureComponents, x as adoptStyles } from '../chunks/base-2-yYc93C.js';
2
+ export { M as MOTION_SCALE } from '../chunks/base-2-yYc93C.js';
3
+ import { e as springSamples } from '../chunks/spring-BK8DiezC.js';
4
4
 
5
5
  var css$8 = "usa-cursor{--usa-cursor-color:var(--usa-accent,#7c5cff);--usa-cursor-size:28px;position:fixed;inset:0;pointer-events:none;z-index:2147483600;opacity:0;transition:opacity 0.2s ease;contain:strict}usa-cursor[data-active]{opacity:1}usa-cursor .usa-cursor-ring{position:absolute;left:0;top:0;width:var(--usa-cursor-size);height:var(--usa-cursor-size);margin:calc(var(--usa-cursor-size) / -2) 0 0 calc(var(--usa-cursor-size) / -2);border:1.5px solid var(--usa-cursor-color);border-radius:999px;box-sizing:border-box;transition:width 0.25s cubic-bezier(0.34,1.56,0.64,1),height 0.25s cubic-bezier(0.34,1.56,0.64,1),margin 0.25s ease,border-radius 0.25s ease,background-color 0.2s ease;will-change:transform}usa-cursor[data-hover] .usa-cursor-ring:first-child{width:calc(var(--usa-cursor-size) * 1.6);height:calc(var(--usa-cursor-size) * 1.6);margin:calc(var(--usa-cursor-size) * -0.8) 0 0 calc(var(--usa-cursor-size) * -0.8);background:color-mix(in srgb,var(--usa-cursor-color) 15%,transparent)}usa-cursor[data-snapped] .usa-cursor-ring{border-radius:12px;background:color-mix(in srgb,var(--usa-cursor-color) 12%,transparent);translate:-50% -50%;margin:0}usa-cursor[data-down] .usa-cursor-ring:first-child{scale:0.8}usa-cursor .usa-cursor-dot{position:absolute;left:-3px;top:-3px;width:6px;height:6px;border-radius:50%;background:var(--usa-cursor-color)}usa-cursor[data-snapped] .usa-cursor-dot{opacity:0}usa-cursor .usa-cursor-glow{position:absolute;left:-200px;top:-200px;width:400px;height:400px;border-radius:50%;background:radial-gradient(circle,color-mix(in srgb,var(--usa-cursor-color) 35%,transparent),transparent 65%);mix-blend-mode:screen}.usa-cursor-none,.usa-cursor-none *{cursor:none !important}@media (pointer:coarse),(prefers-reduced-motion:reduce){usa-cursor{display:none}.usa-cursor-none,.usa-cursor-none *{cursor:auto !important}}";
6
6
 
@@ -1,5 +1,5 @@
1
- import { o as onFrame, t as setStyleLoader, f as animationBudget, h as getMotionIntensity, g as configureComponents, j as setAnimationBudget, b as activeAnimations } from '../chunks/base-DchG4q_S.js';
2
- export { s as schedulerStats } from '../chunks/base-DchG4q_S.js';
1
+ import { o as onFrame, t as setStyleLoader, f as animationBudget, h as getMotionIntensity, g as configureComponents, j as setAnimationBudget, b as activeAnimations } from '../chunks/base-2-yYc93C.js';
2
+ export { s as schedulerStats } from '../chunks/base-2-yYc93C.js';
3
3
  import { C as COMPONENT_CATEGORIES } from '../chunks/index-tags-C04JP8g4.js';
4
4
 
5
5
  /**