UNPKG

react-layout-motion

Version:
1 lines 23.8 kB
{"version":3,"file":"index.cjs","sources":["../src/components/Viewport.tsx","../src/utils/LayoutManger.ts","../src/utils/noop.ts","../src/hooks/useEvent.ts","../src/hooks/useLayoutAnimation.ts","../src/hooks/useMotionAnimation.ts","../src/components/Motion.tsx"],"sourcesContent":["import { createContext, useContext, useId, useRef } from \"react\";\n\nconst ViewportContext = createContext<string | null>(null);\n\ninterface ViewportProps {\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n as?: React.ElementType;\n viewportId?: string;\n}\n\nexport function Viewport({\n children,\n className,\n style,\n as: Component = \"div\",\n viewportId: propViewportId,\n}: ViewportProps) {\n const internalViewportId = useId();\n const viewportId = propViewportId || internalViewportId;\n const elementRef = useRef<HTMLElement>(null);\n\n return (\n <ViewportContext.Provider value={viewportId}>\n <Component data-viewport-id={viewportId} ref={elementRef} className={className} style={style}>\n {children}\n </Component>\n </ViewportContext.Provider>\n );\n}\n\nexport function useViewportId() {\n const viewportId = useContext(ViewportContext);\n return viewportId ?? \"root\";\n}\n","export interface Layout {\n element: HTMLElement;\n rect: DOMRect;\n}\n\ninterface LayoutManagerInterface {\n registerLayout: (id: string, element: HTMLElement) => string;\n unregisterLayout: (id: string) => void;\n getLayout: (id: string) => Layout | null;\n}\n\nexport class LayoutManager implements LayoutManagerInterface {\n private static instance: LayoutManager;\n\n private layoutMap: Map<string, Layout> = new Map();\n\n public static getInstance(): LayoutManager {\n if (!LayoutManager.instance) {\n LayoutManager.instance = new LayoutManager();\n }\n return LayoutManager.instance;\n }\n\n public registerLayout(layoutId: string, element: HTMLElement): string {\n const viewport = element.closest(\"[data-viewport-id]\");\n const rect = viewport ? this.getRelativeRect(element, viewport) : element.getBoundingClientRect();\n const viewportId = viewport ? viewport.getAttribute(\"data-viewport-id\") : \"root\";\n const viewportLayoutId = `${viewportId}:${layoutId}`;\n\n this.layoutMap.set(viewportLayoutId, { element, rect });\n\n return viewportLayoutId;\n }\n\n public unregisterLayout(id: string): void {\n this.layoutMap.delete(id);\n }\n\n public getLayout(id: string): Layout | null {\n return this.layoutMap.get(id) || null;\n }\n\n private getRelativeRect(element: HTMLElement, viewport: Element): DOMRect {\n const elementRect = element.getBoundingClientRect();\n const viewportRect = viewport.getBoundingClientRect();\n\n return new DOMRect(\n elementRect.left - viewportRect.left,\n elementRect.top - viewportRect.top,\n elementRect.width,\n elementRect.height,\n );\n }\n}\n","export function noop() {}\n","import { useMemo, useRef } from \"react\";\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n\nexport function useEvent<T extends noop>(fn: T) {\n const fnRef = useRef<T>(fn);\n fnRef.current = useMemo<T>(() => fn, [fn]);\n\n const memoizedFn = useRef<PickFunction<T>>(undefined);\n\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args);\n };\n }\n\n return memoizedFn.current;\n}\n","import type { MotionAnimationConfig } from \"../types\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { useViewportId } from \"../components/Viewport\";\nimport { LayoutManager } from \"../utils/LayoutManger\";\nimport { noop } from \"../utils/noop\";\nimport { useEvent } from \"./useEvent\";\n\nconst LayoutManagerInstance = LayoutManager.getInstance();\n\nconst DefaultLayoutConfig: MotionAnimationConfig = {\n duration: 300,\n easing: \"cubic-bezier(0.25, 0.1, 0.25, 1)\",\n};\n\nexport function useLayoutAnimation<T extends HTMLElement>(\n layoutId?: string,\n config?: MotionAnimationConfig,\n onLayoutAnimationStart = noop,\n onLayoutAnimationComplete = noop,\n): React.RefObject<T | null> {\n const elementRef = useRef<T>(null);\n const animationRef = useRef<Animation>(null);\n\n const configRef = useRef({ ...DefaultLayoutConfig, ...config });\n const onAnimationStart = useEvent(onLayoutAnimationStart);\n const onAnimationFinish = useEvent(onLayoutAnimationComplete);\n\n const viewportId = useViewportId();\n const viewportLayoutId = layoutId ? `${viewportId}:${layoutId}` : null;\n const layout = viewportLayoutId ? LayoutManagerInstance.getLayout(viewportLayoutId) : null;\n\n useLayoutEffect(() => {\n const element = elementRef.current;\n if (!element || !layoutId) {\n return;\n }\n\n const viewportLayoutId = LayoutManagerInstance.registerLayout(layoutId, element);\n\n return () => {\n LayoutManagerInstance.unregisterLayout(viewportLayoutId);\n animationRef.current?.cancel();\n };\n }, []);\n\n useLayoutEffect(() => {\n const element = elementRef.current;\n if (!element || !viewportLayoutId) {\n return;\n }\n\n const currentLayout = LayoutManagerInstance.getLayout(viewportLayoutId);\n const previousLayout = layout;\n\n if (previousLayout && previousLayout.rect && currentLayout) {\n // cancel any existing animation\n if (animationRef.current) {\n animationRef.current.cancel();\n }\n\n // FLIP\n const deltaX = previousLayout.rect.left - currentLayout.rect.left;\n const deltaY = previousLayout.rect.top - currentLayout.rect.top;\n const deltaScaleX = previousLayout.rect.width / currentLayout.rect.width;\n const deltaScaleY = previousLayout.rect.height / currentLayout.rect.height;\n\n const previousTransformOrigin = element.style.transformOrigin;\n const nextTransformOrigin = configRef.current.origin;\n\n if (previousTransformOrigin !== nextTransformOrigin && nextTransformOrigin) {\n element.style.transformOrigin = nextTransformOrigin;\n }\n\n animationRef.current = element.animate(\n [\n {\n transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaScaleX}, ${deltaScaleY})`,\n offset: 0,\n },\n {\n transform: \"translate(0px, 0px) scale(1, 1)\",\n offset: 1,\n },\n ],\n {\n duration: configRef.current.duration,\n easing: configRef.current.easing,\n fill: \"both\",\n },\n );\n\n if (animationRef.current.playState === \"idle\") {\n animationRef.current.addEventListener(\"start\", onAnimationStart);\n }\n else {\n onAnimationStart();\n }\n\n if (animationRef.current.playState === \"finished\") {\n onAnimationFinish();\n }\n else {\n animationRef.current.addEventListener(\"finish\", onAnimationFinish);\n }\n }\n }, []);\n\n return elementRef;\n}\n","import type { AnimationPhase, MotionConfig } from \"../types\";\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\";\n\nexport enum MotionState {\n INITIAL = \"initial\",\n ANIMATE = \"animate\",\n EXIT = \"exit\",\n}\n\nconst DefaultMotionConfig: MotionConfig = {\n transitions: {\n enter: { duration: 300, easing: \"cubic-bezier(0.25, 0.1, 0.25, 1)\" },\n exit: { duration: 200, easing: \"ease-out\" },\n },\n};\n\nfunction createTransformString(phase: AnimationPhase): string {\n const transforms: string[] = [];\n\n if (phase.scale !== undefined)\n transforms.push(`scale(${phase.scale})`);\n if (phase.x !== undefined)\n transforms.push(`translateX(${phase.x}px)`);\n if (phase.y !== undefined)\n transforms.push(`translateY(${phase.y}px)`);\n if (phase.rotate !== undefined)\n transforms.push(`rotate(${phase.rotate}deg)`);\n\n return transforms.join(\" \");\n}\n\nfunction phaseToKeyframe(phase: AnimationPhase): any {\n const keyframe: any = {};\n\n const transform = createTransformString(phase);\n if (transform)\n keyframe.transform = transform;\n\n Object.entries(phase).forEach(([key, value]) => {\n if (![\"scale\", \"x\", \"y\", \"rotate\"].includes(key)) {\n keyframe[key] = value;\n }\n });\n\n return keyframe;\n}\n\nexport function useMotionAnimation<T extends HTMLElement>(\n elementRef: React.RefObject<T | null>,\n config?: MotionConfig,\n) {\n const animationRef = useRef<Animation | null>(null);\n const [currentState, setCurrentState] = useState<MotionState>(MotionState.INITIAL);\n const configRef = useRef({ ...DefaultMotionConfig, ...config });\n const finishHandlerRef = useRef<(() => void) | null>(null);\n\n const cleanup = useCallback(() => {\n if (animationRef.current) {\n if (finishHandlerRef.current) {\n animationRef.current.removeEventListener(\"finish\", finishHandlerRef.current);\n finishHandlerRef.current = null;\n }\n animationRef.current.cancel();\n animationRef.current = null;\n }\n }, []);\n\n useLayoutEffect(() => {\n if (!elementRef.current)\n return;\n\n const element = elementRef.current;\n const motionConfig = configRef.current;\n\n if (motionConfig.phases?.initial) {\n const initialKeyframe = phaseToKeyframe(motionConfig.phases.initial);\n Object.assign(element.style, initialKeyframe);\n }\n\n if (motionConfig.phases?.animate) {\n const enterConfig = motionConfig.transitions?.enter;\n\n const keyframes = [\n motionConfig.phases.initial ? phaseToKeyframe(motionConfig.phases.initial) : {},\n phaseToKeyframe(motionConfig.phases.animate),\n ];\n\n cleanup();\n\n animationRef.current = element.animate(keyframes, {\n duration: enterConfig?.duration || 300,\n easing: enterConfig?.easing || DefaultMotionConfig.transitions?.enter?.easing,\n delay: enterConfig?.delay || 0,\n fill: \"forwards\",\n });\n\n finishHandlerRef.current = () => {\n setCurrentState(MotionState.ANIMATE);\n finishHandlerRef.current = null;\n };\n\n animationRef.current.addEventListener(\"finish\", finishHandlerRef.current);\n }\n else {\n setCurrentState(MotionState.ANIMATE);\n }\n\n return cleanup;\n }, [cleanup]);\n\n useLayoutEffect(() => {\n configRef.current = { ...DefaultMotionConfig, ...config };\n }, [config]);\n\n const performExitAnimation = useCallback((): Promise<void> => {\n if (!elementRef.current)\n return Promise.resolve();\n\n return new Promise<void>((resolve) => {\n const element = elementRef.current!;\n const motionConfig = configRef.current;\n\n if (motionConfig.phases?.exit) {\n const exitConfig = motionConfig.transitions?.exit;\n const currentPhase = motionConfig.phases.animate || {};\n\n const keyframes = [\n phaseToKeyframe(currentPhase),\n phaseToKeyframe(motionConfig.phases.exit),\n ];\n\n cleanup();\n\n const animation = element.animate(keyframes, {\n duration: exitConfig?.duration || DefaultMotionConfig.transitions?.exit?.duration,\n easing: exitConfig?.easing || DefaultMotionConfig.transitions?.exit?.easing,\n delay: exitConfig?.delay,\n fill: \"forwards\",\n });\n\n const exitFinishHandler = () => {\n setCurrentState(MotionState.EXIT);\n animation.removeEventListener(\"finish\", exitFinishHandler);\n resolve();\n };\n\n animation.addEventListener(\"finish\", exitFinishHandler);\n\n animationRef.current = animation;\n }\n else {\n resolve();\n }\n });\n }, [cleanup]);\n\n return {\n currentState,\n performExitAnimation,\n };\n}\n","import type { AnimationPhase, MotionAnimationConfig, MotionConfig } from \"../types\";\n\nimport React, { useId } from \"react\";\nimport { useLayoutAnimation } from \"../hooks/useLayoutAnimation\";\nimport { useMotionAnimation } from \"../hooks/useMotionAnimation\";\n\ninterface MotionProps {\n layout?: boolean;\n layoutId?: string;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n as?: React.ElementType;\n\n initial?: AnimationPhase;\n animate?: AnimationPhase;\n exit?: AnimationPhase;\n\n transition?: MotionAnimationConfig;\n layoutTransition?: MotionAnimationConfig;\n\n onLayoutAnimationStart?: () => void;\n onLayoutAnimationComplete?: () => void;\n}\n\nexport function Motion({\n layout,\n layoutId: propLayoutId,\n children,\n style,\n className,\n as: Component = \"div\",\n initial,\n animate,\n exit,\n transition,\n layoutTransition,\n onLayoutAnimationStart,\n onLayoutAnimationComplete,\n ...props\n}: MotionProps): React.ReactNode {\n const motionConfig: MotionConfig = {\n phases: {\n initial,\n animate,\n exit,\n },\n transitions: {\n enter: transition,\n exit: transition,\n },\n };\n\n const internalLayoutId = useId();\n const layoutId = propLayoutId || (layout ? internalLayoutId : undefined);\n\n const elementRef = useLayoutAnimation<HTMLElement>(layoutId, layoutTransition, onLayoutAnimationStart, onLayoutAnimationComplete);\n useMotionAnimation(elementRef, motionConfig);\n\n return (\n <Component ref={elementRef} style={style} className={className} {...props}>\n {children}\n </Component>\n );\n}\n"],"names":["createContext","useId","useRef","_jsx","useContext","useMemo","useLayoutEffect","useState","useCallback"],"mappings":"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"}