@once-ui-system/core 1.6.2 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/components/CelebrationFx.d.ts +1 -0
  3. package/dist/components/CelebrationFx.d.ts.map +1 -1
  4. package/dist/components/CelebrationFx.js +7 -3
  5. package/dist/components/CelebrationFx.js.map +1 -1
  6. package/dist/components/HoloFx.d.ts +1 -0
  7. package/dist/components/HoloFx.d.ts.map +1 -1
  8. package/dist/components/HoloFx.js +10 -3
  9. package/dist/components/HoloFx.js.map +1 -1
  10. package/dist/components/Mask.d.ts +1 -0
  11. package/dist/components/Mask.d.ts.map +1 -1
  12. package/dist/components/Mask.js +56 -32
  13. package/dist/components/Mask.js.map +1 -1
  14. package/dist/components/MatrixFx.d.ts +1 -0
  15. package/dist/components/MatrixFx.d.ts.map +1 -1
  16. package/dist/components/MatrixFx.js +8 -1
  17. package/dist/components/MatrixFx.js.map +1 -1
  18. package/dist/components/Particle.d.ts +1 -0
  19. package/dist/components/Particle.d.ts.map +1 -1
  20. package/dist/components/Particle.js +86 -78
  21. package/dist/components/Particle.js.map +1 -1
  22. package/dist/components/ShineFx.d.ts +1 -0
  23. package/dist/components/ShineFx.d.ts.map +1 -1
  24. package/dist/components/ShineFx.js +5 -2
  25. package/dist/components/ShineFx.js.map +1 -1
  26. package/dist/components/TiltFx.d.ts +1 -0
  27. package/dist/components/TiltFx.d.ts.map +1 -1
  28. package/dist/components/TiltFx.js +27 -10
  29. package/dist/components/TiltFx.js.map +1 -1
  30. package/dist/components/WeatherFx.d.ts +1 -0
  31. package/dist/components/WeatherFx.d.ts.map +1 -1
  32. package/dist/components/WeatherFx.js +97 -2
  33. package/dist/components/WeatherFx.js.map +1 -1
  34. package/dist/css/styles.css +1 -1
  35. package/dist/css/styles.css.map +1 -1
  36. package/dist/data/emoji-data.json +8 -0
  37. package/dist/hooks/index.d.ts +2 -0
  38. package/dist/hooks/index.d.ts.map +1 -1
  39. package/dist/hooks/index.js +2 -0
  40. package/dist/hooks/index.js.map +1 -1
  41. package/dist/hooks/useInViewport.d.ts +3 -0
  42. package/dist/hooks/useInViewport.d.ts.map +1 -0
  43. package/dist/hooks/useInViewport.js +19 -0
  44. package/dist/hooks/useInViewport.js.map +1 -0
  45. package/dist/hooks/useReducedMotion.d.ts +8 -0
  46. package/dist/hooks/useReducedMotion.d.ts.map +1 -0
  47. package/dist/hooks/useReducedMotion.js +44 -0
  48. package/dist/hooks/useReducedMotion.js.map +1 -0
  49. package/dist/interfaces.d.ts +12 -0
  50. package/dist/interfaces.d.ts.map +1 -1
  51. package/dist/modules/navigation/Kbar.d.ts.map +1 -1
  52. package/dist/modules/navigation/Kbar.js +13 -28
  53. package/dist/modules/navigation/Kbar.js.map +1 -1
  54. package/dist/package.json +1 -1
  55. package/dist/styles/typography.scss +8 -40
  56. package/next-env.d.ts +5 -0
  57. package/package.json +113 -115
@@ -2,8 +2,12 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import React, { useEffect, useRef } from "react";
4
4
  import { Flex } from ".";
5
- const Particle = React.forwardRef(({ density = 100, color = "brand-on-background-weak", size = "2", speed = 0.3, interactive = false, mode = "repel", intensity = 20, opacity = 100, children, className, style, ...rest }, forwardedRef) => {
5
+ import { useInViewport } from "../hooks/useInViewport";
6
+ import { useReducedMotion } from "../hooks/useReducedMotion";
7
+ const Particle = React.forwardRef(({ density = 100, color = "brand-on-background-weak", size = "2", speed = 0.3, interactive = false, mode = "repel", intensity = 20, opacity = 100, reducedMotion = "auto", children, className, style, ...rest }, forwardedRef) => {
6
8
  const containerRef = useRef(null);
9
+ const isInViewport = useInViewport(containerRef);
10
+ const { shouldAnimate } = useReducedMotion(reducedMotion);
7
11
  useEffect(() => {
8
12
  if (forwardedRef && "current" in forwardedRef) {
9
13
  forwardedRef.current = containerRef.current;
@@ -14,118 +18,122 @@ const Particle = React.forwardRef(({ density = 100, color = "brand-on-background
14
18
  }, [forwardedRef]);
15
19
  useEffect(() => {
16
20
  const container = containerRef.current;
17
- const particles = [];
18
- const particleTargets = new Map();
19
- const initialPositions = new Map();
21
+ if (!container)
22
+ return;
23
+ // If reduced motion, render static particles with no animation loop
24
+ const effectiveDensity = shouldAnimate ? density : Math.min(density, 30);
25
+ const particleEls = [];
26
+ // Flat arrays for fast iteration — no Map lookups or style parsing per frame
27
+ const currentX = new Float32Array(effectiveDensity);
28
+ const currentY = new Float32Array(effectiveDensity);
29
+ const initialX = new Float32Array(effectiveDensity);
30
+ const initialY = new Float32Array(effectiveDensity);
31
+ const targetX = new Float32Array(effectiveDensity);
32
+ const targetY = new Float32Array(effectiveDensity);
20
33
  let mousePosition = { x: -1000, y: -1000 };
21
- let animationFrameId;
34
+ let animationFrameId = null;
22
35
  const parsedSize = `var(--static-space-${size})`;
23
36
  const parsedOpacity = `${opacity}%`;
24
37
  const movementSpeed = speed * 0.08;
25
38
  const repulsionStrength = 0.15 * (speed || 1);
26
39
  const handleMouseMove = (e) => {
27
- const rect = container?.getBoundingClientRect();
28
- if (!rect)
29
- return;
40
+ const rect = container.getBoundingClientRect();
30
41
  mousePosition = {
31
42
  x: ((e.clientX - rect.left) / rect.width) * 100,
32
43
  y: ((e.clientY - rect.top) / rect.height) * 100,
33
44
  };
34
45
  };
35
- const createParticle = () => {
36
- const particleEl = document.createElement("div");
37
- particleEl.style.position = "absolute";
38
- particleEl.style.width = parsedSize;
39
- particleEl.style.height = parsedSize;
40
- particleEl.style.background = `var(--${color})`;
41
- particleEl.style.borderRadius = "50%";
42
- particleEl.style.pointerEvents = "none";
43
- particleEl.style.opacity = parsedOpacity;
44
- particleEl.style.transition = "transform 0.4s ease-out, opacity 0.6s ease-out";
45
- const initialX = 10 + Math.random() * 80;
46
- const initialY = 10 + Math.random() * 80;
47
- particleEl.style.left = `${initialX}%`;
48
- particleEl.style.top = `${initialY}%`;
49
- initialPositions.set(particleEl, { x: initialX, y: initialY });
50
- particleTargets.set(particleEl, { x: initialX, y: initialY });
51
- container?.appendChild(particleEl);
52
- particles.push(particleEl);
53
- return particleEl;
54
- };
46
+ // Create particles using translate3d instead of left/top
47
+ for (let i = 0; i < effectiveDensity; i++) {
48
+ const el = document.createElement("div");
49
+ el.style.cssText = `
50
+ position:absolute;left:0;top:0;
51
+ width:${parsedSize};height:${parsedSize};
52
+ background:var(--${color});
53
+ border-radius:50%;
54
+ pointer-events:none;
55
+ opacity:${parsedOpacity};
56
+ will-change:transform;
57
+ `;
58
+ const ix = 10 + Math.random() * 80;
59
+ const iy = 10 + Math.random() * 80;
60
+ initialX[i] = ix;
61
+ initialY[i] = iy;
62
+ currentX[i] = ix;
63
+ currentY[i] = iy;
64
+ targetX[i] = ix;
65
+ targetY[i] = iy;
66
+ el.style.transform = `translate3d(${ix}cqw, ${iy}cqh, 0)`;
67
+ container.appendChild(el);
68
+ particleEls.push(el);
69
+ }
70
+ // If reduced motion or not in viewport initially, just place them statically
71
+ if (!shouldAnimate)
72
+ return () => cleanup();
55
73
  const updateParticles = () => {
56
- particles.forEach((particleEl, index) => {
57
- const currentTarget = particleTargets.get(particleEl);
58
- const initial = initialPositions.get(particleEl);
59
- if (!currentTarget || !initial)
60
- return;
61
- const currentX = parseFloat(particleEl.style.left);
62
- const currentY = parseFloat(particleEl.style.top);
63
- const time = Date.now() * 0.001 * speed;
64
- const baseNoiseX = Math.sin(time + index) * 0.5;
65
- const baseNoiseY = Math.cos(time + index * 1.2) * 0.5;
66
- let targetX = initial.x + baseNoiseX;
67
- let targetY = initial.y + baseNoiseY;
68
- let isCloseToMouse = false;
74
+ const time = Date.now() * 0.001 * speed;
75
+ for (let i = 0; i < effectiveDensity; i++) {
76
+ const cx = currentX[i];
77
+ const cy = currentY[i];
78
+ const baseNoiseX = Math.sin(time + i) * 0.5;
79
+ const baseNoiseY = Math.cos(time + i * 1.2) * 0.5;
80
+ let tx = initialX[i] + baseNoiseX;
81
+ let ty = initialY[i] + baseNoiseY;
69
82
  if (interactive) {
70
- const dx = mousePosition.x - currentX;
71
- const dy = mousePosition.y - currentY;
83
+ const dx = mousePosition.x - cx;
84
+ const dy = mousePosition.y - cy;
72
85
  const distance = Math.sqrt(dx * dx + dy * dy);
73
86
  if (distance < intensity) {
74
87
  const angle = Math.atan2(dy, dx);
75
88
  if (mode === "attract") {
76
- // Attract: move towards cursor
77
89
  const minDistance = 8;
78
90
  if (distance <= minDistance) {
79
- // Particle is close - freeze it at cursor position (no noise, no movement)
80
- targetX = mousePosition.x;
81
- targetY = mousePosition.y;
82
- isCloseToMouse = true;
91
+ tx = mousePosition.x;
92
+ ty = mousePosition.y;
83
93
  }
84
94
  else {
85
- // Force is proportional to distance (strong when far, weak when close)
86
95
  const normalizedDistance = Math.min(distance / intensity, 1);
87
96
  const force = distance * repulsionStrength * normalizedDistance * 0.3;
88
- targetX = currentX + Math.cos(angle) * force;
89
- targetY = currentY + Math.sin(angle) * force;
97
+ tx = cx + Math.cos(angle) * force;
98
+ ty = cy + Math.sin(angle) * force;
90
99
  }
91
100
  }
92
101
  else {
93
- // Repel: move away from cursor (original behavior)
94
102
  const force = (intensity - distance) * repulsionStrength;
95
- targetX -= Math.cos(angle) * force;
96
- targetY -= Math.sin(angle) * force;
103
+ tx -= Math.cos(angle) * force;
104
+ ty -= Math.sin(angle) * force;
97
105
  }
98
106
  }
99
107
  }
100
- targetX = Math.max(5, Math.min(95, targetX));
101
- targetY = Math.max(5, Math.min(95, targetY));
102
- particleTargets.set(particleEl, {
103
- x: targetX,
104
- y: targetY,
105
- });
106
- particleEl.style.left = `${currentX + (targetX - currentX) * movementSpeed}%`;
107
- particleEl.style.top = `${currentY + (targetY - currentY) * movementSpeed}%`;
108
- });
108
+ tx = Math.max(5, Math.min(95, tx));
109
+ ty = Math.max(5, Math.min(95, ty));
110
+ targetX[i] = tx;
111
+ targetY[i] = ty;
112
+ const nx = cx + (tx - cx) * movementSpeed;
113
+ const ny = cy + (ty - cy) * movementSpeed;
114
+ currentX[i] = nx;
115
+ currentY[i] = ny;
116
+ particleEls[i].style.transform = `translate3d(${nx}cqw, ${ny}cqh, 0)`;
117
+ }
109
118
  animationFrameId = requestAnimationFrame(updateParticles);
110
119
  };
111
120
  if (interactive) {
112
- document.addEventListener("mousemove", handleMouseMove);
121
+ container.addEventListener("mousemove", handleMouseMove, { passive: true });
113
122
  }
114
- for (let i = 0; i < density; i++) {
115
- createParticle();
123
+ // Start animation only if in viewport
124
+ if (isInViewport) {
125
+ animationFrameId = requestAnimationFrame(updateParticles);
116
126
  }
117
- updateParticles();
118
- return () => {
119
- document.removeEventListener("mousemove", handleMouseMove);
120
- cancelAnimationFrame(animationFrameId);
121
- particles.forEach((particleEl) => {
122
- particleEl.remove();
123
- particleTargets.delete(particleEl);
124
- initialPositions.delete(particleEl);
125
- });
126
- };
127
- }, [color, size, speed, interactive, intensity, opacity, density, containerRef]);
128
- return (_jsx(Flex, { ref: containerRef, fill: true, pointerEvents: "none", className: className, style: style, ...rest, children: children }));
127
+ function cleanup() {
128
+ container.removeEventListener("mousemove", handleMouseMove);
129
+ if (animationFrameId != null) {
130
+ cancelAnimationFrame(animationFrameId);
131
+ }
132
+ particleEls.forEach((el) => el.remove());
133
+ }
134
+ return () => cleanup();
135
+ }, [color, size, speed, interactive, intensity, opacity, density, mode, shouldAnimate, isInViewport]);
136
+ return (_jsx(Flex, { ref: containerRef, fill: true, position: "relative", pointerEvents: interactive ? "auto" : "none", className: className, style: { containerType: "size", ...style }, ...rest, children: children }));
129
137
  });
130
138
  Particle.displayName = "Particle";
131
139
  export { Particle };
@@ -1 +1 @@
1
- {"version":3,"file":"Particle.js","sourceRoot":"","sources":["../../src/components/Particle.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Particle.js","sourceRoot":"","sources":["../../src/components/Particle.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export interface ShineFxProps extends React.ComponentProps<typeof Text> {
5
5
  disabled?: boolean;
6
6
  inverse?: boolean;
7
7
  baseOpacity?: number;
8
+ reducedMotion?: boolean | "auto";
8
9
  children?: React.ReactNode;
9
10
  }
10
11
  declare const ShineFx: React.FC<ShineFxProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"ShineFx.d.ts","sourceRoot":"","sources":["../../src/components/ShineFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAIzB,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,QAAA,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAyBnC,CAAC;AAIF,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"ShineFx.d.ts","sourceRoot":"","sources":["../../src/components/ShineFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAKzB,MAAM,WAAW,YAAa,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,QAAA,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA4BnC,CAAC;AAIF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -3,9 +3,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Text } from ".";
4
4
  import styles from "./ShineFx.module.scss";
5
5
  import classNames from "classnames";
6
- const ShineFx = ({ speed = 1, disabled = false, inverse = false, baseOpacity = 0.3, children, className, style, ...text }) => {
6
+ import { useReducedMotion } from "../hooks/useReducedMotion";
7
+ const ShineFx = ({ speed = 1, disabled = false, inverse = false, baseOpacity = 0.3, reducedMotion = "auto", children, className, style, ...text }) => {
8
+ const { shouldAnimate } = useReducedMotion(reducedMotion);
9
+ const isDisabled = disabled || !shouldAnimate;
7
10
  const animationDuration = `${speed}s`;
8
- return (_jsx(Text, { ...text, className: classNames(styles.shineFx, disabled ? styles.disabled : "", inverse ? styles.inverse : styles.default, className), style: {
11
+ return (_jsx(Text, { ...text, className: classNames(styles.shineFx, isDisabled ? styles.disabled : "", inverse ? styles.inverse : styles.default, className), style: {
9
12
  ...style,
10
13
  animationDuration,
11
14
  ["--shine-base-opacity"]: baseOpacity,
@@ -1 +1 @@
1
- {"version":3,"file":"ShineFx.js","sourceRoot":"","sources":["../../src/components/ShineFx.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AACzB,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,UAAU,MAAM,YAAY,CAAC;AAUpC,MAAM,OAAO,GAA2B,CAAC,EACvC,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,WAAW,GAAG,GAAG,EACjB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,EAAE;IACH,MAAM,iBAAiB,GAAG,GAAG,KAAK,GAAG,CAAC;IAEtC,OAAO,CACL,KAAC,IAAI,OACC,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAC5H,KAAK,EAAE;YACL,GAAG,KAAK;YACR,iBAAiB;YACjB,CAAC,sBAAgC,CAAC,EAAE,WAAW;SAChD,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"ShineFx.js","sourceRoot":"","sources":["../../src/components/ShineFx.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AACzB,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAW7D,MAAM,OAAO,GAA2B,CAAC,EACvC,KAAK,GAAG,CAAC,EACT,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,WAAW,GAAG,GAAG,EACjB,aAAa,GAAG,MAAM,EACtB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,EAAE;IACH,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,aAAa,CAAC;IAC9C,MAAM,iBAAiB,GAAG,GAAG,KAAK,GAAG,CAAC;IAEtC,OAAO,CACL,KAAC,IAAI,OACC,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9H,KAAK,EAAE;YACL,GAAG,KAAK;YACR,iBAAiB;YACjB,CAAC,sBAAgC,CAAC,EAAE,WAAW;SAChD,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -3,6 +3,7 @@ import { Flex } from ".";
3
3
  interface TiltFxProps extends React.ComponentProps<typeof Flex> {
4
4
  children: React.ReactNode;
5
5
  intensity?: number;
6
+ reducedMotion?: boolean | "auto";
6
7
  }
7
8
  declare const TiltFx: React.FC<TiltFxProps>;
8
9
  export { TiltFx };
@@ -1 +1 @@
1
- {"version":3,"file":"TiltFx.d.ts","sourceRoot":"","sources":["../../src/components/TiltFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAEzB,UAAU,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IAC7D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA4DjC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"TiltFx.d.ts","sourceRoot":"","sources":["../../src/components/TiltFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAGzB,UAAU,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IAC7D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAClC;AAED,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA+EjC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,20 +1,29 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useRef } from "react";
3
+ import { useEffect, useRef } from "react";
4
4
  import styles from "./TiltFx.module.scss";
5
5
  import { Flex } from ".";
6
- const TiltFx = ({ children, intensity = 1, ...rest }) => {
6
+ import { useReducedMotion } from "../hooks/useReducedMotion";
7
+ const TiltFx = ({ children, intensity = 1, reducedMotion = "auto", ...rest }) => {
7
8
  const ref = useRef(null);
8
- let lastCall = 0;
9
- let resetTimeout;
9
+ const lastCallRef = useRef(0);
10
+ const resetTimeoutRef = useRef(null);
11
+ const isTouchDeviceRef = useRef(false);
12
+ const { shouldAnimate } = useReducedMotion(reducedMotion);
13
+ useEffect(() => {
14
+ isTouchDeviceRef.current = "ontouchstart" in window;
15
+ }, []);
10
16
  const handleMouseMove = (e) => {
11
- if ("ontouchstart" in window)
17
+ if (isTouchDeviceRef.current || !shouldAnimate)
12
18
  return;
13
- clearTimeout(resetTimeout);
19
+ if (resetTimeoutRef.current) {
20
+ clearTimeout(resetTimeoutRef.current);
21
+ resetTimeoutRef.current = null;
22
+ }
14
23
  const now = Date.now();
15
- if (now - lastCall < 16)
24
+ if (now - lastCallRef.current < 16)
16
25
  return;
17
- lastCall = now;
26
+ lastCallRef.current = now;
18
27
  const element = ref.current;
19
28
  if (!element)
20
29
  return;
@@ -33,16 +42,24 @@ const TiltFx = ({ children, intensity = 1, ...rest }) => {
33
42
  });
34
43
  };
35
44
  const handleMouseLeave = () => {
36
- if ("ontouchstart" in window)
45
+ if (isTouchDeviceRef.current || !shouldAnimate)
37
46
  return;
38
47
  const element = ref.current;
39
48
  if (element) {
40
- resetTimeout = setTimeout(() => {
49
+ resetTimeoutRef.current = setTimeout(() => {
41
50
  element.style.transform =
42
51
  "perspective(1000px) translate3d(0, 0, 0) rotateX(0deg) rotateY(0deg)";
52
+ resetTimeoutRef.current = null;
43
53
  }, 100);
44
54
  }
45
55
  };
56
+ useEffect(() => {
57
+ return () => {
58
+ if (resetTimeoutRef.current) {
59
+ clearTimeout(resetTimeoutRef.current);
60
+ }
61
+ };
62
+ }, []);
46
63
  return (_jsx(Flex, { ref: ref, overflow: "hidden", className: styles.tiltFx, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, ...rest, children: children }));
47
64
  };
48
65
  export { TiltFx };
@@ -1 +1 @@
1
- {"version":3,"file":"TiltFx.js","sourceRoot":"","sources":["../../src/components/TiltFx.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAOzB,MAAM,MAAM,GAA0B,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAC7E,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAA4B,CAAC;IAEjC,MAAM,eAAe,GAAG,CAAC,CAAmC,EAAE,EAAE;QAC9D,IAAI,cAAc,IAAI,MAAM;YAAE,OAAO;QAErC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,QAAQ,GAAG,EAAE;YAAE,OAAO;QAChC,QAAQ,GAAG,GAAG,CAAC;QAEf,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;QAE7C,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;QACxC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;QACxC,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC;QAElC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,yCAAyC,UAAU,eAAe,OAAO,gBAAgB,OAAO,MAAM,CAAC;QACnI,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,cAAc,IAAI,MAAM;YAAE,OAAO;QAErC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,OAAO,CAAC,KAAK,CAAC,SAAS;oBACrB,sEAAsE,CAAC;YAC3E,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,IAAI,IACH,GAAG,EAAE,GAAG,EACR,QAAQ,EAAC,QAAQ,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EACxB,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,gBAAgB,KAC1B,IAAI,YAEP,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"TiltFx.js","sourceRoot":"","sources":["../../src/components/TiltFx.tsx"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ interface WeatherFxProps extends React.ComponentProps<typeof Flex> {
10
10
  duration?: number;
11
11
  trigger?: "mount" | "hover" | "click" | "manual";
12
12
  active?: boolean;
13
+ reducedMotion?: boolean | "auto";
13
14
  children?: React.ReactNode;
14
15
  }
15
16
  declare const WeatherFx: React.ForwardRefExoticComponent<Omit<WeatherFxProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"WeatherFx.d.ts","sourceRoot":"","sources":["../../src/components/WeatherFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAEzB,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE5D,UAAU,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAgED,QAAA,MAAM,SAAS,oGA04Bd,CAAC;AAGF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"WeatherFx.d.ts","sourceRoot":"","sources":["../../src/components/WeatherFx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;AAGzB,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE5D,UAAU,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAgED,QAAA,MAAM,SAAS,oGA0+Bd,CAAC;AAGF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -2,7 +2,9 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React, { useEffect, useRef } from "react";
4
4
  import { Flex } from ".";
5
- const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand-solid-medium"], intensity = 50, angle = 0, duration, trigger = "mount", active = false, children, ...rest }, forwardedRef) => {
5
+ import { useReducedMotion } from "../hooks/useReducedMotion";
6
+ const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand-solid-medium"], intensity = 50, angle = 0, duration, trigger = "mount", active = false, reducedMotion = "auto", children, ...rest }, forwardedRef) => {
7
+ const { shouldAnimate } = useReducedMotion(reducedMotion);
6
8
  const containerRef = useRef(null);
7
9
  const canvasRef = useRef(null);
8
10
  const animationRef = useRef(undefined);
@@ -532,6 +534,12 @@ const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand
532
534
  ctx.globalAlpha = 1;
533
535
  animationRef.current = requestAnimationFrame(animate);
534
536
  };
537
+ if (!shouldAnimate) {
538
+ // When reduced motion is active, don't start the animation loop at all
539
+ return () => {
540
+ window.removeEventListener("resize", updateSize);
541
+ };
542
+ }
535
543
  animate();
536
544
  return () => {
537
545
  window.removeEventListener("resize", updateSize);
@@ -539,7 +547,7 @@ const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand
539
547
  cancelAnimationFrame(animationRef.current);
540
548
  }
541
549
  };
542
- }, [type, colors, speed, intensity, angle, duration, trigger]);
550
+ }, [type, colors, speed, intensity, angle, duration, trigger, shouldAnimate]);
543
551
  // Respond to external control in manual mode
544
552
  useEffect(() => {
545
553
  if (trigger !== "manual")
@@ -647,6 +655,93 @@ const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand
647
655
  isHoveredRef.current = true;
648
656
  isEmittingRef.current = true;
649
657
  emitStartTimeRef.current = Date.now();
658
+ // Initialize particles if none exist yet
659
+ if (particlesRef.current.length === 0) {
660
+ const canvas = canvasRef.current;
661
+ const container = containerRef.current;
662
+ if (canvas && container) {
663
+ const cw = canvas.width / 2;
664
+ const ch = canvas.height / 2;
665
+ const parsedColors = colors.map((color) => {
666
+ const computedColor = getComputedStyle(container).getPropertyValue(`--${color}`);
667
+ return computedColor || color;
668
+ });
669
+ const angleRad = (angle * Math.PI) / 180;
670
+ const horizontalOffset = Math.abs(Math.tan(angleRad) * ch);
671
+ if (type === "rain") {
672
+ const particles = [];
673
+ for (let i = 0; i < intensity; i++) {
674
+ const spawnWidth = cw + horizontalOffset * 2;
675
+ const spawnX = Math.random() * spawnWidth - horizontalOffset;
676
+ particles.push({
677
+ x: spawnX,
678
+ y: Math.random() * ch - ch,
679
+ length: 10 + Math.random() * 20,
680
+ speed: (2 + Math.random() * 3) * speed,
681
+ color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
682
+ opacity: 0.3 + Math.random() * 0.5,
683
+ thickness: 1 + Math.random() * 1.5,
684
+ });
685
+ }
686
+ particlesRef.current = particles;
687
+ }
688
+ else if (type === "snow") {
689
+ const particles = [];
690
+ for (let i = 0; i < intensity; i++) {
691
+ const depth = Math.random();
692
+ const size = 2 + depth * 4;
693
+ const spawnWidth = cw + horizontalOffset * 2;
694
+ const spawnX = Math.random() * spawnWidth - horizontalOffset;
695
+ particles.push({
696
+ x: spawnX,
697
+ y: Math.random() * ch - ch,
698
+ size,
699
+ speed: (0.3 + depth * 0.7) * speed,
700
+ color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
701
+ opacity: 0.4 + depth * 0.5,
702
+ swayAmplitude: 20 + Math.random() * 30,
703
+ swaySpeed: 0.5 + Math.random() * 1,
704
+ swayOffset: Math.random() * Math.PI * 2,
705
+ depth,
706
+ });
707
+ }
708
+ particlesRef.current = particles;
709
+ }
710
+ else if (type === "leaves") {
711
+ const particles = [];
712
+ for (let i = 0; i < intensity; i++) {
713
+ const depth = Math.random();
714
+ const width = 8 + depth * 12;
715
+ const height = width * (0.6 + Math.random() * 0.4);
716
+ const spawnWidth = cw + horizontalOffset * 2;
717
+ const spawnX = Math.random() * spawnWidth - horizontalOffset;
718
+ const colorIndex = Math.floor(Math.random() * parsedColors.length);
719
+ const color1 = parsedColors[colorIndex];
720
+ const color2 = parsedColors[Math.min(colorIndex + 1, parsedColors.length - 1)];
721
+ particles.push({
722
+ x: spawnX,
723
+ y: Math.random() * ch - ch,
724
+ width,
725
+ height,
726
+ speed: (0.4 + depth * 0.8) * speed,
727
+ color1,
728
+ color2,
729
+ opacity: 0.6 + depth * 0.3,
730
+ swayAmplitude: 30 + Math.random() * 50,
731
+ swaySpeed: 0.3 + Math.random() * 0.7,
732
+ swayOffset: Math.random() * Math.PI * 2,
733
+ rotation: Math.random() * Math.PI * 2,
734
+ rotationSpeed: (Math.random() - 0.5) * 0.08,
735
+ rotation3D: Math.random() * Math.PI * 2,
736
+ rotation3DSpeed: (Math.random() - 0.5) * 0.06,
737
+ depth,
738
+ });
739
+ }
740
+ particlesRef.current = particles;
741
+ }
742
+ // Lightning doesn't need pre-initialization (spawns dynamically)
743
+ }
744
+ }
650
745
  }
651
746
  };
652
747
  const handleMouseLeave = () => {