{"version":3,"sources":["../../src/styleclass/useStyleClass.ts","../../src/styleclass/useStyleClass.props.ts"],"sourcesContent":["import { withHeadless } from '@primereact/core/headless';\nimport { useEventListener } from '@primereact/hooks/use-event-listener';\nimport { useMountEffect } from '@primereact/hooks/use-mount-effect';\nimport { useUnmountEffect } from '@primereact/hooks/use-unmount-effect';\nimport { useUpdateEffect } from '@primereact/hooks/use-update-effect';\nimport { addClass, getTargetElement, hasClass, isVisible, removeClass, setAttribute, toElement } from '@primeuix/utils';\nimport * as React from 'react';\nimport { defaultProps } from './useStyleClass.props';\n\nexport const useStyleClass = withHeadless({\n    name: 'useStyleClass',\n    defaultProps,\n    setup({ props, elementRef }) {\n        const animating = React.useRef(false);\n\n        // element refs\n        const targetRef = React.useRef<HTMLElement | null>(null);\n\n        // events\n        const [bindTargetEnterListener, unbindTargetEnterListener] = useEventListener({\n            type: 'animationend',\n            listener() {\n                removeClass(targetRef.current as Element, props.enterActiveClassName ?? '');\n\n                if (props.enterToClassName) {\n                    addClass(targetRef.current as Element, props.enterToClassName);\n                }\n\n                unbindTargetEnterListener();\n\n                if (targetRef.current && props.enterActiveClassName?.includes('slidedown')) {\n                    targetRef.current.style.maxHeight = '';\n                }\n\n                animating.current = false;\n            }\n        });\n\n        const [bindTargetLeaveListener, unbindTargetLeaveListener] = useEventListener({\n            type: 'animationend',\n            listener() {\n                removeClass(targetRef.current as Element, props.leaveActiveClassName ?? '');\n\n                if (props.leaveToClassName) {\n                    addClass(targetRef.current as Element, props.leaveToClassName);\n                }\n\n                unbindTargetLeaveListener();\n                animating.current = false;\n            }\n        });\n\n        const [bindDocumentClickListener, unbindDocumentClickListener] = useEventListener({\n            type: 'click',\n            listener(event) {\n                if (!isVisible(targetRef.current as HTMLElement) || getComputedStyle(targetRef.current as Element).getPropertyValue('position') === 'static') {\n                    unbindDocumentClickListener();\n                } else if (isOutsideClick(event as MouseEvent)) {\n                    leave();\n                }\n            },\n            when: props.hideOnOutsideClick\n        });\n\n        const [bindClickListener, unbindClickListener] = useEventListener({\n            type: 'click',\n            listener() {\n                targetRef.current = resolveTarget() as HTMLElement;\n\n                if (props.toggleClassName) {\n                    if (hasClass(targetRef.current, props.toggleClassName)) {\n                        removeClass(targetRef.current, props.toggleClassName);\n                    } else {\n                        addClass(targetRef.current, props.toggleClassName);\n                    }\n                } else {\n                    if (isVisible(targetRef.current)) {\n                        leave();\n                    } else {\n                        enter();\n                    }\n                }\n            }\n        });\n\n        // methods\n        const enter = React.useCallback(() => {\n            if (!targetRef.current) return;\n\n            if (props.enterActiveClassName) {\n                if (!animating.current) {\n                    animating.current = true;\n\n                    if (props.enterActiveClassName.includes('slidedown')) {\n                        targetRef.current.style.height = '0px';\n                        removeClass(targetRef.current, (props.hiddenClassName || props.enterFromClassName) ?? '');\n                        targetRef.current.style.maxHeight = targetRef.current.scrollHeight + 'px';\n                        addClass(targetRef.current, props.hiddenClassName || props.enterActiveClassName);\n                        targetRef.current.style.height = '';\n                    }\n\n                    addClass(targetRef.current, props.enterActiveClassName);\n\n                    if (props.enterFromClassName) {\n                        removeClass(targetRef.current, props.enterFromClassName);\n                    }\n\n                    bindTargetEnterListener({ target: targetRef.current });\n                }\n            } else {\n                if (props.enterFromClassName) {\n                    removeClass(targetRef.current, props.enterFromClassName);\n                }\n\n                if (props.enterToClassName) {\n                    addClass(targetRef.current, props.enterToClassName);\n                }\n            }\n\n            bindDocumentClickListener({ target: elementRef.current?.ownerDocument });\n        }, [bindDocumentClickListener, bindTargetEnterListener, elementRef, props]);\n\n        const leave = React.useCallback(() => {\n            if (props.leaveActiveClassName) {\n                if (!animating.current) {\n                    animating.current = true;\n                    addClass(targetRef.current as Element, props.leaveActiveClassName);\n\n                    if (props.leaveFromClassName) {\n                        removeClass(targetRef.current as Element, props.leaveFromClassName);\n                    }\n\n                    bindTargetLeaveListener({ target: targetRef.current });\n                }\n            } else {\n                if (props.leaveFromClassName) {\n                    removeClass(targetRef.current as Element, props.leaveFromClassName);\n                }\n\n                if (props.leaveToClassName) {\n                    addClass(targetRef.current as Element, props.leaveToClassName);\n                }\n            }\n\n            if (props.hideOnOutsideClick) {\n                unbindDocumentClickListener();\n            }\n        }, [bindTargetLeaveListener, props, unbindDocumentClickListener]);\n\n        const resolveTarget = React.useCallback(() => {\n            return targetRef.current || getTargetElement(props.selector, elementRef.current as Element);\n        }, [elementRef, props.selector]);\n\n        const init = React.useCallback(() => {\n            Promise.resolve().then(() => {\n                if (props.nodeRef?.current) {\n                    elementRef.current = toElement(props.nodeRef) as HTMLElement;\n                }\n\n                setAttribute(elementRef.current as HTMLElement, 'data-pd-styleclass', true);\n                bindClickListener({ target: elementRef.current });\n            });\n        }, [bindClickListener, elementRef, props.nodeRef]);\n\n        const destroy = React.useCallback(() => {\n            unbindClickListener();\n            unbindDocumentClickListener();\n            targetRef.current = null;\n        }, []);\n\n        const isOutsideClick = (event: MouseEvent) => {\n            const target = event?.target as Node;\n\n            return !elementRef.current?.isSameNode(target) && !elementRef.current?.contains(target) && !targetRef.current?.contains(target);\n        };\n\n        // effects\n        useMountEffect(() => {\n            init();\n        });\n\n        useUpdateEffect(() => {\n            init();\n\n            return () => {\n                unbindClickListener();\n            };\n        });\n\n        useUnmountEffect(() => {\n            destroy();\n        });\n\n        return {\n            // element refs\n            targetRef,\n            // methods\n            enter,\n            leave\n        };\n    }\n});\n","import type { useStyleClassProps } from '@primereact/types/shared/styleclass';\n\nexport const defaultProps: useStyleClassProps = {\n    nodeRef: undefined,\n    selector: undefined,\n    enterFromClassName: undefined,\n    enterActiveClassName: undefined,\n    enterToClassName: undefined,\n    leaveFromClassName: undefined,\n    leaveActiveClassName: undefined,\n    leaveToClassName: undefined,\n    hiddenClassName: undefined,\n    hideOnOutsideClick: false,\n    toggleClassName: undefined\n};\n"],"mappings":"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","names":["withHeadless","useEventListener","useMountEffect","useUnmountEffect","useUpdateEffect","addClass","getTargetElement","hasClass","isVisible","removeClass","setAttribute","toElement","React","defaultProps","useStyleClass","withHeadless","defaultProps","props","elementRef","animating","targetRef","bindTargetEnterListener","unbindTargetEnterListener","useEventListener","_a","_b","removeClass","addClass","bindTargetLeaveListener","unbindTargetLeaveListener","bindDocumentClickListener","unbindDocumentClickListener","event","isVisible","isOutsideClick","leave","bindClickListener","unbindClickListener","resolveTarget","hasClass","enter","getTargetElement","init","toElement","setAttribute","destroy","_c","target","useMountEffect","useUpdateEffect","useUnmountEffect"]}