{"version":3,"file":"BottomSheet.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\nimport { usePortalHost } from \"../Portal/portal-host\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n    /** Controlled open state. */\n    open: boolean;\n    /** Fires when user dismisses (backdrop click, Esc, swipe). */\n    onClose: () => void;\n    /** Optional title rendered at the top of the sheet. */\n    title?: ReactNode;\n    /** Show a drag handle indicator at the top. Default `true`. */\n    showHandle?: boolean;\n    /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n    dismissOnBackdrop?: boolean;\n    /** When `true`, pressing Esc closes the sheet. Default `true`. */\n    dismissOnEsc?: boolean;\n    children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n *     <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n    open,\n    onClose,\n    title,\n    showHandle = true,\n    dismissOnBackdrop = true,\n    dismissOnEsc = true,\n    className,\n    children,\n    ...props\n}: BottomSheetProps) {\n    useEffect(() => {\n        if (!open || !dismissOnEsc) return;\n        const handler = (e: KeyboardEvent) => {\n            if (e.key === \"Escape\") onClose();\n        };\n        window.addEventListener(\"keydown\", handler);\n        return () => window.removeEventListener(\"keydown\", handler);\n    }, [open, dismissOnEsc, onClose]);\n\n    useEffect(() => {\n        if (!open) return;\n        const previous = document.body.style.overflow;\n        document.body.style.overflow = \"hidden\";\n        return () => {\n            document.body.style.overflow = previous;\n        };\n    }, [open]);\n\n    const portalHost = usePortalHost();\n\n    if (!open || !portalHost) return null;\n\n    return createPortal(\n        <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n            <div\n                className={styles.backdrop}\n                onClick={() => dismissOnBackdrop && onClose()}\n                aria-hidden=\"true\"\n            />\n            <div className={cn(styles.sheet, className)} {...props}>\n                {showHandle && (\n                    <button\n                        type=\"button\"\n                        className={styles.handle}\n                        aria-label=\"Arrastar para fechar\"\n                        onClick={onClose}\n                    >\n                        <span className={styles.handleBar} />\n                    </button>\n                )}\n                {title && <div className={styles.title}>{title}</div>}\n                <div className={styles.body}>{children}</div>\n            </div>\n        </div>,\n        portalHost,\n    );\n}\n"],"mappings":"gMAgCA,SAAgB,EAAY,CACxB,OACA,UACA,QACA,aAAa,GACb,oBAAoB,GACpB,eAAe,GACf,YACA,WACA,GAAG,GACc,EACjB,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,GAAQ,CAAC,EAAc,OAC5B,IAAM,EAAW,GAAqB,CAC9B,EAAE,MAAQ,UAAU,EAAQ,CACpC,EAEA,OADA,OAAO,iBAAiB,UAAW,CAAO,MAC7B,OAAO,oBAAoB,UAAW,CAAO,CAC9D,EAAG,CAAC,EAAM,EAAc,CAAO,CAAC,GAEhC,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,SAAS,KAAK,MAAM,SAErC,MADA,UAAS,KAAK,MAAM,SAAW,aAClB,CACT,SAAS,KAAK,MAAM,SAAW,CACnC,CACJ,EAAG,CAAC,CAAI,CAAC,EAET,IAAM,EAAa,EAAA,cAAc,EAIjC,MAFI,CAAC,GAAQ,CAAC,EAAmB,MAEjC,EAAO,EAAA,aAAA,EACH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAM,KAAK,SAAS,aAAW,OAAtD,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,UAAW,EAAA,QAAO,SAClB,YAAe,GAAqB,EAAQ,EAC5C,cAAY,MACf,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EAAG,GAAI,EAAjD,SAAA,CACK,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAW,uBACX,QAAS,EAET,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,SAAY,CAAA,CAChC,CAAA,EAEX,IAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAW,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAO,UAAc,CAAA,CAC3C,CACJ,CAAA,CAAA,CACL,CAAA,EAAA,CACJ,CACJ"}