{"version":3,"file":"Tooltip.mjs","sources":["../../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["'use client'\n\nimport {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\n\nimport { isEmpty } from '~/src/utils/type'\n\nimport {\n  AlphaTooltipPrimitive,\n  AlphaTooltipPrimitiveContent,\n  type AlphaTooltipPrimitiveContentProps,\n  AlphaTooltipPrimitivePortal,\n  AlphaTooltipPrimitiveProvider,\n  AlphaTooltipPrimitiveTrigger,\n} from '~/src/components/AlphaTooltipPrimitive'\nimport { Icon } from '~/src/components/Icon'\nimport { HStack } from '~/src/components/Stack'\nimport { Text } from '~/src/components/Text'\nimport { InvertedThemeProvider } from '~/src/components/ThemeProvider'\nimport { useRootElement } from '~/src/components/WindowProvider'\n\nimport { type TooltipPosition, type TooltipProps } from './Tooltip.types'\n\nimport styles from './Tooltip.module.scss'\n\nfunction getSideAndAlign(\n  placement: TooltipPosition\n): Pick<AlphaTooltipPrimitiveContentProps, 'side' | 'align'> {\n  switch (placement) {\n    case 'top-center':\n      return {\n        side: 'top',\n        align: 'center',\n      }\n    case 'top-left':\n      return {\n        side: 'top',\n        align: 'start',\n      }\n    case 'top-right':\n      return {\n        side: 'top',\n        align: 'end',\n      }\n    case 'right-center':\n      return {\n        side: 'right',\n        align: 'center',\n      }\n    case 'right-top':\n      return {\n        side: 'right',\n        align: 'start',\n      }\n    case 'right-bottom':\n      return {\n        side: 'right',\n        align: 'end',\n      }\n    case 'bottom-center':\n      return {\n        side: 'bottom',\n        align: 'center',\n      }\n    case 'bottom-left':\n      return {\n        side: 'bottom',\n        align: 'start',\n      }\n    case 'bottom-right':\n      return {\n        side: 'bottom',\n        align: 'end',\n      }\n    case 'left-center':\n      return {\n        side: 'left',\n        align: 'center',\n      }\n    case 'left-top':\n      return {\n        side: 'left',\n        align: 'start',\n      }\n    case 'left-bottom':\n      return {\n        side: 'left',\n        align: 'end',\n      }\n    default:\n      // NOTE: should not reach here\n      return {\n        side: undefined,\n        align: undefined,\n      }\n  }\n}\n\n/**\n * `Tooltip` is a component that shows additional information when the mouse hovers or the keyboard is focused.\n *\n * Components that pass to children **must spread props and forward ref.**\n * @example\n * ```tsx\n * // Your component must spread props and forward ref.\n * const Button = React.forwardRef((props, forwardedRef) => (<button {...props} ref={forwardedRef} />))\n * // Then, you can use `Tooltip` with your component.\n * <Tooltip content=\"Ta-da!\">\n *   <Button>Hover me</Button>\n * </Tooltip>\n * ```\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(\n  function Tooltip(\n    {\n      children,\n      defaultShow,\n      onShow: onShowProp,\n      onHide: onHideProp,\n      disabled,\n      title,\n      content,\n      description,\n      icon,\n      placement = 'bottom-center',\n      offset = 4,\n      container: containerProp,\n      keepInContainer = true,\n      allowHover = false,\n      delayShow = 0,\n      delayHide = 0,\n      ...rest\n    },\n    forwardedRef\n  ) {\n    const [show, setShow] = useState<boolean>(defaultShow ?? false)\n    const timeoutRef = useRef<NodeJS.Timeout>(undefined)\n\n    const rootElement = useRootElement()\n    const container = containerProp ?? rootElement\n\n    const shouldBeHidden = useMemo(\n      () => disabled || isEmpty(content),\n      [disabled, content]\n    )\n\n    const onShow = useCallback(() => {\n      setShow(true)\n      onShowProp?.()\n    }, [onShowProp])\n\n    const onHide = useCallback(() => {\n      setShow(false)\n      onHideProp?.()\n    }, [onHideProp])\n\n    useEffect(\n      function forceHide() {\n        if (shouldBeHidden) {\n          onHide()\n        }\n      },\n      [shouldBeHidden, onHide]\n    )\n\n    useEffect(\n      function cleanUpTimeout() {\n        return function cleanUp() {\n          if (timeoutRef.current) {\n            clearTimeout(timeoutRef.current)\n          }\n        }\n      },\n      [shouldBeHidden]\n    )\n\n    const onOpenChange = useCallback(\n      (open: boolean) => {\n        if (shouldBeHidden) {\n          return\n        }\n\n        if (open) {\n          onShow()\n          return\n        }\n\n        if (timeoutRef.current) {\n          clearTimeout(timeoutRef.current)\n          timeoutRef.current = undefined\n        }\n\n        if (delayHide > 0) {\n          timeoutRef.current = setTimeout(() => {\n            onHide()\n          }, delayHide)\n          return\n        }\n\n        onHide()\n      },\n      [shouldBeHidden, delayHide, onShow, onHide]\n    )\n\n    return (\n      <AlphaTooltipPrimitiveProvider skipDelayDuration={0}>\n        <AlphaTooltipPrimitive\n          open={show}\n          defaultOpen={defaultShow}\n          delayDuration={delayShow}\n          disableHoverableContent={!allowHover}\n          onOpenChange={onOpenChange}\n        >\n          <AlphaTooltipPrimitiveTrigger asChild>\n            {children}\n          </AlphaTooltipPrimitiveTrigger>\n\n          <AlphaTooltipPrimitivePortal container={container}>\n            <InvertedThemeProvider>\n              <AlphaTooltipPrimitiveContent\n                {...rest}\n                {...getSideAndAlign(placement)}\n                asChild\n                ref={forwardedRef}\n                sideOffset={offset}\n                avoidCollisions={keepInContainer}\n                collisionPadding={8}\n                hideWhenDetached\n              >\n                <HStack\n                  spacing={4}\n                  className={styles.Tooltip}\n                >\n                  <div className={styles.TooltipContainer}>\n                    {title && (\n                      <Text\n                        typo=\"13\"\n                        bold\n                        marginBottom={2}\n                        color=\"text-neutral\"\n                      >\n                        {title}\n                      </Text>\n                    )}\n\n                    <Text\n                      color=\"text-neutral\"\n                      className={styles.TooltipContent}\n                      truncated={20}\n                      typo=\"13\"\n                    >\n                      {content}\n                    </Text>\n\n                    {description && (\n                      <Text\n                        typo=\"12\"\n                        color=\"text-neutral-lighter\"\n                      >\n                        {description}\n                      </Text>\n                    )}\n                  </div>\n\n                  {icon && (\n                    <Icon\n                      size=\"xs\"\n                      color=\"text-neutral\"\n                      source={icon}\n                      className={styles.Icon}\n                    />\n                  )}\n                </HStack>\n              </AlphaTooltipPrimitiveContent>\n            </InvertedThemeProvider>\n          </AlphaTooltipPrimitivePortal>\n        </AlphaTooltipPrimitive>\n      </AlphaTooltipPrimitiveProvider>\n    )\n  }\n)\n"],"names":["getSideAndAlign","placement","side","align","undefined","Tooltip","forwardRef","children","defaultShow","onShow","onShowProp","onHide","onHideProp","disabled","title","content","description","icon","offset","container","containerProp","keepInContainer","allowHover","delayShow","delayHide","rest","forwardedRef","show","setShow","useState","timeoutRef","useRef","rootElement","useRootElement","shouldBeHidden","useMemo","isEmpty","useCallback","useEffect","forceHide","cleanUpTimeout","cleanUp","current","clearTimeout","onOpenChange","open","setTimeout","_jsx","AlphaTooltipPrimitiveProvider","skipDelayDuration","_jsxs","AlphaTooltipPrimitive","defaultOpen","delayDuration","disableHoverableContent","AlphaTooltipPrimitiveTrigger","asChild","AlphaTooltipPrimitivePortal","InvertedThemeProvider","AlphaTooltipPrimitiveContent","ref","sideOffset","avoidCollisions","collisionPadding","hideWhenDetached","HStack","spacing","className","styles","TooltipContainer","Text","typo","bold","marginBottom","color","TooltipContent","truncated","Icon","size","source"],"mappings":"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"}