/** * CustomTitleBar - Conventional title bar for Windows and Linux when the native frame is hidden. * * Renders a draggable top strip with window controls (minimize, maximize/restore, close) * on the right. Only shown in Electron on Windows or Linux (macOS uses native traffic lights). */ import { useEffect, useState } from 'react'; import { isElectronMode } from '@renderer/api'; import faviconUrl from '@renderer/favicon.png'; import { useStore } from '@renderer/store'; import { Minus, Square, X } from 'lucide-react'; const TITLE_BAR_HEIGHT = 32; function needsCustomTitleBar(): boolean { if (!isElectronMode()) return false; const ua = window.navigator.userAgent; return ua.includes('Windows') || ua.includes('Linux'); } export const CustomTitleBar = (): React.JSX.Element | null => { const [isMaximized, setIsMaximized] = useState(false); const useNativeTitleBar = useStore((s) => s.appConfig?.general?.useNativeTitleBar ?? false); const showTitleBar = needsCustomTitleBar() && !useNativeTitleBar; const api = typeof window !== 'undefined' ? window.electronAPI?.windowControls : null; useEffect(() => { if (api) void api.isMaximized().then(setIsMaximized); }, [api]); if (!showTitleBar || !api) return null; const { minimize, maximize, close, isMaximized: getIsMaximized } = api; const handleMaximize = async (): Promise => { await maximize(); const maximized = await getIsMaximized(); setIsMaximized(maximized); }; const buttonBase = 'flex h-full w-12 items-center justify-center transition-colors border-0 outline-none'; const buttonHover = 'hover:bg-white/10'; const titleBarStyle = { height: `${TITLE_BAR_HEIGHT}px`, backgroundColor: 'var(--color-surface-sidebar)', borderBottom: '1px solid var(--color-border)', WebkitAppRegion: 'drag', } as React.CSSProperties; return (
{/* Draggable area — app icon */}
{/* Window controls — no-drag so they receive clicks */}
); };