import { type } from '@tauri-apps/plugin-os'; import { settingsAtom } from '@yaakapp-internal/models'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'; import { useMemo } from 'react'; import { useIsFullscreen } from '../hooks/useIsFullscreen'; import { HEADER_SIZE_LG, HEADER_SIZE_MD, WINDOW_CONTROLS_WIDTH } from '../lib/constants'; import { WindowControls } from './WindowControls'; interface HeaderSizeProps extends HTMLAttributes { children?: ReactNode; size: 'md' | 'lg'; ignoreControlsSpacing?: boolean; onlyXWindowControl?: boolean; hideControls?: boolean; } export function HeaderSize({ className, style, size, ignoreControlsSpacing, onlyXWindowControl, children, hideControls, }: HeaderSizeProps) { const settings = useAtomValue(settingsAtom); const isFullscreen = useIsFullscreen(); const nativeTitlebar = settings.useNativeTitlebar; const finalStyle = useMemo(() => { const s = { ...style }; // Set the height (use min-height because scaling font size may make it larger if (size === 'md') s.minHeight = HEADER_SIZE_MD; if (size === 'lg') s.minHeight = HEADER_SIZE_LG; if (nativeTitlebar) { // No style updates when using native titlebar } else if (type() === 'macos') { if (!isFullscreen) { // Add large padding for window controls s.paddingLeft = 72 / settings.interfaceScale; } } else if (!ignoreControlsSpacing && !settings.hideWindowControls) { s.paddingRight = WINDOW_CONTROLS_WIDTH; } return s; }, [ ignoreControlsSpacing, isFullscreen, settings.hideWindowControls, settings.interfaceScale, size, style, nativeTitlebar, ]); return (
{/* NOTE: This needs display:grid or else the element shrinks (even though scrollable) */}
{children}
{!hideControls && !nativeTitlebar && }
); }