mirror of
https://github.com/umami-software/umami.git
synced 2026-02-13 09:05:36 +01:00
63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import { useState } from 'react';
|
|
import {
|
|
Column,
|
|
type ColumnProps,
|
|
Row,
|
|
Icon,
|
|
Button,
|
|
TooltipTrigger,
|
|
Tooltip,
|
|
Heading,
|
|
} from '@umami/react-zen';
|
|
import { Maximize, X } from '@/components/icons';
|
|
import { useMessages } from '@/components/hooks';
|
|
|
|
export interface PanelProps extends ColumnProps {
|
|
title?: string;
|
|
allowFullscreen?: boolean;
|
|
}
|
|
|
|
const fullscreenStyles = {
|
|
position: 'fixed',
|
|
width: '100%',
|
|
height: '100%',
|
|
top: 0,
|
|
left: 0,
|
|
border: 'none',
|
|
zIndex: 9999,
|
|
} as any;
|
|
|
|
export function Panel({ title, allowFullscreen, style, children, ...props }: PanelProps) {
|
|
const { formatMessage, labels } = useMessages();
|
|
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
|
|
const handleFullscreen = () => {
|
|
setIsFullscreen(!isFullscreen);
|
|
};
|
|
|
|
return (
|
|
<Column
|
|
padding={{ xs: '3', md: '6' }}
|
|
border
|
|
borderRadius="3"
|
|
backgroundColor
|
|
position="relative"
|
|
gap
|
|
{...props}
|
|
style={{ ...style, ...(isFullscreen ? fullscreenStyles : {}) }}
|
|
>
|
|
{title && <Heading>{title}</Heading>}
|
|
{allowFullscreen && (
|
|
<Row justifyContent="flex-end" alignItems="center">
|
|
<TooltipTrigger delay={0} isDisabled={isFullscreen}>
|
|
<Button variant="quiet" onPress={handleFullscreen}>
|
|
<Icon>{isFullscreen ? <X /> : <Maximize />}</Icon>
|
|
</Button>
|
|
<Tooltip>{formatMessage(labels.maximize)}</Tooltip>
|
|
</TooltipTrigger>
|
|
</Row>
|
|
)}
|
|
{children}
|
|
</Column>
|
|
);
|
|
}
|