UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

147 lines (146 loc) 4.56 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = AccordionContent; var _hasOwn = _interopRequireDefault(require("core-js-pure/stable/object/has-own.js")); var _react = _interopRequireDefault(require("react")); var _clsx = _interopRequireDefault(require("clsx")); var _componentHelper = require("../../shared/component-helper.js"); var _index = require("../../shared/index.js"); var _AccordionContext = _interopRequireDefault(require("./AccordionContext.js")); var _SpacingUtils = require("../space/SpacingUtils.js"); var _HeightAnimation = _interopRequireDefault(require("../height-animation/HeightAnimation.js")); var _withComponentMarkers = _interopRequireDefault(require("../../shared/helpers/withComponentMarkers.js")); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function AccordionContent(props) { const context = _react.default.useContext(_AccordionContext.default); const { id, expanded, keepInDOM, preventRerender, singleContainer, disabled, noAnimation, contentRef } = context; const { className, children, instance, ...rest } = props; let elementRef = _react.default.useRef(null); const cacheRef = _react.default.useRef(null); if (contentRef) { elementRef = contentRef; } const setContainerHeight = () => { const { singleContainer } = context; if (singleContainer) { const contentElem = elementRef.current; if (contentElem) { try { contentElem.style.height = ''; const containerElement = (0, _componentHelper.getClosestParent)('dnb-accordion-group--single-container', contentElem); if (noAnimation) { containerElement.style.transitionDuration = '1ms'; } const minHeight = (contentElem.offsetHeight + contentElem.offsetTop) / 16; containerElement.style.minHeight = `${minHeight}rem`; } catch (e) { (0, _componentHelper.warn)(e); } } } }; const renderContent = () => { const children = (0, _componentHelper.processChildren)(props); const { expanded, keepInDOM, preventRerender, preventRerenderConditional } = context; let content = children; if (typeof content === 'string') { content = (0, _jsxRuntime.jsx)("p", { className: "dnb-p", children: content }); } if (preventRerender) { if (!(expanded || keepInDOM)) { content = null; } if (preventRerenderConditional && cacheRef.current !== content) { cacheRef.current = content; } if (cacheRef.current) { content = cacheRef.current; } else { cacheRef.current = content; } } return content; }; _react.default.useEffect(() => { if (expanded && singleContainer) { setContainerHeight(); } }, [children, expanded, singleContainer, setContainerHeight]); _react.default.useState(() => { if (instance && (0, _hasOwn.default)(instance, 'current')) { const mutableInstance = instance; mutableInstance.current = { setContainerHeight }; } }); const isSmallScreen = (0, _index.useMediaQuery)({ when: { max: 'small' } }); const content = renderContent(); const wrapperParams = { className: (0, _clsx.default)('dnb-accordion__content', className), ...rest }; const keepInDOMContent = keepInDOM || preventRerender; const innerParams = (0, _SpacingUtils.applySpacing)(rest, { id: `${id}-content`, 'aria-labelledby': `${id}-header`, className: 'dnb-accordion__content__inner' }); if (expanded) { innerParams['aria-expanded'] = true; } if (!expanded || disabled) { innerParams.disabled = true; innerParams['aria-hidden'] = true; } (0, _componentHelper.validateDOMAttributes)(props, wrapperParams); (0, _componentHelper.validateDOMAttributes)(null, innerParams); const animate = !noAnimation && (singleContainer ? isSmallScreen : true); return (0, _jsxRuntime.jsx)(_HeightAnimation.default, { ...wrapperParams, open: expanded, animate: animate, keepInDOM: keepInDOMContent, ref: elementRef, children: (0, _jsxRuntime.jsx)("section", { ...innerParams, children: content }) }); } (0, _withComponentMarkers.default)(AccordionContent, { _supportsSpacingProps: true }); //# sourceMappingURL=AccordionContent.js.map