Pulastya B
feat: Initial commit - Data Science Agent with React frontend and FastAPI backend
226ac39
import React from "react";
import { motion } from "framer-motion";
import { ArrowRight } from "lucide-react";
import { cn } from "../lib/utils";
function FloatingPaths({ position }: { position: number }) {
const paths = Array.from({ length: 36 }, (_, i) => ({
id: i,
d: `M-${380 - i * 5 * position} -${189 + i * 6}C-${
380 - i * 5 * position
} -${189 + i * 6} -${312 - i * 5 * position} ${216 - i * 6} ${
152 - i * 5 * position
} ${343 - i * 6}C${616 - i * 5 * position} ${470 - i * 6} ${
684 - i * 5 * position
} ${875 - i * 6} ${684 - i * 5 * position} ${875 - i * 6}`,
color: `rgba(99,102,241,${0.05 + i * 0.01})`, // Using indigo-500 tint
width: 0.5 + i * 0.03,
}));
return (
<div className="absolute inset-0 pointer-events-none">
<svg
className="w-full h-full text-indigo-500/20"
viewBox="0 0 696 316"
fill="none"
>
<title>Background Paths</title>
{paths.map((path) => (
<motion.path
key={path.id}
d={path.d}
stroke="currentColor"
strokeWidth={path.width}
strokeOpacity={0.1 + path.id * 0.02}
initial={{ pathLength: 0.3, opacity: 0.4 }}
animate={{
pathLength: 1,
opacity: [0.2, 0.5, 0.2],
pathOffset: [0, 1, 0],
}}
transition={{
duration: 15 + Math.random() * 10,
repeat: Number.POSITIVE_INFINITY,
ease: "linear",
}}
/>
))}
</svg>
</div>
);
}
export function BackgroundPaths({
title = "The Future is Autonomous",
subtitle = "Scale your data engineering and predictive modeling beyond human limits.",
}: {
title?: string;
subtitle?: string;
}) {
const words = title.split(" ");
return (
<section className="relative min-h-[80vh] w-full flex items-center justify-center overflow-hidden bg-[#030303]">
<div className="absolute inset-0">
<FloatingPaths position={1} />
<FloatingPaths position={-1} />
</div>
<div className="relative z-10 container mx-auto px-4 md:px-6 text-center">
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 2 }}
className="max-w-4xl mx-auto"
>
<h2 className="text-5xl sm:text-6xl md:text-8xl font-extrabold mb-8 tracking-tighter">
{words.map((word, wordIndex) => (
<span
key={wordIndex}
className="inline-block mr-4 last:mr-0"
>
{word.split("").map((letter, letterIndex) => (
<motion.span
key={`${wordIndex}-${letterIndex}`}
initial={{ y: 50, opacity: 0 }}
whileInView={{ y: 0, opacity: 1 }}
viewport={{ once: true }}
transition={{
delay:
wordIndex * 0.1 +
letterIndex * 0.02,
type: "spring",
stiffness: 150,
damping: 25,
}}
className="inline-block text-transparent bg-clip-text
bg-gradient-to-r from-white via-white/90 to-white/70"
>
{letter}
</motion.span>
))}
</span>
))}
</h2>
<motion.p
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: 0.5 }}
className="text-white/40 text-xl font-medium mb-12 max-w-2xl mx-auto tracking-tight"
>
{subtitle}
</motion.p>
<motion.div
initial={{ opacity: 0, scale: 0.9 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ delay: 0.8 }}
className="inline-block group relative bg-gradient-to-b from-white/10 to-indigo-500/10
p-px rounded-2xl backdrop-blur-lg
overflow-hidden shadow-lg hover:shadow-indigo-500/20 transition-all duration-300"
>
<button
className="rounded-[1.15rem] px-10 py-5 text-lg font-bold backdrop-blur-md
bg-white/95 hover:bg-white text-black transition-all duration-300
group-hover:-translate-y-0.5 border border-white/10
flex items-center gap-3"
>
<span className="opacity-90 group-hover:opacity-100 transition-opacity">
Deploy Your First Agent
</span>
<ArrowRight
className="w-5 h-5 opacity-70 group-hover:opacity-100 group-hover:translate-x-1.5
transition-all duration-300"
/>
</button>
</motion.div>
</motion.div>
</div>
{/* Subtle glow effect at the bottom */}
<div className="absolute bottom-0 left-1/2 -translate-x-1/2 w-full h-px bg-gradient-to-r from-transparent via-indigo-500/50 to-transparent shadow-[0_0_50px_2px_rgba(99,102,241,0.2)]" />
</section>
);
}