UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

80 lines (76 loc) 2.49 kB
import React, { useState, useEffect } from 'react'; import { clsx } from 'clsx'; import classes from './Details.module.css.js'; import { useMergedRefs } from '../internal/hooks/useMergedRefs.js'; import { defaultSxProp } from '../utils/defaultSxProp.js'; import Box from '../Box/Box.js'; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const Root = /*#__PURE__*/React.forwardRef(({ className, children, sx: sxProp = defaultSxProp, ...rest }, forwardRef) => { const detailsRef = React.useRef(null); const ref = useMergedRefs(forwardRef, detailsRef); const [hasSummary, setHasSummary] = useState(false); useEffect(() => { const { current: details } = detailsRef; if (!details) { return; } const updateSummary = () => { const summary = details.querySelector('summary:not([data-default-summary])'); setHasSummary(!!summary); }; // Update summary on mount updateSummary(); const observer = new MutationObserver(() => { updateSummary(); }); observer.observe(details, { childList: true, subtree: true }); return () => { observer.disconnect(); }; }, []); if (sxProp !== defaultSxProp) { return /*#__PURE__*/React.createElement(Box, _extends({ as: 'details', className: clsx(className, classes.Details) }, rest, { sx: sxProp, ref: ref }), !hasSummary && /*#__PURE__*/React.createElement(Details.Summary, { "data-default-summary": true }, 'See Details'), children); } return /*#__PURE__*/React.createElement("details", _extends({ className: clsx(className, classes.Details) }, rest, { ref: ref }), !hasSummary && /*#__PURE__*/React.createElement(Details.Summary, { "data-default-summary": true }, 'See Details'), children); }); Root.displayName = 'Details'; function Summary({ as, children, ...props }) { const Component = as !== null && as !== undefined ? as : 'summary'; return /*#__PURE__*/React.createElement(Component, _extends({ as: Component === 'summary' ? null : 'summary' }, props), children); } Summary.displayName = "Summary"; Summary.displayName = 'Summary'; const Details = Object.assign(Root, { Summary }); export { Summary, Details as default };