use-scroll-animate 7.1.0 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/dist/chunks/builtins-HlqAkK0f.js +99 -0
- package/dist/chunks/builtins-HlqAkK0f.js.map +1 -0
- package/dist/chunks/builtins-xalxV2d5.cjs +101 -0
- package/dist/chunks/builtins-xalxV2d5.cjs.map +1 -0
- package/dist/components/angular.cjs +1 -0
- package/dist/components/angular.cjs.map +1 -1
- package/dist/components/angular.js +1 -0
- package/dist/components/angular.js.map +1 -1
- package/dist/components/effects.cjs +1 -0
- package/dist/components/effects.cjs.map +1 -1
- package/dist/components/effects.js +1 -0
- package/dist/components/effects.js.map +1 -1
- package/dist/components/fx-chart.cjs +158 -0
- package/dist/components/fx-chart.cjs.map +1 -0
- package/dist/components/fx-chart.d.cts +73 -0
- package/dist/components/fx-chart.d.ts +73 -0
- package/dist/components/fx-chart.js +154 -0
- package/dist/components/fx-chart.js.map +1 -0
- package/dist/components/fx-shop.cjs +133 -0
- package/dist/components/fx-shop.cjs.map +1 -0
- package/dist/components/fx-shop.d.cts +70 -0
- package/dist/components/fx-shop.d.ts +70 -0
- package/dist/components/fx-shop.js +129 -0
- package/dist/components/fx-shop.js.map +1 -0
- package/dist/components/fx.cjs +5 -98
- package/dist/components/fx.cjs.map +1 -1
- package/dist/components/fx.js +3 -96
- package/dist/components/fx.js.map +1 -1
- package/dist/components/fx2.cjs +12 -0
- package/dist/components/fx2.cjs.map +1 -1
- package/dist/components/fx2.d.cts +56 -1
- package/dist/components/fx2.d.ts +56 -1
- package/dist/components/fx2.js +9 -1
- package/dist/components/fx2.js.map +1 -1
- package/dist/components/solid.cjs +1 -0
- package/dist/components/solid.cjs.map +1 -1
- package/dist/components/solid.js +1 -0
- package/dist/components/solid.js.map +1 -1
- package/dist/components/svelte.cjs +1 -0
- package/dist/components/svelte.cjs.map +1 -1
- package/dist/components/svelte.js +1 -0
- package/dist/components/svelte.js.map +1 -1
- package/dist/components/vue.cjs +1 -0
- package/dist/components/vue.cjs.map +1 -1
- package/dist/components/vue.js +1 -0
- package/dist/components/vue.js.map +1 -1
- package/dist/components/widgets.cjs +916 -70
- package/dist/components/widgets.cjs.map +1 -1
- package/dist/components/widgets.d.cts +158 -2
- package/dist/components/widgets.d.ts +158 -2
- package/dist/components/widgets.js +904 -71
- package/dist/components/widgets.js.map +1 -1
- package/dist/components.cjs +2 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +2 -1
- package/dist/components.js.map +1 -1
- package/dist/widgets.umd.js +1 -1
- package/dist/widgets.umd.js.map +1 -1
- package/docs/ROADMAP.md +2 -2
- package/docs/components.md +50 -0
- package/package.json +41 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var registry = require('../chunks/registry-DehBVRDV.cjs');
|
|
4
|
+
var shared = require('../chunks/shared-jkgRH-Hx.cjs');
|
|
5
|
+
require('../chunks/base-BaQV-2ha.cjs');
|
|
6
|
+
|
|
7
|
+
const fade = (el, ctx) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });
|
|
8
|
+
const pick = (el, sel) => Array.from(el.querySelectorAll(sel));
|
|
9
|
+
/** Parse a number out of text like "$1,234.5k" → { n, pre, post, dec }. */
|
|
10
|
+
function parseFigure(s) {
|
|
11
|
+
const m = /^(\D*?)(-?[\d,]*\.?\d+)(.*)$/.exec(s.trim());
|
|
12
|
+
if (!m)
|
|
13
|
+
return null;
|
|
14
|
+
const raw = m[2].replace(/,/g, '');
|
|
15
|
+
return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };
|
|
16
|
+
}
|
|
17
|
+
const CHART_FX = [
|
|
18
|
+
{
|
|
19
|
+
name: 'bars-grow',
|
|
20
|
+
kind: 'enter',
|
|
21
|
+
description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',
|
|
22
|
+
defaults: { axis: 'y', stagger: 60, duration: 700 },
|
|
23
|
+
run: (el, o, ctx) => {
|
|
24
|
+
let bars = pick(el, '[data-bar]');
|
|
25
|
+
if (!bars.length)
|
|
26
|
+
bars = pick(el, 'rect');
|
|
27
|
+
if (!bars.length)
|
|
28
|
+
bars = Array.from(el.children);
|
|
29
|
+
if (ctx.reduced)
|
|
30
|
+
return fade(el, ctx);
|
|
31
|
+
const x = o.axis === 'x';
|
|
32
|
+
return shared.all(bars.map((b, i) => {
|
|
33
|
+
b.style.transformOrigin = x ? '0% 50%' : '50% 100%';
|
|
34
|
+
b.style.transformBox = 'fill-box';
|
|
35
|
+
return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });
|
|
36
|
+
}));
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'line-draw',
|
|
41
|
+
kind: 'enter',
|
|
42
|
+
description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',
|
|
43
|
+
defaults: { duration: 1100, stagger: 120 },
|
|
44
|
+
run: (el, o, ctx) => {
|
|
45
|
+
const lines = pick(el, 'path, polyline, line');
|
|
46
|
+
if (ctx.reduced || !lines.length)
|
|
47
|
+
return fade(el, ctx);
|
|
48
|
+
return shared.all(lines.map((p, i) => {
|
|
49
|
+
const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;
|
|
50
|
+
const fill = getComputedStyle(p).fill;
|
|
51
|
+
const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';
|
|
52
|
+
return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });
|
|
53
|
+
}));
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'ring-sweep',
|
|
58
|
+
kind: 'enter',
|
|
59
|
+
description: "SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).",
|
|
60
|
+
defaults: { duration: 1000, stagger: 150 },
|
|
61
|
+
run: (el, o, ctx) => {
|
|
62
|
+
const rings = pick(el, 'circle');
|
|
63
|
+
if (ctx.reduced || !rings.length)
|
|
64
|
+
return fade(el, ctx);
|
|
65
|
+
return shared.all(rings.map((c, i) => {
|
|
66
|
+
const r = Number(c.getAttribute('r')) || 0;
|
|
67
|
+
const len = 2 * Math.PI * r || 100;
|
|
68
|
+
const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;
|
|
69
|
+
const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;
|
|
70
|
+
return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });
|
|
71
|
+
}));
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'sankey-flow',
|
|
76
|
+
kind: 'loop',
|
|
77
|
+
description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',
|
|
78
|
+
defaults: { speed: 1, dash: '6 10' },
|
|
79
|
+
reduced: 'run',
|
|
80
|
+
run: (el, o, ctx) => {
|
|
81
|
+
let links = pick(el, '[data-flow]');
|
|
82
|
+
if (!links.length)
|
|
83
|
+
links = pick(el, 'path');
|
|
84
|
+
const prev = links.map((l) => l.getAttribute('stroke-dasharray'));
|
|
85
|
+
links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));
|
|
86
|
+
const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));
|
|
87
|
+
const stop = () => {
|
|
88
|
+
anims.forEach((a) => a?.cancel());
|
|
89
|
+
links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i])));
|
|
90
|
+
};
|
|
91
|
+
ctx.onCleanup(stop);
|
|
92
|
+
return stop;
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'number-roll',
|
|
97
|
+
kind: 'enter',
|
|
98
|
+
description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',
|
|
99
|
+
defaults: { duration: 1200, locale: undefined },
|
|
100
|
+
run: (el, o, ctx) => {
|
|
101
|
+
const targets = pick(el, '[data-value]');
|
|
102
|
+
const list = targets.length ? targets : [el];
|
|
103
|
+
const jobs = list.map((t) => {
|
|
104
|
+
const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');
|
|
105
|
+
return f && Number.isFinite(f.n) ? { t, f } : null;
|
|
106
|
+
}).filter(Boolean);
|
|
107
|
+
const out = (f, v) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;
|
|
108
|
+
if (ctx.reduced || typeof requestAnimationFrame !== 'function') {
|
|
109
|
+
jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));
|
|
110
|
+
return fade(el, ctx);
|
|
111
|
+
}
|
|
112
|
+
return new Promise((resolve) => {
|
|
113
|
+
const t0 = performance.now();
|
|
114
|
+
let raf = 0;
|
|
115
|
+
const step = (now) => {
|
|
116
|
+
const k = Math.min(1, (now - t0) / o.duration);
|
|
117
|
+
const e = 1 - Math.pow(1 - k, 3);
|
|
118
|
+
jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));
|
|
119
|
+
if (k < 1)
|
|
120
|
+
raf = requestAnimationFrame(step);
|
|
121
|
+
else
|
|
122
|
+
resolve();
|
|
123
|
+
};
|
|
124
|
+
raf = requestAnimationFrame(step);
|
|
125
|
+
ctx.onCleanup(() => cancelAnimationFrame(raf));
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'dots-pop',
|
|
131
|
+
kind: 'enter',
|
|
132
|
+
description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',
|
|
133
|
+
defaults: { stagger: 40, duration: 420 },
|
|
134
|
+
run: (el, o, ctx) => {
|
|
135
|
+
let dots = pick(el, '[data-dot]');
|
|
136
|
+
if (!dots.length)
|
|
137
|
+
dots = pick(el, 'circle');
|
|
138
|
+
if (ctx.reduced || !dots.length)
|
|
139
|
+
return fade(el, ctx);
|
|
140
|
+
const xOf = (d) => Number(d.getAttribute('cx')) || d.offsetLeft || 0;
|
|
141
|
+
const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));
|
|
142
|
+
return shared.all(sorted.map((d, i) => {
|
|
143
|
+
d.style.transformBox = 'fill-box';
|
|
144
|
+
d.style.transformOrigin = '50% 50%';
|
|
145
|
+
return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });
|
|
146
|
+
}));
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
/** Register the 7.2 data-viz motion pack (idempotent). */
|
|
151
|
+
function registerChartPack() {
|
|
152
|
+
registry.registerEffects(CHART_FX);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
exports.CHART_FX = CHART_FX;
|
|
156
|
+
exports.parseFigure = parseFigure;
|
|
157
|
+
exports.registerChartPack = registerChartPack;
|
|
158
|
+
//# sourceMappingURL=fx-chart.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fx-chart.cjs","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":["all","registerEffects"],"mappings":";;;;;;AAqBA,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,GAAkB,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACtH,MAAM,IAAI,GAAG,CAAoB,EAAW,EAAE,GAAW,KAAU,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAI,GAAG,CAAC,CAAC;AAE1G;AACM,SAAU,WAAW,CAAC,CAAS,EAAA;IACnC,MAAM,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;AACnB,IAAA,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AAClC,IAAA,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE;AACzF;AAEO,MAAM,QAAQ,GAAuB;AAC1C,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,6HAA6H;AAC1I,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;QACnD,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,IAAI,GAAG,IAAI,CAAc,EAAE,EAAE,YAAY,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAc,EAAE,EAAE,MAAM,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAkB;YACjE,IAAI,GAAG,CAAC,OAAO;AAAE,gBAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;AACrC,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG;YACxB,OAAOA,UAAG,CACR,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACf,gBAAA,CAAC,CAAC,KAA6B,CAAC,eAAe,GAAG,CAAC,GAAG,QAAQ,GAAG,UAAU;AAC3E,gBAAA,CAAC,CAAC,KAA6B,CAAC,YAAY,GAAG,UAAU;AAC1D,gBAAA,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,WAAW,GAAG,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACvQ,CAAC,CAAC,CACH;QACH,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,uGAAuG;QACpH,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QAC1C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,IAAI,CAAqB,EAAE,EAAE,sBAAsB,CAAC;AAClE,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YACtD,OAAOA,UAAG,CACR,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBACjB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,cAAc,KAAK,UAAU,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,IAAI,GAAG,IAAI;gBACtF,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;gBACrC,MAAM,OAAO,GAAG,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,kBAAkB;gBACtE,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACxX,CAAC,CAAC,CACH;QACH,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,+FAA+F;QAC5G,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QAC1C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,KAAK,GAAG,IAAI,CAAmB,EAAE,EAAE,QAAQ,CAAC;AAClD,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YACtD,OAAOA,UAAG,CACR,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACjB,gBAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG;AAClC,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE;AAClE,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;gBAC7D,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC5M,CAAC,CAAC,CACH;QACH,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,8GAA8G;QAC3H,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;AACpC,QAAA,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,KAAK,GAAG,IAAI,CAAiB,EAAE,EAAE,aAAa,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,gBAAA,KAAK,GAAG,IAAI,CAAiB,EAAE,EAAE,MAAM,CAAC;AAC3D,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;AACjE,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/M,MAAM,IAAI,GAAG,MAAK;AAChB,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AACjC,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AACpI,YAAA,CAAC;AACD,YAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,YAAA,OAAO,IAAI;QACb,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,kIAAkI;QAC/I,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;QAC/C,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,MAAM,OAAO,GAAG,IAAI,CAAc,EAAE,EAAE,cAAc,CAAC;AACrD,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC1B,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;gBACnL,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI;AACpD,YAAA,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAyE;AAC1F,YAAA,MAAM,GAAG,GAAG,CAAC,CAA8C,EAAE,CAAS,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI;YACtL,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE;gBAC9D,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,gBAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YACtB;AACA,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,gBAAA,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC5B,IAAI,GAAG,GAAG,CAAC;AACX,gBAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAI;AAC3B,oBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC;AAC9C,oBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAChC,oBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7D,IAAI,CAAC,GAAG,CAAC;AAAE,wBAAA,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC;;AACvC,wBAAA,OAAO,EAAE;AAChB,gBAAA,CAAC;AACD,gBAAA,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAChD,YAAA,CAAC,CAAC;QACJ,CAAC;AACF,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,2GAA2G;QACxH,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;QACxC,GAAG,EAAE,CAAC,EAAe,EAAE,CAAM,EAAE,GAAkB,KAAI;YACnD,IAAI,IAAI,GAAG,IAAI,CAAa,EAAE,EAAE,YAAY,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAa,EAAE,EAAE,QAAQ,CAAC;AACvD,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC;YACrD,MAAM,GAAG,GAAG,CAAC,CAAU,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAK,CAAiB,CAAC,UAAU,IAAI,CAAC;YAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAOA,UAAG,CACR,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACjB,gBAAA,CAAC,CAAC,KAA6B,CAAC,YAAY,GAAG,UAAU;AACzD,gBAAA,CAAC,CAAC,KAA6B,CAAC,eAAe,GAAG,SAAS;AAC5D,gBAAA,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACpP,CAAC,CAAC,CACH;QACH,CAAC;AACF,KAAA;;AAGH;SACgB,iBAAiB,GAAA;IAC/BC,wBAAe,CAAC,QAAQ,CAAC;AAC3B;;;;;;"}
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
* 7.2 — Data-viz motion (`motionary/fx/chart`, also
|
|
46
|
+
* `motionary/components/fx-chart`): entrances for the charts you already
|
|
47
|
+
* have (any SVG or HTML chart library), registered through `registerEffect()`:
|
|
48
|
+
*
|
|
49
|
+
* - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow
|
|
50
|
+
* from the baseline in a stagger.
|
|
51
|
+
* - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.
|
|
52
|
+
* - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.
|
|
53
|
+
* - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or
|
|
54
|
+
* every stroked `path`) to show direction and volume.
|
|
55
|
+
* - `number-roll` (enter) — numbers (`[data-value]` or the text) count up
|
|
56
|
+
* with locale formatting.
|
|
57
|
+
* - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.
|
|
58
|
+
*
|
|
59
|
+
* Reduced motion: final state with a short fade (sankey-flow is static).
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/** Parse a number out of text like "$1,234.5k" → { n, pre, post, dec }. */
|
|
63
|
+
declare function parseFigure(s: string): {
|
|
64
|
+
n: number;
|
|
65
|
+
pre: string;
|
|
66
|
+
post: string;
|
|
67
|
+
dec: number;
|
|
68
|
+
} | null;
|
|
69
|
+
declare const CHART_FX: EffectDefinition[];
|
|
70
|
+
/** Register the 7.2 data-viz motion pack (idempotent). */
|
|
71
|
+
declare function registerChartPack(): void;
|
|
72
|
+
|
|
73
|
+
export { CHART_FX, parseFigure, registerChartPack };
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
* 7.2 — Data-viz motion (`motionary/fx/chart`, also
|
|
46
|
+
* `motionary/components/fx-chart`): entrances for the charts you already
|
|
47
|
+
* have (any SVG or HTML chart library), registered through `registerEffect()`:
|
|
48
|
+
*
|
|
49
|
+
* - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow
|
|
50
|
+
* from the baseline in a stagger.
|
|
51
|
+
* - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.
|
|
52
|
+
* - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.
|
|
53
|
+
* - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or
|
|
54
|
+
* every stroked `path`) to show direction and volume.
|
|
55
|
+
* - `number-roll` (enter) — numbers (`[data-value]` or the text) count up
|
|
56
|
+
* with locale formatting.
|
|
57
|
+
* - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.
|
|
58
|
+
*
|
|
59
|
+
* Reduced motion: final state with a short fade (sankey-flow is static).
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/** Parse a number out of text like "$1,234.5k" → { n, pre, post, dec }. */
|
|
63
|
+
declare function parseFigure(s: string): {
|
|
64
|
+
n: number;
|
|
65
|
+
pre: string;
|
|
66
|
+
post: string;
|
|
67
|
+
dec: number;
|
|
68
|
+
} | null;
|
|
69
|
+
declare const CHART_FX: EffectDefinition[];
|
|
70
|
+
/** Register the 7.2 data-viz motion pack (idempotent). */
|
|
71
|
+
declare function registerChartPack(): void;
|
|
72
|
+
|
|
73
|
+
export { CHART_FX, parseFigure, registerChartPack };
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { registerEffects } from '../chunks/registry-CyKExAmE.js';
|
|
2
|
+
import { a as all } from '../chunks/shared-CkKHWrtJ.js';
|
|
3
|
+
import '../chunks/base-2-yYc93C.js';
|
|
4
|
+
|
|
5
|
+
const fade = (el, ctx) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });
|
|
6
|
+
const pick = (el, sel) => Array.from(el.querySelectorAll(sel));
|
|
7
|
+
/** Parse a number out of text like "$1,234.5k" → { n, pre, post, dec }. */
|
|
8
|
+
function parseFigure(s) {
|
|
9
|
+
const m = /^(\D*?)(-?[\d,]*\.?\d+)(.*)$/.exec(s.trim());
|
|
10
|
+
if (!m)
|
|
11
|
+
return null;
|
|
12
|
+
const raw = m[2].replace(/,/g, '');
|
|
13
|
+
return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };
|
|
14
|
+
}
|
|
15
|
+
const CHART_FX = [
|
|
16
|
+
{
|
|
17
|
+
name: 'bars-grow',
|
|
18
|
+
kind: 'enter',
|
|
19
|
+
description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',
|
|
20
|
+
defaults: { axis: 'y', stagger: 60, duration: 700 },
|
|
21
|
+
run: (el, o, ctx) => {
|
|
22
|
+
let bars = pick(el, '[data-bar]');
|
|
23
|
+
if (!bars.length)
|
|
24
|
+
bars = pick(el, 'rect');
|
|
25
|
+
if (!bars.length)
|
|
26
|
+
bars = Array.from(el.children);
|
|
27
|
+
if (ctx.reduced)
|
|
28
|
+
return fade(el, ctx);
|
|
29
|
+
const x = o.axis === 'x';
|
|
30
|
+
return all(bars.map((b, i) => {
|
|
31
|
+
b.style.transformOrigin = x ? '0% 50%' : '50% 100%';
|
|
32
|
+
b.style.transformBox = 'fill-box';
|
|
33
|
+
return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });
|
|
34
|
+
}));
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'line-draw',
|
|
39
|
+
kind: 'enter',
|
|
40
|
+
description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',
|
|
41
|
+
defaults: { duration: 1100, stagger: 120 },
|
|
42
|
+
run: (el, o, ctx) => {
|
|
43
|
+
const lines = pick(el, 'path, polyline, line');
|
|
44
|
+
if (ctx.reduced || !lines.length)
|
|
45
|
+
return fade(el, ctx);
|
|
46
|
+
return all(lines.map((p, i) => {
|
|
47
|
+
const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;
|
|
48
|
+
const fill = getComputedStyle(p).fill;
|
|
49
|
+
const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';
|
|
50
|
+
return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });
|
|
51
|
+
}));
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'ring-sweep',
|
|
56
|
+
kind: 'enter',
|
|
57
|
+
description: "SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).",
|
|
58
|
+
defaults: { duration: 1000, stagger: 150 },
|
|
59
|
+
run: (el, o, ctx) => {
|
|
60
|
+
const rings = pick(el, 'circle');
|
|
61
|
+
if (ctx.reduced || !rings.length)
|
|
62
|
+
return fade(el, ctx);
|
|
63
|
+
return all(rings.map((c, i) => {
|
|
64
|
+
const r = Number(c.getAttribute('r')) || 0;
|
|
65
|
+
const len = 2 * Math.PI * r || 100;
|
|
66
|
+
const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;
|
|
67
|
+
const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;
|
|
68
|
+
return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });
|
|
69
|
+
}));
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'sankey-flow',
|
|
74
|
+
kind: 'loop',
|
|
75
|
+
description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',
|
|
76
|
+
defaults: { speed: 1, dash: '6 10' },
|
|
77
|
+
reduced: 'run',
|
|
78
|
+
run: (el, o, ctx) => {
|
|
79
|
+
let links = pick(el, '[data-flow]');
|
|
80
|
+
if (!links.length)
|
|
81
|
+
links = pick(el, 'path');
|
|
82
|
+
const prev = links.map((l) => l.getAttribute('stroke-dasharray'));
|
|
83
|
+
links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));
|
|
84
|
+
const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));
|
|
85
|
+
const stop = () => {
|
|
86
|
+
anims.forEach((a) => a?.cancel());
|
|
87
|
+
links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i])));
|
|
88
|
+
};
|
|
89
|
+
ctx.onCleanup(stop);
|
|
90
|
+
return stop;
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'number-roll',
|
|
95
|
+
kind: 'enter',
|
|
96
|
+
description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',
|
|
97
|
+
defaults: { duration: 1200, locale: undefined },
|
|
98
|
+
run: (el, o, ctx) => {
|
|
99
|
+
const targets = pick(el, '[data-value]');
|
|
100
|
+
const list = targets.length ? targets : [el];
|
|
101
|
+
const jobs = list.map((t) => {
|
|
102
|
+
const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');
|
|
103
|
+
return f && Number.isFinite(f.n) ? { t, f } : null;
|
|
104
|
+
}).filter(Boolean);
|
|
105
|
+
const out = (f, v) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;
|
|
106
|
+
if (ctx.reduced || typeof requestAnimationFrame !== 'function') {
|
|
107
|
+
jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));
|
|
108
|
+
return fade(el, ctx);
|
|
109
|
+
}
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
const t0 = performance.now();
|
|
112
|
+
let raf = 0;
|
|
113
|
+
const step = (now) => {
|
|
114
|
+
const k = Math.min(1, (now - t0) / o.duration);
|
|
115
|
+
const e = 1 - Math.pow(1 - k, 3);
|
|
116
|
+
jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));
|
|
117
|
+
if (k < 1)
|
|
118
|
+
raf = requestAnimationFrame(step);
|
|
119
|
+
else
|
|
120
|
+
resolve();
|
|
121
|
+
};
|
|
122
|
+
raf = requestAnimationFrame(step);
|
|
123
|
+
ctx.onCleanup(() => cancelAnimationFrame(raf));
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'dots-pop',
|
|
129
|
+
kind: 'enter',
|
|
130
|
+
description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',
|
|
131
|
+
defaults: { stagger: 40, duration: 420 },
|
|
132
|
+
run: (el, o, ctx) => {
|
|
133
|
+
let dots = pick(el, '[data-dot]');
|
|
134
|
+
if (!dots.length)
|
|
135
|
+
dots = pick(el, 'circle');
|
|
136
|
+
if (ctx.reduced || !dots.length)
|
|
137
|
+
return fade(el, ctx);
|
|
138
|
+
const xOf = (d) => Number(d.getAttribute('cx')) || d.offsetLeft || 0;
|
|
139
|
+
const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));
|
|
140
|
+
return all(sorted.map((d, i) => {
|
|
141
|
+
d.style.transformBox = 'fill-box';
|
|
142
|
+
d.style.transformOrigin = '50% 50%';
|
|
143
|
+
return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });
|
|
144
|
+
}));
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
/** Register the 7.2 data-viz motion pack (idempotent). */
|
|
149
|
+
function registerChartPack() {
|
|
150
|
+
registerEffects(CHART_FX);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { CHART_FX, parseFigure, registerChartPack };
|
|
154
|
+
//# sourceMappingURL=fx-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fx-chart.js","sources":["../../src/components/fx2/chart.ts"],"sourcesContent":["/**\n * 7.2 — Data-viz motion (`motionary/fx/chart`, also\n * `motionary/components/fx-chart`): entrances for the charts you already\n * have (any SVG or HTML chart library), registered through `registerEffect()`:\n *\n * - `bars-grow` (enter) — bars (`[data-bar]`, `rect`, or the children) grow\n * from the baseline in a stagger.\n * - `line-draw` (enter) — every SVG `path` / `polyline` / `line` draws itself.\n * - `ring-sweep` (enter) — SVG `circle` arcs sweep around from 12 o'clock.\n * - `sankey-flow` (loop) — dashes flow along the SVG links (`[data-flow]` or\n * every stroked `path`) to show direction and volume.\n * - `number-roll` (enter) — numbers (`[data-value]` or the text) count up\n * with locale formatting.\n * - `dots-pop` (enter) — scatter / line points (`circle`, `[data-dot]`) pop in.\n *\n * Reduced motion: final state with a short fade (sankey-flow is static).\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { all } from '../effects/shared';\n\nconst fade = (el: Element, ctx: EffectContext) => ctx.animate(el, [{ opacity: 0 }, { opacity: 1 }], { duration: 250 });\nconst pick = <T extends Element>(el: Element, sel: string): T[] => Array.from(el.querySelectorAll<T>(sel));\n\n/** Parse a number out of text like \"$1,234.5k\" → { n, pre, post, dec }. */\nexport function parseFigure(s: string): { n: number; pre: string; post: string; dec: number } | null {\n const m = /^(\\D*?)(-?[\\d,]*\\.?\\d+)(.*)$/.exec(s.trim());\n if (!m) return null;\n const raw = m[2].replace(/,/g, '');\n return { n: Number(raw), pre: m[1], post: m[3], dec: (raw.split('.')[1] || '').length };\n}\n\nexport const CHART_FX: EffectDefinition[] = [\n {\n name: 'bars-grow',\n kind: 'enter',\n description: 'Bars (`[data-bar]`, SVG `rect`, or the children) grow from the baseline in a stagger (`axis` y | x, `stagger`, `duration`).',\n defaults: { axis: 'y', stagger: 60, duration: 700 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let bars = pick<HTMLElement>(el, '[data-bar]');\n if (!bars.length) bars = pick<HTMLElement>(el, 'rect');\n if (!bars.length) bars = Array.from(el.children) as HTMLElement[];\n if (ctx.reduced) return fade(el, ctx);\n const x = o.axis === 'x';\n return all(\n bars.map((b, i) => {\n (b.style as CSSStyleDeclaration).transformOrigin = x ? '0% 50%' : '50% 100%';\n (b.style as CSSStyleDeclaration).transformBox = 'fill-box';\n return ctx.animate(b, [{ transform: x ? 'scaleX(0)' : 'scaleY(0)' }, { transform: x ? 'scaleX(1.04)' : 'scaleY(1.04)', offset: 0.75 }, { transform: 'none' }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.2,.8,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'line-draw',\n kind: 'enter',\n description: 'Every SVG `path` / `polyline` / `line` draws itself, then area fills fade in (`duration`, `stagger`).',\n defaults: { duration: 1100, stagger: 120 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const lines = pick<SVGGeometryElement>(el, 'path, polyline, line');\n if (ctx.reduced || !lines.length) return fade(el, ctx);\n return all(\n lines.map((p, i) => {\n const len = typeof p.getTotalLength === 'function' ? p.getTotalLength() || 1000 : 1000;\n const fill = getComputedStyle(p).fill;\n const hasFill = fill && fill !== 'none' && fill !== 'rgba(0, 0, 0, 0)';\n return ctx.animate(p, [{ strokeDasharray: `${len}`, strokeDashoffset: len, fillOpacity: hasFill ? 0 : 1 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: hasFill ? 0 : 1, offset: 0.8 }, { strokeDasharray: `${len}`, strokeDashoffset: 0, fillOpacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'ring-sweep',\n kind: 'enter',\n description: \"SVG `circle` arcs (donut / ring charts) sweep around from 12 o'clock (`duration`, `stagger`).\",\n defaults: { duration: 1000, stagger: 150 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const rings = pick<SVGCircleElement>(el, 'circle');\n if (ctx.reduced || !rings.length) return fade(el, ctx);\n return all(\n rings.map((c, i) => {\n const r = Number(c.getAttribute('r')) || 0;\n const len = 2 * Math.PI * r || 100;\n const dash = c.getAttribute('stroke-dasharray') || `${len} ${len}`;\n const visible = Number(String(dash).split(/[ ,]+/)[0]) || len;\n return ctx.animate(c, [{ strokeDasharray: `0 ${len}` }, { strokeDasharray: `${visible} ${len}` }], { duration: o.duration, delay: i * o.stagger, easing: 'cubic-bezier(.6,.05,.3,1)', fill: 'backwards' });\n })\n );\n },\n },\n {\n name: 'sankey-flow',\n kind: 'loop',\n description: 'Dashes flow along the SVG links (`[data-flow]` or every stroked `path`) to show direction (`speed`, `dash`).',\n defaults: { speed: 1, dash: '6 10' },\n reduced: 'run',\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let links = pick<SVGPathElement>(el, '[data-flow]');\n if (!links.length) links = pick<SVGPathElement>(el, 'path');\n const prev = links.map((l) => l.getAttribute('stroke-dasharray'));\n links.forEach((l) => l.setAttribute('stroke-dasharray', o.dash));\n const anims = ctx.reduced ? [] : links.map((l, i) => ctx.animate(l, [{ strokeDashoffset: 0 }, { strokeDashoffset: -32 }], { duration: (1200 + (i % 3) * 300) / Math.max(0.1, o.speed), iterations: Infinity }));\n const stop = () => {\n anims.forEach((a) => a?.cancel());\n links.forEach((l, i) => (prev[i] === null ? l.removeAttribute('stroke-dasharray') : l.setAttribute('stroke-dasharray', prev[i]!)));\n };\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'number-roll',\n kind: 'enter',\n description: 'Numbers (`[data-value]` or the text of the element) count up with locale formatting, keeping prefixes and suffixes (`duration`).',\n defaults: { duration: 1200, locale: undefined },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const targets = pick<HTMLElement>(el, '[data-value]');\n const list = targets.length ? targets : [el];\n const jobs = list.map((t) => {\n const f = t.dataset.value !== undefined ? { ...(parseFigure(t.textContent || '') || { pre: '', post: '', dec: 0 }), n: Number(t.dataset.value) } : parseFigure(t.textContent || '');\n return f && Number.isFinite(f.n) ? { t, f } : null;\n }).filter(Boolean) as { t: HTMLElement; f: NonNullable<ReturnType<typeof parseFigure>> }[];\n const out = (f: NonNullable<ReturnType<typeof parseFigure>>, v: number) => f.pre + v.toLocaleString(o.locale, { minimumFractionDigits: f.dec, maximumFractionDigits: f.dec }) + f.post;\n if (ctx.reduced || typeof requestAnimationFrame !== 'function') {\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n)));\n return fade(el, ctx);\n }\n return new Promise<void>((resolve) => {\n const t0 = performance.now();\n let raf = 0;\n const step = (now: number) => {\n const k = Math.min(1, (now - t0) / o.duration);\n const e = 1 - Math.pow(1 - k, 3);\n jobs.forEach(({ t, f }) => (t.textContent = out(f, f.n * e)));\n if (k < 1) raf = requestAnimationFrame(step);\n else resolve();\n };\n raf = requestAnimationFrame(step);\n ctx.onCleanup(() => cancelAnimationFrame(raf));\n });\n },\n },\n {\n name: 'dots-pop',\n kind: 'enter',\n description: 'Scatter / line-chart points (`circle`, `[data-dot]`) pop in with an overshoot, left to right (`stagger`).',\n defaults: { stagger: 40, duration: 420 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n let dots = pick<SVGElement>(el, '[data-dot]');\n if (!dots.length) dots = pick<SVGElement>(el, 'circle');\n if (ctx.reduced || !dots.length) return fade(el, ctx);\n const xOf = (d: Element) => Number(d.getAttribute('cx')) || (d as HTMLElement).offsetLeft || 0;\n const sorted = dots.slice().sort((a, b) => xOf(a) - xOf(b));\n return all(\n sorted.map((d, i) => {\n (d.style as CSSStyleDeclaration).transformBox = 'fill-box';\n (d.style as CSSStyleDeclaration).transformOrigin = '50% 50%';\n return ctx.animate(d, [{ transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.5)', opacity: 1, offset: 0.6 }, { transform: 'scale(1)', opacity: 1 }], { duration: o.duration, delay: i * o.stagger, easing: 'ease-out', fill: 'backwards' });\n })\n );\n },\n },\n];\n\n/** Register the 7.2 data-viz motion pack (idempotent). */\nexport function registerChartPack(): void {\n registerEffects(CHART_FX);\n}\n"],"names":[],"mappings":"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"}
|