{"version":3,"sources":["../src/components/Portal/Portal.tsx"],"names":["useState","useEffect","createPortal","jsx","useRef"],"mappings":";;;;;;;AAQO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgB;AAO3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,QAAA,KAAa,aAAa,OAAO,IAAA;AAExD,EAAA,MAAM,MAAA,GAAS,aAAa,QAAA,CAAS,IAAA;AAErC,EAAA,OAAOC,qBAAA;AAAA,oBACLC,cAAA,CAAC,qBAAmB,QAAA,EAAS,CAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAOA,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAA4B;AAChE,EAAA,MAAM,GAAA,GAAMC,aAAuB,IAAI,CAAA;AAEvC,EAAAH,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,MAAA,GACJ,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAC9B,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA,KAAM,MAAA;AACtC,MAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,IAAA,EAAK;AAEL,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAI,CAAA;AAC1C,IAAA,QAAA,CAAS,QAAQ,IAAA,EAAM;AAAA,MACrB,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAA,EAAS,YAAY;AAAA,KACxC,CAAA;AAED,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEE,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,yBAAA,EAAwB,EAAA,EAAG,OAAO,EAAE,OAAA,EAAS,UAAA,EAAW,EACpE,QAAA,EACH,CAAA;AAEJ","file":"chunk-NBZC6LOB.cjs","sourcesContent":["import { createPortal } from \"react-dom\";\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nexport interface PortalProps {\n  children: ReactNode;\n  container?: HTMLElement;\n}\n\nexport function Portal({ children, container }: PortalProps) {\n  // Render nothing on the server AND on the client's first (hydration) render,\n  // then portal after mount. Without the `mounted` gate the client would render\n  // the portal immediately while the server rendered null — a hydration\n  // mismatch (the portal wrapper appears client-only). Deferring to after mount\n  // keeps the first client render identical to the server. SSR-safe for every\n  // Portal consumer (Toast, Modal, Dropdown, Tooltip, Popover, …).\n  const [mounted, setMounted] = useState(false);\n  useEffect(() => {\n    setMounted(true);\n  }, []);\n\n  if (!mounted || typeof document === \"undefined\") return null;\n\n  const target = container ?? document.body;\n\n  return createPortal(\n    <PortalDarkWrapper>{children}</PortalDarkWrapper>,\n    target,\n  );\n}\n\n/**\n * Wrapper that propagates the `dark` class from <html> into the portal subtree.\n * This ensures Tailwind `dark:` utilities work even though Portal renders\n * outside the React component tree.\n */\nfunction PortalDarkWrapper({ children }: { children: ReactNode }) {\n  const ref = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const root = document.documentElement;\n    const wrapper = ref.current;\n    if (!wrapper) return;\n\n    const sync = () => {\n      const isDark =\n        root.classList.contains(\"dark\") ||\n        root.getAttribute(\"data-theme\") === \"dark\";\n      wrapper.classList.toggle(\"dark\", isDark);\n    };\n\n    sync();\n\n    const observer = new MutationObserver(sync);\n    observer.observe(root, {\n      attributes: true,\n      attributeFilter: [\"class\", \"data-theme\"],\n    });\n\n    return () => observer.disconnect();\n  }, []);\n\n  return (\n    <div ref={ref} data-react-fancy-portal=\"\" style={{ display: \"contents\" }}>\n      {children}\n    </div>\n  );\n}\n"]}