diff --git a/src/os/Taskbar/Taskbar.tsx b/src/os/Taskbar/Taskbar.tsx index aa45a50..e504dde 100644 --- a/src/os/Taskbar/Taskbar.tsx +++ b/src/os/Taskbar/Taskbar.tsx @@ -52,13 +52,20 @@ export default function Taskbar({ className, config = "default", ...rest }: Task const windows = useWindowStore((state) => state.windows); const activeWindowId = useWindowStore((state) => state.activeWindowId); const setActiveWindow = useWindowStore((state) => state.setActiveWindow); + const minimizedWindows = useWindowStore((state) => state.minimizedWindows); + const restoreWindow = useWindowStore((state) => state.restoreWindow); const showStart = config === "default" || config === "noSystemTray"; const showSystemTray = config === "default" || config === "noStartButton"; const handleTabClick = (id: WindowAppId) => { - // Taskbar 탭 클릭 시 해당 window로 focus - setActiveWindow(id); + const isMinimized = !!minimizedWindows[id]; + + if (isMinimized) { + restoreWindow(id); + } else { + setActiveWindow(id); + } }; return ( @@ -71,12 +78,14 @@ export default function Taskbar({ className, config = "default", ...rest }: Task const app = WINDOW_APPS[window.id]; if (!app) return null; + const isMinimized = !!minimizedWindows[window.id]; + return (
  • handleTabClick(window.id)} />
  • diff --git a/src/os/TitleBar/TitleBar.tsx b/src/os/TitleBar/TitleBar.tsx index 2bacb76..863024f 100644 --- a/src/os/TitleBar/TitleBar.tsx +++ b/src/os/TitleBar/TitleBar.tsx @@ -21,10 +21,13 @@ const sizeConfig = { } as const; export interface TitleBarProps extends React.ComponentPropsWithoutRef<"div">, TitleBarVariantProps { - icon?: FunctionComponent>; // FunctionComponent → ComponentType - title?: string; // text → title (prop 이름 통일) + icon?: FunctionComponent>; + title?: string; buttons?: "all" | "closeOnly" | null; onClose?: () => void; + onMinimize?: () => void; + onMaximize?: () => void; + isMaximized?: boolean; } /** @@ -92,11 +95,33 @@ export default function TitleBar({ title, buttons = null, onClose, + onMinimize, + onMaximize, + isMaximized, className, ...rest }: TitleBarProps) { const { iconClassName, buttonSizeClass, iconSizeClass } = sizeConfig[size ?? "small"]; + const handleButtonMouseDown = (event: React.MouseEvent) => { + event.stopPropagation(); + }; + + const handleMinimize = (event: React.MouseEvent) => { + event.stopPropagation(); + onMinimize?.(); + }; + + const handleMaximize = (event: React.MouseEvent) => { + event.stopPropagation(); + onMaximize?.(); + }; + + const handleClose = (event: React.MouseEvent) => { + event.stopPropagation(); + onClose?.(); + }; + return (
    @@ -133,7 +160,9 @@ export default function TitleBar({ @@ -141,7 +170,8 @@ export default function TitleBar({ )}