Files
Skyheal/app/devices/page.tsx
T

328 lines
13 KiB
TypeScript
Raw Normal View History

2026-01-22 11:32:41 +05:30
"use client";
import Navbar from "../components/layout/Navbar";
import Footer from "../components/layout/Footer";
2026-01-22 15:43:18 +05:30
import { motion } from "framer-motion";
import {
Activity,
Droplet,
Baby,
Scale,
Bluetooth,
ShieldCheck,
2026-01-22 18:33:46 +05:30
Cpu,
Zap,
CheckCircle2,
ArrowUpRight,
2026-01-22 15:43:18 +05:30
} from "lucide-react";
interface DeviceItem {
title: string;
subtitle: string;
description: string;
highlights: string[];
specs: string[];
icon: React.ComponentType<React.SVGProps<SVGSVGElement>>;
}
function DeviceCard({ item, index }: { item: DeviceItem; index: number }) {
return (
<motion.div
2026-01-22 18:33:46 +05:30
initial={{ opacity: 0, y: 30 }}
2026-01-22 15:43:18 +05:30
whileInView={{ opacity: 1, y: 0 }}
2026-01-22 18:33:46 +05:30
transition={{ duration: 0.6, delay: index * 0.1, ease: "easeOut" }}
viewport={{ once: true, margin: "-50px" }}
className="group relative h-full"
2026-01-22 15:43:18 +05:30
>
2026-01-22 18:33:46 +05:30
{/* Card Container */}
<div className="
relative h-full flex flex-col
bg-zinc-950/40 backdrop-blur-md
border border-white/5 rounded-3xl
overflow-hidden
transition-all duration-500
hover:border-cyan-500/30 hover:bg-zinc-900/60
hover:shadow-[0_0_40px_-10px_rgba(6,182,212,0.15)]
">
{/* Hover Gradient Overlay */}
<div className="absolute inset-0 bg-gradient-to-b from-cyan-500/5 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none" />
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
{/* Content Wrapper */}
<div className="p-6 sm:p-8 flex flex-col h-full relative z-10">
{/* Header Section */}
<div className="flex items-start justify-between mb-6">
<div className="
w-12 h-12 sm:w-14 sm:h-14 rounded-2xl
bg-zinc-900/80 border border-white/10
flex items-center justify-center
group-hover:scale-110 group-hover:border-cyan-500/30 group-hover:bg-cyan-950/30
transition-all duration-500
">
<item.icon className="w-6 h-6 sm:w-7 sm:h-7 text-zinc-400 group-hover:text-cyan-400 transition-colors duration-300" />
</div>
{/* Corner Action Icon */}
<div className="opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-300">
<ArrowUpRight className="w-5 h-5 text-zinc-500 group-hover:text-cyan-400" />
</div>
2026-01-22 15:43:18 +05:30
</div>
2026-01-22 18:33:46 +05:30
<div className="mb-4">
<h3 className="text-xl sm:text-2xl font-bold text-white tracking-tight mb-1 group-hover:text-cyan-100 transition-colors">
2026-01-22 15:43:18 +05:30
{item.title}
</h3>
2026-01-22 18:33:46 +05:30
<p className="text-xs sm:text-sm font-medium text-cyan-600/80 uppercase tracking-wider">
2026-01-22 15:43:18 +05:30
{item.subtitle}
</p>
</div>
2026-01-22 18:33:46 +05:30
<p className="text-sm sm:text-base text-zinc-400 leading-relaxed mb-6 flex-grow">
{item.description}
</p>
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
{/* Divider */}
<div className="h-px w-full bg-white/5 mb-6 group-hover:bg-cyan-500/20 transition-colors duration-500" />
{/* Specs Grid (Compact) */}
<div className="space-y-4">
<div className="grid grid-cols-2 gap-3">
{item.highlights.slice(0, 4).map((highlight, i) => ( // Show first 4
<div key={i} className="flex items-start gap-2">
<CheckCircle2 className="w-3.5 h-3.5 text-cyan-500/70 mt-0.5 shrink-0" />
<span className="text-xs text-zinc-300 font-medium">{highlight}</span>
</div>
))}
2026-01-22 15:43:18 +05:30
</div>
2026-01-22 18:33:46 +05:30
{/* Technical Chips */}
<div className="flex flex-wrap gap-2 pt-2">
{item.specs.slice(0, 3).map((spec, i) => (
<span key={i} className="
px-2.5 py-1 rounded-md text-[10px] uppercase tracking-wide font-bold
bg-white/5 border border-white/5 text-zinc-500
group-hover:border-cyan-500/20 group-hover:text-cyan-400/80 group-hover:bg-cyan-950/20
transition-all duration-300
">
{spec}
</span>
))}
</div>
</div>
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
</div>
2026-01-22 15:43:18 +05:30
</div>
</motion.div>
);
}
2026-01-22 11:32:41 +05:30
2026-01-22 18:33:46 +05:30
export default function DeviceShowcase() {
2026-01-22 15:43:18 +05:30
const devices: DeviceItem[] = [
{
title: "Multi-Vital Monitor",
2026-01-22 18:33:46 +05:30
subtitle: "Hemodynamics",
description: "Clinical-grade core vital signs measurement with validated algorithms and secure wireless pairing.",
highlights: ["±0.1°C accuracy", "±2% SpO₂", "±3 mmHg NIBP", "Resp. Rate"],
specs: ["BT 5.2 LE", "IEC 60601", "IP54"],
2026-01-22 15:43:18 +05:30
icon: Activity,
},
{
2026-01-22 18:33:46 +05:30
title: "Metabolic Analyzer",
subtitle: "Blood Chemistry",
description: "Fast point-of-care testing from a single micro-sample with temperature compensation.",
highlights: ["5s Result", "±5 mg/dL Glu", "HCT Corrected", "Ketone Check"],
specs: ["Micro-fluidic", "NFC Sync", "Auto-Cal"],
2026-01-22 15:43:18 +05:30
icon: Droplet,
},
{
2026-01-22 18:33:46 +05:30
title: "Fetal Doppler",
subtitle: "Maternity Care",
description: "High-sensitivity fetal heart rate detection with audio output and waveform recording.",
highlights: ["50240 BPM", "3 MHz Probe", "Auto-Record", "Noise Cancel"],
specs: ["Ultrasonic", "FDA Cleared", "Type-C"],
2026-01-22 15:43:18 +05:30
icon: Baby,
},
{
2026-01-22 18:33:46 +05:30
title: "Precision Scale",
subtitle: "Biometrics",
description: "High-accuracy weighing platform with body composition analysis for clinical follow-up.",
highlights: ["50g Resolution", "Bio-Impedance", "Muscle/Fat %", "Water Mass"],
specs: ["Tempered Glass", "Strain Gauge", "WiFi"],
2026-01-22 15:43:18 +05:30
icon: Scale,
},
2026-01-22 18:33:46 +05:30
{
title: "Digital Otoscope",
subtitle: "ENT Imaging",
description: "HD video capture of the ear canal and tympanic membrane with AI diagnostic support.",
highlights: ["1080p Video", "100x Zoom", "Auto-Focus", "LED Ring"],
specs: ["WiFi Direct", "Macro Lens", "IP67"],
icon: Zap, // Using Zap as placeholder for Otoscope/Light
},
{
title: "ECG Patch",
subtitle: "Cardiology",
description: "Wearable continuous heart monitoring with arrhythmia detection and cloud sync.",
highlights: ["7-Day Battery", "Lead II", "Afib Alert", "Waterproof"],
specs: ["Bluetooth 5.0", "Medical Adhesive", "24/7"],
icon: Cpu,
},
2026-01-22 15:43:18 +05:30
];
2026-01-22 11:32:41 +05:30
2026-01-22 15:43:18 +05:30
return (
2026-01-22 18:33:46 +05:30
<div className="min-h-screen text-zinc-100 relative bg-[#05080f] font-sans selection:bg-cyan-500/30">
{/* ====================== Animated Background Layers ====================== */}
<div className="fixed inset-0 pointer-events-none overflow-hidden z-0">
{/* Base Gradient */}
<div className="absolute inset-0 bg-gradient-to-b from-[#05080f] via-[#090c15] to-[#05080f]" />
{/* Radial Center Glow */}
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-full h-[800px] bg-[radial-gradient(circle_at_center,rgba(6,182,212,0.08),transparent_60%)]" />
2026-01-22 11:32:41 +05:30
2026-01-22 18:33:46 +05:30
{/* Animated Rings (Responsive Sizes) */}
<div className="absolute inset-0 flex items-center justify-center opacity-30">
<motion.div
animate={{ rotate: 360 }}
transition={{ duration: 120, repeat: Infinity, ease: "linear" }}
className="w-[800px] h-[800px] border border-cyan-900/20 rounded-full border-dashed"
/>
<motion.div
animate={{ rotate: -360 }}
transition={{ duration: 80, repeat: Infinity, ease: "linear" }}
className="absolute w-[600px] h-[600px] border border-cyan-500/5 rounded-full"
/>
<motion.div
animate={{ scale: [1, 1.1, 1], opacity: [0.1, 0.3, 0.1] }}
transition={{ duration: 8, repeat: Infinity, ease: "easeInOut" }}
className="absolute w-[400px] h-[400px] bg-cyan-500/5 rounded-full blur-3xl"
/>
2026-01-22 11:32:41 +05:30
</div>
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
{/* Floating Particles */}
2026-01-22 15:43:18 +05:30
<div className="absolute inset-0">
2026-01-22 18:33:46 +05:30
{[...Array(12)].map((_, i) => (
<motion.div
key={i}
className="absolute w-1 h-1 bg-cyan-400/40 rounded-full"
style={{
top: `${Math.random() * 100}%`,
left: `${Math.random() * 100}%`,
}}
animate={{
y: [0, -100],
opacity: [0, 1, 0],
scale: [0, 1.5, 0]
}}
transition={{
duration: Math.random() * 5 + 5,
repeat: Infinity,
delay: Math.random() * 5,
ease: "linear"
}}
/>
))}
2026-01-22 15:43:18 +05:30
</div>
</div>
{/* ====================== Main Content ====================== */}
2026-01-22 18:33:46 +05:30
<div className="relative z-10 flex flex-col min-h-screen">
2026-01-22 15:43:18 +05:30
<Navbar />
2026-01-22 18:33:46 +05:30
<main className="flex-grow pt-32 pb-32 sm:pt-40 sm:pb-40">
{/* Container limits width, scales for 4K */}
<div className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl 2xl:max-w-[1800px]">
{/* --- Hero Header --- */}
<div className="flex flex-col items-center text-center max-w-4xl 2xl:max-w-5xl mx-auto mb-20 lg:mb-28">
{/* Badge */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="inline-flex items-center gap-2 px-4 py-2 rounded-full border border-cyan-500/20 bg-cyan-950/10 backdrop-blur-md text-cyan-400 text-xs font-bold tracking-wider uppercase mb-8 shadow-[0_0_20px_-5px_rgba(6,182,212,0.3)]"
>
<Bluetooth className="w-4 h-4" />
<span>IoT Ecosystem</span>
</motion.div>
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
{/* Title */}
<motion.h1
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: 0.1 }}
className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl 2xl:text-8xl font-bold tracking-tight text-white leading-[1.1] mb-6"
>
Clinical <span className="text-transparent bg-clip-text bg-gradient-to-r from-cyan-400 to-blue-600">Hardware</span> Suite
</motion.h1>
2026-01-22 15:43:18 +05:30
2026-01-22 18:33:46 +05:30
{/* Subtitle */}
<motion.p
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: 0.2 }}
className="text-lg sm:text-xl 2xl:text-2xl text-zinc-400 max-w-2xl 2xl:max-w-3xl leading-relaxed"
>
Seamlessly connected diagnostic devices designed for accuracy, speed, and institutional interoperability.
</motion.p>
2026-01-22 15:43:18 +05:30
</div>
2026-01-22 18:33:46 +05:30
{/* --- Devices Grid --- */}
{/* 1 col mobile, 2 col tablet, 3 col laptop, 4 col ultra-wide */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-6 lg:gap-8 2xl:gap-10">
2026-01-22 15:43:18 +05:30
{devices.map((device, i) => (
<DeviceCard key={device.title} item={device} index={i} />
))}
</div>
2026-01-22 18:33:46 +05:30
{/* --- Bottom Feature: Security --- */}
2026-01-22 15:43:18 +05:30
<motion.div
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.4 }}
viewport={{ once: true }}
2026-01-22 18:33:46 +05:30
className="mt-32 2xl:mt-48"
2026-01-22 15:43:18 +05:30
>
2026-01-22 18:33:46 +05:30
<div className="
relative overflow-hidden rounded-3xl
bg-gradient-to-br from-zinc-900/80 to-zinc-950/80 backdrop-blur-xl
border border-white/5
p-8 md:p-12 lg:p-16
flex flex-col lg:flex-row items-center gap-10 lg:gap-16
">
{/* Decoration */}
<div className="absolute top-0 right-0 w-64 h-64 bg-cyan-500/10 blur-[100px] pointer-events-none" />
2026-01-22 15:43:18 +05:30
<div className="
2026-01-22 18:33:46 +05:30
shrink-0 w-20 h-20 sm:w-24 sm:h-24 rounded-3xl
bg-gradient-to-br from-cyan-500/10 to-blue-500/10
border border-cyan-500/20
flex items-center justify-center
shadow-[0_0_40px_-10px_rgba(6,182,212,0.2)]
2026-01-22 15:43:18 +05:30
">
2026-01-22 18:33:46 +05:30
<ShieldCheck className="w-10 h-10 sm:w-12 sm:h-12 text-cyan-400" />
2026-01-22 15:43:18 +05:30
</div>
2026-01-22 18:33:46 +05:30
<div className="text-center lg:text-left space-y-4 max-w-4xl">
<h2 className="text-2xl sm:text-3xl lg:text-4xl font-bold text-white tracking-tight">
Enterprise-Grade Compliance
2026-01-22 15:43:18 +05:30
</h2>
2026-01-22 18:33:46 +05:30
<p className="text-base sm:text-lg text-zinc-400 leading-relaxed">
Built for the modern hospital. Our devices comply with <span className="text-cyan-200">IEC 60601</span> and <span className="text-cyan-200">HIPAA</span> standards.
End-to-end encryption ensures patient data remains secure from the sensor to the cloud.
2026-01-22 15:43:18 +05:30
</p>
</div>
</div>
</motion.div>
2026-01-22 18:33:46 +05:30
2026-01-22 15:43:18 +05:30
</div>
</main>
<Footer />
</div>
</div>
);
}