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 React, { 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 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 (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, ]); return (
{/* NOTE: This needs display:grid or else the element shrinks (even though scrollable) */}
{children}
{!hideControls && }
); }