UNPKG

@grafana/ui

Version:
148 lines (143 loc) 4.26 kB
'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