UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

255 lines (254 loc) 11.4 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.AccordionHeader = void 0; require("core-js/modules/web.dom-collections.iterator.js"); var _react = _interopRequireWildcard(require("react")); var _componentHelper = require("../../shared/component-helper"); var _IconPrimary = _interopRequireDefault(require("../icon-primary/IconPrimary")); var _classnames = _interopRequireDefault(require("classnames")); var _AccordionContext = _interopRequireDefault(require("./AccordionContext")); var _SpacingHelper = require("../space/SpacingHelper"); var _SkeletonHelper = require("../skeleton/SkeletonHelper"); const _excluded = ["children"], _excluded2 = ["children"], _excluded3 = ["children"], _excluded4 = ["icon_size"], _excluded5 = ["children", "className", "left_component", "expanded", "title", "description", "icon", "icon_size", "disabled"]; function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } function AccordionHeaderTitle(_ref) { let { children = null } = _ref, rest = _objectWithoutProperties(_ref, _excluded); return _react.default.createElement("span", { className: (0, _classnames.default)('dnb-accordion__header__title', (0, _SpacingHelper.createSpacingClasses)(rest)) }, children); } function AccordionHeaderDescription(_ref2) { let { children = null } = _ref2, rest = _objectWithoutProperties(_ref2, _excluded2); return children ? _react.default.createElement("span", { className: (0, _classnames.default)('dnb-accordion__header__description', (0, _SpacingHelper.createSpacingClasses)(rest)) }, children) : null; } function AccordionHeaderContainer(_ref3) { let { children = null } = _ref3, rest = _objectWithoutProperties(_ref3, _excluded3); return children ? _react.default.createElement("span", { className: (0, _classnames.default)('dnb-accordion__header__container', (0, _SpacingHelper.createSpacingClasses)(rest)) }, children) : null; } function AccordionHeaderIcon(_ref4) { let { icon: iconProp, expanded, size = 'medium', icon_position } = _ref4; const icon = iconProp && typeof iconProp === 'object' && 'expanded' in iconProp && typeof (iconProp === null || iconProp === void 0 ? void 0 : iconProp.expanded) !== 'undefined' ? iconProp[expanded ? 'expanded' : 'closed'] : iconProp || 'chevron-down'; return _react.default.createElement("span", { className: 'dnb-accordion__header__icon' + (icon_position ? ` dnb-accordion__header__icon--${icon_position}` : "") }, _react.default.createElement(_IconPrimary.default, { size: size, icon: icon, "aria-hidden": true })); } const accordionHeaderDefaultProps = { icon_size: 'medium' }; const AccordionHeader = _ref5 => { let { icon_size: icon_size_default = 'medium' } = _ref5, restOfProps = _objectWithoutProperties(_ref5, _excluded4); const props = _objectSpread({ icon_size: icon_size_default }, restOfProps); const [isHovering, setIsHovering] = (0, _react.useState)(false); const [hasClicked, setHasClicked] = (0, _react.useState)(false); const context = (0, _react.useContext)(_AccordionContext.default); function onKeyDownHandler(event) { const keyPressed = event.key; if (keyPressed === 'Enter' || keyPressed === ' ') { event.preventDefault(); onClickHandler(event); } } function onClickHandler(event) { const { id, group } = context; if (canClick()) { const expanded = !context.expanded; context.callOnChange({ id, group, expanded, event }); setHasClicked(true); } } function onMouseOverHandler() { setIsHovering(true); } function onMouseOutHandler() { setIsHovering(false); setHasClicked(false); } function canClick() { const { expanded, allow_close_all, group } = context; return !group || group && !expanded || allow_close_all; } const extendedProps = (0, _componentHelper.extendPropsWithContext)(props, accordionHeaderDefaultProps, context); const { id, left_component, expanded, title, description, element, heading, heading_level, icon, icon_size, disabled, skeleton, no_animation, variant } = extendedProps; let { icon_position } = extendedProps; const { children, className, left_component: _left_component, expanded: _expanded, title: _title, description: _description, icon: _icon, icon_size: _icon_size, disabled: _disabled } = props, rest = _objectWithoutProperties(props, _excluded5); const defaultParts = [_react.default.createElement(AccordionHeaderIcon, { key: "icon", icon: icon, size: icon_size, expanded: context.expanded, icon_position: icon_position }), _react.default.createElement(AccordionHeaderContainer, { key: "container" }, left_component), _react.default.createElement(AccordionHeaderTitle, { key: "title" }, title || (Array.isArray(children) ? children.filter(cur => !_react.default.isValidElement(cur)) : children)), _react.default.createElement(AccordionHeaderDescription, { key: "description" }, description)]; if (Array.isArray(children)) { const removeParts = []; children.forEach(cur => { if (_react.default.isValidElement(cur)) { const part = defaultParts.find(c => c.type === cur.type); if (part) { removeParts.push(part); } defaultParts.push(cur); } }); removeParts.forEach(part => { const index = defaultParts.findIndex(c => c === part); if (index > -1) { defaultParts.splice(index, 1); } }); } const partsToRender = []; const wrapperParts = []; const wrapperComp = _react.default.createElement("span", { className: "dnb-accordion__header__wrapper", key: "wrapper" }, wrapperParts); defaultParts.forEach(part => { if (_react.default.isValidElement(part) && (part.type === AccordionHeaderTitle || part.type === AccordionHeaderDescription)) { wrapperParts.push(part); if (partsToRender.findIndex(c => c === wrapperComp) === -1) { partsToRender.push(wrapperComp); } } else { partsToRender.push(part); } }); if (icon_position === undefined) { const iconIndex = partsToRender.findIndex(c => c.type === AccordionHeaderIcon); if (iconIndex > 1) { icon_position = 'right'; } if (left_component) { icon_position = 'right'; } } const headerParams = _objectSpread({ id: `${id}-header`, 'aria-controls': `${id}-content`, 'aria-expanded': context.expanded, role: 'button', tabIndex: 0, className: (0, _classnames.default)('dnb-accordion__header', (0, _SkeletonHelper.createSkeletonClass)('font', skeleton, context), (0, _SpacingHelper.createSpacingClasses)(rest), className, context.expanded && 'dnb-accordion__header--expanded' + (isHovering && hasClicked ? " dnb-accordion__header--after-click" : ""), variant && `dnb-accordion__header--${variant}`, icon_position && `dnb-accordion__header--icon-${icon_position}`, !canClick() && 'dnb-accordion__header--prevent-click', description && 'dnb-accordion__header--description', no_animation && 'dnb-accordion__header--no-animation'), disabled }, rest); if (disabled || skeleton) { headerParams.tabIndex = -1; headerParams.disabled = true; headerParams['aria-disabled'] = true; } else { headerParams.onClick = onClickHandler; headerParams.onKeyDown = onKeyDownHandler; headerParams.onMouseOver = onMouseOverHandler; headerParams.onMouseOut = onMouseOutHandler; } (0, _SkeletonHelper.skeletonDOMAttributes)(headerParams, skeleton, context); (0, _componentHelper.validateDOMAttributes)(props, headerParams); let Element = 'div'; if (heading && (String(heading) === 'true' || String(heading) === '1')) { headerParams.role = 'heading'; headerParams['aria-level'] = heading_level ? Number(heading_level) : 2; } else if (heading) { headerParams.role = null; Element = heading; } else if (element) { headerParams.role = null; Element = element; } return _react.default.createElement(Element, headerParams, partsToRender); }; exports.AccordionHeader = AccordionHeader; AccordionHeader.Container = AccordionHeaderContainer; AccordionHeader.Icon = AccordionHeaderIcon; AccordionHeader.Title = AccordionHeaderTitle; AccordionHeader.Description = AccordionHeaderDescription; AccordionHeader._supportsSpacingProps = true; var _default = exports.default = AccordionHeader; //# sourceMappingURL=AccordionHeader.js.map