UNPKG

@oku-ui/motion

Version:

A tiny, performant animation library for VueJS

76 lines (75 loc) 2.64 kB
import { PrimitiveProps } from '@oku-ui/primitives'; import { DOMKeyframesDefinition, DynamicAnimationOptions } from 'framer-motion'; import { animate } from 'framer-motion/dom'; import { CSSProperties, Reactive } from 'vue'; import { MotionState } from './motion-state'; import { SvgElementName } from '../components/utils'; type AnimationPlaybackControls = ReturnType<typeof animate>; export interface Variant extends DOMKeyframesDefinition { transition?: DynamicAnimationOptions; } type MarginValue = `${number}${'px' | '%'}`; type MarginType = MarginValue | `${MarginValue} ${MarginValue}` | `${MarginValue} ${MarginValue} ${MarginValue}` | `${MarginValue} ${MarginValue} ${MarginValue} ${MarginValue}`; export interface InViewOptions { root?: Element | Document; margin?: MarginType; amount?: 'some' | 'all' | number; } export interface Options { id?: string; inViewOptions?: InViewOptions & { once?: boolean; }; inView?: string | Variant; press?: string | Variant; hover?: string | Variant; initial?: string | Variant | boolean; animate?: string | Variant; exit?: string | Variant; variants?: { [k: string]: Variant; }; transition?: DynamicAnimationOptions; style?: CSSProperties; isDefaultTransition?: boolean | undefined; onMotionStart?: (target: DOMKeyframesDefinition) => void; onMotionComplete?: (target: DOMKeyframesDefinition) => void; onHoverStart?: (e: PointerEvent) => void; onHoverEnd?: (e: PointerEvent) => void; onPressStart?: (e: PointerEvent) => void; onPressEnd?: (e: PointerEvent) => void; onViewEnter?: (target: Element) => void; onViewLeave?: (target: Element) => void; } export interface MotionStateContext { initial?: string; animate?: string; inView?: string; hover?: string; press?: string; exit?: string; } export type AnimationFactory = () => AnimationPlaybackControls | undefined; export interface CssPropertyDefinition { syntax: `<${string}>`; initialValue: string | number; toDefaultUnit: (v: number) => string | number; } export type CssPropertyDefinitionMap = { [key: string]: CssPropertyDefinition; }; export interface MotionProps extends Options { as?: PrimitiveProps['as'] | SvgElementName; style?: CSSProperties; hover?: Options['hover']; press?: Options['press']; inView?: Options['inView']; inViewOptions?: Options['inViewOptions']; id?: string; } export type MountedStates = Reactive<Map<string, { element: Element; state: MotionState; animations: AnimationPlaybackControls[]; }>>; export {};