@grafana/ui
Version:
Grafana Components Library
148 lines (143 loc) • 4.26 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var jsxRuntime = require('react/jsx-runtime');
var css = require('@emotion/css');
var React = require('react');
var ThemeContext = require('../../themes/ThemeContext.cjs');
var IconButton = require('../IconButton/IconButton.cjs');
"use strict";
const getStyles = (theme) => ({
collapse: css.css({
label: "collapse",
marginBottom: theme.spacing(1),
backgroundColor: theme.colors.background.primary,
border: `1px solid ${theme.colors.border.weak}`,
position: "relative",
borderRadius: theme.shape.radius.default,
width: "100%",
display: "flex",
flexDirection: "column",
flex: "1 1 0"
}),
collapseBody: css.css({
label: "collapse__body",
padding: theme.spacing(theme.components.panel.padding),
paddingTop: 0,
flex: 1,
overflow: "hidden",
display: "flex",
flexDirection: "column"
}),
bodyContentWrapper: css.css({
label: "bodyContentWrapper",
flex: 1
}),
loader: css.css({
label: "collapse__loader",
height: "2px",
position: "relative",
overflow: "hidden",
background: "none",
margin: theme.spacing(0.5)
}),
loaderActive: css.css({
label: "collapse__loader_active",
"&:after": {
content: "' '",
display: "block",
width: "25%",
top: 0,
height: "250%",
position: "absolute",
[theme.transitions.handleMotion("no-preference", "reduce")]: {
animation: "loader 2s cubic-bezier(0.17, 0.67, 0.83, 0.67) 500ms",
animationIterationCount: 100
},
[theme.transitions.handleMotion("reduce")]: {
animationDuration: "10s",
animationIterationCount: 20
},
left: "-25%",
background: theme.colors.primary.main
},
"@keyframes loader": {
from: {
left: "-25%",
opacity: 0.1
},
to: {
left: "100%",
opacity: 1
}
}
}),
header: css.css({
cursor: "pointer",
label: "collapse__header",
padding: theme.spacing(1),
display: "flex",
gap: theme.spacing(1)
}),
button: css.css({
marginRight: 0
}),
headerLabel: css.css({
label: "collapse__header-label",
fontWeight: theme.typography.fontWeightMedium,
fontSize: theme.typography.size.md,
display: "flex",
flex: 1
})
});
const ControlledCollapse = ({ isOpen, onToggle, ...otherProps }) => {
const [open, setOpen] = React.useState(isOpen);
return /* @__PURE__ */ jsxRuntime.jsx(
Collapse,
{
isOpen: open,
...otherProps,
onToggle: () => {
setOpen(!open);
if (onToggle) {
onToggle(!open);
}
}
}
);
};
const Collapse = ({ isOpen, label, loading, onToggle, className, children }) => {
const style = ThemeContext.useStyles2(getStyles);
const labelId = React.useId();
const contentId = React.useId();
const onClickToggle = () => {
if (onToggle) {
onToggle(!isOpen);
}
};
const panelClass = css.cx([style.collapse, className]);
const loaderClass = loading ? css.cx([style.loader, style.loaderActive]) : style.loader;
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: panelClass, children: [
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: style.header, onClick: onClickToggle, children: [
/* @__PURE__ */ jsxRuntime.jsx(
IconButton.IconButton,
{
"aria-describedby": labelId,
"aria-expanded": isOpen,
"aria-controls": contentId,
className: style.button,
"aria-labelledby": labelId,
name: isOpen ? "angle-down" : "angle-right"
}
),
/* @__PURE__ */ jsxRuntime.jsx("div", { id: labelId, className: style.headerLabel, children: label })
] }),
isOpen && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: style.collapseBody, id: contentId, children: [
/* @__PURE__ */ jsxRuntime.jsx("div", { className: loaderClass }),
/* @__PURE__ */ jsxRuntime.jsx("div", { className: style.bodyContentWrapper, children })
] })
] });
};
Collapse.displayName = "Collapse";
exports.Collapse = Collapse;
exports.ControlledCollapse = ControlledCollapse;
//# sourceMappingURL=Collapse.cjs.map