{"version":3,"sources":["../../src/accordion/useAccordion.ts","../../src/accordion/useAccordion.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport type { NavigationDirection } from '@primereact/types/shared/accordion';\nimport { useAccordionProps } from '@primereact/types/shared/accordion';\nimport { findSingle, focus, getAttribute } from '@primeuix/utils/dom';\nimport * as React from 'react';\nimport { defaultProps } from './useAccordion.props';\n\nexport const useAccordion = withHeadless({\n    name: 'useAccordion',\n    defaultProps,\n    setup({ props, elementRef }) {\n        const [activeValueState, setActiveValueState] = React.useState<useAccordionProps['value']>(props.value ?? props.defaultValue ?? null);\n\n        const state = {\n            value: activeValueState\n        };\n\n        // methods\n        const updateValue = (key: null | undefined | string | number) => {\n            if (key === undefined) return;\n\n            let activeValue = activeValueState;\n            const isActive = isItemActive(key);\n\n            if (props.multiple) {\n                const arrayValue = Array.isArray(activeValue) ? activeValue : [];\n\n                activeValue = isActive ? arrayValue.filter((k) => k !== key) : key !== null && key !== undefined ? [...arrayValue, key] : arrayValue;\n            } else {\n                activeValue = isActive ? null : key;\n            }\n\n            setActiveValueState(activeValue);\n        };\n\n        const isItemActive = (key: null | undefined | string | number): boolean => {\n            if (key === null || key === undefined) return false;\n\n            if (props.multiple) {\n                const arrayValue = activeValueState as (string | number)[] | null | undefined;\n\n                return Array.isArray(arrayValue) && arrayValue.includes(key as string | number);\n            } else {\n                return activeValueState === key;\n            }\n        };\n\n        const focusPanel = (accordionHeader: HTMLElement | null, direction: NavigationDirection): void => {\n            const findHeader = (panelElement: HTMLElement): HTMLElement | null => {\n                return findSingle(panelElement, '[data-pc-name=\"accordionheader\"]') as HTMLElement | null;\n            };\n\n            const findAdjacentPanel = (panelElement: HTMLElement, direction: 'next' | 'previous', selfCheck = false): HTMLElement | null => {\n                const siblingProperty = direction === 'next' ? 'nextElementSibling' : 'previousElementSibling';\n                const element = selfCheck ? panelElement : (panelElement[siblingProperty] as HTMLElement | null);\n\n                if (!element) {\n                    return null;\n                }\n\n                if (getAttribute(element, 'data-p-disabled')) {\n                    return findAdjacentPanel(element, direction);\n                }\n\n                return findHeader(element);\n            };\n\n            const findBoundaryPanel = (boundary: 'first' | 'last'): HTMLElement | null => {\n                const accordionElement = elementRef?.current;\n\n                if (!accordionElement) return null;\n\n                const targetChild = boundary === 'first' ? accordionElement.firstElementChild : accordionElement.lastElementChild;\n\n                if (!targetChild) return null;\n\n                const direction = boundary === 'first' ? 'next' : 'previous';\n\n                return findAdjacentPanel(targetChild as HTMLElement, direction, true);\n            };\n\n            const currentPanel = accordionHeader?.closest('[data-pc-name=\"accordionpanel\"]') as HTMLElement | null;\n\n            if (!currentPanel) return;\n\n            let targetPanel: HTMLElement | null = null;\n\n            switch (direction) {\n                case 'next':\n                    targetPanel = findAdjacentPanel(currentPanel, 'next');\n\n                    if (!targetPanel) {\n                        targetPanel = findBoundaryPanel('first');\n                    }\n\n                    break;\n\n                case 'previous':\n                    targetPanel = findAdjacentPanel(currentPanel, 'previous');\n\n                    if (!targetPanel) {\n                        targetPanel = findBoundaryPanel('last');\n                    }\n\n                    break;\n\n                case 'first':\n                    targetPanel = findBoundaryPanel('first');\n                    break;\n\n                case 'last':\n                    targetPanel = findBoundaryPanel('last');\n                    break;\n            }\n\n            if (targetPanel) {\n                focus(targetPanel);\n            }\n        };\n\n        const onHeaderClick = (event: React.MouseEvent<HTMLButtonElement>, value: null | undefined | string | number) => {\n            if (!props.selectOnFocus) {\n                updateValue(value);\n            }\n        };\n\n        const onHeaderFocus = (event: React.FocusEvent<HTMLButtonElement>, value: null | undefined | string | number) => {\n            if (props.selectOnFocus) {\n                updateValue(value);\n            }\n        };\n\n        const onHeaderKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, value: null | undefined | string | number) => {\n            switch (event.code) {\n                case 'ArrowDown':\n                    focusPanel(event.currentTarget, 'next');\n                    break;\n\n                case 'ArrowUp':\n                    focusPanel(event.currentTarget, 'previous');\n                    break;\n\n                case 'Home':\n                    focusPanel(event.currentTarget, 'first');\n                    break;\n\n                case 'End':\n                    focusPanel(event.currentTarget, 'last');\n                    break;\n\n                case 'Enter':\n                case 'NumpadEnter':\n                case 'Space':\n                    updateValue(value);\n                    break;\n\n                case 'Tab':\n                    return;\n\n                default:\n                    break;\n            }\n\n            event.preventDefault();\n        };\n\n        // effects\n\n        return {\n            state,\n            // methods\n            updateValue,\n            isItemActive,\n            onHeaderClick,\n            onHeaderFocus,\n            onHeaderKeyDown\n        };\n    }\n});\n","import type { useAccordionProps } from '@primereact/types/shared/accordion';\n\nexport const defaultProps: useAccordionProps = {\n    defaultValue: null,\n    value: null,\n    multiple: false,\n    onValueChange: undefined,\n    selectOnFocus: false\n};\n"],"mappings":"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","names":["withHeadless","findSingle","focus","getAttribute","React","defaultProps","useAccordion","withHeadless","defaultProps","props","elementRef","_a","_b","activeValueState","setActiveValueState","state","updateValue","key","activeValue","isActive","isItemActive","arrayValue","k","focusPanel","accordionHeader","direction","findHeader","panelElement","findSingle","findAdjacentPanel","selfCheck","element","getAttribute","findBoundaryPanel","boundary","accordionElement","targetChild","currentPanel","targetPanel","focus","event","value"]}