UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

88 lines (87 loc) 3.22 kB
"use client"; import { TooltipGroupContext } from "./TooltipGroup/TooltipGroup.mjs"; import { use, useCallback, useState } from "react"; import { useDidUpdate, useId as useId$1 } from "@mantine/hooks"; import { arrow, autoUpdate, flip, inline, offset, shift, useDelayGroup, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole } from "@floating-ui/react"; //#region packages/@mantine/core/src/components/Tooltip/use-tooltip.ts function getDefaultMiddlewares(middlewares) { if (middlewares === void 0) return { shift: true, flip: true }; const result = { ...middlewares }; if (middlewares.shift === void 0) result.shift = true; if (middlewares.flip === void 0) result.flip = true; return result; } function getTooltipMiddlewares(settings) { const middlewaresOptions = getDefaultMiddlewares(settings.middlewares); const middlewares = [offset(settings.offset)]; if (middlewaresOptions.shift) middlewares.push(shift(typeof middlewaresOptions.shift === "boolean" ? { padding: 8 } : { padding: 8, ...middlewaresOptions.shift })); if (middlewaresOptions.flip) middlewares.push(typeof middlewaresOptions.flip === "boolean" ? flip() : flip(middlewaresOptions.flip)); middlewares.push(arrow({ element: settings.arrowRef, padding: settings.arrowOffset })); if (middlewaresOptions.inline) middlewares.push(typeof middlewaresOptions.inline === "boolean" ? inline() : inline(middlewaresOptions.inline)); else if (settings.inline) middlewares.push(inline()); return middlewares; } function useTooltip(settings) { const [uncontrolledOpened, setUncontrolledOpened] = useState(settings.defaultOpened); const opened = typeof settings.opened === "boolean" ? settings.opened : uncontrolledOpened; const withinGroup = use(TooltipGroupContext).withinGroup; const uid = useId$1(); const onChange = useCallback((_opened) => { setUncontrolledOpened(_opened); if (_opened) setCurrentId(uid); }, [uid]); const { x, y, context, refs, placement, middlewareData: { arrow: { x: arrowX, y: arrowY } = {} } } = useFloating({ strategy: settings.strategy, placement: settings.position, open: opened, onOpenChange: onChange, middleware: getTooltipMiddlewares(settings), whileElementsMounted: autoUpdate }); const { delay: groupDelay, currentId, setCurrentId } = useDelayGroup(context, { id: uid }); const { getReferenceProps, getFloatingProps } = useInteractions([ useHover(context, { enabled: settings.events?.hover, delay: withinGroup ? groupDelay : { open: settings.openDelay, close: settings.closeDelay }, mouseOnly: !settings.events?.touch }), useFocus(context, { enabled: settings.events?.focus, visibleOnly: true }), useRole(context, { role: "tooltip" }), useDismiss(context, { enabled: typeof settings.opened === "undefined" }) ]); useDidUpdate(() => { settings.onPositionChange?.(placement); }, [placement]); const isGroupPhase = opened && currentId && currentId !== uid; return { x, y, arrowX, arrowY, reference: refs.setReference, floating: refs.setFloating, getFloatingProps, getReferenceProps, isGroupPhase, opened, placement }; } //#endregion export { useTooltip }; //# sourceMappingURL=use-tooltip.mjs.map