react-gsap-aos 1.1.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh-TW.md CHANGED
@@ -202,7 +202,7 @@ import { toAOSProps } from "react-gsap-aos";
202
202
  </AOSProvider>
203
203
  ```
204
204
 
205
- > 預設選項只會作用在後續生成的動畫,這是有意為之的行為
205
+ > 注意:預設選項只作用於後續生成的動畫,這是刻意設計的行為。
206
206
 
207
207
  ### useAOSScope
208
208
 
package/dist/client.d.mts CHANGED
@@ -1,14 +1,37 @@
1
- import * as React from 'react';
2
- import React__default, { ElementType, ComponentPropsWithoutRef } from 'react';
1
+ import * as react from 'react';
2
+ import { ComponentPropsWithoutRef } from 'react';
3
3
  import { A as AOSAttributeOptions } from './toAOSProps-ny0U8kMv.mjs';
4
4
  import { b as AnimationOptions } from './types-D34qWHFU.mjs';
5
5
 
6
- type AOSProviderProps<T extends ElementType> = {
6
+ /** 區塊元素標籤 */
7
+ type BlockElementTag = "address" | "article" | "aside" | "blockquote" | "canvas" | "dd" | "div" | "dl" | "dt" | "fieldset" | "figcaption" | "figure" | "footer" | "form" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "header" | "hr" | "li" | "main" | "nav" | "noscript" | "ol" | "p" | "pre" | "section" | "table" | "tfoot" | "ul" | "video";
8
+
9
+ type AOSProviderProps<T extends BlockElementTag> = {
10
+ /**
11
+ * 要渲染的 HTML 元素標籤。
12
+ *
13
+ * 如果未提供或非區塊元素,預設會渲染 `<div>`。
14
+ *
15
+ * @default "div"
16
+ *
17
+ * @see https://www.w3schools.com/html/html_blocks.asp
18
+ */
7
19
  component?: T;
20
+ /**
21
+ * 讓子元素繼承的預設動畫參數
22
+ *
23
+ * > 注意:預設選項只作用於後續生成的動畫,這是刻意設計的行為。
24
+ */
8
25
  options?: AOSAttributeOptions;
9
- children?: React__default.ReactNode;
10
- } & Omit<ComponentPropsWithoutRef<T>, "ref">;
11
- declare function AOSProvider<T extends ElementType = "div">({ component, options, children, ...props }: AOSProviderProps<T>): React__default.ReactElement<any, string | React__default.JSXElementConstructor<any>>;
26
+ } & ComponentPropsWithoutRef<T>;
27
+ /**
28
+ * 為子元素提供自動 AOS 動畫能力。
29
+ *
30
+ * 所有帶有 `data-aos` 屬性的子元素都會自動生成動畫。
31
+ */
32
+ declare function AOSProvider<T extends BlockElementTag = "div">({ component, options, children, ...props }: AOSProviderProps<T>): react.DetailedReactHTMLElement<Omit<AOSProviderProps<T>, "component" | "children" | "options"> & {
33
+ ref: react.RefObject<HTMLElement | null>;
34
+ }, HTMLElement>;
12
35
 
13
36
  /**
14
37
  * 綁定 AOS 動畫範圍
@@ -31,8 +54,10 @@ declare function AOSProvider<T extends ElementType = "div">({ component, options
31
54
  }
32
55
  * ```
33
56
  */
34
- declare function useAOSScope<E extends HTMLElement = HTMLElement>(options?: Partial<AnimationOptions>): {
35
- containerRef: React.RefObject<E | null>;
57
+ declare function useAOSScope<E extends HTMLElement = HTMLElement>(
58
+ /** 預設動畫選項 */
59
+ options?: Partial<AnimationOptions>): {
60
+ containerRef: react.RefObject<E | null>;
36
61
  };
37
62
 
38
63
  export { AOSProvider, useAOSScope };
package/dist/client.d.ts CHANGED
@@ -1,14 +1,37 @@
1
- import * as React from 'react';
2
- import React__default, { ElementType, ComponentPropsWithoutRef } from 'react';
1
+ import * as react from 'react';
2
+ import { ComponentPropsWithoutRef } from 'react';
3
3
  import { A as AOSAttributeOptions } from './toAOSProps-CmwrF_u3.js';
4
4
  import { b as AnimationOptions } from './types-D34qWHFU.js';
5
5
 
6
- type AOSProviderProps<T extends ElementType> = {
6
+ /** 區塊元素標籤 */
7
+ type BlockElementTag = "address" | "article" | "aside" | "blockquote" | "canvas" | "dd" | "div" | "dl" | "dt" | "fieldset" | "figcaption" | "figure" | "footer" | "form" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "header" | "hr" | "li" | "main" | "nav" | "noscript" | "ol" | "p" | "pre" | "section" | "table" | "tfoot" | "ul" | "video";
8
+
9
+ type AOSProviderProps<T extends BlockElementTag> = {
10
+ /**
11
+ * 要渲染的 HTML 元素標籤。
12
+ *
13
+ * 如果未提供或非區塊元素,預設會渲染 `<div>`。
14
+ *
15
+ * @default "div"
16
+ *
17
+ * @see https://www.w3schools.com/html/html_blocks.asp
18
+ */
7
19
  component?: T;
20
+ /**
21
+ * 讓子元素繼承的預設動畫參數
22
+ *
23
+ * > 注意:預設選項只作用於後續生成的動畫,這是刻意設計的行為。
24
+ */
8
25
  options?: AOSAttributeOptions;
9
- children?: React__default.ReactNode;
10
- } & Omit<ComponentPropsWithoutRef<T>, "ref">;
11
- declare function AOSProvider<T extends ElementType = "div">({ component, options, children, ...props }: AOSProviderProps<T>): React__default.ReactElement<any, string | React__default.JSXElementConstructor<any>>;
26
+ } & ComponentPropsWithoutRef<T>;
27
+ /**
28
+ * 為子元素提供自動 AOS 動畫能力。
29
+ *
30
+ * 所有帶有 `data-aos` 屬性的子元素都會自動生成動畫。
31
+ */
32
+ declare function AOSProvider<T extends BlockElementTag = "div">({ component, options, children, ...props }: AOSProviderProps<T>): react.DetailedReactHTMLElement<Omit<AOSProviderProps<T>, "component" | "children" | "options"> & {
33
+ ref: react.RefObject<HTMLElement | null>;
34
+ }, HTMLElement>;
12
35
 
13
36
  /**
14
37
  * 綁定 AOS 動畫範圍
@@ -31,8 +54,10 @@ declare function AOSProvider<T extends ElementType = "div">({ component, options
31
54
  }
32
55
  * ```
33
56
  */
34
- declare function useAOSScope<E extends HTMLElement = HTMLElement>(options?: Partial<AnimationOptions>): {
35
- containerRef: React.RefObject<E | null>;
57
+ declare function useAOSScope<E extends HTMLElement = HTMLElement>(
58
+ /** 預設動畫選項 */
59
+ options?: Partial<AnimationOptions>): {
60
+ containerRef: react.RefObject<E | null>;
36
61
  };
37
62
 
38
63
  export { AOSProvider, useAOSScope };
package/dist/client.js CHANGED
@@ -682,6 +682,47 @@ function collectElements(nodes, result) {
682
682
  }
683
683
  }
684
684
 
685
+ // src/utils/isBlockElementTag.ts
686
+ var BLOCK_ELEMENT_TAGS = [
687
+ "address",
688
+ "article",
689
+ "aside",
690
+ "blockquote",
691
+ "canvas",
692
+ "dd",
693
+ "div",
694
+ "dl",
695
+ "dt",
696
+ "fieldset",
697
+ "figcaption",
698
+ "figure",
699
+ "footer",
700
+ "form",
701
+ "h1",
702
+ "h2",
703
+ "h3",
704
+ "h4",
705
+ "h5",
706
+ "h6",
707
+ "header",
708
+ "hr",
709
+ "li",
710
+ "main",
711
+ "nav",
712
+ "noscript",
713
+ "ol",
714
+ "p",
715
+ "pre",
716
+ "section",
717
+ "table",
718
+ "tfoot",
719
+ "ul",
720
+ "video"
721
+ ];
722
+ function isBlockElementTag(value) {
723
+ return BLOCK_ELEMENT_TAGS.includes(value);
724
+ }
725
+
685
726
  // src/components/AOSProvider.tsx
686
727
  function AOSProvider(_a) {
687
728
  var _b = _a, {
@@ -695,10 +736,8 @@ function AOSProvider(_a) {
695
736
  ]);
696
737
  const { containerRef } = useAOSScope(options);
697
738
  return (0, import_react3.createElement)(
698
- typeof component === "string" ? component : "div",
699
- __spreadProps(__spreadValues({}, props), {
700
- ref: containerRef
701
- }),
739
+ isBlockElementTag(component) ? component : "div",
740
+ __spreadProps(__spreadValues({}, props), { ref: containerRef }),
702
741
  children
703
742
  );
704
743
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/components/AOSProvider.tsx","../src/hooks/useAOSScope.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"],"sourcesContent":["\"use client\";\n\nexport { default as AOSProvider } from \"./components/AOSProvider\";\nexport { default as useAOSScope } from \"./hooks/useAOSScope\";\n","\"use client\";\n\nimport React, {\n type ComponentPropsWithoutRef,\n createElement,\n type ElementType,\n} from \"react\";\n\nimport useAOSScope from \"@/hooks/useAOSScope\";\nimport { type AOSAttributeOptions } from \"@/utils/toAOSProps\";\n\ntype AOSProviderProps<T extends ElementType> = {\n component?: T;\n options?: AOSAttributeOptions;\n children?: React.ReactNode;\n} & Omit<ComponentPropsWithoutRef<T>, \"ref\">;\n\nexport default function AOSProvider<T extends ElementType = \"div\">({\n component,\n options,\n children,\n ...props\n}: AOSProviderProps<T>) {\n const { containerRef } = useAOSScope(options);\n\n return createElement(\n typeof component === \"string\" ? component : \"div\",\n {\n ...props,\n ref: containerRef,\n },\n children,\n );\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 {useAOSScope} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSScope<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 useAOSScope<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.isInteger(numberValue)) {\n options[prop] = numberValue;\n }\n break;\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 \"easing\":\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\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 extends string>(\n list: readonly T[],\n value: string,\n): 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 return undefined;\n }\n}\n\nfunction parseNumber(value: string) {\n const num = Number(value);\n return Number.isInteger(num) ? num : undefined;\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 resolveScrollTriggerStart(\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.isFinite(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 解析 ScrollTrigger 的 `toggleActions` */\nfunction resolveToggleActions(once?: boolean, mirror?: boolean): string {\n if (once) return \"play none none none\";\n if (mirror) return \"play reverse play reverse\";\n return \"play none none reverse\";\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: resolveToggleActions(once, mirror),\n start: resolveScrollTriggerStart(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 const value = options[key];\n\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\":\n if (typeof value === \"number\" && Number.isInteger(value)) {\n result[key] = value;\n }\n break;\n case \"once\":\n case \"mirror\":\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n case \"easing\":\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n case \"anchorPlacement\":\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\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 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,gBAIO;;;ACNP,mBAAwC;AACxC,IAAAC,gBAAwB;AACxB,IAAAC,eAAiB;;;ACCV,IAAM,kBAAoC;AAAA,EAC/C,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAGO,IAAM,UAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AChEA,IAAM,oBAAoB;AAAA,EACxB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,6BAA6B;AAC/B;AAGe,SAAR,gBAAoD,SAAY;AACrE,QAAM,UAAU,CAAC;AAEjB,aAAW,OAAO,OAAO,KAAK,iBAAiB,GAAG;AAChD,UAAM,QAAQ,QAAQ,aAAa,GAAG;AAEtC,QAAI,OAAO;AACT,YAAM,OAAO,kBAAkB,GAAsB;AAErD,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,gBAAM,cAAc,YAAY,KAAK;AACrC,cAAI,OAAO,UAAU,WAAW,GAAG;AACjC,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK,UAAU;AACb,gBAAM,eAAe,aAAa,KAAK;AACvC,cAAI,OAAO,iBAAiB,WAAW;AACrC,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF;AAAA,QACA,KAAK;AACH,gBAAM,SAAS,UAAU,SAAS,KAAK;AACvC,cAAI,QAAQ;AACV,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF,KAAK,mBAAmB;AACtB,gBAAM,kBAAkB,UAAU,kBAAkB,KAAK;AACzD,cAAI,iBAAiB;AACnB,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UACP,MACA,OACe;AACf,SAAO,KAAK,SAAS,KAAU,IAAK,QAAc;AACpD;AAEA,SAAS,aAAa,OAAe;AACnC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,OAAe;AAClC,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,OAAO,UAAU,GAAG,IAAI,MAAM;AACvC;;;ACnFA,kBAAiB;;;ACKF,SAAR,gBACF,OACe;AAClB,QAAM,SAAS,mBAAK;AAEpB,aAAW,WAAW,OAAO;AAC3B,QAAI,CAAC,QAAS;AAEd,eAAW,OAAO,OAAO,KAAK,OAAO,GAAiC;AACpE,YAAM,QAAQ,QAAQ,GAAG;AAEzB,cAAQ,KAAK;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,cAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,cAAI,OAAO,UAAU,WAAW;AAC9B,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AACH,cAAI,WAAW,SAAS,KAAK,GAAG;AAC9B,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AACH,cAAI,WAAW,kBAAkB,KAAK,GAAG;AACvC,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAc,MAAoB,OAA4B;AACrE,SAAO,KAAK,SAAS,KAAU;AACjC;;;ACnDO,SAAS,YAAY,GAAoB,GAAoB,GAAW;AAC7E,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAEO,SAAS,QAAQ,GAAoB;AAC1C,SAAO,EAAE,SAAS,EAAE;AACtB;AAEO,SAAS,QAAQ,GAAoB;AAC1C,SAAO,EAAE,SAAS,EAAE;AACtB;AAEO,SAAS,MAAM,GAAW,GAAY;AAC3C,SAAO,OAAO,MAAM,WACf;AAAA,IACC,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,IACC;AAAA,IACC,OAAO;AAAA,EACT;AACN;AAGO,SAAS,YAAY,OAAe;AACzC,SAAO;AAAA,IACL,sBAAsB;AAAA,EACxB;AACF;;;ACLO,IAAM,WAAW;AAGxB,IAAM,UAAU;AAAA,EACd,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,OACN,YAAY,GAAG,GAAG,CAAC,IACnB,MAAM,CAAC;AAAA,EAEd;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,YAAY;AAAA,OACT,YAAY,GAAG,GAAG,CAAC;AAAA,EAE1B;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI,CAAC;AAAA,EACP;AACF;AAGA,IAAM,cAAc;AAAA,EAClB,MAAM;AAAA,IACJ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,CAAC;AAAA,MACP,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,UAAU,CAAC;AAAA,MAChC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC;AAAA,MACjC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,GAAG,CAAC;AAAA,MAChC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,GAAG,CAAC;AAAA,MACjC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,UAAU,CAAC;AAAA,MACxC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,UAAU,CAAC;AAAA,MACvC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;AAAA,MACzC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,CAAC,UAAU,CAAC;AAAA,MACxC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,SAAS;AAAA,MAEtB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,QAAQ;AAAA,MAErB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,SAAS;AAAA,MAEtB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,QAAQ;AAAA,MAErB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,QAAQ,CAAC;AAAA,MAC9B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,SAAS,CAAC;AAAA,MAC/B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,QAAQ,GAAG,CAAC;AAAA,MAC9B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,SAAS,GAAG,CAAC;AAAA,MAC/B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ,EAAE,QAAQ,QAAQ,MAAM,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE;AAAA,EACnE,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,GAAG,UAAU,CAAC,IAAM,MAAM,GAAG;AAAA,MACpD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,GAAG,CAAC,UAAU,CAAC,IAAM,MAAM,GAAG;AAAA,MACrD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,UAAU,GAAG,CAAC,IAAM,MAAM,GAAG;AAAA,MACpD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,CAAC,UAAU,GAAG,CAAC,IAAM,MAAM,GAAG;AAAA,MACrD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS,EAAE,QAAQ,QAAQ,MAAM,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE;AAAA,EACpE,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,GAAG,UAAU,CAAC,IAC1B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,GAAG,CAAC,UAAU,CAAC,IAC3B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,UAAU,GAAG,CAAC,IAC1B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,CAAC,UAAU,GAAG,CAAC,IAC3B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEA,IAAO,sBAAQ;;;AHhQf,SAAS,0BACP,iBACA,QACQ;AACR,QAAM,CAAC,IAAI,EAAE,IAAI,gBAAgB,MAAM,GAAG;AAC1C,QAAM,SAAS,GAAG,EAAE,IAAI,EAAE;AAE1B,MAAI,WAAW,KAAK,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO;AAErD,QAAM,MAAM,GAAG,SAAS,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,MAAM,CAAC;AACzD,SAAO,GAAG,MAAM,GAAG,GAAG;AACxB;AAGA,SAAS,qBAAqB,MAAgB,QAA0B;AACtE,MAAI,KAAM,QAAO;AACjB,MAAI,OAAQ,QAAO;AACnB,SAAO;AACT;AAGA,SAAS,yBACP,SACA,QACA,MACA,SACA;AA1CF;AA2CE,QAAM,EAAE,MAAM,GAAG,IAAI;AACrB,QAAM,EAAE,QAAQ,OAAO,UAAU,QAAQ,MAAM,QAAQ,gBAAgB,IACrE,aAAa,OAAO;AAGtB,QAAM,cAAY,aAAQ,kBAAR,mBAAuB,aAAa,yBAClD,QAAQ,gBACR;AAEJ,SAAO,YAAAC,QAAK;AAAA,IACV;AAAA,IACA,kCACK,OAAO,OACP;AAAA,IAEL,gDACK,OAAO,KACP,KAFL;AAAA,MAGE,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,WAAW;AAAA,MACX,eAAe;AAAA;AAAA,QAEb,SAAS,aAAa;AAAA,QACtB,eAAe,qBAAqB,MAAM,MAAM;AAAA,QAChD,OAAO,0BAA0B,iBAAiB,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,mBACPC,cAC6C;AAC7C,QAAM,SAAS,CAAC;AAChB,QAAM,OAAO,OAAO,KAAKA,YAAW;AAEpC,aAAW,OAAO,MAAM;AACtB,UAAM,EAAE,QAAQ,KAAK,IAAIA,aAAY,GAAG;AAExC,WAAO,GAAG,IAAI,CAAC,SAAS,YACtB,yBAAyB,SAAS,QAAQ,MAAM,OAAO;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,mBAAmB,mBAAW;AAEjD,IAAO,qBAAQ;;;AIzFf,IAAM,qBAAiE;AAAA,EACrE,MAAM,mBAAW;AAAA,EACjB,WAAW,mBAAW;AAAA,EACtB,aAAa,mBAAW;AAAA,EACxB,aAAa,mBAAW;AAAA,EACxB,cAAc,mBAAW;AAAA,EACzB,iBAAiB,mBAAW;AAAA,EAC5B,gBAAgB,mBAAW;AAAA,EAC3B,mBAAmB,mBAAW;AAAA,EAC9B,kBAAkB,mBAAW;AAAA,EAC7B,WAAW,mBAAW;AAAA,EACtB,aAAa,mBAAW;AAAA,EACxB,aAAa,mBAAW;AAAA,EACxB,cAAc,mBAAW;AAAA,EACzB,YAAY,mBAAW;AAAA,EACvB,cAAc,mBAAW;AAAA,EACzB,cAAc,mBAAW;AAAA,EACzB,eAAe,mBAAW;AAAA,EAC1B,WAAW,mBAAW;AAAA,EACtB,cAAc,mBAAW;AAAA,EACzB,gBAAgB,mBAAW;AAAA,EAC3B,gBAAgB,mBAAW;AAAA,EAC3B,iBAAiB,mBAAW;AAAA,EAC5B,YAAY,mBAAW;AAAA,EACvB,eAAe,mBAAW;AAAA,EAC1B,iBAAiB,mBAAW;AAAA,EAC5B,iBAAiB,mBAAW;AAAA,EAC5B,kBAAkB,mBAAW;AAC/B;AAGe,SAAR,gBACL,SACA,SACA;AACA,QAAM,UAAU,QAAQ,aAAa,UAAU;AAC/C,MAAI,CAAC,QAAS;AAEd,QAAM,kBAAkB,mBAAmB,OAAO;AAClD,MAAI,CAAC,gBAAiB;AAEtB,SAAO,gBAAgB,SAAS,kCAC3B,UACA,gBAAgB,OAAO,EAC3B;AACH;;;AP3CA,aAAAC,QAAK,eAAe,qBAAO;AAG3B,IAAM,qBAAuD;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,gBAAgB;AAuBP,SAAR,YACL,SACA;AACA,QAAM,mBAAe,qBAAiB,IAAI;AAC1C,QAAM,kBAAc,qBAAgC,IAAI;AAExD,QAAM,wBAAoB;AAAA,IACxB,oBAAI,QAAQ;AAAA,EACd;AACA,QAAM,iBAAa,qBAAO,OAAO;AAGjC,oCAAgB,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AAEZ;AAAA,IACE,CAAC,GAAG,gBAAgB;AAClB,UAAI,CAAC,aAAa,WAAW,CAAC,YAAa;AAG3C,YAAM,eAAe,CAAC,YAAyB;AAC7C,YAAI,kBAAkB,QAAQ,IAAI,OAAO,EAAG;AAE5C,cAAM,eAAe,YAAY,eAAe;AAAA,UAC9C;AAAA,UACA,WAAW;AAAA,QACb;AACA,YAAI,CAAC,aAAc;AAEnB,0BAAkB,QAAQ,IAAI,SAAS,YAAY;AAAA,MACrD;AAGA,YAAM,kBAAkB,CAAC,YAAyB;AAChD,cAAM,YAAY,kBAAkB,QAAQ,IAAI,OAAO;AACvD,YAAI,CAAC,UAAW;AAEhB,kBAAU,KAAK,EAAE,OAAO;AACxB,0BAAkB,QAAQ,OAAO,OAAO;AAAA,MAC1C;AAGA,YAAM,kBAAkB,CAAC,YAAyB;AAChD,wBAAgB,OAAO;AACvB,qBAAa,OAAO;AAAA,MACtB;AAGA,YAAM,iBAAmC,CAAC,cAAc;AACtD,cAAM,kBAAkB,oBAAI,IAAiB;AAC7C,cAAM,gBAAgB,oBAAI,IAAiB;AAC3C,cAAM,kBAAkB,oBAAI,IAAiB;AAE7C,mBAAW,YAAY,WAAW;AAChC,cACE,SAAS,SAAS,gBAClB,SAAS,kBAAkB,aAC3B;AACA,4BAAgB,IAAI,SAAS,MAAM;AAAA,UACrC,WAAW,SAAS,SAAS,aAAa;AACxC,4BAAgB,SAAS,YAAY,aAAa;AAClD,4BAAgB,SAAS,cAAc,eAAe;AAAA,UACxD;AAAA,QACF;AAGA,mBAAW,WAAW,iBAAiB;AACrC,0BAAgB,OAAO;AAAA,QACzB;AAEA,mBAAW,WAAW,eAAe;AACnC,uBAAa,OAAO;AAAA,QACtB;AAEA,mBAAW,WAAW,iBAAiB;AACrC,0BAAgB,OAAO;AAAA,QACzB;AAAA,MACF;AAGA,iBAAW,WAAW,aAAAA,QAAK,MAAM;AAAA,QAC/B;AAAA,QACA,aAAa;AAAA,MACf,GAAG;AACD,qBAAa,OAAO;AAAA,MACtB;AAEA,kBAAY,UAAU,IAAI,iBAAiB,cAAc;AACzD,kBAAY,QAAQ,QAAQ,aAAa,SAAS;AAAA,QAChD,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO,MAAM;AACX,YAAI,YAAY,SAAS;AACvB,sBAAY,QAAQ,WAAW;AAC/B,sBAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,OAAO,cAAc,cAAc,CAAC,EAAE;AAAA,EAC1C;AAEA,SAAO,EAAE,aAAa;AACxB;AAGA,SAAS,gBAAgB,OAAiB,QAA0B;AAClE,aAAW,QAAQ,OAAO;AACxB,QAAI,EAAE,gBAAgB,aAAc;AACpC,QAAI,KAAK,QAAQ,aAAa,EAAG,QAAO,IAAI,IAAI;AAChD,eAAW,WAAW,KAAK,iBAA8B,aAAa,GAAG;AACvE,aAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF;AACF;;;ADlJe,SAAR,YAA4D,IAK3C;AAL2C,eACjE;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EApBF,IAiBmE,IAI9D,kBAJ8D,IAI9D;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAM,EAAE,aAAa,IAAI,YAAY,OAAO;AAE5C,aAAO;AAAA,IACL,OAAO,cAAc,WAAW,YAAY;AAAA,IAC5C,iCACK,QADL;AAAA,MAEE,KAAK;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;","names":["import_react","import_react","import_gsap","gsap","definitions","gsap"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/components/AOSProvider.tsx","../src/hooks/useAOSScope.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/isBlockElementTag.ts"],"sourcesContent":["\"use client\";\n\nexport { default as AOSProvider } from \"./components/AOSProvider\";\nexport { default as useAOSScope } from \"./hooks/useAOSScope\";\n","\"use client\";\n\nimport { type ComponentPropsWithoutRef, createElement } from \"react\";\n\nimport useAOSScope from \"@/hooks/useAOSScope\";\nimport isBlockElementTag, {\n type BlockElementTag,\n} from \"@/utils/isBlockElementTag\";\nimport { type AOSAttributeOptions } from \"@/utils/toAOSProps\";\n\ntype AOSProviderProps<T extends BlockElementTag> = {\n /**\n * 要渲染的 HTML 元素標籤。\n *\n * 如果未提供或非區塊元素,預設會渲染 `<div>`。\n *\n * @default \"div\"\n *\n * @see https://www.w3schools.com/html/html_blocks.asp\n */\n component?: T;\n /**\n * 讓子元素繼承的預設動畫參數\n *\n * > 注意:預設選項只作用於後續生成的動畫,這是刻意設計的行為。\n */\n options?: AOSAttributeOptions;\n} & ComponentPropsWithoutRef<T>;\n\n/**\n * 為子元素提供自動 AOS 動畫能力。\n *\n * 所有帶有 `data-aos` 屬性的子元素都會自動生成動畫。\n */\nexport default function AOSProvider<T extends BlockElementTag = \"div\">({\n component,\n options,\n children,\n ...props\n}: AOSProviderProps<T>) {\n const { containerRef } = useAOSScope(options);\n\n return createElement(\n isBlockElementTag(component) ? component : \"div\",\n { ...props, ref: containerRef },\n children,\n );\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 {useAOSScope} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSScope<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 useAOSScope<E extends HTMLElement = HTMLElement>(\n /** 預設動畫選項 */\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.isInteger(numberValue)) {\n options[prop] = numberValue;\n }\n break;\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 \"easing\":\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\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 extends string>(\n list: readonly T[],\n value: string,\n): 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 return undefined;\n }\n}\n\nfunction parseNumber(value: string) {\n const num = Number(value);\n return Number.isInteger(num) ? num : undefined;\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 resolveScrollTriggerStart(\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.isFinite(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 解析 ScrollTrigger 的 `toggleActions` */\nfunction resolveToggleActions(once?: boolean, mirror?: boolean): string {\n if (once) return \"play none none none\";\n if (mirror) return \"play reverse play reverse\";\n return \"play none none reverse\";\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: resolveToggleActions(once, mirror),\n start: resolveScrollTriggerStart(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 const value = options[key];\n\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\":\n if (typeof value === \"number\" && Number.isInteger(value)) {\n result[key] = value;\n }\n break;\n case \"once\":\n case \"mirror\":\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n case \"easing\":\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n case \"anchorPlacement\":\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\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 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\n/** 動畫配置 */\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\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","/** 區塊元素標籤 */\nexport type BlockElementTag =\n | \"address\"\n | \"article\"\n | \"aside\"\n | \"blockquote\"\n | \"canvas\"\n | \"dd\"\n | \"div\"\n | \"dl\"\n | \"dt\"\n | \"fieldset\"\n | \"figcaption\"\n | \"figure\"\n | \"footer\"\n | \"form\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"header\"\n | \"hr\"\n | \"li\"\n | \"main\"\n | \"nav\"\n | \"noscript\"\n | \"ol\"\n | \"p\"\n | \"pre\"\n | \"section\"\n | \"table\"\n | \"tfoot\"\n | \"ul\"\n | \"video\";\n\n/** 區塊元素標籤清單 */\nconst BLOCK_ELEMENT_TAGS: BlockElementTag[] = [\n \"address\",\n \"article\",\n \"aside\",\n \"blockquote\",\n \"canvas\",\n \"dd\",\n \"div\",\n \"dl\",\n \"dt\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"footer\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"header\",\n \"hr\",\n \"li\",\n \"main\",\n \"nav\",\n \"noscript\",\n \"ol\",\n \"p\",\n \"pre\",\n \"section\",\n \"table\",\n \"tfoot\",\n \"ul\",\n \"video\",\n];\n\n/**\n * 檢查標籤是否是區塊元素\n *\n * @see https://www.w3schools.com/html/html_blocks.asp\n * */\nexport default function isBlockElementTag(\n value: unknown,\n): value is BlockElementTag {\n return BLOCK_ELEMENT_TAGS.includes(value as BlockElementTag);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,gBAA6D;;;ACF7D,mBAAwC;AACxC,IAAAC,gBAAwB;AACxB,IAAAC,eAAiB;;;ACCV,IAAM,kBAAoC;AAAA,EAC/C,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAGO,IAAM,UAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AChEA,IAAM,oBAAoB;AAAA,EACxB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,6BAA6B;AAC/B;AAGe,SAAR,gBAAoD,SAAY;AACrE,QAAM,UAAU,CAAC;AAEjB,aAAW,OAAO,OAAO,KAAK,iBAAiB,GAAG;AAChD,UAAM,QAAQ,QAAQ,aAAa,GAAG;AAEtC,QAAI,OAAO;AACT,YAAM,OAAO,kBAAkB,GAAsB;AAErD,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,gBAAM,cAAc,YAAY,KAAK;AACrC,cAAI,OAAO,UAAU,WAAW,GAAG;AACjC,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK,UAAU;AACb,gBAAM,eAAe,aAAa,KAAK;AACvC,cAAI,OAAO,iBAAiB,WAAW;AACrC,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF;AAAA,QACA,KAAK;AACH,gBAAM,SAAS,UAAU,SAAS,KAAK;AACvC,cAAI,QAAQ;AACV,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF,KAAK,mBAAmB;AACtB,gBAAM,kBAAkB,UAAU,kBAAkB,KAAK;AACzD,cAAI,iBAAiB;AACnB,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UACP,MACA,OACe;AACf,SAAO,KAAK,SAAS,KAAU,IAAK,QAAc;AACpD;AAEA,SAAS,aAAa,OAAe;AACnC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,OAAe;AAClC,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,OAAO,UAAU,GAAG,IAAI,MAAM;AACvC;;;ACnFA,kBAAiB;;;ACKF,SAAR,gBACF,OACe;AAClB,QAAM,SAAS,mBAAK;AAEpB,aAAW,WAAW,OAAO;AAC3B,QAAI,CAAC,QAAS;AAEd,eAAW,OAAO,OAAO,KAAK,OAAO,GAAiC;AACpE,YAAM,QAAQ,QAAQ,GAAG;AAEzB,cAAQ,KAAK;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,cAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,cAAI,OAAO,UAAU,WAAW;AAC9B,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AACH,cAAI,WAAW,SAAS,KAAK,GAAG;AAC9B,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF,KAAK;AACH,cAAI,WAAW,kBAAkB,KAAK,GAAG;AACvC,mBAAO,GAAG,IAAI;AAAA,UAChB;AACA;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAc,MAAoB,OAA4B;AACrE,SAAO,KAAK,SAAS,KAAU;AACjC;;;ACnDO,SAAS,YAAY,GAAoB,GAAoB,GAAW;AAC7E,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAEO,SAAS,QAAQ,GAAoB;AAC1C,SAAO,EAAE,SAAS,EAAE;AACtB;AAEO,SAAS,QAAQ,GAAoB;AAC1C,SAAO,EAAE,SAAS,EAAE;AACtB;AAEO,SAAS,MAAM,GAAW,GAAY;AAC3C,SAAO,OAAO,MAAM,WACf;AAAA,IACC,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,IACC;AAAA,IACC,OAAO;AAAA,EACT;AACN;AAGO,SAAS,YAAY,OAAe;AACzC,SAAO;AAAA,IACL,sBAAsB;AAAA,EACxB;AACF;;;ACHO,IAAM,WAAW;AAGxB,IAAM,UAAU;AAAA,EACd,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,OACN,YAAY,GAAG,GAAG,CAAC,IACnB,MAAM,CAAC;AAAA,EAEd;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,YAAY;AAAA,OACT,YAAY,GAAG,GAAG,CAAC;AAAA,EAE1B;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,IACA,IAAI,CAAC;AAAA,EACP;AACF;AAGA,IAAM,cAAc;AAAA,EAClB,MAAM;AAAA,IACJ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,CAAC;AAAA,MACP,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,UAAU,CAAC;AAAA,MAChC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC;AAAA,MACjC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,GAAG,CAAC;AAAA,MAChC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,GAAG,CAAC;AAAA,MACjC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,UAAU,CAAC;AAAA,MACxC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,UAAU,CAAC;AAAA,MACvC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;AAAA,MACzC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,UAAU,CAAC,UAAU,CAAC;AAAA,MACxC,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,SAAS;AAAA,MAEtB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,QAAQ;AAAA,MAErB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,SAAS;AAAA,MAEtB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,IAAI,IAChB,QAAQ,QAAQ;AAAA,MAErB,IAAI,kCAAK,YAAY,IAAI,IAAM,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,QAAQ,CAAC;AAAA,MAC9B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,GAAG,SAAS,CAAC;AAAA,MAC/B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,QAAQ,GAAG,CAAC;AAAA,MAC9B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,YAAY,SAAS,GAAG,CAAC;AAAA,MAC/B,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,QAAQ,EAAE,QAAQ,QAAQ,MAAM,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE;AAAA,EACnE,UAAU;AAAA,IACR,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,GAAG,UAAU,CAAC,IAAM,MAAM,GAAG;AAAA,MACpD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,GAAG,CAAC,UAAU,CAAC,IAAM,MAAM,GAAG;AAAA,MACrD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,UAAU,GAAG,CAAC,IAAM,MAAM,GAAG;AAAA,MACpD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCAAK,YAAY,CAAC,UAAU,GAAG,CAAC,IAAM,MAAM,GAAG;AAAA,MACrD,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS,EAAE,QAAQ,QAAQ,MAAM,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE;AAAA,EACpE,WAAW;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,GAAG,UAAU,CAAC,IAC1B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,GAAG,CAAC,UAAU,CAAC,IAC3B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,UAAU,GAAG,CAAC,IAC1B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,MACJ,MAAM,kCACD,YAAY,CAAC,UAAU,GAAG,CAAC,IAC3B,MAAM,GAAG;AAAA,MAEd,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEA,IAAO,sBAAQ;;;AHlQf,SAAS,0BACP,iBACA,QACQ;AACR,QAAM,CAAC,IAAI,EAAE,IAAI,gBAAgB,MAAM,GAAG;AAC1C,QAAM,SAAS,GAAG,EAAE,IAAI,EAAE;AAE1B,MAAI,WAAW,KAAK,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO;AAErD,QAAM,MAAM,GAAG,SAAS,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,MAAM,CAAC;AACzD,SAAO,GAAG,MAAM,GAAG,GAAG;AACxB;AAGA,SAAS,qBAAqB,MAAgB,QAA0B;AACtE,MAAI,KAAM,QAAO;AACjB,MAAI,OAAQ,QAAO;AACnB,SAAO;AACT;AAGA,SAAS,yBACP,SACA,QACA,MACA,SACA;AA1CF;AA2CE,QAAM,EAAE,MAAM,GAAG,IAAI;AACrB,QAAM,EAAE,QAAQ,OAAO,UAAU,QAAQ,MAAM,QAAQ,gBAAgB,IACrE,aAAa,OAAO;AAGtB,QAAM,cAAY,aAAQ,kBAAR,mBAAuB,aAAa,yBAClD,QAAQ,gBACR;AAEJ,SAAO,YAAAC,QAAK;AAAA,IACV;AAAA,IACA,kCACK,OAAO,OACP;AAAA,IAEL,gDACK,OAAO,KACP,KAFL;AAAA,MAGE,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,MACrB,OAAO,QAAQ;AAAA,MACf,WAAW;AAAA,MACX,eAAe;AAAA;AAAA,QAEb,SAAS,aAAa;AAAA,QACtB,eAAe,qBAAqB,MAAM,MAAM;AAAA,QAChD,OAAO,0BAA0B,iBAAiB,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,mBACPC,cAC6C;AAC7C,QAAM,SAAS,CAAC;AAChB,QAAM,OAAO,OAAO,KAAKA,YAAW;AAEpC,aAAW,OAAO,MAAM;AACtB,UAAM,EAAE,QAAQ,KAAK,IAAIA,aAAY,GAAG;AAExC,WAAO,GAAG,IAAI,CAAC,SAAS,YACtB,yBAAyB,SAAS,QAAQ,MAAM,OAAO;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,mBAAmB,mBAAW;AAEjD,IAAO,qBAAQ;;;AIzFf,IAAM,qBAAiE;AAAA,EACrE,MAAM,mBAAW;AAAA,EACjB,WAAW,mBAAW;AAAA,EACtB,aAAa,mBAAW;AAAA,EACxB,aAAa,mBAAW;AAAA,EACxB,cAAc,mBAAW;AAAA,EACzB,iBAAiB,mBAAW;AAAA,EAC5B,gBAAgB,mBAAW;AAAA,EAC3B,mBAAmB,mBAAW;AAAA,EAC9B,kBAAkB,mBAAW;AAAA,EAC7B,WAAW,mBAAW;AAAA,EACtB,aAAa,mBAAW;AAAA,EACxB,aAAa,mBAAW;AAAA,EACxB,cAAc,mBAAW;AAAA,EACzB,YAAY,mBAAW;AAAA,EACvB,cAAc,mBAAW;AAAA,EACzB,cAAc,mBAAW;AAAA,EACzB,eAAe,mBAAW;AAAA,EAC1B,WAAW,mBAAW;AAAA,EACtB,cAAc,mBAAW;AAAA,EACzB,gBAAgB,mBAAW;AAAA,EAC3B,gBAAgB,mBAAW;AAAA,EAC3B,iBAAiB,mBAAW;AAAA,EAC5B,YAAY,mBAAW;AAAA,EACvB,eAAe,mBAAW;AAAA,EAC1B,iBAAiB,mBAAW;AAAA,EAC5B,iBAAiB,mBAAW;AAAA,EAC5B,kBAAkB,mBAAW;AAC/B;AAGe,SAAR,gBACL,SACA,SACA;AACA,QAAM,UAAU,QAAQ,aAAa,UAAU;AAC/C,MAAI,CAAC,QAAS;AAEd,QAAM,kBAAkB,mBAAmB,OAAO;AAClD,MAAI,CAAC,gBAAiB;AAEtB,SAAO,gBAAgB,SAAS,kCAC3B,UACA,gBAAgB,OAAO,EAC3B;AACH;;;AP3CA,aAAAC,QAAK,eAAe,qBAAO;AAG3B,IAAM,qBAAuD;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,gBAAgB;AAuBP,SAAR,YAEL,SACA;AACA,QAAM,mBAAe,qBAAiB,IAAI;AAC1C,QAAM,kBAAc,qBAAgC,IAAI;AAExD,QAAM,wBAAoB;AAAA,IACxB,oBAAI,QAAQ;AAAA,EACd;AACA,QAAM,iBAAa,qBAAO,OAAO;AAGjC,oCAAgB,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AAEZ;AAAA,IACE,CAAC,GAAG,gBAAgB;AAClB,UAAI,CAAC,aAAa,WAAW,CAAC,YAAa;AAG3C,YAAM,eAAe,CAAC,YAAyB;AAC7C,YAAI,kBAAkB,QAAQ,IAAI,OAAO,EAAG;AAE5C,cAAM,eAAe,YAAY,eAAe;AAAA,UAC9C;AAAA,UACA,WAAW;AAAA,QACb;AACA,YAAI,CAAC,aAAc;AAEnB,0BAAkB,QAAQ,IAAI,SAAS,YAAY;AAAA,MACrD;AAGA,YAAM,kBAAkB,CAAC,YAAyB;AAChD,cAAM,YAAY,kBAAkB,QAAQ,IAAI,OAAO;AACvD,YAAI,CAAC,UAAW;AAEhB,kBAAU,KAAK,EAAE,OAAO;AACxB,0BAAkB,QAAQ,OAAO,OAAO;AAAA,MAC1C;AAGA,YAAM,kBAAkB,CAAC,YAAyB;AAChD,wBAAgB,OAAO;AACvB,qBAAa,OAAO;AAAA,MACtB;AAGA,YAAM,iBAAmC,CAAC,cAAc;AACtD,cAAM,kBAAkB,oBAAI,IAAiB;AAC7C,cAAM,gBAAgB,oBAAI,IAAiB;AAC3C,cAAM,kBAAkB,oBAAI,IAAiB;AAE7C,mBAAW,YAAY,WAAW;AAChC,cACE,SAAS,SAAS,gBAClB,SAAS,kBAAkB,aAC3B;AACA,4BAAgB,IAAI,SAAS,MAAM;AAAA,UACrC,WAAW,SAAS,SAAS,aAAa;AACxC,4BAAgB,SAAS,YAAY,aAAa;AAClD,4BAAgB,SAAS,cAAc,eAAe;AAAA,UACxD;AAAA,QACF;AAGA,mBAAW,WAAW,iBAAiB;AACrC,0BAAgB,OAAO;AAAA,QACzB;AAEA,mBAAW,WAAW,eAAe;AACnC,uBAAa,OAAO;AAAA,QACtB;AAEA,mBAAW,WAAW,iBAAiB;AACrC,0BAAgB,OAAO;AAAA,QACzB;AAAA,MACF;AAGA,iBAAW,WAAW,aAAAA,QAAK,MAAM;AAAA,QAC/B;AAAA,QACA,aAAa;AAAA,MACf,GAAG;AACD,qBAAa,OAAO;AAAA,MACtB;AAEA,kBAAY,UAAU,IAAI,iBAAiB,cAAc;AACzD,kBAAY,QAAQ,QAAQ,aAAa,SAAS;AAAA,QAChD,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO,MAAM;AACX,YAAI,YAAY,SAAS;AACvB,sBAAY,QAAQ,WAAW;AAC/B,sBAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,OAAO,cAAc,cAAc,CAAC,EAAE;AAAA,EAC1C;AAEA,SAAO,EAAE,aAAa;AACxB;AAGA,SAAS,gBAAgB,OAAiB,QAA0B;AAClE,aAAW,QAAQ,OAAO;AACxB,QAAI,EAAE,gBAAgB,aAAc;AACpC,QAAI,KAAK,QAAQ,aAAa,EAAG,QAAO,IAAI,IAAI;AAChD,eAAW,WAAW,KAAK,iBAA8B,aAAa,GAAG;AACvE,aAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF;AACF;;;AQ9HA,IAAM,qBAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOe,SAAR,kBACL,OAC0B;AAC1B,SAAO,mBAAmB,SAAS,KAAwB;AAC7D;;;ATlDe,SAAR,YAAgE,IAK/C;AAL+C,eACrE;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EArCF,IAkCuE,IAIlE,kBAJkE,IAIlE;AAAA,IAHH;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAM,EAAE,aAAa,IAAI,YAAY,OAAO;AAE5C,aAAO;AAAA,IACL,kBAAkB,SAAS,IAAI,YAAY;AAAA,IAC3C,iCAAK,QAAL,EAAY,KAAK,aAAa;AAAA,IAC9B;AAAA,EACF;AACF;","names":["import_react","import_react","import_gsap","gsap","definitions","gsap"]}
package/dist/client.mjs CHANGED
@@ -32,9 +32,7 @@ var __objRest = (source, exclude) => {
32
32
  };
33
33
 
34
34
  // src/components/AOSProvider.tsx
35
- import {
36
- createElement
37
- } from "react";
35
+ import { createElement } from "react";
38
36
 
39
37
  // src/hooks/useAOSScope.ts
40
38
  import { useLayoutEffect, useRef } from "react";
@@ -650,6 +648,47 @@ function collectElements(nodes, result) {
650
648
  }
651
649
  }
652
650
 
651
+ // src/utils/isBlockElementTag.ts
652
+ var BLOCK_ELEMENT_TAGS = [
653
+ "address",
654
+ "article",
655
+ "aside",
656
+ "blockquote",
657
+ "canvas",
658
+ "dd",
659
+ "div",
660
+ "dl",
661
+ "dt",
662
+ "fieldset",
663
+ "figcaption",
664
+ "figure",
665
+ "footer",
666
+ "form",
667
+ "h1",
668
+ "h2",
669
+ "h3",
670
+ "h4",
671
+ "h5",
672
+ "h6",
673
+ "header",
674
+ "hr",
675
+ "li",
676
+ "main",
677
+ "nav",
678
+ "noscript",
679
+ "ol",
680
+ "p",
681
+ "pre",
682
+ "section",
683
+ "table",
684
+ "tfoot",
685
+ "ul",
686
+ "video"
687
+ ];
688
+ function isBlockElementTag(value) {
689
+ return BLOCK_ELEMENT_TAGS.includes(value);
690
+ }
691
+
653
692
  // src/components/AOSProvider.tsx
654
693
  function AOSProvider(_a) {
655
694
  var _b = _a, {
@@ -663,10 +702,8 @@ function AOSProvider(_a) {
663
702
  ]);
664
703
  const { containerRef } = useAOSScope(options);
665
704
  return createElement(
666
- typeof component === "string" ? component : "div",
667
- __spreadProps(__spreadValues({}, props), {
668
- ref: containerRef
669
- }),
705
+ isBlockElementTag(component) ? component : "div",
706
+ __spreadProps(__spreadValues({}, props), { ref: containerRef }),
670
707
  children
671
708
  );
672
709
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AOSProvider.tsx","../src/hooks/useAOSScope.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"],"sourcesContent":["\"use client\";\n\nimport React, {\n type ComponentPropsWithoutRef,\n createElement,\n type ElementType,\n} from \"react\";\n\nimport useAOSScope from \"@/hooks/useAOSScope\";\nimport { type AOSAttributeOptions } from \"@/utils/toAOSProps\";\n\ntype AOSProviderProps<T extends ElementType> = {\n component?: T;\n options?: AOSAttributeOptions;\n children?: React.ReactNode;\n} & Omit<ComponentPropsWithoutRef<T>, \"ref\">;\n\nexport default function AOSProvider<T extends ElementType = \"div\">({\n component,\n options,\n children,\n ...props\n}: AOSProviderProps<T>) {\n const { containerRef } = useAOSScope(options);\n\n return createElement(\n typeof component === \"string\" ? component : \"div\",\n {\n ...props,\n ref: containerRef,\n },\n children,\n );\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 {useAOSScope} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSScope<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 useAOSScope<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.isInteger(numberValue)) {\n options[prop] = numberValue;\n }\n break;\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 \"easing\":\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\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 extends string>(\n list: readonly T[],\n value: string,\n): 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 return undefined;\n }\n}\n\nfunction parseNumber(value: string) {\n const num = Number(value);\n return Number.isInteger(num) ? num : undefined;\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 resolveScrollTriggerStart(\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.isFinite(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 解析 ScrollTrigger 的 `toggleActions` */\nfunction resolveToggleActions(once?: boolean, mirror?: boolean): string {\n if (once) return \"play none none none\";\n if (mirror) return \"play reverse play reverse\";\n return \"play none none reverse\";\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: resolveToggleActions(once, mirror),\n start: resolveScrollTriggerStart(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 const value = options[key];\n\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\":\n if (typeof value === \"number\" && Number.isInteger(value)) {\n result[key] = value;\n }\n break;\n case \"once\":\n case \"mirror\":\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n case \"easing\":\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n case \"anchorPlacement\":\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\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 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"],"mappings":"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","names":["gsap","definitions","gsap"]}
1
+ {"version":3,"sources":["../src/components/AOSProvider.tsx","../src/hooks/useAOSScope.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/isBlockElementTag.ts"],"sourcesContent":["\"use client\";\n\nimport { type ComponentPropsWithoutRef, createElement } from \"react\";\n\nimport useAOSScope from \"@/hooks/useAOSScope\";\nimport isBlockElementTag, {\n type BlockElementTag,\n} from \"@/utils/isBlockElementTag\";\nimport { type AOSAttributeOptions } from \"@/utils/toAOSProps\";\n\ntype AOSProviderProps<T extends BlockElementTag> = {\n /**\n * 要渲染的 HTML 元素標籤。\n *\n * 如果未提供或非區塊元素,預設會渲染 `<div>`。\n *\n * @default \"div\"\n *\n * @see https://www.w3schools.com/html/html_blocks.asp\n */\n component?: T;\n /**\n * 讓子元素繼承的預設動畫參數\n *\n * > 注意:預設選項只作用於後續生成的動畫,這是刻意設計的行為。\n */\n options?: AOSAttributeOptions;\n} & ComponentPropsWithoutRef<T>;\n\n/**\n * 為子元素提供自動 AOS 動畫能力。\n *\n * 所有帶有 `data-aos` 屬性的子元素都會自動生成動畫。\n */\nexport default function AOSProvider<T extends BlockElementTag = \"div\">({\n component,\n options,\n children,\n ...props\n}: AOSProviderProps<T>) {\n const { containerRef } = useAOSScope(options);\n\n return createElement(\n isBlockElementTag(component) ? component : \"div\",\n { ...props, ref: containerRef },\n children,\n );\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 {useAOSScope} from '@/aos';\n \n export default function Demo() {\n const {containerRef} = useAOSScope<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 useAOSScope<E extends HTMLElement = HTMLElement>(\n /** 預設動畫選項 */\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.isInteger(numberValue)) {\n options[prop] = numberValue;\n }\n break;\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 \"easing\":\n const easing = parseEnum(easings, value);\n if (easing) {\n options[prop] = easing;\n }\n break;\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 extends string>(\n list: readonly T[],\n value: string,\n): 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 return undefined;\n }\n}\n\nfunction parseNumber(value: string) {\n const num = Number(value);\n return Number.isInteger(num) ? num : undefined;\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 resolveScrollTriggerStart(\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.isFinite(offset)) return anchor;\n\n const fix = `${offset > 0 ? \"-\" : \"+\"}=${Math.abs(offset)}`;\n return `${anchor}${fix}`;\n}\n\n/** 解析 ScrollTrigger 的 `toggleActions` */\nfunction resolveToggleActions(once?: boolean, mirror?: boolean): string {\n if (once) return \"play none none none\";\n if (mirror) return \"play reverse play reverse\";\n return \"play none none reverse\";\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: resolveToggleActions(once, mirror),\n start: resolveScrollTriggerStart(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 const value = options[key];\n\n switch (key) {\n case \"offset\":\n case \"delay\":\n case \"duration\":\n if (typeof value === \"number\" && Number.isInteger(value)) {\n result[key] = value;\n }\n break;\n case \"once\":\n case \"mirror\":\n if (typeof value === \"boolean\") {\n result[key] = value;\n }\n break;\n case \"easing\":\n if (verifyEnum(easings, value)) {\n result[key] = value;\n }\n break;\n case \"anchorPlacement\":\n if (verifyEnum(anchorPlacements, value)) {\n result[key] = value;\n }\n break;\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 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\n/** 動畫配置 */\nexport interface AnimationPreset {\n /** 動畫起點 */\n from: gsap.TweenVars;\n /** 動畫終點 */\n to: gsap.TweenVars;\n}\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","/** 區塊元素標籤 */\nexport type BlockElementTag =\n | \"address\"\n | \"article\"\n | \"aside\"\n | \"blockquote\"\n | \"canvas\"\n | \"dd\"\n | \"div\"\n | \"dl\"\n | \"dt\"\n | \"fieldset\"\n | \"figcaption\"\n | \"figure\"\n | \"footer\"\n | \"form\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"header\"\n | \"hr\"\n | \"li\"\n | \"main\"\n | \"nav\"\n | \"noscript\"\n | \"ol\"\n | \"p\"\n | \"pre\"\n | \"section\"\n | \"table\"\n | \"tfoot\"\n | \"ul\"\n | \"video\";\n\n/** 區塊元素標籤清單 */\nconst BLOCK_ELEMENT_TAGS: BlockElementTag[] = [\n \"address\",\n \"article\",\n \"aside\",\n \"blockquote\",\n \"canvas\",\n \"dd\",\n \"div\",\n \"dl\",\n \"dt\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"footer\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"header\",\n \"hr\",\n \"li\",\n \"main\",\n \"nav\",\n \"noscript\",\n \"ol\",\n \"p\",\n \"pre\",\n \"section\",\n \"table\",\n \"tfoot\",\n \"ul\",\n \"video\",\n];\n\n/**\n * 檢查標籤是否是區塊元素\n *\n * @see https://www.w3schools.com/html/html_blocks.asp\n * */\nexport default function isBlockElementTag(\n value: unknown,\n): value is BlockElementTag {\n return BLOCK_ELEMENT_TAGS.includes(value as BlockElementTag);\n}\n"],"mappings":"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","names":["gsap","definitions","gsap"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-gsap-aos",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
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",