{"version":3,"file":"Portal.cjs","sources":["../../../src/components/Portal/Portal.tsx"],"sourcesContent":["import { forwardRef, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { assignRef, useIsomorphicEffect } from '@raikou/hooks';\nimport { useProps } from '../../core';\n\nfunction createPortalNode(props: React.ComponentPropsWithoutRef<'div'>) {\n  const node = document.createElement('div');\n  node.setAttribute('data-portal', 'true');\n  typeof props.className === 'string' &&\n    node.classList.add(...props.className.split(' ').filter(Boolean));\n  typeof props.style === 'object' && Object.assign(node.style, props.style);\n  typeof props.id === 'string' && node.setAttribute('id', props.id);\n  return node;\n}\n\nexport interface PortalProps extends React.ComponentPropsWithoutRef<'div'> {\n  /** Portal children, for example, custom modal or popover */\n  children: React.ReactNode;\n\n  /** Element inside which portal should be created, by default a new div element is created and appended to the `document.body` */\n  target?: HTMLElement | string;\n}\n\nconst defaultProps: Partial<PortalProps> = {};\n\nexport const Portal = forwardRef<HTMLDivElement, PortalProps>((props, ref) => {\n  const { children, target, ...others } = useProps('Portal', defaultProps, props);\n\n  const [mounted, setMounted] = useState(false);\n  const nodeRef = useRef<HTMLElement | null>(null);\n\n  useIsomorphicEffect(() => {\n    setMounted(true);\n    nodeRef.current = !target\n      ? createPortalNode(others)\n      : typeof target === 'string'\n        ? document.querySelector(target)\n        : target;\n\n    assignRef(ref, nodeRef.current);\n\n    if (!target && nodeRef.current) {\n      document.body.appendChild(nodeRef.current);\n    }\n\n    return () => {\n      if (!target && nodeRef.current) {\n        document.body.removeChild(nodeRef.current);\n      }\n    };\n  }, [target]);\n\n  if (!mounted || !nodeRef.current) {\n    return null;\n  }\n\n  return createPortal(<>{children}</>, nodeRef.current);\n});\n\nPortal.displayName = '@raikou/core/Portal';\n"],"names":["forwardRef","useProps","useState","useRef","useIsomorphicEffect","assignRef","createPortal","jsx","Fragment"],"mappings":";;;;;;;;;;;;AAKA,SAAS,iBAAiB,KAA8C,EAAA;AACtE,EAAM,MAAA,IAAA,GAAO,QAAS,CAAA,aAAA,CAAc,KAAK,CAAA;AACzC,EAAK,IAAA,CAAA,YAAA,CAAa,eAAe,MAAM,CAAA;AACvC,EAAA,OAAO,KAAM,CAAA,SAAA,KAAc,QACzB,IAAA,IAAA,CAAK,UAAU,GAAI,CAAA,GAAG,KAAM,CAAA,SAAA,CAAU,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAClE,EAAO,OAAA,KAAA,CAAM,UAAU,QAAY,IAAA,MAAA,CAAO,OAAO,IAAK,CAAA,KAAA,EAAO,MAAM,KAAK,CAAA;AACxE,EAAA,OAAO,MAAM,EAAO,KAAA,QAAA,IAAY,KAAK,YAAa,CAAA,IAAA,EAAM,MAAM,EAAE,CAAA;AAChE,EAAO,OAAA,IAAA;AACT;AAUA,MAAM,eAAqC,EAAC;AAErC,MAAM,MAAS,GAAAA,gBAAA,CAAwC,CAAC,KAAA,EAAO,GAAQ,KAAA;AAC5E,EAAM,MAAA,EAAE,UAAU,MAAQ,EAAA,GAAG,QAAW,GAAAC,iBAAA,CAAS,QAAU,EAAA,YAAA,EAAc,KAAK,CAAA;AAE9E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,OAAA,GAAUC,aAA2B,IAAI,CAAA;AAE/C,EAAAC,yBAAA,CAAoB,MAAM;AACxB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,OAAA,CAAQ,OAAU,GAAA,CAAC,MACf,GAAA,gBAAA,CAAiB,MAAM,CAAA,GACvB,OAAO,MAAA,KAAW,QAChB,GAAA,QAAA,CAAS,aAAc,CAAA,MAAM,CAC7B,GAAA,MAAA;AAEN,IAAUC,eAAA,CAAA,GAAA,EAAK,QAAQ,OAAO,CAAA;AAE9B,IAAI,IAAA,CAAC,MAAU,IAAA,OAAA,CAAQ,OAAS,EAAA;AAC9B,MAAS,QAAA,CAAA,IAAA,CAAK,WAAY,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AAG3C,IAAA,OAAO,MAAM;AACX,MAAI,IAAA,CAAC,MAAU,IAAA,OAAA,CAAQ,OAAS,EAAA;AAC9B,QAAS,QAAA,CAAA,IAAA,CAAK,WAAY,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AAC3C,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,OAAS,EAAA;AAChC,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,OAAOC,qBAAa,iBAAAC,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAS,EAAA,CAAA,EAAK,QAAQ,OAAO,CAAA;AACtD,CAAC;AAED,MAAA,CAAO,WAAc,GAAA,qBAAA;;;;"}