{"version":3,"file":"Accordion.mjs","names":[],"sources":["../../src/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { Divider } from 'antd';\nimport { cx } from 'antd-style';\nimport { LayoutGroup } from 'motion/react';\nimport { type Key } from 'react';\nimport { Children, Fragment, isValidElement, memo, useCallback, useMemo, useRef } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { AccordionConfigContext, AccordionItemStateProvider } from './context';\nimport { styles } from './style';\nimport { type AccordionProps } from './type';\n\nconst Accordion = memo<AccordionProps>(\n  ({\n    children,\n    className: userClassName,\n    style: userStyle,\n    accordion = false,\n    defaultExpandedKeys,\n    expandedKeys: expandedKeysProp,\n    onExpandedChange,\n    variant = 'borderless',\n    gap,\n    showDivider = false,\n    disableAnimation = false,\n    hideIndicator = false,\n    indicatorPlacement = 'start',\n    keepContentMounted = true,\n    classNames,\n    styles: customStyles,\n    motionProps,\n    ref,\n    ...rest\n  }) => {\n    // Convert children to array and filter valid elements\n    const validChildren = Children.toArray(children).filter(isValidElement);\n\n    // Collect all item keys\n    const allItemKeys = validChildren.map((child, index) => (child.props as any).itemKey || index);\n\n    // If defaultExpandedKeys or expandedKeys is undefined, expand all items by default\n    const initialExpandedKeys = defaultExpandedKeys ?? allItemKeys;\n\n    const [expandedKeys, setExpandedKeys] = useMergeState<Key[]>(initialExpandedKeys, {\n      onChange: onExpandedChange,\n      value: expandedKeysProp,\n    });\n\n    // Hold expandedKeys and setExpandedKeys via refs so toggleExpand can stay\n    // reference-stable. use-merge-value's setter is recreated on every render,\n    // so depending on it would force AccordionItemStateProvider's memoized\n    // value to change identity each render — even when nothing toggled —\n    // re-rendering every nested AccordionItem via \"context changed\".\n    const expandedKeysRef = useRef(expandedKeys);\n    expandedKeysRef.current = expandedKeys;\n    const setExpandedKeysRef = useRef(setExpandedKeys);\n    setExpandedKeysRef.current = setExpandedKeys;\n\n    const isOpenKey = useCallback((key: Key) => expandedKeysRef.current.includes(key), []);\n\n    const toggleExpand = useCallback(\n      (key: Key) => {\n        const prev = expandedKeysRef.current;\n        let newKeys: Key[];\n\n        if (accordion) {\n          newKeys = prev.includes(key) ? [] : [key];\n        } else {\n          newKeys = prev.includes(key) ? prev.filter((k: Key) => k !== key) : [...prev, key];\n        }\n\n        setExpandedKeysRef.current(newKeys);\n      },\n      [accordion],\n    );\n\n    const toggleExpandKeys = useCallback(\n      (keys: Key[], preferredKey: Key) => {\n        const prev = expandedKeysRef.current;\n        const isOpen = keys.some((key) => prev.includes(key));\n        let newKeys: Key[];\n\n        if (accordion) {\n          newKeys = isOpen ? [] : [preferredKey];\n        } else {\n          newKeys = isOpen\n            ? prev.filter((key: Key) => !keys.includes(key))\n            : [...prev, preferredKey];\n        }\n\n        setExpandedKeysRef.current(newKeys);\n      },\n      [accordion],\n    );\n\n    const configValue = useMemo(\n      () => ({\n        disableAnimation,\n        hideIndicator,\n        indicatorPlacement,\n        keepContentMounted,\n        motionProps,\n        showDivider,\n        variant,\n      }),\n      [\n        disableAnimation,\n        hideIndicator,\n        indicatorPlacement,\n        keepContentMounted,\n        motionProps,\n        showDivider,\n        variant,\n      ],\n    );\n\n    const hasExplicitExpandedKeys =\n      expandedKeysProp !== undefined || defaultExpandedKeys !== undefined;\n\n    const content = (\n      <>\n        {validChildren.map((child, index) => {\n          const hasChildItemKey = (child.props as any).itemKey !== undefined;\n          const childKey = hasChildItemKey ? (child.props as any).itemKey : index;\n          const itemIsOpen = expandedKeys.includes(childKey);\n          return (\n            <Fragment key={childKey}>\n              <AccordionItemStateProvider\n                expandedKeys={hasChildItemKey ? undefined : expandedKeys}\n                isOpen={itemIsOpen}\n                isOpenKey={isOpenKey}\n                itemKey={childKey}\n                preferProviderKeyForNestedItems={!hasExplicitExpandedKeys}\n                onToggleKey={toggleExpand}\n                onToggleKeys={toggleExpandKeys}\n              >\n                {child}\n              </AccordionItemStateProvider>\n              {showDivider && index < validChildren.length - 1 && (\n                <Divider className={styles.divider} />\n              )}\n            </Fragment>\n          );\n        })}\n      </>\n    );\n\n    return (\n      <AccordionConfigContext value={configValue}>\n        <div\n          className={cx(styles.base, classNames?.base, userClassName)}\n          ref={ref}\n          style={{\n            gap: gap,\n            ...customStyles?.base,\n            ...userStyle,\n          }}\n          {...rest}\n        >\n          {disableAnimation ? content : <LayoutGroup>{content}</LayoutGroup>}\n        </div>\n      </AccordionConfigContext>\n    );\n  },\n);\n\nAccordion.displayName = 'Accordion';\n\nexport default Accordion;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,YAAY,MACf,EACC,UACA,WAAW,eACX,OAAO,WACP,YAAY,OACZ,qBACA,cAAc,kBACd,kBACA,UAAU,cACV,KACA,cAAc,OACd,mBAAmB,OACnB,gBAAgB,OAChB,qBAAqB,SACrB,qBAAqB,MACrB,YACA,QAAQ,cACR,aACA,KACA,GAAG,WACC;CAEJ,MAAM,gBAAgB,SAAS,QAAQ,SAAS,CAAC,OAAO,eAAe;CAGvE,MAAM,cAAc,cAAc,KAAK,OAAO,UAAW,MAAM,MAAc,WAAW,MAAM;CAK9F,MAAM,CAAC,cAAc,mBAAmB,cAFZ,uBAAuB,aAE+B;EAChF,UAAU;EACV,OAAO;EACR,CAAC;CAOF,MAAM,kBAAkB,OAAO,aAAa;AAC5C,iBAAgB,UAAU;CAC1B,MAAM,qBAAqB,OAAO,gBAAgB;AAClD,oBAAmB,UAAU;CAE7B,MAAM,YAAY,aAAa,QAAa,gBAAgB,QAAQ,SAAS,IAAI,EAAE,EAAE,CAAC;CAEtF,MAAM,eAAe,aAClB,QAAa;EACZ,MAAM,OAAO,gBAAgB;EAC7B,IAAI;AAEJ,MAAI,UACF,WAAU,KAAK,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI;MAEzC,WAAU,KAAK,SAAS,IAAI,GAAG,KAAK,QAAQ,MAAW,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,IAAI;AAGpF,qBAAmB,QAAQ,QAAQ;IAErC,CAAC,UAAU,CACZ;CAED,MAAM,mBAAmB,aACtB,MAAa,iBAAsB;EAClC,MAAM,OAAO,gBAAgB;EAC7B,MAAM,SAAS,KAAK,MAAM,QAAQ,KAAK,SAAS,IAAI,CAAC;EACrD,IAAI;AAEJ,MAAI,UACF,WAAU,SAAS,EAAE,GAAG,CAAC,aAAa;MAEtC,WAAU,SACN,KAAK,QAAQ,QAAa,CAAC,KAAK,SAAS,IAAI,CAAC,GAC9C,CAAC,GAAG,MAAM,aAAa;AAG7B,qBAAmB,QAAQ,QAAQ;IAErC,CAAC,UAAU,CACZ;CAED,MAAM,cAAc,eACX;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,0BACJ,qBAAqB,KAAA,KAAa,wBAAwB,KAAA;CAE5D,MAAM,UACJ,oBAAA,YAAA,EAAA,UACG,cAAc,KAAK,OAAO,UAAU;EACnC,MAAM,kBAAmB,MAAM,MAAc,YAAY,KAAA;EACzD,MAAM,WAAW,kBAAmB,MAAM,MAAc,UAAU;EAClE,MAAM,aAAa,aAAa,SAAS,SAAS;AAClD,SACE,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,4BAAD;GACE,cAAc,kBAAkB,KAAA,IAAY;GAC5C,QAAQ;GACG;GACX,SAAS;GACT,iCAAiC,CAAC;GAClC,aAAa;GACb,cAAc;aAEb;GAC0B,CAAA,EAC5B,eAAe,QAAQ,cAAc,SAAS,KAC7C,oBAAC,SAAD,EAAS,WAAW,OAAO,SAAW,CAAA,CAE/B,EAAA,EAfI,SAeJ;GAEb,EACD,CAAA;AAGL,QACE,oBAAC,wBAAD;EAAwB,OAAO;YAC7B,oBAAC,OAAD;GACE,WAAW,GAAG,OAAO,MAAM,YAAY,MAAM,cAAc;GACtD;GACL,OAAO;IACA;IACL,GAAG,cAAc;IACjB,GAAG;IACJ;GACD,GAAI;aAEH,mBAAmB,UAAU,oBAAC,aAAD,EAAA,UAAc,SAAsB,CAAA;GAC9D,CAAA;EACiB,CAAA;EAG9B;AAED,UAAU,cAAc"}