"use client" import type React from "react" import { useState, useEffect } from "react" import { Button } from "./ui/button" import { Dialog, DialogContent } from "./ui/dialog" import { ChevronLeft, ChevronRight, X, Sparkles, LayoutDashboard, HardDrive, Network, Box, Cpu, FileText, Rocket, } from "lucide-react" import Image from "next/image" interface OnboardingSlide { id: number title: string description: string image?: string icon: React.ReactNode gradient: string } const slides: OnboardingSlide[] = [ { id: 0, title: "¡Bienvenido a ProxMenux Monitor!", description: "Tu nueva herramienta de monitoreo profesional para Proxmox. Descubre todas las funcionalidades que te ayudarán a gestionar y supervisar tu infraestructura de manera eficiente.", icon: , gradient: "from-blue-500 via-purple-500 to-pink-500", }, { id: 1, title: "Vista General del Sistema", description: "Monitorea en tiempo real el estado de tu servidor: CPU, memoria, temperatura, carga del sistema y más. Todo en un dashboard intuitivo y fácil de entender.", image: "/images/onboarding/imagen1.png", icon: , gradient: "from-blue-500 to-cyan-500", }, { id: 2, title: "Gestión de Almacenamiento", description: "Visualiza el estado de todos tus discos y volúmenes. Información detallada de capacidad, uso, salud SMART, temperatura y rendimiento de cada dispositivo de almacenamiento.", image: "/images/onboarding/imagen2.png", icon: , gradient: "from-cyan-500 to-teal-500", }, { id: 3, title: "Métricas de Red", description: "Supervisa el tráfico de red en tiempo real. Estadísticas de ancho de banda, interfaces activas, velocidades de transferencia y gráficos históricos de uso.", image: "/images/onboarding/imagen3.png", icon: , gradient: "from-teal-500 to-green-500", }, { id: 4, title: "Máquinas Virtuales y Contenedores", description: "Gestiona todas tus VMs y contenedores LXC desde un solo lugar. Estado, recursos asignados, uso actual y controles rápidos para cada máquina virtual.", image: "/images/onboarding/imagen4.png", icon: , gradient: "from-green-500 to-emerald-500", }, { id: 5, title: "Información de Hardware", description: "Detalles completos del hardware de tu servidor: CPU, memoria RAM, GPU, discos, red, SAI y más. Especificaciones técnicas, modelos, números de serie y estado de cada componente.", image: "/images/onboarding/imagen5.png", icon: , gradient: "from-emerald-500 to-blue-500", }, { id: 6, title: "Logs del Sistema", description: "Accede a los registros del sistema en tiempo real. Filtra por tipo de evento, busca errores específicos y mantén un seguimiento completo de la actividad de tu servidor.", image: "/images/onboarding/imagen6.png", icon: , gradient: "from-blue-500 to-indigo-500", }, { id: 7, title: "¡Preparado para el Futuro!", description: "ProxMenux Monitor está en constante evolución. Próximamente: alertas personalizadas, notificaciones push, integración con Telegram/Discord, reportes automáticos y muchas más funcionalidades.", icon: , gradient: "from-indigo-500 via-purple-500 to-pink-500", }, ] export function OnboardingCarousel() { const [open, setOpen] = useState(false) const [currentSlide, setCurrentSlide] = useState(0) const [direction, setDirection] = useState<"next" | "prev">("next") useEffect(() => { const hasSeenOnboarding = localStorage.getItem("proxmenux-onboarding-seen") if (!hasSeenOnboarding) { setOpen(true) } }, []) const handleNext = () => { if (currentSlide < slides.length - 1) { setDirection("next") setCurrentSlide(currentSlide + 1) } else { handleComplete() } } const handlePrev = () => { if (currentSlide > 0) { setDirection("prev") setCurrentSlide(currentSlide - 1) } } const handleSkip = () => { setOpen(false) } const handleComplete = () => { localStorage.setItem("proxmenux-onboarding-seen", "true") setOpen(false) } const handleDotClick = (index: number) => { setDirection(index > currentSlide ? "next" : "prev") setCurrentSlide(index) } const slide = slides[currentSlide] return (
{/* Close button */} {/* Gradient header */}
{/* Icon or Image */}
{slide.image ? (
{slide.title} { const target = e.target as HTMLImageElement target.style.display = "none" const fallback = target.parentElement?.querySelector(".fallback-icon") if (fallback) { fallback.classList.remove("hidden") } }} />
{slide.icon}
) : (
{slide.icon}
)}
{/* Decorative elements */}
{/* Content */}

{slide.title}

{slide.description}

{/* Progress dots */}
{slides.map((_, index) => (
{/* Navigation buttons */}
{currentSlide < slides.length - 1 ? ( <> ) : ( )}
{/* Don't show again */} {currentSlide === slides.length - 1 && (
)}
) }