import type { ReactNode } from "react"; import { translateReactNode, usePlatformLanguage } from "../i18n/LanguageContext"; import type { PlatformInterfaceIdentityProps } from "../types"; import DismissibleAlert from "./DismissibleAlert"; import LoadingFrame from "./LoadingFrame"; import PageScrollViewport from "./PageScrollViewport"; import PageTitle from "./PageTitle"; export type PageLayoutMode = "standalone" | "embedded"; export type PageHeaderProps = { title: ReactNode; description?: ReactNode; actions?: ReactNode; loading?: boolean; sticky?: boolean; className?: string; }; export function PageHeader({ title, description, actions, loading = false, sticky = true, className = "" }: PageHeaderProps) { const { translateText } = usePlatformLanguage(); const classes = [ "page-heading", "split", sticky ? "workspace-heading" : "", "page-layout-header", className ].filter(Boolean).join(" "); return (
{title} {description &&

{translateReactNode(description, translateText)}

}
{actions &&
{actions}
}
); } export type PageLayoutProps = PlatformInterfaceIdentityProps & { title: ReactNode; description?: ReactNode; actions?: ReactNode; children: ReactNode; loading?: boolean; loadingLabel?: string; error?: string; success?: string; mode?: PageLayoutMode; scrollable?: boolean; stickyHeader?: boolean; documentationType?: "user" | "admin"; className?: string; viewportClassName?: string; headerClassName?: string; bodyClassName?: string; }; export default function PageLayout({ title, description, actions, children, loading = false, loadingLabel = "i18n:govoplan-core.loading_page_data.85fe9edf", error = "", success = "", mode = "standalone", scrollable, stickyHeader = true, documentationType = "user", className = "", viewportClassName = "", headerClassName = "", bodyClassName = "", interfaceId, helpContextId, helpModuleId, helpTopicId }: PageLayoutProps) { const shouldScroll = scrollable ?? mode === "standalone"; const layoutClasses = [ "page-layout", `page-layout-${mode}`, mode === "standalone" ? "content-pad workspace-data-page" : "", className ].filter(Boolean).join(" "); const layout = (
{error && {error}} {success && {success}} {children}
); if (!shouldScroll) return layout; return {layout}; }