diff --git a/src/components/Dock/Dock.css b/src/components/Dock/Dock.css new file mode 100644 index 0000000..9e8a52a --- /dev/null +++ b/src/components/Dock/Dock.css @@ -0,0 +1,52 @@ +.dock-container { + position: fixed; + bottom: 8px; + left: 50%; + transform: translateX(-50%); + z-index: 500; +} + +.dock { + display: flex; + align-items: flex-end; + gap: 6px; + background: rgba(30, 30, 40, 0.52); + backdrop-filter: var(--glass-blur); + -webkit-backdrop-filter: var(--glass-blur); + border: 1px solid var(--glass-border); + border-radius: 18px; + padding: 8px 12px; + box-shadow: 0 4px 28px rgba(0,0,0,0.4); +} + +.dock-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 3px; + cursor: pointer; + position: relative; +} + +.dock-item:hover .dock-icon { + transform: scale(1.18) translateY(-6px); +} + +.dock-icon { + width: 48px; + height: 48px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + transition: transform 0.15s ease; + box-shadow: 0 2px 8px rgba(0,0,0,0.3); +} + +.dock-dot { + width: 4px; + height: 4px; + border-radius: 50%; + background: rgba(255,255,255,0.7); +} diff --git a/src/components/Dock/Dock.tsx b/src/components/Dock/Dock.tsx new file mode 100644 index 0000000..da088f6 --- /dev/null +++ b/src/components/Dock/Dock.tsx @@ -0,0 +1,36 @@ +import './Dock.css'; +import { useOS } from '../../context/WindowContext'; +import { APPS } from '../../config/apps'; + +export default function Dock() { + const { state, openWindow, focusWindow } = useOS(); + + function handleClick(id: string) { + const win = state.windows[id]; + if (!win.isOpen) { + openWindow(id); + } else { + // focusWindow also sets isMinimized: false, so this handles both minimized and normal cases + focusWindow(id); + } + } + + return ( +
+
+ {APPS.map(app => { + const win = state.windows[app.id]; + const isOpen = win.isOpen; + return ( +
handleClick(app.id)}> +
+ {app.emoji} +
+ {isOpen &&
} +
+ ); + })} +
+
+ ); +}