Files
mintel.me/apps/web/video/mocks/framer-motion.tsx
Marc Mintel 498db2a42c
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 8s
Build & Deploy / 🏗️ Build (push) Failing after 36s
Build & Deploy / 🧪 QA (push) Failing after 1m56s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
feat(ui): refine ROI calculator for B2B lead-gen and niche traffic
2026-02-22 17:04:45 +01:00

147 lines
4.2 KiB
TypeScript

import React from "react";
// ULTRA-CRITICAL ANIMATION KILLER
// This mock covers all possible Framer Motion V12 entry points
// and forces absolute determinism on both HTML and SVG elements.
const createMotionComponent = (Tag: string) => {
const Component = React.forwardRef(
(
{
children,
style,
animate,
initial,
_whileHover,
_whileTap,
_transition,
_layout,
_layoutId,
_variants,
...props
}: any,
ref,
) => {
// 1. Resolve State
// If animate is a string (variant), we try to find it in variants,
// but since we want to be deterministic, we just ignore variants for now
// to avoid complex logic. We assume the component state is driven by props.
// 2. Resolve Attributes (for SVG)
// Framer motion allows animating SVG attributes like 'r', 'cx' directly.
// We must spread 'animate' into the props to snap them.
const resolvedProps = { ...props };
if (typeof animate === "object" && !Array.isArray(animate)) {
Object.assign(resolvedProps, animate);
} else if (Array.isArray(animate)) {
// Handle keyframes by taking the first one
Object.assign(resolvedProps, animate[0]);
}
// 3. Resolve Style
const combinedStyle = {
...style,
...(typeof initial === "object" && !Array.isArray(initial)
? initial
: {}),
...(typeof animate === "object" && !Array.isArray(animate)
? animate
: {}),
};
// Final cleaning of motion-specific props that shouldn't leak to DOM
const {
_viewport,
transition: __t,
_onAnimationStart,
_onAnimationComplete,
_onUpdate,
_onPan,
_onPanStart,
_onPanEnd,
_onPanSessionStart,
_onTap,
_onTapStart,
_onTapCancel,
_onHoverStart,
_onHoverEnd,
...domProps
} = resolvedProps;
return (
<Tag
ref={ref}
{...domProps}
style={combinedStyle}
data-framer-captured="true"
>
{children}
</Tag>
);
},
);
Component.displayName = `motion.${Tag}`;
return Component;
};
export const motion: any = {
div: createMotionComponent("div"),
button: createMotionComponent("button"),
h1: createMotionComponent("h1"),
h2: createMotionComponent("h2"),
h3: createMotionComponent("h3"),
h4: createMotionComponent("h4"),
p: createMotionComponent("p"),
span: createMotionComponent("span"),
section: createMotionComponent("section"),
nav: createMotionComponent("nav"),
svg: createMotionComponent("svg"),
path: createMotionComponent("path"),
circle: createMotionComponent("circle"),
rect: createMotionComponent("rect"),
line: createMotionComponent("line"),
polyline: createMotionComponent("polyline"),
polygon: createMotionComponent("polygon"),
ellipse: createMotionComponent("ellipse"),
g: createMotionComponent("g"),
a: createMotionComponent("a"),
li: createMotionComponent("li"),
ul: createMotionComponent("ul"),
};
export const m = motion;
export const AnimatePresence = ({ children }: any) => <>{children}</>;
export const MotionConfig = ({ children }: any) => <>{children}</>;
export const LayoutGroup = ({ children }: any) => <>{children}</>;
export const LazyMotion = ({ children }: any) => <>{children}</>;
export const useAnimation = () => ({
start: () => Promise.resolve(),
set: () => {},
stop: () => {},
mount: () => {},
});
export const useInView = () => true;
export const useScroll = () => ({
scrollYProgress: {
get: () => 0,
onChange: () => () => {},
getVelocity: () => 0,
},
scrollY: { get: () => 0, onChange: () => () => {}, getVelocity: () => 0 },
});
export const useTransform = (_value: any, _from: any[], to: any[]) => to[0];
export const useSpring = (value: any) => value;
export const useCycle = (...args: any[]) => [args[0], () => {}];
export const useIsPresent = () => true;
export const useReducedMotion = () => true;
export const useAnimationControls = useAnimation;
export const usePresence = () => [true, null];
export const isValidMotionProp = () => true;
export default motion;