UNPKG

@wordpress/components

Version:
130 lines (109 loc) 3.79 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.PanelBody = PanelBody; exports.default = void 0; var _element = require("@wordpress/element"); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = require("lodash"); var _compose = require("@wordpress/compose"); var _icons = require("@wordpress/icons"); var _button = _interopRequireDefault(require("../button")); var _icon = _interopRequireDefault(require("../icon")); var _utils = require("../utils"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function PanelBody({ buttonProps = {}, children, className, icon, initialOpen, onToggle = _lodash.noop, opened, title, scrollAfterOpen = true }, ref) { const [isOpened, setIsOpened] = (0, _utils.useControlledState)(opened, { initial: initialOpen === undefined ? true : initialOpen }); const nodeRef = (0, _element.useRef)(); // Defaults to 'smooth' scrolling // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView const scrollBehavior = (0, _compose.useReducedMotion)() ? 'auto' : 'smooth'; const handleOnToggle = event => { event.preventDefault(); const next = !isOpened; setIsOpened(next); onToggle(next); }; // Ref is used so that the effect does not re-run upon scrollAfterOpen changing value const scrollAfterOpenRef = (0, _element.useRef)(); scrollAfterOpenRef.current = scrollAfterOpen; // Runs after initial render (0, _utils.useUpdateEffect)(() => { var _nodeRef$current; if (isOpened && scrollAfterOpenRef.current && (_nodeRef$current = nodeRef.current) !== null && _nodeRef$current !== void 0 && _nodeRef$current.scrollIntoView) { /* * Scrolls the content into view when visible. * This improves the UX when there are multiple stacking <PanelBody /> * components in a scrollable container. */ nodeRef.current.scrollIntoView({ inline: 'nearest', block: 'nearest', behavior: scrollBehavior }); } }, [isOpened, scrollBehavior]); const classes = (0, _classnames.default)('components-panel__body', className, { 'is-opened': isOpened }); return (0, _element.createElement)("div", { className: classes, ref: (0, _compose.useMergeRefs)([nodeRef, ref]) }, (0, _element.createElement)(PanelBodyTitle, (0, _extends2.default)({ icon: icon, isOpened: isOpened, onClick: handleOnToggle, title: title }, buttonProps)), typeof children === 'function' ? children({ opened: isOpened }) : isOpened && children); } const PanelBodyTitle = (0, _element.forwardRef)(({ isOpened, icon, title, ...props }, ref) => { if (!title) return null; return (0, _element.createElement)("h2", { className: "components-panel__body-title" }, (0, _element.createElement)(_button.default, (0, _extends2.default)({ className: "components-panel__body-toggle", "aria-expanded": isOpened, ref: ref }, props), (0, _element.createElement)("span", { "aria-hidden": "true" }, (0, _element.createElement)(_icon.default, { className: "components-panel__arrow", icon: isOpened ? _icons.chevronUp : _icons.chevronDown })), title, icon && (0, _element.createElement)(_icon.default, { icon: icon, className: "components-panel__icon", size: 20 }))); }); const ForwardedComponent = (0, _element.forwardRef)(PanelBody); ForwardedComponent.displayName = 'PanelBody'; var _default = ForwardedComponent; exports.default = _default; //# sourceMappingURL=body.js.map