use-scroll-animate 6.2.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -2
- package/README.md +2 -2
- package/README_ja.md +2 -2
- package/README_zh.md +2 -2
- package/dist/chunks/{base-C_3cAoRz.js → base-DchG4q_S.js} +2 -2
- package/dist/chunks/{base-C_3cAoRz.js.map → base-DchG4q_S.js.map} +1 -1
- package/dist/chunks/{core-ps8uvYuN.js → core-D2vF8kZb.js} +2 -2
- package/dist/chunks/{core-ps8uvYuN.js.map → core-D2vF8kZb.js.map} +1 -1
- package/dist/chunks/{core-VEBw36QK.js → core-DVyTlo9Q.js} +2 -2
- package/dist/chunks/{core-VEBw36QK.js.map → core-DVyTlo9Q.js.map} +1 -1
- package/dist/chunks/{fx-Bs6IrV4Q.js → fx-DUMVKSvg.js} +2 -2
- package/dist/chunks/{fx-Bs6IrV4Q.js.map → fx-DUMVKSvg.js.map} +1 -1
- package/dist/chunks/{generative-D2YyhaeO.js → generative-2LhxG5BJ.js} +3 -49
- package/dist/chunks/generative-2LhxG5BJ.js.map +1 -0
- package/dist/chunks/{generative-DzIZq-_g.cjs → generative-BHIj-NU0.cjs} +3 -56
- package/dist/chunks/generative-BHIj-NU0.cjs.map +1 -0
- package/dist/chunks/{gpu-CenK2l6b.cjs → gpu-BBRLgEzM.cjs} +13 -12
- package/dist/chunks/gpu-BBRLgEzM.cjs.map +1 -0
- package/dist/chunks/{gpu-Bu7qwugO.js → gpu-EjV49FQk.js} +4 -3
- package/dist/chunks/gpu-EjV49FQk.js.map +1 -0
- package/dist/chunks/{registry-CKNLQpwd.js → registry-Bu5NrAyA.js} +2 -2
- package/dist/chunks/{registry-CKNLQpwd.js.map → registry-Bu5NrAyA.js.map} +1 -1
- package/dist/chunks/shared-CkKHWrtJ.js +50 -0
- package/dist/chunks/shared-CkKHWrtJ.js.map +1 -0
- package/dist/chunks/shared-jkgRH-Hx.cjs +58 -0
- package/dist/chunks/shared-jkgRH-Hx.cjs.map +1 -0
- package/dist/chunks/{spring-CbvHfVtP.js → spring-BhoT09Qb.js} +2 -2
- package/dist/chunks/{spring-CbvHfVtP.js.map → spring-BhoT09Qb.js.map} +1 -1
- package/dist/chunks/{variants-DRlKVHvu.js → variants-C_hv_s23.js} +2 -2
- package/dist/chunks/{variants-DRlKVHvu.js.map → variants-C_hv_s23.js.map} +1 -1
- package/dist/components/a11y.js +2 -2
- package/dist/components/angular.js +7 -7
- package/dist/components/background.js +2 -2
- package/dist/components/bridge.js +1 -1
- package/dist/components/cards.js +2 -2
- package/dist/components/click.js +3 -3
- package/dist/components/depth.js +3 -3
- package/dist/components/effects.cjs +45 -44
- package/dist/components/effects.cjs.map +1 -1
- package/dist/components/effects.js +7 -6
- package/dist/components/effects.js.map +1 -1
- package/dist/components/feedback.js +1 -1
- package/dist/components/fx-gpu.cjs +3 -2
- package/dist/components/fx-gpu.cjs.map +1 -1
- package/dist/components/fx-gpu.js +5 -4
- package/dist/components/fx-gpu.js.map +1 -1
- package/dist/components/fx-light.cjs +221 -0
- package/dist/components/fx-light.cjs.map +1 -0
- package/dist/components/fx-light.d.cts +72 -0
- package/dist/components/fx-light.d.ts +72 -0
- package/dist/components/fx-light.js +217 -0
- package/dist/components/fx-light.js.map +1 -0
- package/dist/components/fx-text.cjs +267 -0
- package/dist/components/fx-text.cjs.map +1 -0
- package/dist/components/fx-text.d.cts +70 -0
- package/dist/components/fx-text.d.ts +70 -0
- package/dist/components/fx-text.js +263 -0
- package/dist/components/fx-text.js.map +1 -0
- package/dist/components/fx.js +5 -5
- package/dist/components/fx2.cjs +15 -2
- package/dist/components/fx2.cjs.map +1 -1
- package/dist/components/fx2.d.cts +55 -1
- package/dist/components/fx2.d.ts +55 -1
- package/dist/components/fx2.js +15 -6
- package/dist/components/fx2.js.map +1 -1
- package/dist/components/gesture.js +4 -4
- package/dist/components/interaction.js +1 -1
- package/dist/components/layout.js +1 -1
- package/dist/components/packs.js +1 -1
- package/dist/components/page.js +3 -3
- package/dist/components/perf.js +2 -2
- package/dist/components/physics.js +3 -3
- package/dist/components/reveal.js +1 -1
- package/dist/components/solid.js +7 -7
- package/dist/components/svelte.js +7 -7
- package/dist/components/svg.js +1 -1
- package/dist/components/text.js +2 -2
- package/dist/components/timeline.js +3 -3
- package/dist/components/transitions.js +1 -1
- package/dist/components/ui.js +4 -4
- package/dist/components/vue.js +7 -7
- package/dist/components/webgl.js +1 -1
- package/dist/components/widgets.cjs +1096 -8
- package/dist/components/widgets.cjs.map +1 -1
- package/dist/components/widgets.d.cts +163 -2
- package/dist/components/widgets.d.ts +163 -2
- package/dist/components/widgets.js +1084 -11
- package/dist/components/widgets.js.map +1 -1
- package/dist/components.js +9 -9
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.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 +61 -1
- package/package.json +24 -4
- package/dist/chunks/generative-D2YyhaeO.js.map +0 -1
- package/dist/chunks/generative-DzIZq-_g.cjs.map +0 -1
- package/dist/chunks/gpu-Bu7qwugO.js.map +0 -1
- package/dist/chunks/gpu-CenK2l6b.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { y as defineElement, A as kindOf, z as EASE_OUT, k as clamp, F as FLUENT_DECELERATE, E as EASE_SPRING } from '../chunks/base-DchG4q_S.js';
|
|
2
2
|
|
|
3
3
|
var css$4 = "usa-spinner{--usa-spinner-size:32px;--usa-spinner-color:currentColor;position:relative;display:inline-block;vertical-align:middle;flex:none;width:var(--usa-spinner-size);height:var(--usa-spinner-size);color:var(--usa-spinner-color)}usa-spinner i{position:absolute;display:block}usa-spinner[paused] *,usa-spinner[paused] *::after{animation-play-state:paused !important}usa-spinner svg{width:100%;height:100%;animation:usa-spin 2s linear infinite;overflow:visible}usa-spinner svg circle{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-dasharray:0.5 100;stroke-dashoffset:0;animation:usa-ring-arc 1.6s ease-in-out infinite}@keyframes usa-spin{to{transform:rotate(360deg)}}@keyframes usa-ring-arc{0%{stroke-dasharray:0.5 100;stroke-dashoffset:0}50%{stroke-dasharray:62 100;stroke-dashoffset:-20}100%{stroke-dasharray:0.5 100;stroke-dashoffset:-99}}usa-spinner[data-kind=\"windows\"] i{inset:0;opacity:0;animation:usa-orbit 5.5s infinite}usa-spinner[data-kind=\"windows\"] i::after{content:\"\";position:absolute;left:50%;top:0;width:12%;height:12%;margin-left:-6%;border-radius:50%;background:currentColor}usa-spinner[data-kind=\"windows\"] i:nth-child(2){animation-delay:240ms;--n:1}usa-spinner[data-kind=\"windows\"] i:nth-child(3){animation-delay:480ms;--n:2}usa-spinner[data-kind=\"windows\"] i:nth-child(4){animation-delay:720ms;--n:3}usa-spinner[data-kind=\"windows\"] i:nth-child(5){animation-delay:960ms;--n:4}@keyframes usa-orbit{0%{transform:rotate(225deg);opacity:1;animation-timing-function:ease-out}7%{transform:rotate(345deg);animation-timing-function:linear}30%{transform:rotate(455deg);animation-timing-function:ease-in-out}39%{transform:rotate(690deg);animation-timing-function:linear}70%{transform:rotate(815deg);opacity:1;animation-timing-function:ease-out}75%{transform:rotate(945deg);animation-timing-function:ease-out}76%,100%{transform:rotate(945deg);opacity:0}}usa-spinner[data-kind=\"ring\"] i{inset:0;border-radius:50%;border:calc(var(--usa-spinner-size) / 9) solid color-mix(in srgb,currentColor 20%,transparent);border-top-color:currentColor;animation:usa-spin 0.8s linear infinite}usa-spinner[data-kind=\"dots\"]{display:inline-flex;align-items:center;justify-content:space-between;height:calc(var(--usa-spinner-size) / 2.5)}usa-spinner[data-kind=\"dots\"] i{position:static;width:22%;aspect-ratio:1;border-radius:50%;background:currentColor;animation:usa-dot 1.2s ease-in-out infinite}usa-spinner[data-kind=\"dots\"] i:nth-child(2){animation-delay:0.15s}usa-spinner[data-kind=\"dots\"] i:nth-child(3){animation-delay:0.3s}@keyframes usa-dot{0%,60%,100%{transform:translateY(0);opacity:0.35}30%{transform:translateY(-70%);opacity:1}}usa-spinner[data-kind=\"pulse\"] i{inset:0;border-radius:50%;background:currentColor;opacity:0;animation:usa-pulse 1.6s cubic-bezier(0.22,1,0.36,1) infinite}usa-spinner[data-kind=\"pulse\"] i:nth-child(2){animation-delay:0.8s}@keyframes usa-pulse{from{transform:scale(0.1);opacity:0.8}to{transform:scale(1);opacity:0}}usa-spinner[data-kind=\"bars\"]{display:inline-flex;align-items:center;justify-content:space-between}usa-spinner[data-kind=\"bars\"] i{position:static;width:16%;height:100%;border-radius:2px;background:currentColor;transform:scaleY(0.35);animation:usa-bar 1s ease-in-out infinite}usa-spinner[data-kind=\"bars\"] i:nth-child(2){animation-delay:0.12s}usa-spinner[data-kind=\"bars\"] i:nth-child(3){animation-delay:0.24s}usa-spinner[data-kind=\"bars\"] i:nth-child(4){animation-delay:0.36s}@keyframes usa-bar{0%,100%{transform:scaleY(0.35)}40%{transform:scaleY(1)}}@media (prefers-reduced-motion:reduce){usa-spinner svg,usa-spinner i,usa-spinner i::after{animation:usa-calm 2.4s ease-in-out infinite !important}usa-spinner[data-kind=\"windows\"] i{transform:rotate(calc(var(--n,0) * 72deg))}usa-spinner svg circle{animation:none;stroke-dasharray:30 100}}@keyframes usa-calm{0%,100%{opacity:1}50%{opacity:0.4}}";
|
|
4
4
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
require('../chunks/registry-DehBVRDV.cjs');
|
|
4
|
-
require('../chunks/generative-
|
|
5
|
-
|
|
4
|
+
require('../chunks/generative-BHIj-NU0.cjs');
|
|
5
|
+
require('../chunks/shared-jkgRH-Hx.cjs');
|
|
6
|
+
var components_fxGpu = require('../chunks/gpu-BBRLgEzM.cjs');
|
|
6
7
|
require('../chunks/base-BaQV-2ha.cjs');
|
|
7
8
|
|
|
8
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-gpu.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fx-gpu.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import '../chunks/registry-
|
|
2
|
-
import '../chunks/generative-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import '../chunks/registry-Bu5NrAyA.js';
|
|
2
|
+
import '../chunks/generative-2LhxG5BJ.js';
|
|
3
|
+
import '../chunks/shared-CkKHWrtJ.js';
|
|
4
|
+
export { G as GPU_FX, r as registerGpuEffects } from '../chunks/gpu-EjV49FQk.js';
|
|
5
|
+
import '../chunks/base-DchG4q_S.js';
|
|
5
6
|
//# sourceMappingURL=fx-gpu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-gpu.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fx-gpu.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var registry = require('../chunks/registry-DehBVRDV.cjs');
|
|
4
|
+
var generative = require('../chunks/generative-BHIj-NU0.cjs');
|
|
5
|
+
var shared = require('../chunks/shared-jkgRH-Hx.cjs');
|
|
6
|
+
require('../chunks/base-BaQV-2ha.cjs');
|
|
7
|
+
|
|
8
|
+
/** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */
|
|
9
|
+
function trackPointer(el, ctx, fn, x0 = 0.3, y0 = 0.25) {
|
|
10
|
+
fn(x0, y0, false);
|
|
11
|
+
if (ctx.reduced)
|
|
12
|
+
return () => undefined;
|
|
13
|
+
let raf = 0;
|
|
14
|
+
let px = x0;
|
|
15
|
+
let py = y0;
|
|
16
|
+
let inside = false;
|
|
17
|
+
const flush = () => {
|
|
18
|
+
raf = 0;
|
|
19
|
+
fn(px, py, inside);
|
|
20
|
+
};
|
|
21
|
+
const queue = () => {
|
|
22
|
+
if (!raf)
|
|
23
|
+
raf = typeof requestAnimationFrame === 'function' ? requestAnimationFrame(flush) : (flush(), 0);
|
|
24
|
+
};
|
|
25
|
+
const move = (e) => {
|
|
26
|
+
const r = el.getBoundingClientRect();
|
|
27
|
+
px = r.width ? Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) : 0.5;
|
|
28
|
+
py = r.height ? Math.min(1, Math.max(0, (e.clientY - r.top) / r.height)) : 0.5;
|
|
29
|
+
inside = true;
|
|
30
|
+
queue();
|
|
31
|
+
};
|
|
32
|
+
const leave = () => {
|
|
33
|
+
inside = false;
|
|
34
|
+
px = x0;
|
|
35
|
+
py = y0;
|
|
36
|
+
queue();
|
|
37
|
+
};
|
|
38
|
+
el.addEventListener('pointermove', move);
|
|
39
|
+
el.addEventListener('pointerleave', leave);
|
|
40
|
+
return () => {
|
|
41
|
+
if (raf && typeof cancelAnimationFrame === 'function')
|
|
42
|
+
cancelAnimationFrame(raf);
|
|
43
|
+
el.removeEventListener('pointermove', move);
|
|
44
|
+
el.removeEventListener('pointerleave', leave);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const rgba = (hex, a) => {
|
|
48
|
+
const [r, g, b] = generative.hexRgb(hex);
|
|
49
|
+
return `rgba(${r},${g},${b},${a})`;
|
|
50
|
+
};
|
|
51
|
+
const LIGHT_FX = [
|
|
52
|
+
{
|
|
53
|
+
name: 'light-follow',
|
|
54
|
+
kind: 'hover',
|
|
55
|
+
reduced: 'run',
|
|
56
|
+
description: 'A soft point light with a specular hot spot follows the pointer over the surface (persistent; `color`, `size` px, `intensity` 0–1).',
|
|
57
|
+
defaults: { color: '#ffffff', size: 260, intensity: 0.55 },
|
|
58
|
+
run: (el, o, ctx) => {
|
|
59
|
+
const [ov, rm] = shared.overlay(el, 'mix-blend-mode:soft-light;transition:opacity .3s;z-index:1');
|
|
60
|
+
const [spec, rm2] = shared.overlay(el, 'mix-blend-mode:screen;z-index:1');
|
|
61
|
+
const stop = trackPointer(el, ctx, (x, y, inside) => {
|
|
62
|
+
const p = `${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%`;
|
|
63
|
+
ov.style.background = `radial-gradient(${o.size}px circle at ${p}, ${rgba(o.color, o.intensity)}, transparent 70%), radial-gradient(${o.size * 2.4}px circle at ${p}, transparent 30%, rgba(0,0,0,${(o.intensity * 0.45).toFixed(2)}))`;
|
|
64
|
+
spec.style.background = `radial-gradient(${Math.round(o.size / 5)}px circle at ${p}, ${rgba(o.color, inside ? o.intensity * 0.7 : o.intensity * 0.35)}, transparent 70%)`;
|
|
65
|
+
el.style.setProperty('--usa-lx', x.toFixed(3));
|
|
66
|
+
el.style.setProperty('--usa-ly', y.toFixed(3));
|
|
67
|
+
});
|
|
68
|
+
return () => {
|
|
69
|
+
stop();
|
|
70
|
+
rm();
|
|
71
|
+
rm2();
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'refraction',
|
|
77
|
+
kind: 'hover',
|
|
78
|
+
reduced: 'run',
|
|
79
|
+
description: 'A glass lens bends and magnifies what is behind it while following the pointer (persistent; `size` px, `blur`, `rim` color). Uses backdrop-filter.',
|
|
80
|
+
defaults: { size: 120, blur: 1.5, zoom: 1.12, rim: '#9be7ff' },
|
|
81
|
+
run: (el, o, ctx) => {
|
|
82
|
+
if (getComputedStyle(el).position === 'static')
|
|
83
|
+
el.style.position = 'relative';
|
|
84
|
+
const lens = document.createElement('span');
|
|
85
|
+
lens.setAttribute('aria-hidden', 'true');
|
|
86
|
+
const s = Number(o.size) || 120;
|
|
87
|
+
lens.style.cssText = `position:absolute;left:0;top:0;width:${s}px;height:${s}px;border-radius:50%;pointer-events:none;z-index:2;` +
|
|
88
|
+
`-webkit-backdrop-filter:blur(${o.blur}px) saturate(1.6) contrast(1.08) brightness(1.08);backdrop-filter:blur(${o.blur}px) saturate(1.6) contrast(1.08) brightness(1.08);` +
|
|
89
|
+
`box-shadow:inset 0 0 0 1px rgba(255,255,255,.55),inset 6px 8px 14px rgba(255,255,255,.45),inset -8px -10px 18px ${rgba(o.rim, 0.45)},0 10px 30px -8px rgba(0,0,0,.35);` +
|
|
90
|
+
`background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.55),rgba(255,255,255,0) 32%),radial-gradient(circle at 70% 78%,${rgba(o.rim, 0.25)},transparent 45%);transform-origin:50% 50%;will-change:transform;transition:opacity .25s`;
|
|
91
|
+
el.appendChild(lens);
|
|
92
|
+
const stop = trackPointer(el, ctx, (x, y, inside) => {
|
|
93
|
+
const w = el.clientWidth;
|
|
94
|
+
const h = el.clientHeight;
|
|
95
|
+
lens.style.transform = `translate(${(x * w - s / 2).toFixed(1)}px,${(y * h - s / 2).toFixed(1)}px) scale(${inside ? o.zoom : 1})`;
|
|
96
|
+
lens.style.opacity = inside || ctx.reduced ? '1' : '.85';
|
|
97
|
+
}, 0.5, 0.5);
|
|
98
|
+
return () => {
|
|
99
|
+
stop();
|
|
100
|
+
lens.remove();
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'brushed-metal',
|
|
106
|
+
kind: 'card',
|
|
107
|
+
reduced: 'run',
|
|
108
|
+
description: 'Fine brushed-metal lines with an anisotropic sheen that turns with the pointer angle (persistent; `tint`, `lines` px).',
|
|
109
|
+
defaults: { tint: '#cbd5e1', lines: 2 },
|
|
110
|
+
run: (el, o, ctx) => {
|
|
111
|
+
const l = Math.max(1, Number(o.lines) || 2);
|
|
112
|
+
const [grain, rm] = shared.overlay(el, `z-index:0;opacity:.55;mix-blend-mode:overlay;background:repeating-linear-gradient(90deg,rgba(255,255,255,.18) 0 1px,rgba(0,0,0,.12) 1px ${l}px,rgba(255,255,255,.06) ${l}px ${l * 2 + 1}px),linear-gradient(180deg,${rgba(o.tint, 0.9)},${rgba(o.tint, 0.55)})`);
|
|
113
|
+
const [sheen, rm2] = shared.overlay(el, 'z-index:1;mix-blend-mode:soft-light');
|
|
114
|
+
const stop = trackPointer(el, ctx, (x, y) => {
|
|
115
|
+
const ang = Math.atan2(y - 0.5, x - 0.5) * (180 / Math.PI) + 90;
|
|
116
|
+
sheen.style.background = `conic-gradient(from ${ang.toFixed(1)}deg at ${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%, rgba(255,255,255,.75), rgba(0,0,0,.35) 25%, rgba(255,255,255,.6) 50%, rgba(0,0,0,.35) 75%, rgba(255,255,255,.75))`;
|
|
117
|
+
});
|
|
118
|
+
return () => {
|
|
119
|
+
stop();
|
|
120
|
+
rm();
|
|
121
|
+
rm2();
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'pearlescent',
|
|
127
|
+
kind: 'card',
|
|
128
|
+
reduced: 'run',
|
|
129
|
+
description: 'A nacre / holographic film whose hues shift with the pointer position (persistent; `strength` 0–1).',
|
|
130
|
+
defaults: { strength: 0.6 },
|
|
131
|
+
run: (el, o, ctx) => {
|
|
132
|
+
const [film, rm] = shared.overlay(el, `z-index:1;mix-blend-mode:color-dodge;opacity:${o.strength}`);
|
|
133
|
+
const [gloss, rm2] = shared.overlay(el, 'z-index:1;mix-blend-mode:soft-light');
|
|
134
|
+
const stop = trackPointer(el, ctx, (x, y) => {
|
|
135
|
+
const hue = Math.round((x * 0.7 + y * 0.3) * 360);
|
|
136
|
+
film.style.background = `linear-gradient(${Math.round(115 + x * 50)}deg, hsla(${hue},90%,70%,.55), hsla(${hue + 60},90%,75%,.35) 25%, hsla(${hue + 140},85%,70%,.5) 50%, hsla(${hue + 220},90%,75%,.35) 75%, hsla(${hue + 300},90%,70%,.55))`;
|
|
137
|
+
film.style.backgroundSize = '220% 220%';
|
|
138
|
+
film.style.backgroundPosition = `${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%`;
|
|
139
|
+
gloss.style.background = `radial-gradient(80% 60% at ${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%, rgba(255,255,255,.65), transparent 60%)`;
|
|
140
|
+
});
|
|
141
|
+
return () => {
|
|
142
|
+
stop();
|
|
143
|
+
rm();
|
|
144
|
+
rm2();
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'god-rays',
|
|
150
|
+
kind: 'background',
|
|
151
|
+
reduced: 'run',
|
|
152
|
+
description: 'Volumetric light shafts fan out from a source point and slowly sweep (Canvas 2D, additive; `color`, `rays`, `x` / `y` source 0–1).',
|
|
153
|
+
defaults: { color: '#ffe7a3', background: '#0b1020', rays: 14, x: 0.5, y: -0.1, speed: 1, quality: 1 },
|
|
154
|
+
run: (el, o, ctx) => {
|
|
155
|
+
const stop = generative.canvasBackground(el, ctx, {
|
|
156
|
+
init: () => ({ seeds: Array.from({ length: Math.max(3, o.rays | 0) }, (_, i) => ({ a: (i / o.rays) * 1.6 - 0.8 + Math.random() * 0.08, w: 0.03 + Math.random() * 0.06, p: Math.random() * 6.28 })) }),
|
|
157
|
+
draw: ({ ctx: g, w, h, t, state }) => {
|
|
158
|
+
g.globalCompositeOperation = 'source-over';
|
|
159
|
+
g.fillStyle = o.background;
|
|
160
|
+
g.fillRect(0, 0, w, h);
|
|
161
|
+
const sx = o.x * w;
|
|
162
|
+
const sy = o.y * h;
|
|
163
|
+
const len = Math.hypot(w, h) * 1.2;
|
|
164
|
+
const [r, gg, b] = generative.hexRgb(o.color);
|
|
165
|
+
g.globalCompositeOperation = 'lighter';
|
|
166
|
+
for (const s of state.seeds) {
|
|
167
|
+
const a = Math.PI / 2 + s.a + Math.sin(t * 0.25 * o.speed + s.p) * 0.08;
|
|
168
|
+
const alpha = 0.1 + 0.08 * Math.sin(t * 0.8 * o.speed + s.p * 2);
|
|
169
|
+
const grad = g.createLinearGradient(sx, sy, sx + Math.cos(a) * len, sy + Math.sin(a) * len);
|
|
170
|
+
grad.addColorStop(0, `rgba(${r},${gg},${b},${(alpha * 2).toFixed(3)})`);
|
|
171
|
+
grad.addColorStop(1, `rgba(${r},${gg},${b},0)`);
|
|
172
|
+
g.fillStyle = grad;
|
|
173
|
+
g.beginPath();
|
|
174
|
+
g.moveTo(sx, sy);
|
|
175
|
+
g.lineTo(sx + Math.cos(a - s.w) * len, sy + Math.sin(a - s.w) * len);
|
|
176
|
+
g.lineTo(sx + Math.cos(a + s.w) * len, sy + Math.sin(a + s.w) * len);
|
|
177
|
+
g.closePath();
|
|
178
|
+
g.fill();
|
|
179
|
+
}
|
|
180
|
+
const glow = g.createRadialGradient(sx, sy, 0, sx, sy, Math.max(w, h) * 0.45);
|
|
181
|
+
glow.addColorStop(0, `rgba(${r},${gg},${b},.45)`);
|
|
182
|
+
glow.addColorStop(1, `rgba(${r},${gg},${b},0)`);
|
|
183
|
+
g.fillStyle = glow;
|
|
184
|
+
g.fillRect(0, 0, w, h);
|
|
185
|
+
g.globalCompositeOperation = 'source-over';
|
|
186
|
+
},
|
|
187
|
+
}, o);
|
|
188
|
+
ctx.onCleanup(stop);
|
|
189
|
+
return stop;
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'pointer-shadow',
|
|
194
|
+
kind: 'hover',
|
|
195
|
+
reduced: 'run',
|
|
196
|
+
description: 'The pointer is the light: the element casts a soft real-time shadow away from it (persistent; `depth` px, `blur`, `color`).',
|
|
197
|
+
defaults: { depth: 22, blur: 18, color: 'rgba(15,23,42,.38)' },
|
|
198
|
+
run: (el, o, ctx) => {
|
|
199
|
+
const prev = el.style.filter;
|
|
200
|
+
const stop = trackPointer(el, ctx, (x, y, inside) => {
|
|
201
|
+
const dx = (0.5 - x) * 2 * o.depth;
|
|
202
|
+
const dy = (0.5 - y) * 2 * o.depth;
|
|
203
|
+
const k = inside ? 1 : 0.6;
|
|
204
|
+
el.style.filter = `drop-shadow(${(dx * k).toFixed(1)}px ${(dy * k + 4).toFixed(1)}px ${o.blur}px ${o.color})`;
|
|
205
|
+
}, 0.35, 0.2);
|
|
206
|
+
return () => {
|
|
207
|
+
stop();
|
|
208
|
+
el.style.filter = prev;
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
/** Register the 6.4 light & materials pack (idempotent). */
|
|
214
|
+
function registerLightEffects() {
|
|
215
|
+
registry.registerEffects(LIGHT_FX);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
exports.LIGHT_FX = LIGHT_FX;
|
|
219
|
+
exports.registerLightEffects = registerLightEffects;
|
|
220
|
+
exports.trackPointer = trackPointer;
|
|
221
|
+
//# sourceMappingURL=fx-light.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fx-light.cjs","sources":["../../src/components/fx2/light.ts"],"sourcesContent":["/**\n * 6.4 — Light & materials (`motionary/components/fx-light`), registered\n * through `registerEffect()`. Persistent effects (use `trigger=\"load\"`)\n * that return a cleanup:\n *\n * - `light-follow` (hover) — a soft point light + specular highlight that\n * follows the pointer over the surface.\n * - `refraction` (hover) — a glass lens that bends and magnifies what is\n * behind it as it follows the pointer (backdrop filter, chromatic rim).\n * - `brushed-metal` (card) — fine brushed lines with an anisotropic sheen\n * that turns with the pointer angle.\n * - `pearlescent` (card) — a nacre / holographic film whose hues shift with\n * the pointer position.\n * - `god-rays` (background) — volumetric light shafts from a source point\n * (Canvas 2D, additive).\n * - `pointer-shadow` (hover) — the pointer is the light: the element casts\n * a soft real-time shadow away from it.\n *\n * Reduced motion: surfaces stay lit from a fixed angle (no tracking),\n * `god-rays` draws one still frame.\n */\nimport type { EffectContext, EffectDefinition } from '../fx/registry';\nimport { registerEffects } from '../fx/registry';\nimport { canvasBackground, hexRgb } from '../effects/generative';\nimport { overlay } from '../effects/shared';\n\n/** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */\nexport function trackPointer(el: HTMLElement, ctx: EffectContext, fn: (x: number, y: number, inside: boolean) => void, x0 = 0.3, y0 = 0.25): () => void {\n fn(x0, y0, false);\n if (ctx.reduced) return () => undefined;\n let raf = 0;\n let px = x0;\n let py = y0;\n let inside = false;\n const flush = () => {\n raf = 0;\n fn(px, py, inside);\n };\n const queue = () => {\n if (!raf) raf = typeof requestAnimationFrame === 'function' ? requestAnimationFrame(flush) : (flush(), 0);\n };\n const move = (e: PointerEvent) => {\n const r = el.getBoundingClientRect();\n px = r.width ? Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) : 0.5;\n py = r.height ? Math.min(1, Math.max(0, (e.clientY - r.top) / r.height)) : 0.5;\n inside = true;\n queue();\n };\n const leave = () => {\n inside = false;\n px = x0;\n py = y0;\n queue();\n };\n el.addEventListener('pointermove', move);\n el.addEventListener('pointerleave', leave);\n return () => {\n if (raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(raf);\n el.removeEventListener('pointermove', move);\n el.removeEventListener('pointerleave', leave);\n };\n}\n\nconst rgba = (hex: string, a: number) => {\n const [r, g, b] = hexRgb(hex);\n return `rgba(${r},${g},${b},${a})`;\n};\n\nexport const LIGHT_FX: EffectDefinition[] = [\n {\n name: 'light-follow',\n kind: 'hover',\n reduced: 'run',\n description: 'A soft point light with a specular hot spot follows the pointer over the surface (persistent; `color`, `size` px, `intensity` 0–1).',\n defaults: { color: '#ffffff', size: 260, intensity: 0.55 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const [ov, rm] = overlay(el, 'mix-blend-mode:soft-light;transition:opacity .3s;z-index:1');\n const [spec, rm2] = overlay(el, 'mix-blend-mode:screen;z-index:1');\n const stop = trackPointer(el, ctx, (x, y, inside) => {\n const p = `${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%`;\n ov.style.background = `radial-gradient(${o.size}px circle at ${p}, ${rgba(o.color, o.intensity)}, transparent 70%), radial-gradient(${o.size * 2.4}px circle at ${p}, transparent 30%, rgba(0,0,0,${(o.intensity * 0.45).toFixed(2)}))`;\n spec.style.background = `radial-gradient(${Math.round(o.size / 5)}px circle at ${p}, ${rgba(o.color, inside ? o.intensity * 0.7 : o.intensity * 0.35)}, transparent 70%)`;\n el.style.setProperty('--usa-lx', x.toFixed(3));\n el.style.setProperty('--usa-ly', y.toFixed(3));\n });\n return () => {\n stop();\n rm();\n rm2();\n };\n },\n },\n {\n name: 'refraction',\n kind: 'hover',\n reduced: 'run',\n description: 'A glass lens bends and magnifies what is behind it while following the pointer (persistent; `size` px, `blur`, `rim` color). Uses backdrop-filter.',\n defaults: { size: 120, blur: 1.5, zoom: 1.12, rim: '#9be7ff' },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const lens = document.createElement('span');\n lens.setAttribute('aria-hidden', 'true');\n const s = Number(o.size) || 120;\n lens.style.cssText = `position:absolute;left:0;top:0;width:${s}px;height:${s}px;border-radius:50%;pointer-events:none;z-index:2;` +\n `-webkit-backdrop-filter:blur(${o.blur}px) saturate(1.6) contrast(1.08) brightness(1.08);backdrop-filter:blur(${o.blur}px) saturate(1.6) contrast(1.08) brightness(1.08);` +\n `box-shadow:inset 0 0 0 1px rgba(255,255,255,.55),inset 6px 8px 14px rgba(255,255,255,.45),inset -8px -10px 18px ${rgba(o.rim, 0.45)},0 10px 30px -8px rgba(0,0,0,.35);` +\n `background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.55),rgba(255,255,255,0) 32%),radial-gradient(circle at 70% 78%,${rgba(o.rim, 0.25)},transparent 45%);transform-origin:50% 50%;will-change:transform;transition:opacity .25s`;\n el.appendChild(lens);\n const stop = trackPointer(el, ctx, (x, y, inside) => {\n const w = el.clientWidth;\n const h = el.clientHeight;\n lens.style.transform = `translate(${(x * w - s / 2).toFixed(1)}px,${(y * h - s / 2).toFixed(1)}px) scale(${inside ? o.zoom : 1})`;\n lens.style.opacity = inside || ctx.reduced ? '1' : '.85';\n }, 0.5, 0.5);\n return () => {\n stop();\n lens.remove();\n };\n },\n },\n {\n name: 'brushed-metal',\n kind: 'card',\n reduced: 'run',\n description: 'Fine brushed-metal lines with an anisotropic sheen that turns with the pointer angle (persistent; `tint`, `lines` px).',\n defaults: { tint: '#cbd5e1', lines: 2 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const l = Math.max(1, Number(o.lines) || 2);\n const [grain, rm] = overlay(el, `z-index:0;opacity:.55;mix-blend-mode:overlay;background:repeating-linear-gradient(90deg,rgba(255,255,255,.18) 0 1px,rgba(0,0,0,.12) 1px ${l}px,rgba(255,255,255,.06) ${l}px ${l * 2 + 1}px),linear-gradient(180deg,${rgba(o.tint, 0.9)},${rgba(o.tint, 0.55)})`);\n const [sheen, rm2] = overlay(el, 'z-index:1;mix-blend-mode:soft-light');\n const stop = trackPointer(el, ctx, (x, y) => {\n const ang = Math.atan2(y - 0.5, x - 0.5) * (180 / Math.PI) + 90;\n sheen.style.background = `conic-gradient(from ${ang.toFixed(1)}deg at ${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%, rgba(255,255,255,.75), rgba(0,0,0,.35) 25%, rgba(255,255,255,.6) 50%, rgba(0,0,0,.35) 75%, rgba(255,255,255,.75))`;\n });\n void grain;\n return () => {\n stop();\n rm();\n rm2();\n };\n },\n },\n {\n name: 'pearlescent',\n kind: 'card',\n reduced: 'run',\n description: 'A nacre / holographic film whose hues shift with the pointer position (persistent; `strength` 0–1).',\n defaults: { strength: 0.6 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const [film, rm] = overlay(el, `z-index:1;mix-blend-mode:color-dodge;opacity:${o.strength}`);\n const [gloss, rm2] = overlay(el, 'z-index:1;mix-blend-mode:soft-light');\n const stop = trackPointer(el, ctx, (x, y) => {\n const hue = Math.round((x * 0.7 + y * 0.3) * 360);\n film.style.background = `linear-gradient(${Math.round(115 + x * 50)}deg, hsla(${hue},90%,70%,.55), hsla(${hue + 60},90%,75%,.35) 25%, hsla(${hue + 140},85%,70%,.5) 50%, hsla(${hue + 220},90%,75%,.35) 75%, hsla(${hue + 300},90%,70%,.55))`;\n film.style.backgroundSize = '220% 220%';\n film.style.backgroundPosition = `${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%`;\n gloss.style.background = `radial-gradient(80% 60% at ${(x * 100).toFixed(1)}% ${(y * 100).toFixed(1)}%, rgba(255,255,255,.65), transparent 60%)`;\n });\n return () => {\n stop();\n rm();\n rm2();\n };\n },\n },\n {\n name: 'god-rays',\n kind: 'background',\n reduced: 'run',\n description: 'Volumetric light shafts fan out from a source point and slowly sweep (Canvas 2D, additive; `color`, `rays`, `x` / `y` source 0–1).',\n defaults: { color: '#ffe7a3', background: '#0b1020', rays: 14, x: 0.5, y: -0.1, speed: 1, quality: 1 },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const stop = canvasBackground(el, ctx, {\n init: () => ({ seeds: Array.from({ length: Math.max(3, o.rays | 0) }, (_, i) => ({ a: (i / o.rays) * 1.6 - 0.8 + Math.random() * 0.08, w: 0.03 + Math.random() * 0.06, p: Math.random() * 6.28 })) }),\n draw: ({ ctx: g, w, h, t, state }) => {\n g.globalCompositeOperation = 'source-over';\n g.fillStyle = o.background;\n g.fillRect(0, 0, w, h);\n const sx = o.x * w;\n const sy = o.y * h;\n const len = Math.hypot(w, h) * 1.2;\n const [r, gg, b] = hexRgb(o.color);\n g.globalCompositeOperation = 'lighter';\n for (const s of state.seeds) {\n const a = Math.PI / 2 + s.a + Math.sin(t * 0.25 * o.speed + s.p) * 0.08;\n const alpha = 0.1 + 0.08 * Math.sin(t * 0.8 * o.speed + s.p * 2);\n const grad = g.createLinearGradient(sx, sy, sx + Math.cos(a) * len, sy + Math.sin(a) * len);\n grad.addColorStop(0, `rgba(${r},${gg},${b},${(alpha * 2).toFixed(3)})`);\n grad.addColorStop(1, `rgba(${r},${gg},${b},0)`);\n g.fillStyle = grad;\n g.beginPath();\n g.moveTo(sx, sy);\n g.lineTo(sx + Math.cos(a - s.w) * len, sy + Math.sin(a - s.w) * len);\n g.lineTo(sx + Math.cos(a + s.w) * len, sy + Math.sin(a + s.w) * len);\n g.closePath();\n g.fill();\n }\n const glow = g.createRadialGradient(sx, sy, 0, sx, sy, Math.max(w, h) * 0.45);\n glow.addColorStop(0, `rgba(${r},${gg},${b},.45)`);\n glow.addColorStop(1, `rgba(${r},${gg},${b},0)`);\n g.fillStyle = glow;\n g.fillRect(0, 0, w, h);\n g.globalCompositeOperation = 'source-over';\n },\n }, o);\n ctx.onCleanup(stop);\n return stop;\n },\n },\n {\n name: 'pointer-shadow',\n kind: 'hover',\n reduced: 'run',\n description: 'The pointer is the light: the element casts a soft real-time shadow away from it (persistent; `depth` px, `blur`, `color`).',\n defaults: { depth: 22, blur: 18, color: 'rgba(15,23,42,.38)' },\n run: (el: HTMLElement, o: any, ctx: EffectContext) => {\n const prev = el.style.filter;\n const stop = trackPointer(el, ctx, (x, y, inside) => {\n const dx = (0.5 - x) * 2 * o.depth;\n const dy = (0.5 - y) * 2 * o.depth;\n const k = inside ? 1 : 0.6;\n el.style.filter = `drop-shadow(${(dx * k).toFixed(1)}px ${(dy * k + 4).toFixed(1)}px ${o.blur}px ${o.color})`;\n }, 0.35, 0.2);\n return () => {\n stop();\n el.style.filter = prev;\n };\n },\n },\n];\n\n/** Register the 6.4 light & materials pack (idempotent). */\nexport function registerLightEffects(): void {\n registerEffects(LIGHT_FX);\n}\n"],"names":["hexRgb","overlay","canvasBackground","registerEffects"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
* 6.4 — Light & materials (`motionary/components/fx-light`), registered
|
|
46
|
+
* through `registerEffect()`. Persistent effects (use `trigger="load"`)
|
|
47
|
+
* that return a cleanup:
|
|
48
|
+
*
|
|
49
|
+
* - `light-follow` (hover) — a soft point light + specular highlight that
|
|
50
|
+
* follows the pointer over the surface.
|
|
51
|
+
* - `refraction` (hover) — a glass lens that bends and magnifies what is
|
|
52
|
+
* behind it as it follows the pointer (backdrop filter, chromatic rim).
|
|
53
|
+
* - `brushed-metal` (card) — fine brushed lines with an anisotropic sheen
|
|
54
|
+
* that turns with the pointer angle.
|
|
55
|
+
* - `pearlescent` (card) — a nacre / holographic film whose hues shift with
|
|
56
|
+
* the pointer position.
|
|
57
|
+
* - `god-rays` (background) — volumetric light shafts from a source point
|
|
58
|
+
* (Canvas 2D, additive).
|
|
59
|
+
* - `pointer-shadow` (hover) — the pointer is the light: the element casts
|
|
60
|
+
* a soft real-time shadow away from it.
|
|
61
|
+
*
|
|
62
|
+
* Reduced motion: surfaces stay lit from a fixed angle (no tracking),
|
|
63
|
+
* `god-rays` draws one still frame.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
/** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */
|
|
67
|
+
declare function trackPointer(el: HTMLElement, ctx: EffectContext, fn: (x: number, y: number, inside: boolean) => void, x0?: number, y0?: number): () => void;
|
|
68
|
+
declare const LIGHT_FX: EffectDefinition[];
|
|
69
|
+
/** Register the 6.4 light & materials pack (idempotent). */
|
|
70
|
+
declare function registerLightEffects(): void;
|
|
71
|
+
|
|
72
|
+
export { LIGHT_FX, registerLightEffects, trackPointer };
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
* 6.4 — Light & materials (`motionary/components/fx-light`), registered
|
|
46
|
+
* through `registerEffect()`. Persistent effects (use `trigger="load"`)
|
|
47
|
+
* that return a cleanup:
|
|
48
|
+
*
|
|
49
|
+
* - `light-follow` (hover) — a soft point light + specular highlight that
|
|
50
|
+
* follows the pointer over the surface.
|
|
51
|
+
* - `refraction` (hover) — a glass lens that bends and magnifies what is
|
|
52
|
+
* behind it as it follows the pointer (backdrop filter, chromatic rim).
|
|
53
|
+
* - `brushed-metal` (card) — fine brushed lines with an anisotropic sheen
|
|
54
|
+
* that turns with the pointer angle.
|
|
55
|
+
* - `pearlescent` (card) — a nacre / holographic film whose hues shift with
|
|
56
|
+
* the pointer position.
|
|
57
|
+
* - `god-rays` (background) — volumetric light shafts from a source point
|
|
58
|
+
* (Canvas 2D, additive).
|
|
59
|
+
* - `pointer-shadow` (hover) — the pointer is the light: the element casts
|
|
60
|
+
* a soft real-time shadow away from it.
|
|
61
|
+
*
|
|
62
|
+
* Reduced motion: surfaces stay lit from a fixed angle (no tracking),
|
|
63
|
+
* `god-rays` draws one still frame.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
/** Track the pointer over `el` as 0–1 coordinates (`fn(x, y, inside)`); starts at (`x0`, `y0`). Returns a remover. */
|
|
67
|
+
declare function trackPointer(el: HTMLElement, ctx: EffectContext, fn: (x: number, y: number, inside: boolean) => void, x0?: number, y0?: number): () => void;
|
|
68
|
+
declare const LIGHT_FX: EffectDefinition[];
|
|
69
|
+
/** Register the 6.4 light & materials pack (idempotent). */
|
|
70
|
+
declare function registerLightEffects(): void;
|
|
71
|
+
|
|
72
|
+
export { LIGHT_FX, registerLightEffects, trackPointer };
|