'use client';
import * as React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
type Props = {
className?: string; // e.g. "w-full h-72"
bg?: string; // default white
};
/** Palette */
const ACCENT = '#00b8db';
const STROKE = '#111827'; // black-ish
const GRAY = '#9CA3AF';
const GRAY_LT = '#E5E7EB';
function Laptop({ x, y }: { x: number; y: number }) {
return (
{/* screen */}
{/* base */}
);
}
function ServerStack({ x, y }: { x: number; y: number }) {
return (
{[0, 1, 2].map((i) => (
))}
{/* tiny rack base */}
);
}
function Cloud({ x, y }: { x: number; y: number }) {
return (
);
}
function Arrow({ d, delay = 0 }: { d: string; delay?: number }) {
return (
);
}
/** Small packet traveling along keyframe x/y arrays */
function Packet({
xs,
ys,
delay = 0,
color = ACCENT,
duration = 2.2,
}: {
xs: number[];
ys: number[];
delay?: number;
color?: string;
duration?: number;
}) {
const prefersReduced = useReducedMotion();
return (
);
}
export default function ProxyForwarding({ className, bg = '#ffffff' }: Props) {
const W = 1000;
const H = 420;
// Key points
const C1 = { x: 140, y: 90 };
const C2 = { x: 140, y: 210 };
const C3 = { x: 140, y: 330 };
const PROXY = { x: 420, y: 210 };
const CLOUD = { x: 640, y: 210 };
const DEST = { x: 860, y: 210 };
return (
);
}