UNPKG

@chakra-ui/core

Version:

Responsive and accessible React UI components built with React and Emotion

245 lines (207 loc) 7.72 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.AccordionPanel = exports.AccordionHeader = exports.AccordionIcon = exports.AccordionItem = exports.Accordion = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _core = require("@emotion/core"); var _autoId = require("@reach/auto-id"); var _react = require("react"); var _Box = _interopRequireDefault(require("../Box")); var _Collapse = _interopRequireDefault(require("../Collapse")); var _Icon = _interopRequireDefault(require("../Icon")); var _PseudoBox = _interopRequireDefault(require("../PseudoBox")); var _utils = require("../utils"); /** @jsx jsx */ var Accordion = function Accordion(_ref) { var allowMultiple = _ref.allowMultiple, allowToggle = _ref.allowToggle, index = _ref.index, defaultIndex = _ref.defaultIndex, _onChange = _ref.onChange, children = _ref.children, rest = (0, _objectWithoutPropertiesLoose2["default"])(_ref, ["allowMultiple", "allowToggle", "index", "defaultIndex", "onChange", "children"]); var initializeState = function initializeState() { if (allowMultiple) { return defaultIndex || []; } else { return defaultIndex || 0; } }; var getExpandCondition = function getExpandCondition(index, itemIndex) { if (Array.isArray(index)) { return index.includes(itemIndex); } return index === itemIndex; }; var _useState = (0, _react.useState)(initializeState), expandedIndex = _useState[0], setExpandedIndex = _useState[1]; var _useRef = (0, _react.useRef)(index != null), isControlled = _useRef.current; var _index = isControlled ? index : expandedIndex; var validChildren = (0, _utils.cleanChildren)(children); var clones = validChildren.map(function (child, childIndex) { return (0, _react.cloneElement)(child, { isOpen: getExpandCondition(_index, childIndex), onChange: function onChange(isExpanded) { if (allowMultiple) { if (isExpanded) { var newIndexes = [].concat(_index, [childIndex]); !isControlled && setExpandedIndex(newIndexes); _onChange && _onChange(newIndexes); } else { var _newIndexes = _index.filter(function (itemIndex) { return itemIndex !== childIndex; }); !isControlled && setExpandedIndex(_newIndexes); _onChange && _onChange(_newIndexes); } } else { if (isExpanded) { !isControlled && setExpandedIndex(childIndex); _onChange && _onChange(childIndex); } else { if (allowToggle) { !isControlled && setExpandedIndex(null); _onChange && _onChange(null); } } } } }); }); return (0, _core.jsx)(_Box["default"], (0, _extends2["default"])({ "data-accordion": "" }, rest), clones); }; exports.Accordion = Accordion; var AccordionItemContext = (0, _react.createContext)(); var useAccordionItemContext = function useAccordionItemContext() { return (0, _react.useContext)(AccordionItemContext); }; var AccordionItem = (0, _react.forwardRef)(function (_ref2, ref) { var isOpen = _ref2.isOpen, defaultIsOpen = _ref2.defaultIsOpen, id = _ref2.id, isDisabled = _ref2.isDisabled, onChange = _ref2.onChange, children = _ref2.children, rest = (0, _objectWithoutPropertiesLoose2["default"])(_ref2, ["isOpen", "defaultIsOpen", "id", "isDisabled", "onChange", "children"]); var _useState2 = (0, _react.useState)(defaultIsOpen || false), isExpanded = _useState2[0], setIsExpanded = _useState2[1]; var _useRef2 = (0, _react.useRef)(isOpen != null), isControlled = _useRef2.current; var _isExpanded = isControlled ? isOpen : isExpanded; var onToggle = function onToggle() { onChange && onChange(!_isExpanded); !isControlled && setIsExpanded(!isExpanded); }; var uuid = (0, _autoId.useId)(); var uniqueId = id || uuid; var headerId = "accordion-header-" + uniqueId; var panelId = "accordion-panel-" + uniqueId; return (0, _core.jsx)(AccordionItemContext.Provider, { value: { isExpanded: _isExpanded, isDisabled: isDisabled, headerId: headerId, panelId: panelId, onToggle: onToggle } }, (0, _core.jsx)(_PseudoBox["default"], (0, _extends2["default"])({ borderTopWidth: "1px", _last: { borderBottomWidth: "1px" }, "data-accordion-item": "", ref: ref }, rest), typeof children === "function" ? children({ isExpanded: _isExpanded, isDisabled: isDisabled }) : children)); }); exports.AccordionItem = AccordionItem; AccordionItem.displayName = "AccordionItem"; ///////////////////////////////////////////////////////////// var AccordionHeader = (0, _react.forwardRef)(function (_ref3, ref) { var _onClick = _ref3.onClick, props = (0, _objectWithoutPropertiesLoose2["default"])(_ref3, ["onClick"]); var _useAccordionItemCont = useAccordionItemContext(), isExpanded = _useAccordionItemCont.isExpanded, panelId = _useAccordionItemCont.panelId, headerId = _useAccordionItemCont.headerId, isDisabled = _useAccordionItemCont.isDisabled, onToggle = _useAccordionItemCont.onToggle; return (0, _core.jsx)(_PseudoBox["default"], (0, _extends2["default"])({ ref: ref, display: "flex", alignItems: "center", width: "100%", transition: "all 0.2s", _focus: { boxShadow: "outline" }, _hover: { bg: "blackAlpha.50" }, _disabled: { opacity: "0.4", cursor: "not-allowed" }, as: "button", type: "button", outline: "0", disabled: isDisabled, "aria-disabled": isDisabled, "aria-expanded": isExpanded, onClick: function onClick(event) { onToggle(); if (_onClick) { _onClick(event); } }, id: headerId, "aria-controls": panelId, px: 4, py: 2 }, props)); }); exports.AccordionHeader = AccordionHeader; AccordionHeader.displayName = "AccordionHeader"; ///////////////////////////////////////////////////////////// var AccordionPanel = (0, _react.forwardRef)(function (props, ref) { var _useAccordionItemCont2 = useAccordionItemContext(), isExpanded = _useAccordionItemCont2.isExpanded, panelId = _useAccordionItemCont2.panelId, headerId = _useAccordionItemCont2.headerId; return (0, _core.jsx)(_Collapse["default"], (0, _extends2["default"])({ ref: ref, "data-accordion-panel": "", role: "region", id: panelId, "aria-labelledby": headerId, "aria-hidden": !isExpanded, isOpen: isExpanded, pt: 2, px: 4, pb: 5 }, props)); }); exports.AccordionPanel = AccordionPanel; AccordionPanel.displayName = "AccordionPanel"; ///////////////////////////////////////////////////////////// var AccordionIcon = function AccordionIcon(props) { var _useAccordionItemCont3 = useAccordionItemContext(), isExpanded = _useAccordionItemCont3.isExpanded, isDisabled = _useAccordionItemCont3.isDisabled; return (0, _core.jsx)(_Icon["default"], (0, _extends2["default"])({ "aria-hidden": true, focusable: "false", size: "1.25em", name: "chevron-down", opacity: isDisabled ? 0.4 : 1, transform: isExpanded ? "rotate(-180deg)" : null, transition: "transform 0.2s", transformOrigin: "center" }, props)); }; exports.AccordionIcon = AccordionIcon;