import { createContext, useContext, useState, useLayoutEffect } from 'react'; import { createPortal } from 'react-dom'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; import { GRID_COLUMNS } from 'dashgui/panels'; export const PageTitleRightContext = createContext(null); export function PageTitleRight({ children }) { const contextNode = useContext(PageTitleRightContext); const [domNode, setDomNode] = useState( () => (typeof document !== 'undefined' ? document.getElementById('page-title-right') : null) ); useLayoutEffect(() => { if (!contextNode && typeof document !== 'undefined') { const el = document.getElementById('page-title-right'); if (el && el !== domNode) { setDomNode(el); } } }, [contextNode, domNode]); const target = contextNode || domNode; if (!target) return null; return createPortal(children, target); } export default function PageLayout({ title, showTitle = true, titleAction, titleRightAction, titleWide = 3, children, }) { const [rightNode, setRightNode] = useState(null); return ( {showTitle ? ( = 2 ? 'span 2' : 'span 1', md: `span ${Math.min(Math.max(titleWide, 1), GRID_COLUMNS)}`, }, display: 'flex', alignItems: 'center', gap: 1.5, minWidth: 0, }} > {title} {titleAction} {titleRightAction} ) : null} {children} ); }