src/components/uiable/blocks/feature/feature-30/feature-30.tsx
"use client"
import { MouseEvent as ReactMouseEvent } from "react"
// shadcn
import { Card } from "@/components/ui/card"
// third-party
import { motion, useMotionTemplate, useMotionValue } from "framer-motion"
// assets
import { CreditCard, Bot, ArrowUpRight } from "lucide-react"
function SpotlightCard({
children,
hoverBorderClass,
glowColor,
borderGlowColor,
}: {
children: React.ReactNode
hoverBorderClass: string
glowColor: string
borderGlowColor: string
}) {
const mouseX = useMotionValue(0)
const mouseY = useMotionValue(0)
function handleMouseMove({
currentTarget,
clientX,
clientY,
}: ReactMouseEvent) {
const { left, top } = currentTarget.getBoundingClientRect()
mouseX.set(clientX - left)
mouseY.set(clientY - top)
}
return (
<Card
className={`group relative mb-0 flex h-full flex-col overflow-hidden border-white/10 bg-[#0B0F19] p-5 transition-colors sm:p-8 ${hoverBorderClass}`}
onMouseMove={handleMouseMove}
>
{/* Subtle Inner Glow */}
<motion.div
className="pointer-events-none absolute -inset-px z-0 opacity-0 transition duration-300 group-hover:opacity-100"
style={{
background: useMotionTemplate`
radial-gradient(
300px circle at ${mouseX}px ${mouseY}px,
${glowColor},
transparent 80%
)
`,
}}
/>
{/* Shine Border Glow */}
<motion.div
className="pointer-events-none absolute inset-0 z-0 rounded-xl opacity-0 transition duration-300 group-hover:opacity-100"
style={
{
background: useMotionTemplate`
radial-gradient(
250px circle at ${mouseX}px ${mouseY}px,
${borderGlowColor},
transparent 100%
)
`,
mask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
WebkitMask:
"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
WebkitMaskComposite: "xor",
maskComposite: "exclude",
padding: "2px",
} as any
}
/>
{children}
</Card>
)
}
export default function Feature30() {
return (
<section className="dark relative bg-slate-950 py-10 text-white md:py-12">
<div className="container mx-auto px-4">
<div className="mb-10 text-center md:mb-12">
<h2 className="mb-4 text-3xl font-bold tracking-tight text-white md:text-4xl">
Developer tools that matter
</h2>
</div>
<div className="grid grid-cols-1 items-stretch gap-6 lg:grid-cols-3">
{/* Card 1: MCP Support */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5 }}
className="flex h-full flex-col"
>
<SpotlightCard
hoverBorderClass="hover:border-red-500/50"
glowColor="rgba(239, 68, 68, 0.2)"
borderGlowColor="rgba(239, 68, 68, 1)"
>
<div className="relative z-10 mb-8">
<div className="mb-6 flex h-10 w-10 items-center justify-center rounded-xl border border-red-500/20 bg-red-500/10">
<CreditCard className="h-5 w-5 text-red-400" />
</div>
<h3 className="mb-2 text-xl font-bold text-white">
MCP Support
</h3>
<p className="text-sm text-gray-400">
Connect to any MCP server and extend your AI assistant with
your data and tools.
</p>
</div>
{/* MCP Terminal Mockup */}
<div className="relative z-10 mt-auto flex h-[200px] flex-col justify-between rounded-xl border border-white/5 bg-black/50 p-4 font-mono text-xs">
{/* Terminal top bar */}
<div className="flex items-center justify-between border-b border-white/5 pb-2 text-[11px] text-gray-500">
<div className="flex items-center gap-1.5">
<span className="h-2 w-2 rounded-full bg-red-500/70" />
<span className="h-2 w-2 rounded-full bg-yellow-500/70" />
<span className="h-2 w-2 rounded-full bg-green-500/70" />
</div>
<span className="font-mono text-[10px] text-gray-400">
mcp-server
</span>
</div>
{/* Commands and output */}
<div className="space-y-1.5 text-gray-400">
<div>
$ <span className="text-purple-400">npm</span>{" "}
<span className="text-blue-300">mcp connect database</span>
</div>
<div className="text-green-400">
✓ Connected to PostgreSQL
</div>
<div className="text-green-400">✓ Tools available (12)</div>
</div>
{/* Status footer */}
<div className="flex items-center justify-between border-t border-white/5 pt-2 text-[11px]">
<div className="flex items-center gap-2 text-green-400">
<span className="h-2 w-2 animate-pulse rounded-full bg-green-500" />
Connected
</div>
<span className="text-[10px] text-gray-500">
latency: 14ms
</span>
</div>
</div>
</SpotlightCard>
</motion.div>
{/* Card 2: Git Integration */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.1 }}
className="flex h-full flex-col"
>
<SpotlightCard
hoverBorderClass="hover:border-cyan-500/50"
glowColor="rgba(6, 182, 212, 0.2)"
borderGlowColor="rgba(6, 182, 212, 1)"
>
<div className="relative z-10 mb-8">
<div className="mb-6 flex h-10 w-10 items-center justify-center rounded-xl border border-cyan-500/20 bg-cyan-500/10">
<Bot className="h-5 w-5 text-cyan-400" />
</div>
<h3 className="mb-2 text-xl font-bold text-white">
Git Integration
</h3>
<p className="text-sm text-gray-400">
Push with your repos directly. Commit, review, and push with
confidence.
</p>
</div>
{/* Commit Mockup */}
<div className="relative z-10 mt-auto flex h-[200px] flex-col justify-between rounded-xl border border-white/5 bg-black/50 p-4">
<div>
<div className="mb-2.5 flex items-center justify-between">
<div className="text-sm font-medium text-white">
Changes
</div>
<div className="text-xs text-gray-400">2 files changed</div>
</div>
<div className="space-y-2 font-mono text-xs">
<div className="flex justify-between text-gray-300">
<span>src/utils/api.ts</span>
<span className="text-amber-400">modified</span>
</div>
<div className="flex justify-between text-gray-300">
<span>src/components/Card.tsx</span>
<span className="text-green-400">added</span>
</div>
</div>
</div>
<button className="w-full rounded-md bg-purple-600 py-2 text-sm font-medium text-white transition-colors hover:bg-purple-700 active:scale-[0.99]">
Commit & Push
</button>
</div>
</SpotlightCard>
</motion.div>
{/* Card 3: Secure by Design */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.2 }}
className="flex h-full flex-col"
>
<SpotlightCard
hoverBorderClass="hover:border-green-500/50"
glowColor="rgba(34, 197, 94, 0.2)"
borderGlowColor="rgba(34, 197, 94, 1)"
>
<div className="relative z-10 mb-8">
<div className="mb-6 flex h-10 w-10 items-center justify-center rounded-xl border border-green-500/20 bg-green-500/10">
<ArrowUpRight className="h-5 w-5 text-green-400" />
</div>
<h3 className="mb-2 text-xl font-bold text-white">
Secure by Design
</h3>
<p className="text-sm text-gray-400">
Enterprise-grade security to keep your code and data
protected.
</p>
</div>
{/* Security Mockup */}
<div className="relative z-10 mt-auto flex h-[200px] flex-col justify-between rounded-xl border border-white/5 bg-black/50 p-4">
{/* Security top bar */}
<div className="flex items-center justify-between border-b border-white/5 pb-2 text-xs">
<span className="font-medium text-white">
Security Checklist
</span>
<span className="flex items-center gap-1 rounded-full border border-green-500/20 bg-green-500/10 px-2 py-0.5 text-[10px] font-medium text-green-400">
<span className="h-1.5 w-1.5 rounded-full bg-green-400" />
100% Passed
</span>
</div>
{/* Security items list */}
<div className="space-y-2 text-xs text-gray-300">
<div className="flex items-center justify-between">
<span className="flex items-center gap-2">
<span className="text-green-400">✓</span> SOC 2 Type II
</span>
<span className="text-[10px] text-gray-400">Certified</span>
</div>
<div className="flex items-center justify-between">
<span className="flex items-center gap-2">
<span className="text-green-400">✓</span> End-to-end
encryption
</span>
<span className="text-[10px] text-gray-400">
256-bit AES
</span>
</div>
<div className="flex items-center justify-between">
<span className="flex items-center gap-2">
<span className="text-green-400">✓</span> Role-based
access
</span>
<span className="text-[10px] text-gray-400">Enforced</span>
</div>
<div className="flex items-center justify-between">
<span className="flex items-center gap-2">
<span className="text-green-400">✓</span> SSO & 2FA
</span>
<span className="text-[10px] text-gray-400">Enabled</span>
</div>
</div>
</div>
</SpotlightCard>
</motion.div>
</div>
</div>
</section>
)
}
































