{"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, { type UseAOSScopeOptions } from \"@/hooks/useAOSScope\";\nimport isBlockElementTag, {\n  type BlockElementTag,\n} from \"@/utils/isBlockElementTag\";\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?: UseAOSScopeOptions;\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\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\n\nimport createAnimation from \"@/animation/createAnimation\";\nimport type { AnimationOptions, AOSAttributeKey } from \"@/types\";\n\ngsap.registerPlugin(useGSAP, ScrollTrigger);\n\n/** AOS hook 選項 */\nexport type UseAOSScopeOptions = Partial<AnimationOptions>;\n\n/** AOS 屬性名稱 */\nconst AOS_ATTRIBUTE = \"data-aos\";\n/** AOS 選擇器 */\nconst AOS_SELECTOR = `[${AOS_ATTRIBUTE}]`;\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  \"data-aos-markers\",\n];\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?: UseAOSScopeOptions,\n) {\n  const containerRef = useRef<E | null>(null);\n  /** 記錄元素與對應 GSAP 動畫實例 */\n  const elementAnimationsRef = 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      const container = containerRef.current;\n\n      if (!container || !contextSafe) return;\n\n      const safeCreateAnimation = contextSafe(createAnimation);\n\n      /** 新增動畫 */\n      const addAnimation = (element: HTMLElement) => {\n        const elementAnimations = elementAnimationsRef.current;\n        if (elementAnimations.has(element)) return;\n\n        const newAnimation = safeCreateAnimation(element, optionsRef.current);\n        if (!newAnimation) return;\n\n        elementAnimations.set(element, newAnimation);\n      };\n\n      /** 移除動畫 */\n      const removeAnimation = (element: HTMLElement) => {\n        const elementAnimations = elementAnimationsRef.current;\n\n        const animation = elementAnimations.get(element);\n        if (!animation) return;\n\n        animation.revert().kill();\n        elementAnimations.delete(element);\n      };\n\n      /** 更新動畫 */\n      const updateAnimation = (element: HTMLElement) => {\n        removeAnimation(element);\n        addAnimation(element);\n      };\n\n      let isRefreshScheduled = false;\n      /**\n       * 合併 ScrollTrigger.refresh 呼叫\n       *\n       * 將多次 refresh 合併到同一幀執行，避免大量 DOM 變動時重複觸發 refresh。\n       */\n      const refreshScrollTrigger = () => {\n        if (isRefreshScheduled) return;\n\n        isRefreshScheduled = true;\n\n        requestAnimationFrame(() => {\n          ScrollTrigger.refresh(true);\n          isRefreshScheduled = false;\n        });\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          const { type, target, addedNodes, removedNodes } = mutation;\n\n          switch (type) {\n            case \"attributes\":\n              if (target instanceof HTMLElement) {\n                // 只有包含 'data-aos' 的元素才需要更新動畫\n                if (!hasAOSAttribute(target)) break;\n                updatedElements.add(target);\n              }\n              break;\n            case \"childList\":\n              collectAOSElements(addedNodes, addedElements);\n              collectAOSElements(removedNodes, removedElements);\n              break;\n            default:\n              break;\n          }\n        }\n\n        // 移除 => 新增 => 更新\n        for (const element of removedElements) removeAnimation(element);\n        for (const element of addedElements) addAnimation(element);\n        for (const element of updatedElements) updateAnimation(element);\n\n        if (removedElements.size || addedElements.size) {\n          refreshScrollTrigger();\n        }\n      };\n\n      let lastHeight = 0;\n      /**\n       * 監聽容器尺寸變化\n       *\n       * ScrollTrigger 已會處理大部分 resize 情境，這裡額外監聽高度變化以確保重新計算。\n       * */\n      const handleResize: ResizeObserverCallback = (entries) => {\n        const entry = entries[0];\n        if (!entry) return;\n\n        const height = entry.contentRect.height;\n\n        if (lastHeight !== 0 && lastHeight !== height) {\n          refreshScrollTrigger();\n        }\n\n        lastHeight = height;\n      };\n\n      // 初始化\n      const elements = queryAOSElements(container);\n\n      for (const element of elements) {\n        addAnimation(element);\n      }\n\n      const mutationObserver = new MutationObserver(handleMutation);\n      mutationObserver.observe(container, {\n        childList: true,\n        subtree: true,\n        attributes: true,\n        attributeFilter: AOS_ATTRIBUTE_KEYS,\n      });\n\n      const resizeObserver = new ResizeObserver(handleResize);\n      resizeObserver.observe(container);\n\n      return () => {\n        if (mutationObserver) {\n          mutationObserver.disconnect();\n        }\n\n        if (resizeObserver) {\n          resizeObserver.disconnect();\n        }\n      };\n    },\n    { scope: containerRef, dependencies: [] },\n  );\n\n  return { containerRef };\n}\n\n/** 從節點列表中收集所有包含 'data-aos' 的元素（包含子節點） */\nfunction collectAOSElements(nodes: NodeList, result: Set<HTMLElement>) {\n  for (const node of nodes) {\n    if (!(node instanceof HTMLElement)) continue;\n\n    if (hasAOSAttribute(node)) {\n      result.add(node);\n    }\n\n    for (const element of queryAOSElements(node)) {\n      result.add(element);\n    }\n  }\n}\n\n/** 判斷元素是否包含 'data-aos' 屬性 */\nfunction hasAOSAttribute(element: HTMLElement) {\n  return element.hasAttribute(AOS_ATTRIBUTE);\n}\n\n/** 查詢指定節點內所有 AOS 動畫元素 */\nfunction queryAOSElements(node: ParentNode): NodeListOf<HTMLElement> {\n  return node.querySelectorAll<HTMLElement>(AOS_SELECTOR);\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  markers: false,\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  \"data-aos-markers\": \"markers\",\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          const numberValue = parseNumber(value);\n          if (typeof numberValue === \"number\") {\n            options[prop] = numberValue;\n          }\n          break;\n        }\n        case \"delay\":\n        case \"duration\": {\n          const numberValue = parseNumber(value);\n          if (typeof numberValue === \"number\") {\n            options[prop] = Math.max(0, numberValue);\n          }\n          break;\n        }\n        case \"once\":\n        case \"mirror\":\n        case \"markers\": {\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        }\n        case \"anchorPlacement\": {\n          const anchorPlacement = parseEnum(anchorPlacements, value);\n          if (anchorPlacement) {\n            options[prop] = anchorPlacement;\n          }\n          break;\n        }\n        default:\n          break;\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/**\n * 解析 ScrollTrigger 的 `start`\n *\n * @see https://gsap.com/docs/v3/Plugins/ScrollTrigger/#start\n */\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/**\n * 解析 ScrollTrigger 的 `toggleActions`\n *\n * @see https://gsap.com/docs/v3/Plugins/ScrollTrigger/#toggleActions\n */\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/** 毫秒單位 */\nconst UNIT_MS = 1000;\n\n/** 建立 ScrollTrigger 動畫 */\nfunction createScrollTriggerTween(\n  element: HTMLElement,\n  preset: AnimationPreset,\n  vars: AnimationPreset,\n  options?: Partial<AnimationOptions>,\n) {\n  const {\n    offset,\n    delay,\n    duration,\n    easing,\n    once,\n    mirror,\n    anchorPlacement,\n    markers,\n  } = mergeOptions(options);\n\n  return gsap.fromTo(\n    element,\n    {\n      ...preset.from,\n      ...vars.from,\n    },\n    {\n      ...preset.to,\n      ...vars.to,\n      ease: easing,\n      duration: duration / UNIT_MS,\n      delay: delay / UNIT_MS,\n      overwrite: \"auto\",\n      scrollTrigger: {\n        markers,\n        trigger:\n          element.closest(\"[data-aos-container]\") ??\n          element.parentElement ??\n          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          if (typeof value === \"number\" && Number.isInteger(value)) {\n            result[key] = value;\n          }\n          break;\n        case \"delay\":\n        case \"duration\":\n          if (typeof value === \"number\" && Number.isInteger(value)) {\n            result[key] = Math.max(0, value);\n          }\n          break;\n        case \"once\":\n        case \"mirror\":\n        case \"markers\":\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","/** @see https://gsap.com/docs/v3/GSAP/CorePlugins/CSS/#3d-transforms */\nexport function perspective(\n  transformPerspective: gsap.TweenVars[\"perspective\"],\n): gsap.TweenVars {\n  return { transformPerspective };\n}\n\nexport function rotateX(\n  rotationX: gsap.TweenVars[\"rotationX\"],\n): gsap.TweenVars {\n  return { rotationX };\n}\n\nexport function rotateY(\n  rotationY: gsap.TweenVars[\"rotationY\"],\n): gsap.TweenVars {\n  return { rotationY };\n}\n\nexport function scale(\n  scaleX: gsap.TweenVars[\"scaleX\"],\n  scaleY?: gsap.TweenVars[\"scaleY\"],\n): gsap.TweenVars {\n  return scaleY !== undefined ? { scaleX, scaleY } : { scale: scaleX };\n}\n\nexport function translate3d(\n  x: gsap.TweenVars[\"x\"],\n  y: gsap.TweenVars[\"y\"],\n  z: gsap.TweenVars[\"z\"],\n): gsap.TweenVars {\n  return { x, y, z };\n}\n\nexport function translate3dPercent(\n  xPercent: gsap.TweenVars[\"xPercent\"],\n  yPercent: gsap.TweenVars[\"yPercent\"],\n  z: gsap.TweenVars[\"z\"],\n): gsap.TweenVars {\n  return { xPercent, yPercent, z };\n}\n","import {\n  perspective,\n  rotateX,\n  rotateY,\n  scale,\n  translate3d,\n  translate3dPercent,\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: { autoAlpha: 0 },\n    to: { autoAlpha: 1, ...translate3d(0, 0, 0) },\n  },\n  zoom: {\n    from: { autoAlpha: 0 },\n    to: { autoAlpha: 1, ...translate3d(0, 0, 0), ...scale(1) },\n  },\n  slide: {\n    from: { visibility: \"hidden\" },\n    to: { visibility: \"visible\", ...translate3dPercent(0, 0, 0) },\n  },\n  flip: {\n    from: { backfaceVisibility: \"hidden\" },\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: { ...perspective(2500), ...rotateX(\"-100deg\") },\n      to: { ...perspective(2500), ...rotateX(0) },\n    },\n  },\n  flipDown: {\n    preset: presets.flip,\n    vars: {\n      from: { ...perspective(2500), ...rotateX(\"100deg\") },\n      to: { ...perspective(2500), ...rotateX(0) },\n    },\n  },\n  flipLeft: {\n    preset: presets.flip,\n    vars: {\n      from: { ...perspective(2500), ...rotateY(\"-100deg\") },\n      to: { ...perspective(2500), ...rotateY(0) },\n    },\n  },\n  flipRight: {\n    preset: presets.flip,\n    vars: {\n      from: { ...perspective(2500), ...rotateY(\"100deg\") },\n      to: { ...perspective(2500), ...rotateY(0) },\n    },\n  },\n  slideUp: {\n    preset: presets.slide,\n    vars: {\n      from: translate3dPercent(0, 100, 0),\n      to: {},\n    },\n  },\n  slideDown: {\n    preset: presets.slide,\n    vars: {\n      from: translate3dPercent(0, -100, 0),\n      to: {},\n    },\n  },\n  slideLeft: {\n    preset: presets.slide,\n    vars: {\n      from: translate3dPercent(100, 0, 0),\n      to: {},\n    },\n  },\n  slideRight: {\n    preset: presets.slide,\n    vars: {\n      from: translate3dPercent(-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: { ...translate3d(0, DISTANCE, 0), ...scale(1.2) },\n      to: {},\n    },\n  },\n  zoomOutDown: {\n    preset: presets.zoom,\n    vars: {\n      from: { ...translate3d(0, -DISTANCE, 0), ...scale(1.2) },\n      to: {},\n    },\n  },\n  zoomOutLeft: {\n    preset: presets.zoom,\n    vars: {\n      from: { ...translate3d(DISTANCE, 0, 0), ...scale(1.2) },\n      to: {},\n    },\n  },\n  zoomOutRight: {\n    preset: presets.zoom,\n    vars: {\n      from: { ...translate3d(-DISTANCE, 0, 0), ...scale(1.2) },\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  /** 要綁定動畫的元素 */\n  element: E,\n  /** 動畫選項 */\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"]}