Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | "use client" import { motion } from "framer-motion" import { useState, useEffect } from "react" import styles from "./Dock.module.css" import { desktopApps } from "@/data/apps" // Updated import path interface DockProps { openWindows: any[] openWindow: (app: any) => void focusWindow: (id: string) => void minimizedWindows: string[] } export default function Dock({ openWindows, openWindow, focusWindow, minimizedWindows }: DockProps) { const [time, setTime] = useState(new Date()) useEffect(() => { const timer = setInterval(() => { setTime(new Date()) }, 1000) return () => clearInterval(timer) }, []) const formatTime = (date: Date) => { const hours = date.getHours() const minutes = date.getMinutes() const ampm = hours >= 12 ? "PM" : "AM" const formattedHours = hours % 12 === 0 ? 12 : hours % 12 const formattedMinutes = minutes < 10 ? "0" + minutes : minutes return `${formattedHours}:${formattedMinutes} ${ampm}` } const dockItemVariants = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0 }, hover: { scale: 1.1, y: -10, transition: { type: "spring", stiffness: 300 } }, tap: { scale: 0.9 }, } const dockVariants = { hidden: { opacity: 0, y: 50 }, visible: { opacity: 1, y: 0, transition: { delay: 0.5, duration: 0.5 } }, } const runningApps = openWindows.filter((app) => !minimizedWindows.includes(app.id)) return ( <motion.div className={styles.dock} initial="hidden" animate="visible" variants={dockVariants} aria-label="Application Dock" > <div className={styles.dockContainer}> {desktopApps.map((app) => { const isRunning = runningApps.some((runningApp) => runningApp.id === app.id) const isMinimized = minimizedWindows.includes(app.id) return ( <motion.div key={app.id} className={`${styles.dockItem} ${isRunning ? styles.running : ""} ${isMinimized ? styles.minimized : ""}`} variants={dockItemVariants} whileHover="hover" whileTap="tap" onClick={() => (isRunning ? focusWindow(app.id) : openWindow(app))} aria-label={app.name} role="button" tabIndex={0} > <span className={styles.appIcon}>{app.icon}</span> {isRunning && <div className={styles.runningDot} />} </motion.div> ) })} </div> <div className={styles.timeDisplay} aria-live="polite"> {formatTime(time)} </div> </motion.div> ) } |