@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 7.61 kB
Source Map (JSON)
{"version":3,"file":"use-tooltip.cjs","names":["usePopperProps","useDisclosure","usePopper","getTriggerProps: PropGetter<\"button\">","props","mergeRefs","getPositionerProps: PropGetter"],"sources":["../../../../src/components/tooltip/use-tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport type { PropGetter } from \"../../core\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport type { UsePopperProps } from \"../../hooks/use-popper\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport { useEventListener } from \"../../hooks/use-event-listener\"\nimport { useOutsideClick } from \"../../hooks/use-outside-click\"\nimport { usePopper, usePopperProps } from \"../../hooks/use-popper\"\nimport {\n cx,\n dataAttr,\n getDocument,\n getWindow,\n handlerAll,\n mergeRefs,\n useUnmountEffect,\n} from \"../../utils\"\n\nexport interface UseTooltipProps\n extends Omit<UseDisclosureProps, \"timing\">,\n UsePopperProps<\"button\"> {\n /**\n * The delay before hiding the tooltip.\n *\n * @default 100\n */\n closeDelay?: number\n /**\n * If `true`, the tooltip will hide on click.\n *\n * @default true\n */\n closeOnClick?: boolean\n /**\n * If `true`, the tooltip will hide on pressing Esc key.\n *\n * @default true\n */\n closeOnEsc?: boolean\n /**\n * If `true`, the tooltip will hide on scroll.\n *\n * @default false\n */\n closeOnScroll?: boolean\n /**\n * If `true`, the tooltip will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The delay before showing the tooltip.\n *\n * @default 400\n */\n openDelay?: number\n}\n\nexport const useTooltip = (props: UseTooltipProps = {}) => {\n const [\n popperProps,\n {\n closeDelay = 0,\n closeOnClick = true,\n closeOnEsc = true,\n closeOnScroll,\n defaultOpen,\n disabled,\n open: openProp,\n openDelay = 0,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n },\n ] = usePopperProps(props, [\"open\"])\n const describedbyId = useId()\n const triggerRef = useRef<HTMLElement>(null)\n const openTimeout = useRef<NodeJS.Timeout>(undefined)\n const closeTimeout = useRef<NodeJS.Timeout>(undefined)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const { getPopperProps, getReferenceProps } = usePopper({\n open,\n ...popperProps,\n })\n\n const onForceClose = useCallback(() => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current)\n\n closeTimeout.current = undefined\n }\n\n onClose()\n }, [onClose])\n\n const onDelayOpen = useCallback(() => {\n if (!disabled && !openTimeout.current) {\n if (open) onForceClose()\n\n openTimeout.current = getWindow(triggerRef.current).setTimeout(\n onOpen,\n openDelay,\n )\n }\n }, [disabled, open, onForceClose, onOpen, openDelay])\n\n const onDelayClose = useCallback(() => {\n if (openTimeout.current) {\n clearTimeout(openTimeout.current)\n openTimeout.current = undefined\n }\n\n closeTimeout.current = getWindow(triggerRef.current).setTimeout(() => {\n onForceClose()\n }, closeDelay)\n }, [closeDelay, onForceClose])\n\n useEventListener(\n () => getDocument(triggerRef.current),\n \"keydown\",\n ({ key }) => {\n if (closeOnEsc && key === \"Escape\") onDelayClose()\n },\n )\n\n useEventListener(\n () => getDocument(triggerRef.current),\n \"scroll\",\n () => {\n if (open && closeOnScroll) onForceClose()\n },\n )\n\n useOutsideClick({\n ref: triggerRef,\n enabled: open,\n handler: () => {\n onDelayClose()\n },\n })\n\n useUnmountEffect(() => {\n clearTimeout(openTimeout.current)\n clearTimeout(closeTimeout.current)\n })\n\n const getTriggerProps: PropGetter<\"button\"> = useCallback(\n ({ \"aria-describedby\": ariaDescribedby, ...props } = {}) => {\n return getReferenceProps({\n ...props,\n ref: mergeRefs(props.ref, triggerRef),\n \"aria-describedby\": cx(\n ariaDescribedby,\n open ? describedbyId : undefined,\n ),\n onBlur: handlerAll(props.onBlur, onDelayClose),\n onClick: handlerAll(\n props.onClick,\n closeOnClick ? onDelayClose : undefined,\n ),\n onFocus: handlerAll(props.onFocus, onDelayOpen),\n onPointerEnter: handlerAll(props.onPointerEnter, (ev) => {\n if (ev.pointerType !== \"touch\") onDelayOpen()\n }),\n onPointerLeave: handlerAll(props.onPointerLeave, (ev) => {\n if (ev.pointerType !== \"touch\") onDelayClose()\n }),\n })\n },\n [\n getReferenceProps,\n describedbyId,\n onDelayOpen,\n open,\n closeOnClick,\n onDelayClose,\n ],\n )\n\n const getPositionerProps: PropGetter = useCallback(\n (props) => {\n return getPopperProps(props)\n },\n [getPopperProps],\n )\n\n const getContentProps: PropGetter = useCallback(\n (props = {}) => ({\n id: describedbyId,\n \"data-close\": dataAttr(!open),\n \"data-open\": dataAttr(open),\n role: \"tooltip\",\n onPointerLeave: handlerAll(props.onPointerLeave, onDelayClose),\n ...props,\n }),\n [describedbyId, onDelayClose, open],\n )\n\n return {\n open,\n getContentProps,\n getPositionerProps,\n getTriggerProps,\n onClose: onForceClose,\n onDelayClose,\n onDelayOpen,\n onOpen,\n }\n}\n\nexport type UseTooltipReturn = ReturnType<typeof useTooltip>\n"],"mappings":";;;;;;;;;;;;;;;AA6DA,MAAa,cAAc,QAAyB,EAAE,KAAK;CACzD,MAAM,CACJ,aACA,EACE,aAAa,GACb,eAAe,MACf,aAAa,MACb,eACA,aACA,UACA,MAAM,UACN,YAAY,GACZ,SAAS,aACT,QAAQ,gBAERA,8CAAe,OAAO,CAAC,OAAO,CAAC;CACnC,MAAM,kCAAuB;CAC7B,MAAM,+BAAiC,KAAK;CAC5C,MAAM,gCAAqC,OAAU;CACrD,MAAM,iCAAsC,OAAU;CACtD,MAAM,EAAE,MAAM,SAAS,WAAWC,qCAAc;EAC9C;EACA,MAAM;EACN,SAAS;EACT,QAAQ;EACT,CAAC;CACF,MAAM,EAAE,gBAAgB,sBAAsBC,yCAAU;EACtD;EACA,GAAG;EACJ,CAAC;CAEF,MAAM,4CAAiC;AACrC,MAAI,aAAa,SAAS;AACxB,gBAAa,aAAa,QAAQ;AAElC,gBAAa,UAAU;;AAGzB,WAAS;IACR,CAAC,QAAQ,CAAC;CAEb,MAAM,2CAAgC;AACpC,MAAI,CAAC,YAAY,CAAC,YAAY,SAAS;AACrC,OAAI,KAAM,eAAc;AAExB,eAAY,2DAAoB,WAAW,QAAQ,CAAC,WAClD,QACA,UACD;;IAEF;EAAC;EAAU;EAAM;EAAc;EAAQ;EAAU,CAAC;CAErD,MAAM,4CAAiC;AACrC,MAAI,YAAY,SAAS;AACvB,gBAAa,YAAY,QAAQ;AACjC,eAAY,UAAU;;AAGxB,eAAa,2DAAoB,WAAW,QAAQ,CAAC,iBAAiB;AACpE,iBAAc;KACb,WAAW;IACb,CAAC,YAAY,aAAa,CAAC;AAE9B,kHACoB,WAAW,QAAQ,EACrC,YACC,EAAE,UAAU;AACX,MAAI,cAAc,QAAQ,SAAU,eAAc;GAErD;AAED,kHACoB,WAAW,QAAQ,EACrC,gBACM;AACJ,MAAI,QAAQ,cAAe,eAAc;GAE5C;AAED,uDAAgB;EACd,KAAK;EACL,SAAS;EACT,eAAe;AACb,iBAAc;;EAEjB,CAAC;AAEF,uCAAuB;AACrB,eAAa,YAAY,QAAQ;AACjC,eAAa,aAAa,QAAQ;GAClC;CAEF,MAAMC,0CACH,EAAE,oBAAoB,gBAAiB,GAAGC,YAAU,EAAE,KAAK;AAC1D,SAAO,kBAAkB;GACvB,GAAGA;GACH,KAAKC,sBAAUD,QAAM,KAAK,WAAW;GACrC,8DACE,iBACA,OAAO,gBAAgB,OACxB;GACD,0DAAmBA,QAAM,QAAQ,aAAa;GAC9C,2DACEA,QAAM,SACN,eAAe,eAAe,OAC/B;GACD,2DAAoBA,QAAM,SAAS,YAAY;GAC/C,kEAA2BA,QAAM,iBAAiB,OAAO;AACvD,QAAI,GAAG,gBAAgB,QAAS,cAAa;KAC7C;GACF,kEAA2BA,QAAM,iBAAiB,OAAO;AACvD,QAAI,GAAG,gBAAgB,QAAS,eAAc;KAC9C;GACH,CAAC;IAEJ;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAME,6CACH,YAAU;AACT,SAAO,eAAeF,QAAM;IAE9B,CAAC,eAAe,CACjB;AAcD,QAAO;EACL;EACA,yCAbC,UAAQ,EAAE,MAAM;GACf,IAAI;GACJ,8DAAuB,CAAC,KAAK;GAC7B,6DAAsB,KAAK;GAC3B,MAAM;GACN,kEAA2BA,QAAM,gBAAgB,aAAa;GAC9D,GAAGA;GACJ,GACD;GAAC;GAAe;GAAc;GAAK,CACpC;EAKC;EACA;EACA,SAAS;EACT;EACA;EACA;EACD"}