chore: overhaul infrastructure and integrate @mintel packages
Some checks failed
🧪 CI (QA) / 🧪 Quality Assurance (push) Failing after 1m3s

- Restructure to pnpm monorepo (site moved to apps/web)
- Integrate @mintel/tsconfig, @mintel/eslint-config, @mintel/husky-config
- Implement Docker service architecture (Varnish, Directus, Gatekeeper)
- Setup environment-aware Gitea Actions deployment
This commit is contained in:
2026-02-05 14:18:51 +01:00
parent 190720ad92
commit 103d71851c
1029 changed files with 13242 additions and 27898 deletions

View File

@@ -0,0 +1,114 @@
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;

View File

@@ -0,0 +1,8 @@
import React from 'react';
const Image: React.FC<any> = ({ src, alt, ...props }) => {
// eslint-disable-next-line @next/next/no-img-element
return <img src={src} alt={alt} {...props} />;
};
export default Image;

View File

@@ -0,0 +1,20 @@
import React from 'react';
export const useRouter = () => ({
push: () => { },
replace: () => { },
prefetch: () => { },
back: () => { },
});
export const useSearchParams = () => {
return new URLSearchParams();
};
export const usePathname = () => '/';
export const Link: React.FC<{ href: string; children: React.ReactNode; className?: string }> = ({ children, className }) => {
return <div className={className}>{children}</div>;
};
export default Link;

View File

@@ -0,0 +1,5 @@
import React from 'react';
export const Reveal = ({ children }: { children: React.ReactNode }) => {
return <>{children}</>;
};