react-gsap-aos 1.0.2 → 1.0.3
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/dist/constants.d.mts +11 -1
- package/dist/constants.d.ts +11 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +25 -57
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -54
- package/dist/index.mjs.map +1 -1
- package/dist/{constants-D5sz-uHX.d.mts → types-CHfsRlXP.d.mts} +1 -9
- package/dist/{constants-D5sz-uHX.d.ts → types-CHfsRlXP.d.ts} +1 -9
- package/package.json +2 -2
package/dist/constants.d.mts
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { c as AnchorPlacement, E as Easing, a as Animation } from './types-CHfsRlXP.mjs';
|
|
2
|
+
|
|
3
|
+
/** 動畫曲線 */
|
|
4
|
+
declare const easings: Easing[];
|
|
5
|
+
/** 動畫錨點 */
|
|
6
|
+
declare const anchorPlacements: AnchorPlacement[];
|
|
7
|
+
|
|
8
|
+
/** 動畫種類 */
|
|
9
|
+
declare const animations: Animation[];
|
|
10
|
+
|
|
11
|
+
export { anchorPlacements, animations, easings };
|
package/dist/constants.d.ts
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { c as AnchorPlacement, E as Easing, a as Animation } from './types-CHfsRlXP.js';
|
|
2
|
+
|
|
3
|
+
/** 動畫曲線 */
|
|
4
|
+
declare const easings: Easing[];
|
|
5
|
+
/** 動畫錨點 */
|
|
6
|
+
declare const anchorPlacements: AnchorPlacement[];
|
|
7
|
+
|
|
8
|
+
/** 動畫種類 */
|
|
9
|
+
declare const animations: Animation[];
|
|
10
|
+
|
|
11
|
+
export { anchorPlacements, animations, easings };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as AnimationOptions, a as Animation, b as AOSAttributeKey } from './constants-D5sz-uHX.mjs';
|
|
2
|
-
export { c as AnchorPlacement, E as Easing, F as FadeAnimation, d as FlipAnimation, S as SlideAnimation, Z as ZoomAnimation, e as anchorPlacements, f as animations, g as easings } from './constants-D5sz-uHX.mjs';
|
|
3
1
|
import * as react from 'react';
|
|
2
|
+
import { A as AnimationOptions, a as Animation, b as AOSAttributeKey } from './types-CHfsRlXP.mjs';
|
|
3
|
+
export { c as AnchorPlacement, E as Easing, F as FadeAnimation, d as FlipAnimation, S as SlideAnimation, Z as ZoomAnimation } from './types-CHfsRlXP.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* 初始化 AOS 動畫
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as AnimationOptions, a as Animation, b as AOSAttributeKey } from './constants-D5sz-uHX.js';
|
|
2
|
-
export { c as AnchorPlacement, E as Easing, F as FadeAnimation, d as FlipAnimation, S as SlideAnimation, Z as ZoomAnimation, e as anchorPlacements, f as animations, g as easings } from './constants-D5sz-uHX.js';
|
|
3
1
|
import * as react from 'react';
|
|
2
|
+
import { A as AnimationOptions, a as Animation, b as AOSAttributeKey } from './types-CHfsRlXP.js';
|
|
3
|
+
export { c as AnchorPlacement, E as Easing, F as FadeAnimation, d as FlipAnimation, S as SlideAnimation, Z as ZoomAnimation } from './types-CHfsRlXP.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* 初始化 AOS 動畫
|
package/dist/index.js
CHANGED
|
@@ -47,15 +47,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
47
47
|
// src/index.ts
|
|
48
48
|
var src_exports = {};
|
|
49
49
|
__export(src_exports, {
|
|
50
|
-
anchorPlacements: () => anchorPlacements,
|
|
51
|
-
animations: () => animations,
|
|
52
|
-
easings: () => easings,
|
|
53
50
|
refreshAOS: () => refreshAOS,
|
|
54
51
|
toAOSProps: () => toAOSProps,
|
|
55
52
|
useAOSInitial: () => useAOSInitial
|
|
56
53
|
});
|
|
57
54
|
module.exports = __toCommonJS(src_exports);
|
|
58
55
|
|
|
56
|
+
// src/hooks/useAOSInitial.ts
|
|
57
|
+
var import_react = require("react");
|
|
58
|
+
var import_react2 = require("@gsap/react");
|
|
59
|
+
var import_gsap2 = __toESM(require("gsap"));
|
|
60
|
+
|
|
59
61
|
// src/animation/constants.ts
|
|
60
62
|
var DEFAULT_OPTIONS = {
|
|
61
63
|
offset: 120,
|
|
@@ -121,42 +123,6 @@ var anchorPlacements = [
|
|
|
121
123
|
"bottom-top"
|
|
122
124
|
];
|
|
123
125
|
|
|
124
|
-
// src/constants.ts
|
|
125
|
-
var animations = [
|
|
126
|
-
"fade",
|
|
127
|
-
"fade-up",
|
|
128
|
-
"fade-down",
|
|
129
|
-
"fade-left",
|
|
130
|
-
"fade-right",
|
|
131
|
-
"fade-up-right",
|
|
132
|
-
"fade-up-left",
|
|
133
|
-
"fade-down-right",
|
|
134
|
-
"fade-down-left",
|
|
135
|
-
"flip-up",
|
|
136
|
-
"flip-down",
|
|
137
|
-
"flip-left",
|
|
138
|
-
"flip-right",
|
|
139
|
-
"slide-up",
|
|
140
|
-
"slide-down",
|
|
141
|
-
"slide-left",
|
|
142
|
-
"slide-right",
|
|
143
|
-
"zoom-in",
|
|
144
|
-
"zoom-in-up",
|
|
145
|
-
"zoom-in-down",
|
|
146
|
-
"zoom-in-left",
|
|
147
|
-
"zoom-in-right",
|
|
148
|
-
"zoom-out",
|
|
149
|
-
"zoom-out-up",
|
|
150
|
-
"zoom-out-down",
|
|
151
|
-
"zoom-out-left",
|
|
152
|
-
"zoom-out-right"
|
|
153
|
-
];
|
|
154
|
-
|
|
155
|
-
// src/hooks/useAOSInitial.ts
|
|
156
|
-
var import_react = require("react");
|
|
157
|
-
var import_react2 = require("@gsap/react");
|
|
158
|
-
var import_gsap2 = __toESM(require("gsap"));
|
|
159
|
-
|
|
160
126
|
// src/animation/utils/parseAttributes.ts
|
|
161
127
|
var AOS_ATTRIBUTE_MAP = {
|
|
162
128
|
"data-aos-offset": "offset",
|
|
@@ -178,7 +144,7 @@ function parseAttributes(element) {
|
|
|
178
144
|
case "delay":
|
|
179
145
|
case "duration": {
|
|
180
146
|
const numberValue = parseNumber(value);
|
|
181
|
-
if (!Number.isNaN(numberValue)) {
|
|
147
|
+
if (!Number.isNaN(numberValue) && !Number.isFinite(numberValue)) {
|
|
182
148
|
options[prop] = numberValue;
|
|
183
149
|
}
|
|
184
150
|
break;
|
|
@@ -241,7 +207,7 @@ function mergeOptions(...array) {
|
|
|
241
207
|
case "delay":
|
|
242
208
|
case "duration": {
|
|
243
209
|
const value = options[key];
|
|
244
|
-
if (typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value)) {
|
|
210
|
+
if (typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value) && Number.isInteger(value)) {
|
|
245
211
|
result[key] = value;
|
|
246
212
|
}
|
|
247
213
|
break;
|
|
@@ -563,8 +529,8 @@ function createAnimationMap(definitions2) {
|
|
|
563
529
|
}
|
|
564
530
|
return result;
|
|
565
531
|
}
|
|
566
|
-
var
|
|
567
|
-
var animations_default =
|
|
532
|
+
var animations = createAnimationMap(definitions_default);
|
|
533
|
+
var animations_default = animations;
|
|
568
534
|
|
|
569
535
|
// src/animation/createAnimation.ts
|
|
570
536
|
var ANIMATION_REGISTRY = {
|
|
@@ -642,8 +608,7 @@ function useAOSInitial(options) {
|
|
|
642
608
|
const removeAnimation = (element) => {
|
|
643
609
|
const animation = animationsWeakMap.current.get(element);
|
|
644
610
|
if (!animation) return;
|
|
645
|
-
animation.kill();
|
|
646
|
-
animation.revert();
|
|
611
|
+
animation.kill().revert();
|
|
647
612
|
animationsWeakMap.current.delete(element);
|
|
648
613
|
};
|
|
649
614
|
const updateAnimation = (element) => {
|
|
@@ -655,18 +620,22 @@ function useAOSInitial(options) {
|
|
|
655
620
|
const addedElements = /* @__PURE__ */ new Set();
|
|
656
621
|
const updatedElements = /* @__PURE__ */ new Set();
|
|
657
622
|
for (const mutation of mutations) {
|
|
658
|
-
if (mutation.type === "attributes") {
|
|
659
|
-
|
|
660
|
-
updatedElements.add(mutation.target);
|
|
661
|
-
}
|
|
623
|
+
if (mutation.type === "attributes" && mutation.target instanceof HTMLElement) {
|
|
624
|
+
updatedElements.add(mutation.target);
|
|
662
625
|
} else if (mutation.type === "childList") {
|
|
663
626
|
collectElements(mutation.addedNodes, addedElements);
|
|
664
627
|
collectElements(mutation.removedNodes, removedElements);
|
|
665
628
|
}
|
|
666
629
|
}
|
|
667
|
-
removedElements
|
|
668
|
-
|
|
669
|
-
|
|
630
|
+
for (const element of removedElements) {
|
|
631
|
+
removeAnimation(element);
|
|
632
|
+
}
|
|
633
|
+
for (const element of addedElements) {
|
|
634
|
+
addAnimation(element);
|
|
635
|
+
}
|
|
636
|
+
for (const element of updatedElements) {
|
|
637
|
+
updateAnimation(element);
|
|
638
|
+
}
|
|
670
639
|
};
|
|
671
640
|
for (const element of import_gsap2.default.utils.toArray(
|
|
672
641
|
AOS_SELECTORS,
|
|
@@ -696,7 +665,9 @@ function collectElements(nodes, result) {
|
|
|
696
665
|
for (const node of nodes) {
|
|
697
666
|
if (!(node instanceof HTMLElement)) continue;
|
|
698
667
|
if (node.matches(AOS_SELECTORS)) result.add(node);
|
|
699
|
-
node.querySelectorAll(AOS_SELECTORS)
|
|
668
|
+
for (const element of node.querySelectorAll(AOS_SELECTORS)) {
|
|
669
|
+
result.add(element);
|
|
670
|
+
}
|
|
700
671
|
}
|
|
701
672
|
}
|
|
702
673
|
|
|
@@ -741,16 +712,13 @@ function toBooleanAttr(value) {
|
|
|
741
712
|
return typeof value === "boolean" ? String(value) : void 0;
|
|
742
713
|
}
|
|
743
714
|
function toNumberAttr(value) {
|
|
744
|
-
return typeof value === "number" ? String(value) : void 0;
|
|
715
|
+
return typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value) && Number.isInteger(value) ? String(value) : void 0;
|
|
745
716
|
}
|
|
746
717
|
function validateEnumValue(list, value) {
|
|
747
718
|
return list.includes(value) ? value : void 0;
|
|
748
719
|
}
|
|
749
720
|
// Annotate the CommonJS export names for ESM import in node:
|
|
750
721
|
0 && (module.exports = {
|
|
751
|
-
anchorPlacements,
|
|
752
|
-
animations,
|
|
753
|
-
easings,
|
|
754
722
|
refreshAOS,
|
|
755
723
|
toAOSProps,
|
|
756
724
|
useAOSInitial
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/animation/constants.ts","../src/constants.ts","../src/hooks/useAOSInitial.ts","../src/animation/utils/parseAttributes.ts","../src/animation/animations.ts","../src/animation/utils/mergeOptions.ts","../src/animation/utils/createTweenVars.ts","../src/animation/definitions.ts","../src/animation/createAnimation.ts","../src/utils/refreshAOS.ts","../src/utils/toAOSProps.ts"],"sourcesContent":["export { anchorPlacements, animations, easings } from \"./constants\";\nexport { default as useAOSInitial } from \"./hooks/useAOSInitial\";\nexport type {\n AnchorPlacement,\n Animation,\n AnimationOptions,\n Easing,\n FadeAnimation,\n FlipAnimation,\n SlideAnimation,\n ZoomAnimation,\n} from \"./types\";\nexport { default as refreshAOS } from \"./utils/refreshAOS\";\nexport { default as toAOSProps } from \"./utils/toAOSProps\";\n","import type { AnchorPlacement, AnimationOptions, Easing } from \"@/types\";\n\n/** 預設選項 */\nexport const DEFAULT_OPTIONS: AnimationOptions = {\n offset: 120,\n delay: 0,\n duration: 400,\n easing: \"none\",\n once: false,\n mirror: false,\n anchorPlacement: \"top-bottom\",\n};\n\n/** 動畫曲線 */\nexport const easings: Easing[] = [\n \"none\",\n \"power1\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"bounce\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"circ\",\n \"circ.in\",\n \"circ.out\",\n \"circ.inOut\",\n \"elastic\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"expo\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"sine\",\n \"sine.in\",\n \"sine.out\",\n \"sine.inOut\",\n];\n\n/** 動畫錨點 */\nexport const anchorPlacements: AnchorPlacement[] = [\n \"top-bottom\",\n \"top-center\",\n \"top-top\",\n \"center-bottom\",\n \"center-center\",\n \"center-top\",\n \"bottom-bottom\",\n \"bottom-center\",\n \"bottom-top\",\n];\n","import type { Animation } from \"./types\";\n\nexport { anchorPlacements, easings } from \"./animation/constants\";\n\n/** 動畫種類 */\nexport const animations: Animation[] = [\n \"fade\",\n \"fade-up\",\n \"fade-down\",\n \"fade-left\",\n \"fade-right\",\n \"fade-up-right\",\n \"fade-up-left\",\n \"fade-down-right\",\n \"fade-down-left\",\n \"flip-up\",\n \"flip-down\",\n \"flip-left\",\n \"flip-right\",\n \"slide-up\",\n \"slide-down\",\n \"slide-left\",\n \"slide-right\",\n \"zoom-in\",\n \"zoom-in-up\",\n \"zoom-in-down\",\n \"zoom-in-left\",\n \"zoom-in-right\",\n \"zoom-out\",\n \"zoom-out-up\",\n \"zoom-out-down\",\n \"zoom-out-left\",\n \"zoom-out-right\",\n];\n","import { useLayoutEffect, useRef } from \"react\";\nimport { useGSAP } from \"@gsap/react\";\nimport gsap from \"gsap\";\n\nimport createAnimation from \"@/animation/createAnimation\";\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ngsap.registerPlugin(useGSAP);\n\n/** AOS 屬性 */\nconst AOS_ATTRIBUTE_KEYS: (AOSAttributeKey | \"data-aos\")[] = [\n \"data-aos\",\n \"data-aos-offset\",\n \"data-aos-delay\",\n \"data-aos-duration\",\n \"data-aos-easing\",\n \"data-aos-mirror\",\n \"data-aos-once\",\n \"data-aos-anchor-placement\",\n];\n\n/** AOS 選擇器 */\nconst AOS_SELECTORS = \"[data-aos]\";\n\n/**\n * 初始化 AOS 動畫\n * \n * @example\n * ```tsx\n \"use client\";\n\n import {useAOSInitial} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSInitial<HTMLDivElement>()\n return (\n <div ref={containerRef} className=\"overflow-hidden\">\n <div data-aos-container>\n <div data-aos=\"fade-up\">Hello AOS</div>\n </div>\n </div>\n )\n }\n * ```\n */\nexport default function useAOSInitial<E extends HTMLElement = HTMLElement>(\n options?: Partial<AnimationOptions>,\n) {\n const containerRef = useRef<E | null>(null);\n const observerRef = useRef<MutationObserver | null>(null);\n /** 記錄每個元素對應的動畫實例 */\n const animationsWeakMap = useRef<WeakMap<HTMLElement, gsap.core.Tween>>(\n new WeakMap(),\n );\n const optionsRef = useRef(options);\n\n // 使用靜態寫入,下次新增動畫才會套用覆蓋預設值\n useLayoutEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useGSAP(\n (_, contextSafe) => {\n if (!containerRef.current || !contextSafe) return;\n\n /** 新增動畫 */\n const addAnimation = (element: HTMLElement) => {\n if (animationsWeakMap.current.has(element)) return;\n\n const newAnimation = contextSafe(createAnimation)(\n element,\n optionsRef.current,\n );\n if (!newAnimation) return;\n\n animationsWeakMap.current.set(element, newAnimation);\n };\n\n /** 移除動畫 */\n const removeAnimation = (element: HTMLElement) => {\n const animation = animationsWeakMap.current.get(element);\n if (!animation) return;\n\n animation.kill();\n animation.revert();\n animationsWeakMap.current.delete(element);\n };\n\n /** 更新動畫 */\n const updateAnimation = (element: HTMLElement) => {\n removeAnimation(element);\n addAnimation(element);\n };\n\n /** 監聽元素變化 */\n const handleMutation: MutationCallback = (mutations) => {\n const removedElements = new Set<HTMLElement>();\n const addedElements = new Set<HTMLElement>();\n const updatedElements = new Set<HTMLElement>();\n\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n if (mutation.target instanceof HTMLElement) {\n updatedElements.add(mutation.target);\n }\n } else if (mutation.type === \"childList\") {\n collectElements(mutation.addedNodes, addedElements);\n collectElements(mutation.removedNodes, removedElements);\n }\n }\n\n // 移除優先於新增,避免重複初始化\n removedElements.forEach(removeAnimation);\n addedElements.forEach(addAnimation);\n updatedElements.forEach(updateAnimation);\n };\n\n // 初始化\n for (const element of gsap.utils.toArray<HTMLElement>(\n AOS_SELECTORS,\n containerRef.current,\n )) {\n addAnimation(element);\n }\n\n observerRef.current = new MutationObserver(handleMutation);\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: AOS_ATTRIBUTE_KEYS,\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n },\n { scope: containerRef, dependencies: [] },\n );\n\n return { containerRef };\n}\n\n/** 搜尋 [data-aos] 變動元素 */\nfunction collectElements(nodes: NodeList, result: Set<HTMLElement>) {\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(AOS_SELECTORS)) result.add(node);\n node\n .querySelectorAll<HTMLElement>(AOS_SELECTORS)\n .forEach((el) => result.add(el));\n }\n}\n","import { anchorPlacements, easings } from \"../constants\";\n\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\n/** AOS 屬性對應 */\nconst AOS_ATTRIBUTE_MAP = {\n \"data-aos-offset\": \"offset\",\n \"data-aos-delay\": \"delay\",\n \"data-aos-duration\": \"duration\",\n \"data-aos-easing\": \"easing\",\n \"data-aos-mirror\": \"mirror\",\n \"data-aos-once\": \"once\",\n \"data-aos-anchor-placement\": \"anchorPlacement\",\n} satisfies Record<AOSAttributeKey, keyof AnimationOptions>;\n\n/** 解析動畫屬性 */\nexport default function parseAttributes<E extends Element>(element: E) {\n const options = {} as Partial<AnimationOptions>;\n\n for (const key of Object.keys(AOS_ATTRIBUTE_MAP)) {\n const value = element.getAttribute(key);\n\n if (value) {\n const prop = AOS_ATTRIBUTE_MAP[key as AOSAttributeKey];\n\n switch (prop) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const numberValue = parseNumber(value);\n if (!Number.isNaN(numberValue)) {\n options[prop] = numberValue;\n }\n break;\n }\n case \"easing\": {\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const booleanValue = parseBoolean(value);\n if (typeof booleanValue === \"boolean\") {\n options[prop] = booleanValue;\n }\n break;\n }\n case \"anchorPlacement\": {\n const anchorPlacement = parseEnum(anchorPlacements, value);\n if (anchorPlacement) {\n options[prop] = anchorPlacement;\n }\n break;\n }\n }\n }\n }\n\n return options;\n}\n\nfunction parseEnum<T>(list: readonly T[], value: string): T | undefined {\n return list.includes(value as T) ? (value as T) : undefined;\n}\n\nfunction parseBoolean(value: string) {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n break;\n }\n}\n\nfunction parseNumber(value: string) {\n return parseInt(value, 10);\n}\n","import gsap from \"gsap\";\n\nimport mergeOptions from \"./utils/mergeOptions\";\nimport definitions, {\n AnimationDefinitions,\n AnimationPreset,\n} from \"./definitions\";\n\nimport type { AnchorPlacement, AnimationOptions } from \"@/types\";\n\nexport type CreateAnimationFunction = (\n element: HTMLElement,\n options?: Partial<AnimationOptions>,\n) => gsap.core.Tween;\n\n/** 計算 ScrollTrigger 的 start */\nfunction scrollTriggerStart(\n anchorPlacement: AnchorPlacement,\n offset: number,\n): string {\n const [v1, v2] = anchorPlacement.split(\"-\");\n const anchor = `${v1} ${v2}`;\n\n if (offset === 0 || Number.isNaN(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 建立 ScrollTrigger 動畫 */\nfunction createScrollTriggerTween(\n element: HTMLElement,\n preset: AnimationPreset,\n vars: AnimationPreset,\n options?: Partial<AnimationOptions>,\n) {\n const { from, to } = vars;\n const { offset, delay, duration, easing, once, mirror, anchorPlacement } =\n mergeOptions(options);\n\n /** 上層基準容器 */\n const container = element.parentElement?.hasAttribute(\"data-aos-container\")\n ? element.parentElement\n : null;\n\n return gsap.fromTo(\n element,\n {\n ...preset.from,\n ...from,\n },\n {\n ...preset.to,\n ...to,\n ease: easing,\n duration: duration / 1000,\n delay: delay / 1000,\n overwrite: \"auto\",\n scrollTrigger: {\n // markers: true,\n trigger: container || element,\n toggleActions: mirror\n ? \"play reverse play reverse\"\n : \"play none none reverse\",\n once,\n start: scrollTriggerStart(anchorPlacement, offset),\n },\n },\n );\n}\n\n/** 建立動畫物件組 */\nfunction createAnimationMap<T extends Record<string, AnimationDefinitions>>(\n definitions: T,\n): { [K in keyof T]: CreateAnimationFunction } {\n const result = {} as Record<keyof T, CreateAnimationFunction>;\n const keys = Object.keys(definitions) as Array<keyof T>;\n\n for (const key of keys) {\n const { preset, vars } = definitions[key];\n\n result[key] = (element, options) =>\n createScrollTriggerTween(element, preset, vars, options);\n }\n\n return result;\n}\n\nconst animations = createAnimationMap(definitions);\n\nexport default animations;\n","import { anchorPlacements, DEFAULT_OPTIONS, easings } from \"../constants\";\n\nimport type { AnimationOptions } from \"@/types\";\n\n/** 跟預設值合併動畫選項 */\nexport default function mergeOptions(\n ...array: (Partial<AnimationOptions> | undefined | null)[]\n): AnimationOptions {\n const result = { ...DEFAULT_OPTIONS };\n\n for (const options of array) {\n if (!options) continue;\n\n for (const key of Object.keys(options) as (keyof AnimationOptions)[]) {\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const value = options[key];\n if (\n typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value)\n ) {\n result[key] = value;\n }\n break;\n }\n case \"easing\": {\n const value = options[key];\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const value = options[key];\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n }\n case \"anchorPlacement\": {\n const value = options[key];\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\n }\n default:\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction verifyEnum<T>(list: readonly T[], value: unknown): value is T {\n return Boolean(value && list.includes(value as T));\n}\n","export function translate3d(x: number | string, y: number | string, z: number) {\n return { x, y, z } satisfies gsap.TweenVars;\n}\n\nexport function rotateY(y: number | string) {\n return { rotateY: y } satisfies gsap.TweenVars;\n}\n\nexport function rotateX(x: number | string) {\n return { rotateX: x } satisfies gsap.TweenVars;\n}\n\nexport function scale(x: number, y?: number) {\n return typeof y === \"number\"\n ? ({\n scaleX: x,\n scaleY: y,\n } satisfies gsap.TweenVars)\n : ({\n scale: x,\n } satisfies gsap.TweenVars);\n}\n\n/** @see https://gsap.com/docs/v3/GSAP/CorePlugins/CSS/#3d-transforms */\nexport function perspective(value: number) {\n return {\n transformPerspective: value,\n } satisfies gsap.TweenVars;\n}\n","import {\n perspective,\n rotateX,\n rotateY,\n scale,\n translate3d,\n} from \"./utils/createTweenVars\";\n\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\n\nexport interface AnimationDefinitions {\n /** 預設配置 */\n preset: AnimationPreset;\n /** 自訂配置 */\n vars: AnimationPreset;\n}\n\n/** 距離 `px` */\nexport const DISTANCE = 100;\n\n/** 動畫預設配置 */\nconst presets = {\n fade: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n transform: \"none\",\n },\n },\n zoom: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n ...translate3d(0, 0, 0),\n ...scale(1),\n },\n },\n slide: {\n from: {\n visibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {\n visibility: \"visible\",\n ...translate3d(0, 0, 0),\n },\n },\n flip: {\n from: {\n backfaceVisibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {},\n },\n} satisfies Record<string, AnimationPreset>;\n\n/** 動畫定義 */\nconst definitions = {\n fade: {\n preset: presets.fade,\n vars: {\n from: {},\n to: {},\n },\n },\n fadeUp: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, DISTANCE, 0),\n to: {},\n },\n },\n fadeDown: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, -DISTANCE, 0),\n to: {},\n },\n },\n fadeLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeUpRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeUpLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeDownRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n fadeDownLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n flipUp: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipDown: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipLeft: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n flipRight: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n slideUp: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"100%\", 0),\n to: {},\n },\n },\n slideDown: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"-100%\", 0),\n to: {},\n },\n },\n slideLeft: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"100%\", 0, 0),\n to: {},\n },\n },\n slideRight: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"-100%\", 0, 0),\n to: {},\n },\n },\n zoomIn: { preset: presets.zoom, vars: { from: scale(0.6), to: {} } },\n zoomInUp: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInDown: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, -DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInLeft: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInRight: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(-DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomOut: { preset: presets.zoom, vars: { from: scale(1.2), to: {} } },\n zoomOutUp: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutDown: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, -DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutLeft: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutRight: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(-DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n} satisfies Record<string, AnimationDefinitions>;\n\nexport default definitions;\n","import parseAttributes from \"./utils/parseAttributes\";\nimport animations, { type CreateAnimationFunction } from \"./animations\";\n\nimport type { Animation, AnimationOptions } from \"@/types\";\n\nconst ANIMATION_REGISTRY: Record<Animation, CreateAnimationFunction> = {\n fade: animations.fade,\n \"fade-up\": animations.fadeUp,\n \"fade-down\": animations.fadeDown,\n \"fade-left\": animations.fadeLeft,\n \"fade-right\": animations.fadeRight,\n \"fade-up-right\": animations.fadeUpRight,\n \"fade-up-left\": animations.fadeUpLeft,\n \"fade-down-right\": animations.fadeDownRight,\n \"fade-down-left\": animations.fadeDownLeft,\n \"flip-up\": animations.flipUp,\n \"flip-down\": animations.flipDown,\n \"flip-left\": animations.flipLeft,\n \"flip-right\": animations.flipRight,\n \"slide-up\": animations.slideUp,\n \"slide-down\": animations.slideDown,\n \"slide-left\": animations.slideLeft,\n \"slide-right\": animations.slideRight,\n \"zoom-in\": animations.zoomIn,\n \"zoom-in-up\": animations.zoomInUp,\n \"zoom-in-down\": animations.zoomInDown,\n \"zoom-in-left\": animations.zoomInLeft,\n \"zoom-in-right\": animations.zoomInRight,\n \"zoom-out\": animations.zoomOut,\n \"zoom-out-up\": animations.zoomOutUp,\n \"zoom-out-down\": animations.zoomOutDown,\n \"zoom-out-left\": animations.zoomOutLeft,\n \"zoom-out-right\": animations.zoomOutRight,\n};\n\n/** 建立動畫元素 */\nexport default function createAnimation<E extends HTMLElement>(\n element: E,\n options?: Partial<AnimationOptions>,\n) {\n const animate = element.getAttribute(\"data-aos\") as Animation | null;\n if (!animate) return;\n\n const handleAnimation = ANIMATION_REGISTRY[animate];\n if (!handleAnimation) return;\n\n return handleAnimation(element, {\n ...options,\n ...parseAttributes(element),\n });\n}\n","import gsap from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\n\ngsap.registerPlugin(ScrollTrigger);\n\n/** 刷新 AOS 動畫位置 */\nexport default function refreshAOS() {\n ScrollTrigger.refresh(true);\n}\n","import { anchorPlacements, easings } from \"@/constants\";\nimport type { Animation, AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ninterface AOSDataAttributes extends Partial<Record<AOSAttributeKey, string>> {\n \"data-aos\": Animation;\n}\n\ninterface AOSAttributeOptions extends Partial<AnimationOptions> {\n animation: Animation;\n}\n\n/** 將 options 轉成可直接使用的 AOS data attributes */\nexport default function toAOSProps(options: AOSAttributeOptions) {\n const attrs: AOSDataAttributes = {\n \"data-aos\": options.animation,\n \"data-aos-offset\": toNumberAttr(options.offset),\n \"data-aos-delay\": toNumberAttr(options.delay),\n \"data-aos-duration\": toNumberAttr(options.duration),\n \"data-aos-easing\": validateEnumValue(easings, options.easing),\n \"data-aos-mirror\": toBooleanAttr(options.mirror),\n \"data-aos-once\": toBooleanAttr(options.once),\n \"data-aos-anchor-placement\": validateEnumValue(\n anchorPlacements,\n options.anchorPlacement,\n ),\n };\n\n return omitNil(attrs);\n}\n\nfunction omitNil<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n\n const keys = Object.keys(obj) as Array<keyof T>;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = obj[key];\n\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction toBooleanAttr(value?: boolean) {\n return typeof value === \"boolean\" ? String(value) : undefined;\n}\n\nfunction toNumberAttr(value?: number) {\n return typeof value === \"number\" ? String(value) : undefined;\n}\n\nfunction validateEnumValue<T>(list: readonly T[], value: T) {\n return list.includes(value) ? value : undefined;\n}\n"],"mappings":"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","names":["import_react","import_gsap","gsap","definitions","animations","gsap","import_gsap","gsap"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/hooks/useAOSInitial.ts","../src/animation/constants.ts","../src/animation/utils/parseAttributes.ts","../src/animation/animations.ts","../src/animation/utils/mergeOptions.ts","../src/animation/utils/createTweenVars.ts","../src/animation/definitions.ts","../src/animation/createAnimation.ts","../src/utils/refreshAOS.ts","../src/utils/toAOSProps.ts"],"sourcesContent":["export { default as useAOSInitial } from \"./hooks/useAOSInitial\";\nexport type {\n AnchorPlacement,\n Animation,\n AnimationOptions,\n Easing,\n FadeAnimation,\n FlipAnimation,\n SlideAnimation,\n ZoomAnimation,\n} from \"./types\";\nexport { default as refreshAOS } from \"./utils/refreshAOS\";\nexport { default as toAOSProps } from \"./utils/toAOSProps\";\n","import { useLayoutEffect, useRef } from \"react\";\nimport { useGSAP } from \"@gsap/react\";\nimport gsap from \"gsap\";\n\nimport createAnimation from \"@/animation/createAnimation\";\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ngsap.registerPlugin(useGSAP);\n\n/** AOS 屬性 */\nconst AOS_ATTRIBUTE_KEYS: (AOSAttributeKey | \"data-aos\")[] = [\n \"data-aos\",\n \"data-aos-offset\",\n \"data-aos-delay\",\n \"data-aos-duration\",\n \"data-aos-easing\",\n \"data-aos-mirror\",\n \"data-aos-once\",\n \"data-aos-anchor-placement\",\n];\n\n/** AOS 選擇器 */\nconst AOS_SELECTORS = \"[data-aos]\";\n\n/**\n * 初始化 AOS 動畫\n * \n * @example\n * ```tsx\n \"use client\";\n\n import {useAOSInitial} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSInitial<HTMLDivElement>()\n return (\n <div ref={containerRef} className=\"overflow-hidden\">\n <div data-aos-container>\n <div data-aos=\"fade-up\">Hello AOS</div>\n </div>\n </div>\n )\n }\n * ```\n */\nexport default function useAOSInitial<E extends HTMLElement = HTMLElement>(\n options?: Partial<AnimationOptions>,\n) {\n const containerRef = useRef<E | null>(null);\n const observerRef = useRef<MutationObserver | null>(null);\n /** 記錄每個元素對應的動畫實例 */\n const animationsWeakMap = useRef<WeakMap<HTMLElement, gsap.core.Tween>>(\n new WeakMap(),\n );\n const optionsRef = useRef(options);\n\n // 使用靜態寫入,下次新增動畫才會套用覆蓋預設值\n useLayoutEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useGSAP(\n (_, contextSafe) => {\n if (!containerRef.current || !contextSafe) return;\n\n /** 新增動畫 */\n const addAnimation = (element: HTMLElement) => {\n if (animationsWeakMap.current.has(element)) return;\n\n const newAnimation = contextSafe(createAnimation)(\n element,\n optionsRef.current,\n );\n if (!newAnimation) return;\n\n animationsWeakMap.current.set(element, newAnimation);\n };\n\n /** 移除動畫 */\n const removeAnimation = (element: HTMLElement) => {\n const animation = animationsWeakMap.current.get(element);\n if (!animation) return;\n\n animation.kill().revert();\n animationsWeakMap.current.delete(element);\n };\n\n /** 更新動畫 */\n const updateAnimation = (element: HTMLElement) => {\n removeAnimation(element);\n addAnimation(element);\n };\n\n /** 監聽元素變化 */\n const handleMutation: MutationCallback = (mutations) => {\n const removedElements = new Set<HTMLElement>();\n const addedElements = new Set<HTMLElement>();\n const updatedElements = new Set<HTMLElement>();\n\n for (const mutation of mutations) {\n if (\n mutation.type === \"attributes\" &&\n mutation.target instanceof HTMLElement\n ) {\n updatedElements.add(mutation.target);\n } else if (mutation.type === \"childList\") {\n collectElements(mutation.addedNodes, addedElements);\n collectElements(mutation.removedNodes, removedElements);\n }\n }\n\n // 移除 => 新增 => 更新,避免重複初始化\n for (const element of removedElements) {\n removeAnimation(element);\n }\n\n for (const element of addedElements) {\n addAnimation(element);\n }\n\n for (const element of updatedElements) {\n updateAnimation(element);\n }\n };\n\n // 初始化\n for (const element of gsap.utils.toArray<HTMLElement>(\n AOS_SELECTORS,\n containerRef.current,\n )) {\n addAnimation(element);\n }\n\n observerRef.current = new MutationObserver(handleMutation);\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: AOS_ATTRIBUTE_KEYS,\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n },\n { scope: containerRef, dependencies: [] },\n );\n\n return { containerRef };\n}\n\n/** 搜尋 [data-aos] 變動元素 */\nfunction collectElements(nodes: NodeList, result: Set<HTMLElement>) {\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(AOS_SELECTORS)) result.add(node);\n for (const element of node.querySelectorAll<HTMLElement>(AOS_SELECTORS)) {\n result.add(element);\n }\n }\n}\n","import type { AnchorPlacement, AnimationOptions, Easing } from \"@/types\";\n\n/** 預設選項 */\nexport const DEFAULT_OPTIONS: AnimationOptions = {\n offset: 120,\n delay: 0,\n duration: 400,\n easing: \"none\",\n once: false,\n mirror: false,\n anchorPlacement: \"top-bottom\",\n};\n\n/** 動畫曲線 */\nexport const easings: Easing[] = [\n \"none\",\n \"power1\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"bounce\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"circ\",\n \"circ.in\",\n \"circ.out\",\n \"circ.inOut\",\n \"elastic\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"expo\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"sine\",\n \"sine.in\",\n \"sine.out\",\n \"sine.inOut\",\n];\n\n/** 動畫錨點 */\nexport const anchorPlacements: AnchorPlacement[] = [\n \"top-bottom\",\n \"top-center\",\n \"top-top\",\n \"center-bottom\",\n \"center-center\",\n \"center-top\",\n \"bottom-bottom\",\n \"bottom-center\",\n \"bottom-top\",\n];\n","import { anchorPlacements, easings } from \"../constants\";\n\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\n/** AOS 屬性對應 */\nconst AOS_ATTRIBUTE_MAP = {\n \"data-aos-offset\": \"offset\",\n \"data-aos-delay\": \"delay\",\n \"data-aos-duration\": \"duration\",\n \"data-aos-easing\": \"easing\",\n \"data-aos-mirror\": \"mirror\",\n \"data-aos-once\": \"once\",\n \"data-aos-anchor-placement\": \"anchorPlacement\",\n} satisfies Record<AOSAttributeKey, keyof AnimationOptions>;\n\n/** 解析動畫屬性 */\nexport default function parseAttributes<E extends Element>(element: E) {\n const options = {} as Partial<AnimationOptions>;\n\n for (const key of Object.keys(AOS_ATTRIBUTE_MAP)) {\n const value = element.getAttribute(key);\n\n if (value) {\n const prop = AOS_ATTRIBUTE_MAP[key as AOSAttributeKey];\n\n switch (prop) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const numberValue = parseNumber(value);\n if (!Number.isNaN(numberValue) && !Number.isFinite(numberValue)) {\n options[prop] = numberValue;\n }\n break;\n }\n case \"easing\": {\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const booleanValue = parseBoolean(value);\n if (typeof booleanValue === \"boolean\") {\n options[prop] = booleanValue;\n }\n break;\n }\n case \"anchorPlacement\": {\n const anchorPlacement = parseEnum(anchorPlacements, value);\n if (anchorPlacement) {\n options[prop] = anchorPlacement;\n }\n break;\n }\n }\n }\n }\n\n return options;\n}\n\nfunction parseEnum<T>(list: readonly T[], value: string): T | undefined {\n return list.includes(value as T) ? (value as T) : undefined;\n}\n\nfunction parseBoolean(value: string) {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n break;\n }\n}\n\nfunction parseNumber(value: string) {\n return parseInt(value, 10);\n}\n","import gsap from \"gsap\";\n\nimport mergeOptions from \"./utils/mergeOptions\";\nimport definitions, {\n AnimationDefinitions,\n AnimationPreset,\n} from \"./definitions\";\n\nimport type { AnchorPlacement, AnimationOptions } from \"@/types\";\n\nexport type CreateAnimationFunction = (\n element: HTMLElement,\n options?: Partial<AnimationOptions>,\n) => gsap.core.Tween;\n\n/** 計算 ScrollTrigger 的 start */\nfunction scrollTriggerStart(\n anchorPlacement: AnchorPlacement,\n offset: number,\n): string {\n const [v1, v2] = anchorPlacement.split(\"-\");\n const anchor = `${v1} ${v2}`;\n\n if (offset === 0 || Number.isNaN(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 建立 ScrollTrigger 動畫 */\nfunction createScrollTriggerTween(\n element: HTMLElement,\n preset: AnimationPreset,\n vars: AnimationPreset,\n options?: Partial<AnimationOptions>,\n) {\n const { from, to } = vars;\n const { offset, delay, duration, easing, once, mirror, anchorPlacement } =\n mergeOptions(options);\n\n /** 上層基準容器 */\n const container = element.parentElement?.hasAttribute(\"data-aos-container\")\n ? element.parentElement\n : null;\n\n return gsap.fromTo(\n element,\n {\n ...preset.from,\n ...from,\n },\n {\n ...preset.to,\n ...to,\n ease: easing,\n duration: duration / 1000,\n delay: delay / 1000,\n overwrite: \"auto\",\n scrollTrigger: {\n // markers: true,\n trigger: container || element,\n toggleActions: mirror\n ? \"play reverse play reverse\"\n : \"play none none reverse\",\n once,\n start: scrollTriggerStart(anchorPlacement, offset),\n },\n },\n );\n}\n\n/** 建立動畫物件組 */\nfunction createAnimationMap<T extends Record<string, AnimationDefinitions>>(\n definitions: T,\n): { [K in keyof T]: CreateAnimationFunction } {\n const result = {} as Record<keyof T, CreateAnimationFunction>;\n const keys = Object.keys(definitions) as Array<keyof T>;\n\n for (const key of keys) {\n const { preset, vars } = definitions[key];\n\n result[key] = (element, options) =>\n createScrollTriggerTween(element, preset, vars, options);\n }\n\n return result;\n}\n\nconst animations = createAnimationMap(definitions);\n\nexport default animations;\n","import { anchorPlacements, DEFAULT_OPTIONS, easings } from \"../constants\";\n\nimport type { AnimationOptions } from \"@/types\";\n\n/** 跟預設值合併動畫選項 */\nexport default function mergeOptions(\n ...array: (Partial<AnimationOptions> | undefined | null)[]\n): AnimationOptions {\n const result = { ...DEFAULT_OPTIONS };\n\n for (const options of array) {\n if (!options) continue;\n\n for (const key of Object.keys(options) as (keyof AnimationOptions)[]) {\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const value = options[key];\n if (\n typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value) &&\n Number.isInteger(value)\n ) {\n result[key] = value;\n }\n break;\n }\n case \"easing\": {\n const value = options[key];\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const value = options[key];\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n }\n case \"anchorPlacement\": {\n const value = options[key];\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\n }\n default:\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction verifyEnum<T>(list: readonly T[], value: unknown): value is T {\n return Boolean(value && list.includes(value as T));\n}\n","export function translate3d(x: number | string, y: number | string, z: number) {\n return { x, y, z } satisfies gsap.TweenVars;\n}\n\nexport function rotateY(y: number | string) {\n return { rotateY: y } satisfies gsap.TweenVars;\n}\n\nexport function rotateX(x: number | string) {\n return { rotateX: x } satisfies gsap.TweenVars;\n}\n\nexport function scale(x: number, y?: number) {\n return typeof y === \"number\"\n ? ({\n scaleX: x,\n scaleY: y,\n } satisfies gsap.TweenVars)\n : ({\n scale: x,\n } satisfies gsap.TweenVars);\n}\n\n/** @see https://gsap.com/docs/v3/GSAP/CorePlugins/CSS/#3d-transforms */\nexport function perspective(value: number) {\n return {\n transformPerspective: value,\n } satisfies gsap.TweenVars;\n}\n","import {\n perspective,\n rotateX,\n rotateY,\n scale,\n translate3d,\n} from \"./utils/createTweenVars\";\n\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\n\nexport interface AnimationDefinitions {\n /** 預設配置 */\n preset: AnimationPreset;\n /** 自訂配置 */\n vars: AnimationPreset;\n}\n\n/** 距離 `px` */\nexport const DISTANCE = 100;\n\n/** 動畫預設配置 */\nconst presets = {\n fade: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n transform: \"none\",\n },\n },\n zoom: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n ...translate3d(0, 0, 0),\n ...scale(1),\n },\n },\n slide: {\n from: {\n visibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {\n visibility: \"visible\",\n ...translate3d(0, 0, 0),\n },\n },\n flip: {\n from: {\n backfaceVisibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {},\n },\n} satisfies Record<string, AnimationPreset>;\n\n/** 動畫定義 */\nconst definitions = {\n fade: {\n preset: presets.fade,\n vars: {\n from: {},\n to: {},\n },\n },\n fadeUp: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, DISTANCE, 0),\n to: {},\n },\n },\n fadeDown: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, -DISTANCE, 0),\n to: {},\n },\n },\n fadeLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeUpRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeUpLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeDownRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n fadeDownLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n flipUp: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipDown: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipLeft: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n flipRight: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n slideUp: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"100%\", 0),\n to: {},\n },\n },\n slideDown: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"-100%\", 0),\n to: {},\n },\n },\n slideLeft: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"100%\", 0, 0),\n to: {},\n },\n },\n slideRight: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"-100%\", 0, 0),\n to: {},\n },\n },\n zoomIn: { preset: presets.zoom, vars: { from: scale(0.6), to: {} } },\n zoomInUp: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInDown: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, -DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInLeft: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInRight: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(-DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomOut: { preset: presets.zoom, vars: { from: scale(1.2), to: {} } },\n zoomOutUp: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutDown: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, -DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutLeft: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutRight: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(-DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n} satisfies Record<string, AnimationDefinitions>;\n\nexport default definitions;\n","import parseAttributes from \"./utils/parseAttributes\";\nimport animations, { type CreateAnimationFunction } from \"./animations\";\n\nimport type { Animation, AnimationOptions } from \"@/types\";\n\nconst ANIMATION_REGISTRY: Record<Animation, CreateAnimationFunction> = {\n fade: animations.fade,\n \"fade-up\": animations.fadeUp,\n \"fade-down\": animations.fadeDown,\n \"fade-left\": animations.fadeLeft,\n \"fade-right\": animations.fadeRight,\n \"fade-up-right\": animations.fadeUpRight,\n \"fade-up-left\": animations.fadeUpLeft,\n \"fade-down-right\": animations.fadeDownRight,\n \"fade-down-left\": animations.fadeDownLeft,\n \"flip-up\": animations.flipUp,\n \"flip-down\": animations.flipDown,\n \"flip-left\": animations.flipLeft,\n \"flip-right\": animations.flipRight,\n \"slide-up\": animations.slideUp,\n \"slide-down\": animations.slideDown,\n \"slide-left\": animations.slideLeft,\n \"slide-right\": animations.slideRight,\n \"zoom-in\": animations.zoomIn,\n \"zoom-in-up\": animations.zoomInUp,\n \"zoom-in-down\": animations.zoomInDown,\n \"zoom-in-left\": animations.zoomInLeft,\n \"zoom-in-right\": animations.zoomInRight,\n \"zoom-out\": animations.zoomOut,\n \"zoom-out-up\": animations.zoomOutUp,\n \"zoom-out-down\": animations.zoomOutDown,\n \"zoom-out-left\": animations.zoomOutLeft,\n \"zoom-out-right\": animations.zoomOutRight,\n};\n\n/** 建立動畫元素 */\nexport default function createAnimation<E extends HTMLElement>(\n element: E,\n options?: Partial<AnimationOptions>,\n) {\n const animate = element.getAttribute(\"data-aos\") as Animation | null;\n if (!animate) return;\n\n const handleAnimation = ANIMATION_REGISTRY[animate];\n if (!handleAnimation) return;\n\n return handleAnimation(element, {\n ...options,\n ...parseAttributes(element),\n });\n}\n","import gsap from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\n\ngsap.registerPlugin(ScrollTrigger);\n\n/** 刷新 AOS 動畫位置 */\nexport default function refreshAOS() {\n ScrollTrigger.refresh(true);\n}\n","import { anchorPlacements, easings } from \"@/constants\";\nimport type { Animation, AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ninterface AOSDataAttributes extends Partial<Record<AOSAttributeKey, string>> {\n \"data-aos\": Animation;\n}\n\ninterface AOSAttributeOptions extends Partial<AnimationOptions> {\n animation: Animation;\n}\n\n/** 將 options 轉成可直接使用的 AOS data attributes */\nexport default function toAOSProps(options: AOSAttributeOptions) {\n const attrs: AOSDataAttributes = {\n \"data-aos\": options.animation,\n \"data-aos-offset\": toNumberAttr(options.offset),\n \"data-aos-delay\": toNumberAttr(options.delay),\n \"data-aos-duration\": toNumberAttr(options.duration),\n \"data-aos-easing\": validateEnumValue(easings, options.easing),\n \"data-aos-mirror\": toBooleanAttr(options.mirror),\n \"data-aos-once\": toBooleanAttr(options.once),\n \"data-aos-anchor-placement\": validateEnumValue(\n anchorPlacements,\n options.anchorPlacement,\n ),\n };\n\n return omitNil(attrs);\n}\n\nfunction omitNil<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n\n const keys = Object.keys(obj) as Array<keyof T>;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = obj[key];\n\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction toBooleanAttr(value?: boolean) {\n return typeof value === \"boolean\" ? String(value) : undefined;\n}\n\nfunction toNumberAttr(value?: number) {\n return typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value) &&\n Number.isInteger(value)\n ? String(value)\n : undefined;\n}\n\nfunction validateEnumValue<T>(list: readonly T[], value: T) {\n return list.includes(value) ? value : undefined;\n}\n"],"mappings":"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","names":["import_react","import_gsap","gsap","definitions","gsap","import_gsap","gsap"]}
|
package/dist/index.mjs
CHANGED
|
@@ -18,6 +18,11 @@ var __spreadValues = (a, b) => {
|
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
|
|
21
|
+
// src/hooks/useAOSInitial.ts
|
|
22
|
+
import { useLayoutEffect, useRef } from "react";
|
|
23
|
+
import { useGSAP } from "@gsap/react";
|
|
24
|
+
import gsap2 from "gsap";
|
|
25
|
+
|
|
21
26
|
// src/animation/constants.ts
|
|
22
27
|
var DEFAULT_OPTIONS = {
|
|
23
28
|
offset: 120,
|
|
@@ -83,42 +88,6 @@ var anchorPlacements = [
|
|
|
83
88
|
"bottom-top"
|
|
84
89
|
];
|
|
85
90
|
|
|
86
|
-
// src/constants.ts
|
|
87
|
-
var animations = [
|
|
88
|
-
"fade",
|
|
89
|
-
"fade-up",
|
|
90
|
-
"fade-down",
|
|
91
|
-
"fade-left",
|
|
92
|
-
"fade-right",
|
|
93
|
-
"fade-up-right",
|
|
94
|
-
"fade-up-left",
|
|
95
|
-
"fade-down-right",
|
|
96
|
-
"fade-down-left",
|
|
97
|
-
"flip-up",
|
|
98
|
-
"flip-down",
|
|
99
|
-
"flip-left",
|
|
100
|
-
"flip-right",
|
|
101
|
-
"slide-up",
|
|
102
|
-
"slide-down",
|
|
103
|
-
"slide-left",
|
|
104
|
-
"slide-right",
|
|
105
|
-
"zoom-in",
|
|
106
|
-
"zoom-in-up",
|
|
107
|
-
"zoom-in-down",
|
|
108
|
-
"zoom-in-left",
|
|
109
|
-
"zoom-in-right",
|
|
110
|
-
"zoom-out",
|
|
111
|
-
"zoom-out-up",
|
|
112
|
-
"zoom-out-down",
|
|
113
|
-
"zoom-out-left",
|
|
114
|
-
"zoom-out-right"
|
|
115
|
-
];
|
|
116
|
-
|
|
117
|
-
// src/hooks/useAOSInitial.ts
|
|
118
|
-
import { useLayoutEffect, useRef } from "react";
|
|
119
|
-
import { useGSAP } from "@gsap/react";
|
|
120
|
-
import gsap2 from "gsap";
|
|
121
|
-
|
|
122
91
|
// src/animation/utils/parseAttributes.ts
|
|
123
92
|
var AOS_ATTRIBUTE_MAP = {
|
|
124
93
|
"data-aos-offset": "offset",
|
|
@@ -140,7 +109,7 @@ function parseAttributes(element) {
|
|
|
140
109
|
case "delay":
|
|
141
110
|
case "duration": {
|
|
142
111
|
const numberValue = parseNumber(value);
|
|
143
|
-
if (!Number.isNaN(numberValue)) {
|
|
112
|
+
if (!Number.isNaN(numberValue) && !Number.isFinite(numberValue)) {
|
|
144
113
|
options[prop] = numberValue;
|
|
145
114
|
}
|
|
146
115
|
break;
|
|
@@ -203,7 +172,7 @@ function mergeOptions(...array) {
|
|
|
203
172
|
case "delay":
|
|
204
173
|
case "duration": {
|
|
205
174
|
const value = options[key];
|
|
206
|
-
if (typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value)) {
|
|
175
|
+
if (typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value) && Number.isInteger(value)) {
|
|
207
176
|
result[key] = value;
|
|
208
177
|
}
|
|
209
178
|
break;
|
|
@@ -525,8 +494,8 @@ function createAnimationMap(definitions2) {
|
|
|
525
494
|
}
|
|
526
495
|
return result;
|
|
527
496
|
}
|
|
528
|
-
var
|
|
529
|
-
var animations_default =
|
|
497
|
+
var animations = createAnimationMap(definitions_default);
|
|
498
|
+
var animations_default = animations;
|
|
530
499
|
|
|
531
500
|
// src/animation/createAnimation.ts
|
|
532
501
|
var ANIMATION_REGISTRY = {
|
|
@@ -604,8 +573,7 @@ function useAOSInitial(options) {
|
|
|
604
573
|
const removeAnimation = (element) => {
|
|
605
574
|
const animation = animationsWeakMap.current.get(element);
|
|
606
575
|
if (!animation) return;
|
|
607
|
-
animation.kill();
|
|
608
|
-
animation.revert();
|
|
576
|
+
animation.kill().revert();
|
|
609
577
|
animationsWeakMap.current.delete(element);
|
|
610
578
|
};
|
|
611
579
|
const updateAnimation = (element) => {
|
|
@@ -617,18 +585,22 @@ function useAOSInitial(options) {
|
|
|
617
585
|
const addedElements = /* @__PURE__ */ new Set();
|
|
618
586
|
const updatedElements = /* @__PURE__ */ new Set();
|
|
619
587
|
for (const mutation of mutations) {
|
|
620
|
-
if (mutation.type === "attributes") {
|
|
621
|
-
|
|
622
|
-
updatedElements.add(mutation.target);
|
|
623
|
-
}
|
|
588
|
+
if (mutation.type === "attributes" && mutation.target instanceof HTMLElement) {
|
|
589
|
+
updatedElements.add(mutation.target);
|
|
624
590
|
} else if (mutation.type === "childList") {
|
|
625
591
|
collectElements(mutation.addedNodes, addedElements);
|
|
626
592
|
collectElements(mutation.removedNodes, removedElements);
|
|
627
593
|
}
|
|
628
594
|
}
|
|
629
|
-
removedElements
|
|
630
|
-
|
|
631
|
-
|
|
595
|
+
for (const element of removedElements) {
|
|
596
|
+
removeAnimation(element);
|
|
597
|
+
}
|
|
598
|
+
for (const element of addedElements) {
|
|
599
|
+
addAnimation(element);
|
|
600
|
+
}
|
|
601
|
+
for (const element of updatedElements) {
|
|
602
|
+
updateAnimation(element);
|
|
603
|
+
}
|
|
632
604
|
};
|
|
633
605
|
for (const element of gsap2.utils.toArray(
|
|
634
606
|
AOS_SELECTORS,
|
|
@@ -658,7 +630,9 @@ function collectElements(nodes, result) {
|
|
|
658
630
|
for (const node of nodes) {
|
|
659
631
|
if (!(node instanceof HTMLElement)) continue;
|
|
660
632
|
if (node.matches(AOS_SELECTORS)) result.add(node);
|
|
661
|
-
node.querySelectorAll(AOS_SELECTORS)
|
|
633
|
+
for (const element of node.querySelectorAll(AOS_SELECTORS)) {
|
|
634
|
+
result.add(element);
|
|
635
|
+
}
|
|
662
636
|
}
|
|
663
637
|
}
|
|
664
638
|
|
|
@@ -703,15 +677,12 @@ function toBooleanAttr(value) {
|
|
|
703
677
|
return typeof value === "boolean" ? String(value) : void 0;
|
|
704
678
|
}
|
|
705
679
|
function toNumberAttr(value) {
|
|
706
|
-
return typeof value === "number" ? String(value) : void 0;
|
|
680
|
+
return typeof value === "number" && !Number.isNaN(value) && !Number.isFinite(value) && Number.isInteger(value) ? String(value) : void 0;
|
|
707
681
|
}
|
|
708
682
|
function validateEnumValue(list, value) {
|
|
709
683
|
return list.includes(value) ? value : void 0;
|
|
710
684
|
}
|
|
711
685
|
export {
|
|
712
|
-
anchorPlacements,
|
|
713
|
-
animations,
|
|
714
|
-
easings,
|
|
715
686
|
refreshAOS,
|
|
716
687
|
toAOSProps,
|
|
717
688
|
useAOSInitial
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/animation/constants.ts","../src/constants.ts","../src/hooks/useAOSInitial.ts","../src/animation/utils/parseAttributes.ts","../src/animation/animations.ts","../src/animation/utils/mergeOptions.ts","../src/animation/utils/createTweenVars.ts","../src/animation/definitions.ts","../src/animation/createAnimation.ts","../src/utils/refreshAOS.ts","../src/utils/toAOSProps.ts"],"sourcesContent":["import type { AnchorPlacement, AnimationOptions, Easing } from \"@/types\";\n\n/** 預設選項 */\nexport const DEFAULT_OPTIONS: AnimationOptions = {\n offset: 120,\n delay: 0,\n duration: 400,\n easing: \"none\",\n once: false,\n mirror: false,\n anchorPlacement: \"top-bottom\",\n};\n\n/** 動畫曲線 */\nexport const easings: Easing[] = [\n \"none\",\n \"power1\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"bounce\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"circ\",\n \"circ.in\",\n \"circ.out\",\n \"circ.inOut\",\n \"elastic\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"expo\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"sine\",\n \"sine.in\",\n \"sine.out\",\n \"sine.inOut\",\n];\n\n/** 動畫錨點 */\nexport const anchorPlacements: AnchorPlacement[] = [\n \"top-bottom\",\n \"top-center\",\n \"top-top\",\n \"center-bottom\",\n \"center-center\",\n \"center-top\",\n \"bottom-bottom\",\n \"bottom-center\",\n \"bottom-top\",\n];\n","import type { Animation } from \"./types\";\n\nexport { anchorPlacements, easings } from \"./animation/constants\";\n\n/** 動畫種類 */\nexport const animations: Animation[] = [\n \"fade\",\n \"fade-up\",\n \"fade-down\",\n \"fade-left\",\n \"fade-right\",\n \"fade-up-right\",\n \"fade-up-left\",\n \"fade-down-right\",\n \"fade-down-left\",\n \"flip-up\",\n \"flip-down\",\n \"flip-left\",\n \"flip-right\",\n \"slide-up\",\n \"slide-down\",\n \"slide-left\",\n \"slide-right\",\n \"zoom-in\",\n \"zoom-in-up\",\n \"zoom-in-down\",\n \"zoom-in-left\",\n \"zoom-in-right\",\n \"zoom-out\",\n \"zoom-out-up\",\n \"zoom-out-down\",\n \"zoom-out-left\",\n \"zoom-out-right\",\n];\n","import { useLayoutEffect, useRef } from \"react\";\nimport { useGSAP } from \"@gsap/react\";\nimport gsap from \"gsap\";\n\nimport createAnimation from \"@/animation/createAnimation\";\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ngsap.registerPlugin(useGSAP);\n\n/** AOS 屬性 */\nconst AOS_ATTRIBUTE_KEYS: (AOSAttributeKey | \"data-aos\")[] = [\n \"data-aos\",\n \"data-aos-offset\",\n \"data-aos-delay\",\n \"data-aos-duration\",\n \"data-aos-easing\",\n \"data-aos-mirror\",\n \"data-aos-once\",\n \"data-aos-anchor-placement\",\n];\n\n/** AOS 選擇器 */\nconst AOS_SELECTORS = \"[data-aos]\";\n\n/**\n * 初始化 AOS 動畫\n * \n * @example\n * ```tsx\n \"use client\";\n\n import {useAOSInitial} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSInitial<HTMLDivElement>()\n return (\n <div ref={containerRef} className=\"overflow-hidden\">\n <div data-aos-container>\n <div data-aos=\"fade-up\">Hello AOS</div>\n </div>\n </div>\n )\n }\n * ```\n */\nexport default function useAOSInitial<E extends HTMLElement = HTMLElement>(\n options?: Partial<AnimationOptions>,\n) {\n const containerRef = useRef<E | null>(null);\n const observerRef = useRef<MutationObserver | null>(null);\n /** 記錄每個元素對應的動畫實例 */\n const animationsWeakMap = useRef<WeakMap<HTMLElement, gsap.core.Tween>>(\n new WeakMap(),\n );\n const optionsRef = useRef(options);\n\n // 使用靜態寫入,下次新增動畫才會套用覆蓋預設值\n useLayoutEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useGSAP(\n (_, contextSafe) => {\n if (!containerRef.current || !contextSafe) return;\n\n /** 新增動畫 */\n const addAnimation = (element: HTMLElement) => {\n if (animationsWeakMap.current.has(element)) return;\n\n const newAnimation = contextSafe(createAnimation)(\n element,\n optionsRef.current,\n );\n if (!newAnimation) return;\n\n animationsWeakMap.current.set(element, newAnimation);\n };\n\n /** 移除動畫 */\n const removeAnimation = (element: HTMLElement) => {\n const animation = animationsWeakMap.current.get(element);\n if (!animation) return;\n\n animation.kill();\n animation.revert();\n animationsWeakMap.current.delete(element);\n };\n\n /** 更新動畫 */\n const updateAnimation = (element: HTMLElement) => {\n removeAnimation(element);\n addAnimation(element);\n };\n\n /** 監聽元素變化 */\n const handleMutation: MutationCallback = (mutations) => {\n const removedElements = new Set<HTMLElement>();\n const addedElements = new Set<HTMLElement>();\n const updatedElements = new Set<HTMLElement>();\n\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n if (mutation.target instanceof HTMLElement) {\n updatedElements.add(mutation.target);\n }\n } else if (mutation.type === \"childList\") {\n collectElements(mutation.addedNodes, addedElements);\n collectElements(mutation.removedNodes, removedElements);\n }\n }\n\n // 移除優先於新增,避免重複初始化\n removedElements.forEach(removeAnimation);\n addedElements.forEach(addAnimation);\n updatedElements.forEach(updateAnimation);\n };\n\n // 初始化\n for (const element of gsap.utils.toArray<HTMLElement>(\n AOS_SELECTORS,\n containerRef.current,\n )) {\n addAnimation(element);\n }\n\n observerRef.current = new MutationObserver(handleMutation);\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: AOS_ATTRIBUTE_KEYS,\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n },\n { scope: containerRef, dependencies: [] },\n );\n\n return { containerRef };\n}\n\n/** 搜尋 [data-aos] 變動元素 */\nfunction collectElements(nodes: NodeList, result: Set<HTMLElement>) {\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(AOS_SELECTORS)) result.add(node);\n node\n .querySelectorAll<HTMLElement>(AOS_SELECTORS)\n .forEach((el) => result.add(el));\n }\n}\n","import { anchorPlacements, easings } from \"../constants\";\n\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\n/** AOS 屬性對應 */\nconst AOS_ATTRIBUTE_MAP = {\n \"data-aos-offset\": \"offset\",\n \"data-aos-delay\": \"delay\",\n \"data-aos-duration\": \"duration\",\n \"data-aos-easing\": \"easing\",\n \"data-aos-mirror\": \"mirror\",\n \"data-aos-once\": \"once\",\n \"data-aos-anchor-placement\": \"anchorPlacement\",\n} satisfies Record<AOSAttributeKey, keyof AnimationOptions>;\n\n/** 解析動畫屬性 */\nexport default function parseAttributes<E extends Element>(element: E) {\n const options = {} as Partial<AnimationOptions>;\n\n for (const key of Object.keys(AOS_ATTRIBUTE_MAP)) {\n const value = element.getAttribute(key);\n\n if (value) {\n const prop = AOS_ATTRIBUTE_MAP[key as AOSAttributeKey];\n\n switch (prop) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const numberValue = parseNumber(value);\n if (!Number.isNaN(numberValue)) {\n options[prop] = numberValue;\n }\n break;\n }\n case \"easing\": {\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const booleanValue = parseBoolean(value);\n if (typeof booleanValue === \"boolean\") {\n options[prop] = booleanValue;\n }\n break;\n }\n case \"anchorPlacement\": {\n const anchorPlacement = parseEnum(anchorPlacements, value);\n if (anchorPlacement) {\n options[prop] = anchorPlacement;\n }\n break;\n }\n }\n }\n }\n\n return options;\n}\n\nfunction parseEnum<T>(list: readonly T[], value: string): T | undefined {\n return list.includes(value as T) ? (value as T) : undefined;\n}\n\nfunction parseBoolean(value: string) {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n break;\n }\n}\n\nfunction parseNumber(value: string) {\n return parseInt(value, 10);\n}\n","import gsap from \"gsap\";\n\nimport mergeOptions from \"./utils/mergeOptions\";\nimport definitions, {\n AnimationDefinitions,\n AnimationPreset,\n} from \"./definitions\";\n\nimport type { AnchorPlacement, AnimationOptions } from \"@/types\";\n\nexport type CreateAnimationFunction = (\n element: HTMLElement,\n options?: Partial<AnimationOptions>,\n) => gsap.core.Tween;\n\n/** 計算 ScrollTrigger 的 start */\nfunction scrollTriggerStart(\n anchorPlacement: AnchorPlacement,\n offset: number,\n): string {\n const [v1, v2] = anchorPlacement.split(\"-\");\n const anchor = `${v1} ${v2}`;\n\n if (offset === 0 || Number.isNaN(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 建立 ScrollTrigger 動畫 */\nfunction createScrollTriggerTween(\n element: HTMLElement,\n preset: AnimationPreset,\n vars: AnimationPreset,\n options?: Partial<AnimationOptions>,\n) {\n const { from, to } = vars;\n const { offset, delay, duration, easing, once, mirror, anchorPlacement } =\n mergeOptions(options);\n\n /** 上層基準容器 */\n const container = element.parentElement?.hasAttribute(\"data-aos-container\")\n ? element.parentElement\n : null;\n\n return gsap.fromTo(\n element,\n {\n ...preset.from,\n ...from,\n },\n {\n ...preset.to,\n ...to,\n ease: easing,\n duration: duration / 1000,\n delay: delay / 1000,\n overwrite: \"auto\",\n scrollTrigger: {\n // markers: true,\n trigger: container || element,\n toggleActions: mirror\n ? \"play reverse play reverse\"\n : \"play none none reverse\",\n once,\n start: scrollTriggerStart(anchorPlacement, offset),\n },\n },\n );\n}\n\n/** 建立動畫物件組 */\nfunction createAnimationMap<T extends Record<string, AnimationDefinitions>>(\n definitions: T,\n): { [K in keyof T]: CreateAnimationFunction } {\n const result = {} as Record<keyof T, CreateAnimationFunction>;\n const keys = Object.keys(definitions) as Array<keyof T>;\n\n for (const key of keys) {\n const { preset, vars } = definitions[key];\n\n result[key] = (element, options) =>\n createScrollTriggerTween(element, preset, vars, options);\n }\n\n return result;\n}\n\nconst animations = createAnimationMap(definitions);\n\nexport default animations;\n","import { anchorPlacements, DEFAULT_OPTIONS, easings } from \"../constants\";\n\nimport type { AnimationOptions } from \"@/types\";\n\n/** 跟預設值合併動畫選項 */\nexport default function mergeOptions(\n ...array: (Partial<AnimationOptions> | undefined | null)[]\n): AnimationOptions {\n const result = { ...DEFAULT_OPTIONS };\n\n for (const options of array) {\n if (!options) continue;\n\n for (const key of Object.keys(options) as (keyof AnimationOptions)[]) {\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const value = options[key];\n if (\n typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value)\n ) {\n result[key] = value;\n }\n break;\n }\n case \"easing\": {\n const value = options[key];\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const value = options[key];\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n }\n case \"anchorPlacement\": {\n const value = options[key];\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\n }\n default:\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction verifyEnum<T>(list: readonly T[], value: unknown): value is T {\n return Boolean(value && list.includes(value as T));\n}\n","export function translate3d(x: number | string, y: number | string, z: number) {\n return { x, y, z } satisfies gsap.TweenVars;\n}\n\nexport function rotateY(y: number | string) {\n return { rotateY: y } satisfies gsap.TweenVars;\n}\n\nexport function rotateX(x: number | string) {\n return { rotateX: x } satisfies gsap.TweenVars;\n}\n\nexport function scale(x: number, y?: number) {\n return typeof y === \"number\"\n ? ({\n scaleX: x,\n scaleY: y,\n } satisfies gsap.TweenVars)\n : ({\n scale: x,\n } satisfies gsap.TweenVars);\n}\n\n/** @see https://gsap.com/docs/v3/GSAP/CorePlugins/CSS/#3d-transforms */\nexport function perspective(value: number) {\n return {\n transformPerspective: value,\n } satisfies gsap.TweenVars;\n}\n","import {\n perspective,\n rotateX,\n rotateY,\n scale,\n translate3d,\n} from \"./utils/createTweenVars\";\n\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\n\nexport interface AnimationDefinitions {\n /** 預設配置 */\n preset: AnimationPreset;\n /** 自訂配置 */\n vars: AnimationPreset;\n}\n\n/** 距離 `px` */\nexport const DISTANCE = 100;\n\n/** 動畫預設配置 */\nconst presets = {\n fade: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n transform: \"none\",\n },\n },\n zoom: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n ...translate3d(0, 0, 0),\n ...scale(1),\n },\n },\n slide: {\n from: {\n visibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {\n visibility: \"visible\",\n ...translate3d(0, 0, 0),\n },\n },\n flip: {\n from: {\n backfaceVisibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {},\n },\n} satisfies Record<string, AnimationPreset>;\n\n/** 動畫定義 */\nconst definitions = {\n fade: {\n preset: presets.fade,\n vars: {\n from: {},\n to: {},\n },\n },\n fadeUp: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, DISTANCE, 0),\n to: {},\n },\n },\n fadeDown: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, -DISTANCE, 0),\n to: {},\n },\n },\n fadeLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeUpRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeUpLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeDownRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n fadeDownLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n flipUp: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipDown: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipLeft: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n flipRight: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n slideUp: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"100%\", 0),\n to: {},\n },\n },\n slideDown: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"-100%\", 0),\n to: {},\n },\n },\n slideLeft: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"100%\", 0, 0),\n to: {},\n },\n },\n slideRight: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"-100%\", 0, 0),\n to: {},\n },\n },\n zoomIn: { preset: presets.zoom, vars: { from: scale(0.6), to: {} } },\n zoomInUp: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInDown: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, -DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInLeft: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInRight: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(-DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomOut: { preset: presets.zoom, vars: { from: scale(1.2), to: {} } },\n zoomOutUp: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutDown: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, -DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutLeft: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutRight: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(-DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n} satisfies Record<string, AnimationDefinitions>;\n\nexport default definitions;\n","import parseAttributes from \"./utils/parseAttributes\";\nimport animations, { type CreateAnimationFunction } from \"./animations\";\n\nimport type { Animation, AnimationOptions } from \"@/types\";\n\nconst ANIMATION_REGISTRY: Record<Animation, CreateAnimationFunction> = {\n fade: animations.fade,\n \"fade-up\": animations.fadeUp,\n \"fade-down\": animations.fadeDown,\n \"fade-left\": animations.fadeLeft,\n \"fade-right\": animations.fadeRight,\n \"fade-up-right\": animations.fadeUpRight,\n \"fade-up-left\": animations.fadeUpLeft,\n \"fade-down-right\": animations.fadeDownRight,\n \"fade-down-left\": animations.fadeDownLeft,\n \"flip-up\": animations.flipUp,\n \"flip-down\": animations.flipDown,\n \"flip-left\": animations.flipLeft,\n \"flip-right\": animations.flipRight,\n \"slide-up\": animations.slideUp,\n \"slide-down\": animations.slideDown,\n \"slide-left\": animations.slideLeft,\n \"slide-right\": animations.slideRight,\n \"zoom-in\": animations.zoomIn,\n \"zoom-in-up\": animations.zoomInUp,\n \"zoom-in-down\": animations.zoomInDown,\n \"zoom-in-left\": animations.zoomInLeft,\n \"zoom-in-right\": animations.zoomInRight,\n \"zoom-out\": animations.zoomOut,\n \"zoom-out-up\": animations.zoomOutUp,\n \"zoom-out-down\": animations.zoomOutDown,\n \"zoom-out-left\": animations.zoomOutLeft,\n \"zoom-out-right\": animations.zoomOutRight,\n};\n\n/** 建立動畫元素 */\nexport default function createAnimation<E extends HTMLElement>(\n element: E,\n options?: Partial<AnimationOptions>,\n) {\n const animate = element.getAttribute(\"data-aos\") as Animation | null;\n if (!animate) return;\n\n const handleAnimation = ANIMATION_REGISTRY[animate];\n if (!handleAnimation) return;\n\n return handleAnimation(element, {\n ...options,\n ...parseAttributes(element),\n });\n}\n","import gsap from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\n\ngsap.registerPlugin(ScrollTrigger);\n\n/** 刷新 AOS 動畫位置 */\nexport default function refreshAOS() {\n ScrollTrigger.refresh(true);\n}\n","import { anchorPlacements, easings } from \"@/constants\";\nimport type { Animation, AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ninterface AOSDataAttributes extends Partial<Record<AOSAttributeKey, string>> {\n \"data-aos\": Animation;\n}\n\ninterface AOSAttributeOptions extends Partial<AnimationOptions> {\n animation: Animation;\n}\n\n/** 將 options 轉成可直接使用的 AOS data attributes */\nexport default function toAOSProps(options: AOSAttributeOptions) {\n const attrs: AOSDataAttributes = {\n \"data-aos\": options.animation,\n \"data-aos-offset\": toNumberAttr(options.offset),\n \"data-aos-delay\": toNumberAttr(options.delay),\n \"data-aos-duration\": toNumberAttr(options.duration),\n \"data-aos-easing\": validateEnumValue(easings, options.easing),\n \"data-aos-mirror\": toBooleanAttr(options.mirror),\n \"data-aos-once\": toBooleanAttr(options.once),\n \"data-aos-anchor-placement\": validateEnumValue(\n anchorPlacements,\n options.anchorPlacement,\n ),\n };\n\n return omitNil(attrs);\n}\n\nfunction omitNil<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n\n const keys = Object.keys(obj) as Array<keyof T>;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = obj[key];\n\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction toBooleanAttr(value?: boolean) {\n return typeof value === \"boolean\" ? String(value) : undefined;\n}\n\nfunction toNumberAttr(value?: number) {\n return typeof value === \"number\" ? String(value) : undefined;\n}\n\nfunction validateEnumValue<T>(list: readonly T[], value: T) {\n return list.includes(value) ? value : undefined;\n}\n"],"mappings":"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","names":["gsap","definitions","animations","gsap","gsap"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useAOSInitial.ts","../src/animation/constants.ts","../src/animation/utils/parseAttributes.ts","../src/animation/animations.ts","../src/animation/utils/mergeOptions.ts","../src/animation/utils/createTweenVars.ts","../src/animation/definitions.ts","../src/animation/createAnimation.ts","../src/utils/refreshAOS.ts","../src/utils/toAOSProps.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from \"react\";\nimport { useGSAP } from \"@gsap/react\";\nimport gsap from \"gsap\";\n\nimport createAnimation from \"@/animation/createAnimation\";\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ngsap.registerPlugin(useGSAP);\n\n/** AOS 屬性 */\nconst AOS_ATTRIBUTE_KEYS: (AOSAttributeKey | \"data-aos\")[] = [\n \"data-aos\",\n \"data-aos-offset\",\n \"data-aos-delay\",\n \"data-aos-duration\",\n \"data-aos-easing\",\n \"data-aos-mirror\",\n \"data-aos-once\",\n \"data-aos-anchor-placement\",\n];\n\n/** AOS 選擇器 */\nconst AOS_SELECTORS = \"[data-aos]\";\n\n/**\n * 初始化 AOS 動畫\n * \n * @example\n * ```tsx\n \"use client\";\n\n import {useAOSInitial} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSInitial<HTMLDivElement>()\n return (\n <div ref={containerRef} className=\"overflow-hidden\">\n <div data-aos-container>\n <div data-aos=\"fade-up\">Hello AOS</div>\n </div>\n </div>\n )\n }\n * ```\n */\nexport default function useAOSInitial<E extends HTMLElement = HTMLElement>(\n options?: Partial<AnimationOptions>,\n) {\n const containerRef = useRef<E | null>(null);\n const observerRef = useRef<MutationObserver | null>(null);\n /** 記錄每個元素對應的動畫實例 */\n const animationsWeakMap = useRef<WeakMap<HTMLElement, gsap.core.Tween>>(\n new WeakMap(),\n );\n const optionsRef = useRef(options);\n\n // 使用靜態寫入,下次新增動畫才會套用覆蓋預設值\n useLayoutEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useGSAP(\n (_, contextSafe) => {\n if (!containerRef.current || !contextSafe) return;\n\n /** 新增動畫 */\n const addAnimation = (element: HTMLElement) => {\n if (animationsWeakMap.current.has(element)) return;\n\n const newAnimation = contextSafe(createAnimation)(\n element,\n optionsRef.current,\n );\n if (!newAnimation) return;\n\n animationsWeakMap.current.set(element, newAnimation);\n };\n\n /** 移除動畫 */\n const removeAnimation = (element: HTMLElement) => {\n const animation = animationsWeakMap.current.get(element);\n if (!animation) return;\n\n animation.kill().revert();\n animationsWeakMap.current.delete(element);\n };\n\n /** 更新動畫 */\n const updateAnimation = (element: HTMLElement) => {\n removeAnimation(element);\n addAnimation(element);\n };\n\n /** 監聽元素變化 */\n const handleMutation: MutationCallback = (mutations) => {\n const removedElements = new Set<HTMLElement>();\n const addedElements = new Set<HTMLElement>();\n const updatedElements = new Set<HTMLElement>();\n\n for (const mutation of mutations) {\n if (\n mutation.type === \"attributes\" &&\n mutation.target instanceof HTMLElement\n ) {\n updatedElements.add(mutation.target);\n } else if (mutation.type === \"childList\") {\n collectElements(mutation.addedNodes, addedElements);\n collectElements(mutation.removedNodes, removedElements);\n }\n }\n\n // 移除 => 新增 => 更新,避免重複初始化\n for (const element of removedElements) {\n removeAnimation(element);\n }\n\n for (const element of addedElements) {\n addAnimation(element);\n }\n\n for (const element of updatedElements) {\n updateAnimation(element);\n }\n };\n\n // 初始化\n for (const element of gsap.utils.toArray<HTMLElement>(\n AOS_SELECTORS,\n containerRef.current,\n )) {\n addAnimation(element);\n }\n\n observerRef.current = new MutationObserver(handleMutation);\n observerRef.current.observe(containerRef.current, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: AOS_ATTRIBUTE_KEYS,\n });\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n },\n { scope: containerRef, dependencies: [] },\n );\n\n return { containerRef };\n}\n\n/** 搜尋 [data-aos] 變動元素 */\nfunction collectElements(nodes: NodeList, result: Set<HTMLElement>) {\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (node.matches(AOS_SELECTORS)) result.add(node);\n for (const element of node.querySelectorAll<HTMLElement>(AOS_SELECTORS)) {\n result.add(element);\n }\n }\n}\n","import type { AnchorPlacement, AnimationOptions, Easing } from \"@/types\";\n\n/** 預設選項 */\nexport const DEFAULT_OPTIONS: AnimationOptions = {\n offset: 120,\n delay: 0,\n duration: 400,\n easing: \"none\",\n once: false,\n mirror: false,\n anchorPlacement: \"top-bottom\",\n};\n\n/** 動畫曲線 */\nexport const easings: Easing[] = [\n \"none\",\n \"power1\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"bounce\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"circ\",\n \"circ.in\",\n \"circ.out\",\n \"circ.inOut\",\n \"elastic\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"expo\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"sine\",\n \"sine.in\",\n \"sine.out\",\n \"sine.inOut\",\n];\n\n/** 動畫錨點 */\nexport const anchorPlacements: AnchorPlacement[] = [\n \"top-bottom\",\n \"top-center\",\n \"top-top\",\n \"center-bottom\",\n \"center-center\",\n \"center-top\",\n \"bottom-bottom\",\n \"bottom-center\",\n \"bottom-top\",\n];\n","import { anchorPlacements, easings } from \"../constants\";\n\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\n/** AOS 屬性對應 */\nconst AOS_ATTRIBUTE_MAP = {\n \"data-aos-offset\": \"offset\",\n \"data-aos-delay\": \"delay\",\n \"data-aos-duration\": \"duration\",\n \"data-aos-easing\": \"easing\",\n \"data-aos-mirror\": \"mirror\",\n \"data-aos-once\": \"once\",\n \"data-aos-anchor-placement\": \"anchorPlacement\",\n} satisfies Record<AOSAttributeKey, keyof AnimationOptions>;\n\n/** 解析動畫屬性 */\nexport default function parseAttributes<E extends Element>(element: E) {\n const options = {} as Partial<AnimationOptions>;\n\n for (const key of Object.keys(AOS_ATTRIBUTE_MAP)) {\n const value = element.getAttribute(key);\n\n if (value) {\n const prop = AOS_ATTRIBUTE_MAP[key as AOSAttributeKey];\n\n switch (prop) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const numberValue = parseNumber(value);\n if (!Number.isNaN(numberValue) && !Number.isFinite(numberValue)) {\n options[prop] = numberValue;\n }\n break;\n }\n case \"easing\": {\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const booleanValue = parseBoolean(value);\n if (typeof booleanValue === \"boolean\") {\n options[prop] = booleanValue;\n }\n break;\n }\n case \"anchorPlacement\": {\n const anchorPlacement = parseEnum(anchorPlacements, value);\n if (anchorPlacement) {\n options[prop] = anchorPlacement;\n }\n break;\n }\n }\n }\n }\n\n return options;\n}\n\nfunction parseEnum<T>(list: readonly T[], value: string): T | undefined {\n return list.includes(value as T) ? (value as T) : undefined;\n}\n\nfunction parseBoolean(value: string) {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n break;\n }\n}\n\nfunction parseNumber(value: string) {\n return parseInt(value, 10);\n}\n","import gsap from \"gsap\";\n\nimport mergeOptions from \"./utils/mergeOptions\";\nimport definitions, {\n AnimationDefinitions,\n AnimationPreset,\n} from \"./definitions\";\n\nimport type { AnchorPlacement, AnimationOptions } from \"@/types\";\n\nexport type CreateAnimationFunction = (\n element: HTMLElement,\n options?: Partial<AnimationOptions>,\n) => gsap.core.Tween;\n\n/** 計算 ScrollTrigger 的 start */\nfunction scrollTriggerStart(\n anchorPlacement: AnchorPlacement,\n offset: number,\n): string {\n const [v1, v2] = anchorPlacement.split(\"-\");\n const anchor = `${v1} ${v2}`;\n\n if (offset === 0 || Number.isNaN(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 建立 ScrollTrigger 動畫 */\nfunction createScrollTriggerTween(\n element: HTMLElement,\n preset: AnimationPreset,\n vars: AnimationPreset,\n options?: Partial<AnimationOptions>,\n) {\n const { from, to } = vars;\n const { offset, delay, duration, easing, once, mirror, anchorPlacement } =\n mergeOptions(options);\n\n /** 上層基準容器 */\n const container = element.parentElement?.hasAttribute(\"data-aos-container\")\n ? element.parentElement\n : null;\n\n return gsap.fromTo(\n element,\n {\n ...preset.from,\n ...from,\n },\n {\n ...preset.to,\n ...to,\n ease: easing,\n duration: duration / 1000,\n delay: delay / 1000,\n overwrite: \"auto\",\n scrollTrigger: {\n // markers: true,\n trigger: container || element,\n toggleActions: mirror\n ? \"play reverse play reverse\"\n : \"play none none reverse\",\n once,\n start: scrollTriggerStart(anchorPlacement, offset),\n },\n },\n );\n}\n\n/** 建立動畫物件組 */\nfunction createAnimationMap<T extends Record<string, AnimationDefinitions>>(\n definitions: T,\n): { [K in keyof T]: CreateAnimationFunction } {\n const result = {} as Record<keyof T, CreateAnimationFunction>;\n const keys = Object.keys(definitions) as Array<keyof T>;\n\n for (const key of keys) {\n const { preset, vars } = definitions[key];\n\n result[key] = (element, options) =>\n createScrollTriggerTween(element, preset, vars, options);\n }\n\n return result;\n}\n\nconst animations = createAnimationMap(definitions);\n\nexport default animations;\n","import { anchorPlacements, DEFAULT_OPTIONS, easings } from \"../constants\";\n\nimport type { AnimationOptions } from \"@/types\";\n\n/** 跟預設值合併動畫選項 */\nexport default function mergeOptions(\n ...array: (Partial<AnimationOptions> | undefined | null)[]\n): AnimationOptions {\n const result = { ...DEFAULT_OPTIONS };\n\n for (const options of array) {\n if (!options) continue;\n\n for (const key of Object.keys(options) as (keyof AnimationOptions)[]) {\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\": {\n const value = options[key];\n if (\n typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value) &&\n Number.isInteger(value)\n ) {\n result[key] = value;\n }\n break;\n }\n case \"easing\": {\n const value = options[key];\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n }\n case \"once\":\n case \"mirror\": {\n const value = options[key];\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n }\n case \"anchorPlacement\": {\n const value = options[key];\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\n }\n default:\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction verifyEnum<T>(list: readonly T[], value: unknown): value is T {\n return Boolean(value && list.includes(value as T));\n}\n","export function translate3d(x: number | string, y: number | string, z: number) {\n return { x, y, z } satisfies gsap.TweenVars;\n}\n\nexport function rotateY(y: number | string) {\n return { rotateY: y } satisfies gsap.TweenVars;\n}\n\nexport function rotateX(x: number | string) {\n return { rotateX: x } satisfies gsap.TweenVars;\n}\n\nexport function scale(x: number, y?: number) {\n return typeof y === \"number\"\n ? ({\n scaleX: x,\n scaleY: y,\n } satisfies gsap.TweenVars)\n : ({\n scale: x,\n } satisfies gsap.TweenVars);\n}\n\n/** @see https://gsap.com/docs/v3/GSAP/CorePlugins/CSS/#3d-transforms */\nexport function perspective(value: number) {\n return {\n transformPerspective: value,\n } satisfies gsap.TweenVars;\n}\n","import {\n perspective,\n rotateX,\n rotateY,\n scale,\n translate3d,\n} from \"./utils/createTweenVars\";\n\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\n\nexport interface AnimationDefinitions {\n /** 預設配置 */\n preset: AnimationPreset;\n /** 自訂配置 */\n vars: AnimationPreset;\n}\n\n/** 距離 `px` */\nexport const DISTANCE = 100;\n\n/** 動畫預設配置 */\nconst presets = {\n fade: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n transform: \"none\",\n },\n },\n zoom: {\n from: {\n opacity: 0,\n transitionProperty: \"opacity, transform\",\n },\n to: {\n opacity: 1,\n ...translate3d(0, 0, 0),\n ...scale(1),\n },\n },\n slide: {\n from: {\n visibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {\n visibility: \"visible\",\n ...translate3d(0, 0, 0),\n },\n },\n flip: {\n from: {\n backfaceVisibility: \"hidden\",\n transitionProperty: \"transform\",\n },\n to: {},\n },\n} satisfies Record<string, AnimationPreset>;\n\n/** 動畫定義 */\nconst definitions = {\n fade: {\n preset: presets.fade,\n vars: {\n from: {},\n to: {},\n },\n },\n fadeUp: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, DISTANCE, 0),\n to: {},\n },\n },\n fadeDown: {\n preset: presets.fade,\n vars: {\n from: translate3d(0, -DISTANCE, 0),\n to: {},\n },\n },\n fadeLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, 0, 0),\n to: {},\n },\n },\n fadeUpRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeUpLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, DISTANCE, 0),\n to: {},\n },\n },\n fadeDownRight: {\n preset: presets.fade,\n vars: {\n from: translate3d(-DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n fadeDownLeft: {\n preset: presets.fade,\n vars: {\n from: translate3d(DISTANCE, -DISTANCE, 0),\n to: {},\n },\n },\n flipUp: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipDown: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateX(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateX(0) },\n },\n },\n flipLeft: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"-100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n flipRight: {\n preset: presets.flip,\n vars: {\n from: {\n ...perspective(2500),\n ...rotateY(\"100deg\"),\n },\n to: { ...perspective(2500), ...rotateY(0) },\n },\n },\n slideUp: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"100%\", 0),\n to: {},\n },\n },\n slideDown: {\n preset: presets.slide,\n vars: {\n from: translate3d(0, \"-100%\", 0),\n to: {},\n },\n },\n slideLeft: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"100%\", 0, 0),\n to: {},\n },\n },\n slideRight: {\n preset: presets.slide,\n vars: {\n from: translate3d(\"-100%\", 0, 0),\n to: {},\n },\n },\n zoomIn: { preset: presets.zoom, vars: { from: scale(0.6), to: {} } },\n zoomInUp: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInDown: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(0, -DISTANCE, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInLeft: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomInRight: {\n preset: presets.zoom,\n vars: {\n from: { ...translate3d(-DISTANCE, 0, 0), ...scale(0.6) },\n to: {},\n },\n },\n zoomOut: { preset: presets.zoom, vars: { from: scale(1.2), to: {} } },\n zoomOutUp: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutDown: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(0, -DISTANCE, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutLeft: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n zoomOutRight: {\n preset: presets.zoom,\n vars: {\n from: {\n ...translate3d(-DISTANCE, 0, 0),\n ...scale(1.2),\n },\n to: {},\n },\n },\n} satisfies Record<string, AnimationDefinitions>;\n\nexport default definitions;\n","import parseAttributes from \"./utils/parseAttributes\";\nimport animations, { type CreateAnimationFunction } from \"./animations\";\n\nimport type { Animation, AnimationOptions } from \"@/types\";\n\nconst ANIMATION_REGISTRY: Record<Animation, CreateAnimationFunction> = {\n fade: animations.fade,\n \"fade-up\": animations.fadeUp,\n \"fade-down\": animations.fadeDown,\n \"fade-left\": animations.fadeLeft,\n \"fade-right\": animations.fadeRight,\n \"fade-up-right\": animations.fadeUpRight,\n \"fade-up-left\": animations.fadeUpLeft,\n \"fade-down-right\": animations.fadeDownRight,\n \"fade-down-left\": animations.fadeDownLeft,\n \"flip-up\": animations.flipUp,\n \"flip-down\": animations.flipDown,\n \"flip-left\": animations.flipLeft,\n \"flip-right\": animations.flipRight,\n \"slide-up\": animations.slideUp,\n \"slide-down\": animations.slideDown,\n \"slide-left\": animations.slideLeft,\n \"slide-right\": animations.slideRight,\n \"zoom-in\": animations.zoomIn,\n \"zoom-in-up\": animations.zoomInUp,\n \"zoom-in-down\": animations.zoomInDown,\n \"zoom-in-left\": animations.zoomInLeft,\n \"zoom-in-right\": animations.zoomInRight,\n \"zoom-out\": animations.zoomOut,\n \"zoom-out-up\": animations.zoomOutUp,\n \"zoom-out-down\": animations.zoomOutDown,\n \"zoom-out-left\": animations.zoomOutLeft,\n \"zoom-out-right\": animations.zoomOutRight,\n};\n\n/** 建立動畫元素 */\nexport default function createAnimation<E extends HTMLElement>(\n element: E,\n options?: Partial<AnimationOptions>,\n) {\n const animate = element.getAttribute(\"data-aos\") as Animation | null;\n if (!animate) return;\n\n const handleAnimation = ANIMATION_REGISTRY[animate];\n if (!handleAnimation) return;\n\n return handleAnimation(element, {\n ...options,\n ...parseAttributes(element),\n });\n}\n","import gsap from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\n\ngsap.registerPlugin(ScrollTrigger);\n\n/** 刷新 AOS 動畫位置 */\nexport default function refreshAOS() {\n ScrollTrigger.refresh(true);\n}\n","import { anchorPlacements, easings } from \"@/constants\";\nimport type { Animation, AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ninterface AOSDataAttributes extends Partial<Record<AOSAttributeKey, string>> {\n \"data-aos\": Animation;\n}\n\ninterface AOSAttributeOptions extends Partial<AnimationOptions> {\n animation: Animation;\n}\n\n/** 將 options 轉成可直接使用的 AOS data attributes */\nexport default function toAOSProps(options: AOSAttributeOptions) {\n const attrs: AOSDataAttributes = {\n \"data-aos\": options.animation,\n \"data-aos-offset\": toNumberAttr(options.offset),\n \"data-aos-delay\": toNumberAttr(options.delay),\n \"data-aos-duration\": toNumberAttr(options.duration),\n \"data-aos-easing\": validateEnumValue(easings, options.easing),\n \"data-aos-mirror\": toBooleanAttr(options.mirror),\n \"data-aos-once\": toBooleanAttr(options.once),\n \"data-aos-anchor-placement\": validateEnumValue(\n anchorPlacements,\n options.anchorPlacement,\n ),\n };\n\n return omitNil(attrs);\n}\n\nfunction omitNil<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n\n const keys = Object.keys(obj) as Array<keyof T>;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = obj[key];\n\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction toBooleanAttr(value?: boolean) {\n return typeof value === \"boolean\" ? String(value) : undefined;\n}\n\nfunction toNumberAttr(value?: number) {\n return typeof value === \"number\" &&\n !Number.isNaN(value) &&\n !Number.isFinite(value) &&\n Number.isInteger(value)\n ? String(value)\n : undefined;\n}\n\nfunction validateEnumValue<T>(list: readonly T[], value: T) {\n return list.includes(value) ? value : undefined;\n}\n"],"mappings":"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","names":["gsap","definitions","gsap","gsap"]}
|
|
@@ -61,12 +61,4 @@ type AttributeKey = "offset" | "delay" | "duration" | "easing" | "once" | "mirro
|
|
|
61
61
|
/** AOS 屬性 */
|
|
62
62
|
type AOSAttributeKey = `data-aos-${AttributeKey}`;
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
declare const easings: Easing[];
|
|
66
|
-
/** 動畫錨點 */
|
|
67
|
-
declare const anchorPlacements: AnchorPlacement[];
|
|
68
|
-
|
|
69
|
-
/** 動畫種類 */
|
|
70
|
-
declare const animations: Animation[];
|
|
71
|
-
|
|
72
|
-
export { type AnimationOptions as A, type Easing as E, type FadeAnimation as F, type SlideAnimation as S, type ZoomAnimation as Z, type Animation as a, type AOSAttributeKey as b, type AnchorPlacement as c, type FlipAnimation as d, anchorPlacements as e, animations as f, easings as g };
|
|
64
|
+
export type { AnimationOptions as A, Easing as E, FadeAnimation as F, SlideAnimation as S, ZoomAnimation as Z, Animation as a, AOSAttributeKey as b, AnchorPlacement as c, FlipAnimation as d };
|
|
@@ -61,12 +61,4 @@ type AttributeKey = "offset" | "delay" | "duration" | "easing" | "once" | "mirro
|
|
|
61
61
|
/** AOS 屬性 */
|
|
62
62
|
type AOSAttributeKey = `data-aos-${AttributeKey}`;
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
declare const easings: Easing[];
|
|
66
|
-
/** 動畫錨點 */
|
|
67
|
-
declare const anchorPlacements: AnchorPlacement[];
|
|
68
|
-
|
|
69
|
-
/** 動畫種類 */
|
|
70
|
-
declare const animations: Animation[];
|
|
71
|
-
|
|
72
|
-
export { type AnimationOptions as A, type Easing as E, type FadeAnimation as F, type SlideAnimation as S, type ZoomAnimation as Z, type Animation as a, type AOSAttributeKey as b, type AnchorPlacement as c, type FlipAnimation as d, anchorPlacements as e, animations as f, easings as g };
|
|
64
|
+
export type { AnimationOptions as A, Easing as E, FadeAnimation as F, SlideAnimation as S, ZoomAnimation as Z, Animation as a, AOSAttributeKey as b, AnchorPlacement as c, FlipAnimation as d };
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-gsap-aos",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "A lightweight GSAP + ScrollTrigger integration, similar in usage to AOS, specifically designed for React / Next.js.",
|
|
5
5
|
"author": "Gaia Yang",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"homepage": "https://
|
|
7
|
+
"homepage": "https://react-gsap-aos-nextjs.vercel.app",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "https://github.com/GaiaYang/react-gsap-aos.git",
|