@datalayer/core
Version:
**Datalayer Core**
65 lines (64 loc) • 2.97 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
/*
* Copyright (c) 2023-2025 Datalayer, Inc.
* Distributed under the terms of the Modified BSD License.
*/
import { AlertIcon, CheckIcon, InfoIcon, StopIcon, XIcon } from '@primer/octicons-react';
import { Flash as PrimerFlash, IconButton } from '@primer/react';
import { Box } from "@datalayer/primer-addons";
import { useCallback, useState } from 'react';
/**
* Closable flash component with actions.
*/
export const FlashClosable = (props) => {
const { actions, children, closable, variant, sx, ...others } = props;
const [open, setOpen] = useState(true);
const visual = variant === 'warning' ? (_jsx(AlertIcon, {})) : variant === 'success' ? (_jsx(CheckIcon, {})) : variant === 'danger' ? (_jsx(StopIcon, {})) : (_jsx(InfoIcon, {}));
const onClose = useCallback(() => {
if (closable) {
setOpen(false);
}
}, [closable]);
return open ? (_jsxs(PrimerFlash, { ...others, variant: variant, sx: {
...sx,
margin: 'var(--stack-gap-condensed) 0',
display: 'grid',
gridTemplateColumns: 'min-content 1fr minmax(0, auto)',
gridTemplateRows: 'min-content',
gridTemplateAreas: "'visual message actions close'",
'@media screen and (max-width: 544px)': {
gridTemplateColumns: 'min-content 1fr',
gridTemplateRows: 'min-content min-content',
gridTemplateAreas: `
'visual message close'
'. actions actions'
`
}
}, children: [_jsx(Box, { sx: {
display: 'grid',
paddingBlock: 'var(--base-size-8)',
alignSelf: 'center',
gridArea: 'visual'
}, children: visual }), _jsx(Box, { sx: {
alignSelf: 'center',
display: 'grid',
gridArea: 'message'
}, children: children }), _jsx(Box, { sx: {
display: 'grid',
gap: 'var(--stack-gap-condensed)',
marginLeft: 'actions',
'@media screen and (max-width: 544px)': {
alignSelf: 'start',
margin: 'var(--base-size-8) 0 0 var(--base-size-8)'
}
}, children: actions }), closable && (_jsx(Box, { sx: {
alignSelf: 'start',
marginLeft: 'close'
}, children: _jsx(IconButton, { "aria-label": "Dismiss flash message", title: "Dismiss", onClick: onClose, variant: "invisible", icon: XIcon, sx: {
'& > svg': { marginRight: 0, color: 'var(--fgColor-default)' }
} }) }))] })) : _jsx(_Fragment, {});
};
FlashClosable.defaultProps = {
closable: true,
};
export default FlashClosable;