"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: "Welcome to ProxMenux Monitor!", description: "Your new monitoring tool for Proxmox. Discover all the features that will help you manage and supervise your infrastructure efficiently.", icon: , gradient: "from-blue-500 via-purple-500 to-pink-500", }, { id: 1, title: "System Overview", description: "Monitor your server's status in real-time: CPU, memory, temperature, system load and more. Everything in an intuitive and easy-to-understand dashboard.", image: "/images/onboarding/imagen1.png", icon: , gradient: "from-blue-500 to-cyan-500", }, { id: 2, title: "Storage Management", description: "Visualize the status of all your disks and volumes. Detailed information on capacity, usage, SMART health, temperature and performance of each storage device.", image: "/images/onboarding/imagen2.png", icon: , gradient: "from-cyan-500 to-teal-500", }, { id: 3, title: "Network Metrics", description: "Monitor network traffic in real-time. Bandwidth statistics, active interfaces, transfer speeds and historical usage graphs.", image: "/images/onboarding/imagen3.png", icon: , gradient: "from-teal-500 to-green-500", }, { id: 4, title: "Virtual Machines & Containers", description: "Manage all your VMs and LXC containers from one place. Status, allocated resources, current usage and quick controls for each virtual machine.", image: "/images/onboarding/imagen4.png", icon: , gradient: "from-green-500 to-emerald-500", }, { id: 5, title: "Hardware Information", description: "Complete details of your server hardware: CPU, RAM, GPU, disks, network, UPS and more. Technical specifications, models, serial numbers and status of each component.", image: "/images/onboarding/imagen5.png", icon: , gradient: "from-emerald-500 to-blue-500", }, { id: 6, title: "System Logs", description: "Access system logs in real-time. Filter by event type, search for specific errors and keep complete track of your server activity. Download the displayed logs for further analysis.", image: "/images/onboarding/imagen6.png", icon: , gradient: "from-blue-500 to-indigo-500", }, { id: 7, title: "Ready for the Future!", description: "ProxMenux Monitor is prepared to receive updates and improvements that will be added gradually, improving the user experience and being able to execute ProxMenux functions from the web panel.", 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 */}
{/* 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 */}

{slide.title}

{slide.description}

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