UNPKG

flowbite-react

Version:

Official React components built for Flowbite and Tailwind CSS

59 lines (56 loc) 1.75 kB
'use client'; import { jsx } from 'react/jsx-runtime'; import { useState, useMemo, Children, cloneElement } from 'react'; import { HiChevronDown } from 'react-icons/hi'; import { twMerge } from 'tailwind-merge'; import { mergeDeep } from '../../helpers/merge-deep.mjs'; import { getTheme } from '../../theme-store/index.mjs'; import { AccordionContent } from './AccordionContent.mjs'; import { AccordionPanel } from './AccordionPanel.mjs'; import { AccordionTitle } from './AccordionTitle.mjs'; const AccordionComponent = ({ alwaysOpen = false, arrowIcon = HiChevronDown, children, flush = false, collapseAll = false, className, theme: customTheme = {}, ...props }) => { const [isOpen, setOpen] = useState(collapseAll ? -1 : 0); const panels = useMemo( () => Children.map( children, (child, i) => cloneElement(child, { alwaysOpen, arrowIcon, flush, isOpen: isOpen === i, setOpen: () => setOpen(isOpen === i ? -1 : i) }) ), [alwaysOpen, arrowIcon, children, flush, isOpen] ); const theme = mergeDeep(getTheme().accordion.root, customTheme); return /* @__PURE__ */ jsx( "div", { className: twMerge(theme.base, theme.flush[flush ? "on" : "off"], className), "data-testid": "flowbite-accordion", ...props, children: panels } ); }; AccordionComponent.displayName = "Accordion"; AccordionPanel.displayName = "Accordion.Panel"; AccordionTitle.displayName = "Accordion.Title"; AccordionContent.displayName = "Accordion.Content"; const Accordion = Object.assign(AccordionComponent, { Panel: AccordionPanel, Title: AccordionTitle, Content: AccordionContent }); export { Accordion }; //# sourceMappingURL=Accordion.mjs.map