@soroush.tech/design-system 2.1.0-alpha.0 → 2.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Accordion/Accordion.d.cts +2 -2
- package/dist/Accordion/Accordion.d.mts +2 -2
- package/dist/Accordion/AccordionGroup.d.cts +1 -1
- package/dist/Accordion/AccordionGroup.d.mts +1 -1
- package/dist/Alert/Alert.d.cts +1 -1
- package/dist/Alert/Alert.d.mts +1 -1
- package/dist/AppBar.d.cts +1 -1
- package/dist/AppBar.d.mts +1 -1
- package/dist/Autocomplete.d.cts +1 -1
- package/dist/Autocomplete.d.mts +1 -1
- package/dist/Avatar.d.cts +1 -1
- package/dist/Avatar.d.mts +1 -1
- package/dist/Backdrop.d.cts +1 -1
- package/dist/Backdrop.d.mts +1 -1
- package/dist/Badge.d.cts +1 -1
- package/dist/Badge.d.mts +1 -1
- package/dist/Breadcrumbs.d.cts +3 -3
- package/dist/Breadcrumbs.d.mts +3 -3
- package/dist/Button.d.cts +1 -1
- package/dist/Button.d.mts +1 -1
- package/dist/ButtonGroup.d.cts +1 -1
- package/dist/ButtonGroup.d.mts +1 -1
- package/dist/Card.d.cts +4 -4
- package/dist/Card.d.mts +4 -4
- package/dist/Checkbox.d.cts +1 -1
- package/dist/Checkbox.d.mts +1 -1
- package/dist/Chip.d.cts +1 -1
- package/dist/Chip.d.mts +1 -1
- package/dist/CircularProgress.d.cts +2 -2
- package/dist/CircularProgress.d.mts +2 -2
- package/dist/Collapse.d.cts +1 -1
- package/dist/Collapse.d.mts +1 -1
- package/dist/Drawer.d.cts +3 -3
- package/dist/Drawer.d.mts +3 -3
- package/dist/Fab.d.cts +1 -1
- package/dist/Fab.d.mts +1 -1
- package/dist/FabMenu/FabMenu.d.cts +1 -1
- package/dist/FabMenu/FabMenu.d.mts +1 -1
- package/dist/FabMenu/FabMenuItem.d.cts +1 -1
- package/dist/FabMenu/FabMenuItem.d.mts +1 -1
- package/dist/Fade.d.cts +1 -1
- package/dist/Fade.d.mts +1 -1
- package/dist/Flex.d.cts +1 -1
- package/dist/Flex.d.mts +1 -1
- package/dist/Form.d.cts +1 -1
- package/dist/Form.d.mts +1 -1
- package/dist/FormControl.d.cts +1 -1
- package/dist/FormControl.d.mts +1 -1
- package/dist/FormHelperText.d.cts +1 -1
- package/dist/FormHelperText.d.mts +1 -1
- package/dist/FormLabel.d.cts +1 -1
- package/dist/FormLabel.d.mts +1 -1
- package/dist/Grid.d.cts +1 -1
- package/dist/Grid.d.mts +1 -1
- package/dist/Grow.d.cts +1 -1
- package/dist/Grow.d.mts +1 -1
- package/dist/Icon.d.cts +1 -1
- package/dist/Icon.d.mts +1 -1
- package/dist/Image.d.cts +1 -1
- package/dist/Image.d.mts +1 -1
- package/dist/LinearProgress.d.cts +2 -2
- package/dist/LinearProgress.d.mts +2 -2
- package/dist/Link.d.cts +1 -1
- package/dist/Link.d.mts +1 -1
- package/dist/Menu/ContextMenu.cjs +23 -14
- package/dist/Menu/ContextMenu.d.cts +18 -8
- package/dist/Menu/ContextMenu.d.mts +18 -8
- package/dist/Menu/ContextMenu.mjs +24 -15
- package/dist/Menu/Menu.cjs +1 -1
- package/dist/Menu/Menu.d.cts +1 -1
- package/dist/Menu/Menu.d.mts +1 -1
- package/dist/Menu/Menu.mjs +1 -1
- package/dist/Menu/MenuItems.cjs +1 -1
- package/dist/Menu/MenuItems.d.cts +1 -1
- package/dist/Menu/MenuItems.d.mts +1 -1
- package/dist/Menu/MenuItems.mjs +1 -1
- package/dist/Menu/MenuList.cjs +1 -1
- package/dist/Menu/MenuList.d.cts +3 -36
- package/dist/Menu/MenuList.d.mts +3 -36
- package/dist/Menu/MenuList.mjs +1 -1
- package/dist/{Menu-BfJF32J2.cjs → Menu-C6eIdA1J.cjs} +8 -5
- package/dist/{Menu-CX9V2DAu.mjs → Menu-C_4jYHWE.mjs} +8 -5
- package/dist/Menu.cjs +2 -2
- package/dist/Menu.d.cts +5 -5
- package/dist/Menu.d.mts +5 -5
- package/dist/Menu.mjs +2 -2
- package/dist/{MenuItem-CvCMGXuL.cjs → MenuItem-Bg4iRvVe.cjs} +28 -25
- package/dist/{MenuItem-DdPzSWZY.mjs → MenuItem-kRGVRI6G.mjs} +28 -25
- package/dist/MenuItem.cjs +1 -1
- package/dist/MenuItem.d.cts +1 -1
- package/dist/MenuItem.d.mts +1 -1
- package/dist/MenuItem.mjs +1 -1
- package/dist/{MenuList-DsJmxNPu.cjs → MenuList-CSaaR3jt.cjs} +2 -1
- package/dist/{MenuList-CGZgfBno.mjs → MenuList-D7Pvpn_K.mjs} +2 -1
- package/dist/{MenuListContext-DJ_qJ1Uo.d.cts → MenuListContext-AnAxu0he.d.cts} +2 -2
- package/dist/{MenuListContext-DiZAVDCb.d.mts → MenuListContext-DURKFg_T.d.mts} +2 -2
- package/dist/Modal.d.cts +1 -1
- package/dist/Modal.d.mts +1 -1
- package/dist/NativeSelect.d.cts +2 -2
- package/dist/NativeSelect.d.mts +2 -2
- package/dist/NavTree/NavLink.d.cts +1 -1
- package/dist/NavTree/NavLink.d.mts +1 -1
- package/dist/NavTree/NavTree.d.cts +1 -1
- package/dist/NavTree/NavTree.d.mts +1 -1
- package/dist/NumberInput.d.cts +1 -1
- package/dist/NumberInput.d.mts +1 -1
- package/dist/Pagination/PaginationItem.d.cts +1 -1
- package/dist/Pagination/PaginationItem.d.mts +1 -1
- package/dist/Pagination.d.cts +2 -2
- package/dist/Pagination.d.mts +2 -2
- package/dist/Paper.d.cts +2 -2
- package/dist/Paper.d.mts +2 -2
- package/dist/Popover.d.cts +3 -3
- package/dist/Popover.d.mts +3 -3
- package/dist/Pressable.d.cts +1 -1
- package/dist/Pressable.d.mts +1 -1
- package/dist/Quote.d.cts +2 -2
- package/dist/Quote.d.mts +2 -2
- package/dist/Radio.d.cts +1 -1
- package/dist/Radio.d.mts +1 -1
- package/dist/RangeInput.d.cts +1 -1
- package/dist/RangeInput.d.mts +1 -1
- package/dist/Rating.d.cts +1 -1
- package/dist/Rating.d.mts +1 -1
- package/dist/ScrollArea.d.cts +1 -1
- package/dist/ScrollArea.d.mts +1 -1
- package/dist/Select.d.cts +2 -2
- package/dist/Select.d.mts +2 -2
- package/dist/Sidebar/Sidebar.d.cts +1 -1
- package/dist/Sidebar/Sidebar.d.mts +1 -1
- package/dist/Sidebar/SidebarItem.d.cts +3 -3
- package/dist/Sidebar/SidebarItem.d.mts +3 -3
- package/dist/Skeleton.d.cts +1 -1
- package/dist/Skeleton.d.mts +1 -1
- package/dist/Slide.d.cts +1 -1
- package/dist/Slide.d.mts +1 -1
- package/dist/Snackbar.d.cts +2 -2
- package/dist/Snackbar.d.mts +2 -2
- package/dist/Switch.d.cts +1 -1
- package/dist/Switch.d.mts +1 -1
- package/dist/Table/Table.d.cts +2 -2
- package/dist/Table/Table.d.mts +2 -2
- package/dist/Table/TableBody.d.cts +1 -1
- package/dist/Table/TableBody.d.mts +1 -1
- package/dist/Table/TableCell.d.cts +1 -1
- package/dist/Table/TableCell.d.mts +1 -1
- package/dist/Table/TableContainer.d.cts +1 -1
- package/dist/Table/TableContainer.d.mts +1 -1
- package/dist/Table/TableControl.d.cts +1 -1
- package/dist/Table/TableControl.d.mts +1 -1
- package/dist/Table/TableFooter.d.cts +1 -1
- package/dist/Table/TableFooter.d.mts +1 -1
- package/dist/Table/TableHead.d.cts +1 -1
- package/dist/Table/TableHead.d.mts +1 -1
- package/dist/Table/TablePagination.d.cts +2 -2
- package/dist/Table/TablePagination.d.mts +2 -2
- package/dist/Table/TablePaginationActions.d.cts +1 -1
- package/dist/Table/TablePaginationActions.d.mts +1 -1
- package/dist/Table/TableRow.d.cts +1 -1
- package/dist/Table/TableRow.d.mts +1 -1
- package/dist/Table/TableSortLabel.d.cts +1 -1
- package/dist/Table/TableSortLabel.d.mts +1 -1
- package/dist/Table/hooks.d.cts +1 -1
- package/dist/Table/hooks.d.mts +1 -1
- package/dist/Table.d.cts +5 -5
- package/dist/Table.d.mts +5 -5
- package/dist/{TableContext-4sJdk84N.d.cts → TableContext-CPxH920f.d.mts} +1 -1
- package/dist/{TableContext-BCW5av9c.d.mts → TableContext-VuMFtVNr.d.cts} +1 -1
- package/dist/Tabs/Tab.cjs +18 -14
- package/dist/Tabs/Tab.d.cts +2 -2
- package/dist/Tabs/Tab.d.mts +2 -2
- package/dist/Tabs/Tab.mjs +18 -14
- package/dist/Tabs/TabContext.d.cts +1 -1
- package/dist/Tabs/TabContext.d.mts +1 -1
- package/dist/Tabs/TabList.cjs +1 -1
- package/dist/Tabs/TabList.d.cts +1 -1
- package/dist/Tabs/TabList.d.mts +1 -1
- package/dist/Tabs/TabList.mjs +1 -1
- package/dist/Tabs/TabPanel.d.cts +2 -2
- package/dist/Tabs/TabPanel.d.mts +2 -2
- package/dist/Tabs/TabScrollButton.d.cts +1 -1
- package/dist/Tabs/TabScrollButton.d.mts +1 -1
- package/dist/Tabs/Tabs.cjs +1 -1
- package/dist/Tabs/Tabs.d.cts +2 -2
- package/dist/Tabs/Tabs.d.mts +2 -2
- package/dist/Tabs/Tabs.mjs +1 -1
- package/dist/{Tabs-CG-hRs9L.mjs → Tabs-C_qe9d4p.mjs} +28 -21
- package/dist/{Tabs-CPH0H6yp.cjs → Tabs-DmiA1J--.cjs} +28 -21
- package/dist/Tabs.cjs +1 -1
- package/dist/Tabs.d.cts +3 -3
- package/dist/Tabs.d.mts +3 -3
- package/dist/Tabs.mjs +1 -1
- package/dist/{TabsContext-CsiW5MOp.d.mts → TabsContext-DeP8oJpC.d.cts} +1 -1
- package/dist/{TabsContext-DrmDtBqA.d.cts → TabsContext-VJcdZQOf.d.mts} +1 -1
- package/dist/TextInput.d.cts +1 -1
- package/dist/TextInput.d.mts +1 -1
- package/dist/ToggleButton/ToggleButton.d.cts +1 -1
- package/dist/ToggleButton/ToggleButton.d.mts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.cts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.mts +1 -1
- package/dist/Tooltip-CrPRvmj3.cjs +338 -0
- package/dist/Tooltip-CwbuEQzf.mjs +332 -0
- package/dist/Tooltip.cjs +2 -311
- package/dist/Tooltip.d.cts +18 -5
- package/dist/Tooltip.d.mts +18 -5
- package/dist/Tooltip.mjs +1 -310
- package/dist/TransferList.d.cts +1 -1
- package/dist/TransferList.d.mts +1 -1
- package/dist/Typography.d.cts +2 -2
- package/dist/Typography.d.mts +2 -2
- package/dist/View.d.cts +1 -1
- package/dist/View.d.mts +1 -1
- package/dist/Zoom.d.cts +1 -1
- package/dist/Zoom.d.mts +1 -1
- package/dist/catalog.cjs +4 -0
- package/dist/catalog.d.cts +1 -1
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +4 -0
- package/dist/engine.d.cts +1 -1
- package/dist/engine.d.mts +1 -1
- package/dist/{index-Dt-ZNTnC.d.cts → index-2jMSUeji.d.cts} +1 -1
- package/dist/{index-5TAVgzbU.d.mts → index-3Xe5X6Ny.d.mts} +2 -2
- package/dist/{index-BYAtunSZ.d.cts → index-B-p51b0z.d.cts} +2 -2
- package/dist/index-B2XL_zZY.d.mts +44 -0
- package/dist/{index-YKXzINGk.d.mts → index-B5_-Bxoo.d.cts} +3 -3
- package/dist/{index-DKNvADeE.d.mts → index-BFUn2EWp.d.mts} +2 -2
- package/dist/{index-CeFExef3.d.cts → index-BKM4d_F4.d.cts} +2 -2
- package/dist/index-BL5Kj3Ka.d.mts +1 -0
- package/dist/{index-Biqn5xUs.d.mts → index-BLypGp0N.d.mts} +4 -4
- package/dist/{index-D24iFgwR.d.cts → index-BVDN2XbT.d.mts} +3 -3
- package/dist/{index-D--R4_5H.d.mts → index-Bhb0bFxe.d.mts} +2 -2
- package/dist/index-Biqpy7c9.d.cts +44 -0
- package/dist/{index-BgmEVOSj.d.mts → index-C-ebcNOc.d.mts} +1 -1
- package/dist/{index-DvVQLBZc.d.cts → index-C6a3kDn2.d.cts} +1 -0
- package/dist/{index-DQYhGgbl.d.cts → index-C9nnnfhd.d.cts} +2 -2
- package/dist/{index-DWon54cO.d.cts → index-CBHCGizS.d.mts} +1 -1
- package/dist/{index-Bx-4KmJU.d.mts → index-CCEfrBNN.d.mts} +1 -1
- package/dist/{index-DhTzn0mf.d.cts → index-CHWMSBhQ.d.cts} +1 -1
- package/dist/index-CJMvoc8h.d.cts +1 -0
- package/dist/{index-DtVrZFJI.d.mts → index-COgZvhXQ.d.mts} +1 -1
- package/dist/{index-DtK3SaKA.d.mts → index-CP55_Zs2.d.mts} +1 -1
- package/dist/{index-DhzjNAzv.d.mts → index-CgyyM3ty.d.cts} +10 -5
- package/dist/{index-Buu5MtRG.d.mts → index-CtwlReZi.d.cts} +1 -1
- package/dist/{index-Dudkopvi.d.mts → index-D0skdQEK.d.mts} +1 -1
- package/dist/{index-fRyMPKtY.d.cts → index-D2tfsNPw.d.cts} +1 -1
- package/dist/{index-DrfJt7W6.d.cts → index-D7h8qFS1.d.cts} +2 -2
- package/dist/{index-DR76LcSz.d.mts → index-DACdQ7-d.d.cts} +1 -1
- package/dist/{index-C3TrdOpQ.d.cts → index-DAJ5DVHh.d.cts} +2 -2
- package/dist/{index-CyOSmefH.d.cts → index-DMysZsti.d.cts} +1 -1
- package/dist/{index-BWiDilH8.d.mts → index-DOH6uskj.d.mts} +1 -0
- package/dist/{index-DM7HHa4V.d.mts → index-DQo4XtH4.d.mts} +2 -2
- package/dist/{index-CBOtkDdX.d.cts → index-DTJN6JL2.d.cts} +1 -1
- package/dist/{index-Bp9ECTzr.d.mts → index-DbKYSbLs.d.mts} +2 -2
- package/dist/{index-CW0DW6Aq.d.mts → index-Dg0FPoms.d.mts} +2 -2
- package/dist/{index-D_azfqsX.d.mts → index-DlNBgVwb.d.mts} +1 -1
- package/dist/{index-HAVWK7RM.d.cts → index-DsBOpK8T.d.mts} +3 -3
- package/dist/{index-BlHFb150.d.cts → index-Dvx5TRET.d.cts} +2 -2
- package/dist/{index-m1RGSQlP.d.mts → index-Sq75GwA2.d.cts} +3 -3
- package/dist/{index-Ba39mhDf.d.cts → index-ZyigJMkV.d.mts} +10 -5
- package/dist/{index-HLDMvfb2.d.cts → index-gHMydoIS.d.cts} +4 -4
- package/dist/{index-DgLjcrkG.d.cts → index-gxBafJdz.d.cts} +1 -1
- package/dist/{index-DjmWIzXF.d.mts → index-hTgl9zwe.d.mts} +2 -2
- package/dist/{index-CAICXdTA.d.cts → index-i8BxMDEC.d.mts} +1 -1
- package/dist/{index-Bo8Og0oC.d.cts → index-v1I6VA9w.d.cts} +2 -2
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/style.d.cts +2 -2
- package/dist/style.d.mts +2 -2
- package/dist/theme.d.cts +2 -2
- package/dist/theme.d.mts +2 -2
- package/dist/{useTablePagination-BOzuKUnF.d.mts → useTablePagination-CUsagS5T.d.mts} +1 -1
- package/dist/{useTablePagination-CraL2Mux.d.cts → useTablePagination-jpEfHKUh.d.cts} +1 -1
- package/dist/{useTransition-B-hzi7Sm.d.mts → useTransition-BJ375Sto.d.cts} +1 -1
- package/dist/{useTransition-CF_Zy_tM.d.cts → useTransition-DDGpvgci.d.mts} +1 -1
- package/package.json +1 -1
- package/dist/index-6zQ2VUlM.d.cts +0 -1
- package/dist/index-B1qv6yGM.d.mts +0 -1
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { a as src_exports, o as styled, t as createShouldForwardProp } from "./src-B-rNjHIL.mjs";
|
|
2
|
+
import { n as useDefaultProps } from "./theme-DyyZQFzQ.mjs";
|
|
3
|
+
import { t as themeDefault } from "./themeDefault-BeZJzqJj.mjs";
|
|
4
|
+
import { t as getSurfaceRadius } from "./getSurfaceRadius-B1QE_VLa.mjs";
|
|
5
|
+
import { t as useControlled } from "./useControlled-B4uQ9Bj6.mjs";
|
|
6
|
+
import { Portal } from "./Portal.mjs";
|
|
7
|
+
import { t as useAnchoredPlacement } from "./useAnchoredPlacement-txSaWzfk.mjs";
|
|
8
|
+
import { t as useMergedRefs } from "./useMergedRefs-CdfwtmUd.mjs";
|
|
9
|
+
import { n as resolveTooltipPlacement, t as getTooltipOrigins } from "./getTooltipOrigins-D0bLLXwY.mjs";
|
|
10
|
+
import { cloneElement, useCallback, useEffect, useId, useRef, useState } from "react";
|
|
11
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
// src/Tooltip/hooks/useTooltip.ts
|
|
13
|
+
const isKeyboardFocus = (event) => {
|
|
14
|
+
try {
|
|
15
|
+
return event.target.matches(":focus-visible");
|
|
16
|
+
} catch {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The state of a tooltip: whether it is open (its own, or its owner's), the timers that open and
|
|
22
|
+
* close it, and the handlers its child and the tooltip itself take. Opening and closing are
|
|
23
|
+
* delayed; moving from the child onto the tooltip does not close it, so its text can be read and
|
|
24
|
+
* selected (WCAG 1.4.13); Escape closes it at once.
|
|
25
|
+
*/
|
|
26
|
+
function useTooltip({ isOpen: isOpenProp, defaultOpen, isAtPoint = false, onOpen, onClose, enterDelay, leaveDelay, enterTouchDelay, leaveTouchDelay, shouldOpenOnHover, shouldOpenOnFocus, shouldOpenOnTouch }) {
|
|
27
|
+
const [isOpen, setIsOpen] = useControlled({
|
|
28
|
+
controlled: isOpenProp,
|
|
29
|
+
default: defaultOpen
|
|
30
|
+
});
|
|
31
|
+
const timer = useRef(void 0);
|
|
32
|
+
const latest = useRef({
|
|
33
|
+
isOpen,
|
|
34
|
+
isOpenProp,
|
|
35
|
+
isAtPoint,
|
|
36
|
+
onOpen,
|
|
37
|
+
onClose
|
|
38
|
+
});
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
latest.current = {
|
|
41
|
+
isOpen,
|
|
42
|
+
isOpenProp,
|
|
43
|
+
isAtPoint,
|
|
44
|
+
onOpen,
|
|
45
|
+
onClose
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
const clear = useCallback(() => window.clearTimeout(timer.current), []);
|
|
49
|
+
const ask = useCallback((next, event, delay) => {
|
|
50
|
+
clear();
|
|
51
|
+
timer.current = window.setTimeout(() => {
|
|
52
|
+
const current = latest.current;
|
|
53
|
+
if (current.isOpen === next) return;
|
|
54
|
+
if (next && current.isAtPoint) return;
|
|
55
|
+
if (current.isOpenProp === void 0) setIsOpen(next);
|
|
56
|
+
(next ? current.onOpen : current.onClose)?.(event);
|
|
57
|
+
}, delay);
|
|
58
|
+
}, [clear, setIsOpen]);
|
|
59
|
+
useEffect(() => clear, [clear]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!isOpen) return void 0;
|
|
62
|
+
const handleKeyDown = (event) => {
|
|
63
|
+
if (event.key === "Escape") ask(false, event, 0);
|
|
64
|
+
};
|
|
65
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
66
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
67
|
+
}, [isOpen, ask]);
|
|
68
|
+
return {
|
|
69
|
+
isOpen,
|
|
70
|
+
childHandlers: {
|
|
71
|
+
onMouseEnter: (event) => {
|
|
72
|
+
if (shouldOpenOnHover) ask(true, event, enterDelay);
|
|
73
|
+
},
|
|
74
|
+
onMouseLeave: (event) => {
|
|
75
|
+
if (shouldOpenOnHover) ask(false, event, leaveDelay);
|
|
76
|
+
},
|
|
77
|
+
onFocus: (event) => {
|
|
78
|
+
if (shouldOpenOnFocus && isKeyboardFocus(event)) ask(true, event, enterDelay);
|
|
79
|
+
},
|
|
80
|
+
onBlur: (event) => {
|
|
81
|
+
if (shouldOpenOnFocus) ask(false, event, leaveDelay);
|
|
82
|
+
},
|
|
83
|
+
onTouchStart: (event) => {
|
|
84
|
+
if (shouldOpenOnTouch) ask(true, event, enterTouchDelay);
|
|
85
|
+
},
|
|
86
|
+
onTouchEnd: (event) => {
|
|
87
|
+
if (shouldOpenOnTouch) ask(false, event, leaveTouchDelay);
|
|
88
|
+
},
|
|
89
|
+
onTouchCancel: (event) => {
|
|
90
|
+
if (shouldOpenOnTouch) ask(false, event, leaveTouchDelay);
|
|
91
|
+
},
|
|
92
|
+
onPointerDown: (event) => {
|
|
93
|
+
if (event.pointerType !== "touch") ask(false, event, 0);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
surfaceHandlers: {
|
|
97
|
+
onMouseEnter: () => {
|
|
98
|
+
if (shouldOpenOnHover) clear();
|
|
99
|
+
},
|
|
100
|
+
onMouseLeave: (event) => {
|
|
101
|
+
if (shouldOpenOnHover) ask(false, event, leaveDelay);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// src/Tooltip/Tooltip.tsx
|
|
107
|
+
const MARGIN = 8;
|
|
108
|
+
const GAP = 8;
|
|
109
|
+
const ARROW = 8;
|
|
110
|
+
const TooltipSurface = styled("div", {
|
|
111
|
+
name: "Tooltip",
|
|
112
|
+
label: "Tooltip",
|
|
113
|
+
shouldForwardProp: createShouldForwardProp([
|
|
114
|
+
"layer",
|
|
115
|
+
"isInteractive",
|
|
116
|
+
"borderRadius",
|
|
117
|
+
"bg",
|
|
118
|
+
"textColor"
|
|
119
|
+
])
|
|
120
|
+
})(({ theme, layer, isInteractive, borderRadius, bg, textColor }) => ({
|
|
121
|
+
position: "fixed",
|
|
122
|
+
...!isInteractive && { pointerEvents: "none" },
|
|
123
|
+
top: 0,
|
|
124
|
+
left: 0,
|
|
125
|
+
visibility: "hidden",
|
|
126
|
+
zIndex: theme.zOrder[layer],
|
|
127
|
+
boxSizing: "border-box",
|
|
128
|
+
maxWidth: "20rem",
|
|
129
|
+
padding: `${theme.space[.5]} ${theme.space[1]}`,
|
|
130
|
+
borderRadius: getSurfaceRadius(theme, borderRadius),
|
|
131
|
+
boxShadow: theme.shadows[4],
|
|
132
|
+
backgroundColor: (0, src_exports.get)(theme, `background.${bg ?? "modal"}`),
|
|
133
|
+
color: (0, src_exports.get)(theme, `text.${textColor ?? themeDefault(theme, "textColor", "initial")}`),
|
|
134
|
+
fontFamily: (0, src_exports.get)(theme, "fonts.body"),
|
|
135
|
+
fontSize: theme.fontSizes[0],
|
|
136
|
+
lineHeight: (0, src_exports.get)(theme, "lineHeights.base"),
|
|
137
|
+
overflowWrap: "break-word"
|
|
138
|
+
}));
|
|
139
|
+
const TooltipDescription = styled("span", { label: "TooltipDescription" })({
|
|
140
|
+
position: "absolute",
|
|
141
|
+
width: 1,
|
|
142
|
+
height: 1,
|
|
143
|
+
margin: -1,
|
|
144
|
+
padding: 0,
|
|
145
|
+
border: 0,
|
|
146
|
+
overflow: "hidden",
|
|
147
|
+
clip: "rect(0 0 0 0)",
|
|
148
|
+
whiteSpace: "nowrap"
|
|
149
|
+
});
|
|
150
|
+
const TooltipTarget = styled("span", { label: "TooltipTarget" })({ display: "inline-grid" });
|
|
151
|
+
const TooltipArrow = styled("span", {
|
|
152
|
+
name: "Tooltip",
|
|
153
|
+
slot: "arrow",
|
|
154
|
+
label: "TooltipArrow"
|
|
155
|
+
})({
|
|
156
|
+
position: "absolute",
|
|
157
|
+
width: ARROW,
|
|
158
|
+
height: ARROW,
|
|
159
|
+
backgroundColor: "inherit",
|
|
160
|
+
transform: "rotate(45deg)",
|
|
161
|
+
pointerEvents: "none"
|
|
162
|
+
});
|
|
163
|
+
const getArrow = ({ anchorRect, surfaceSize, top, left }) => {
|
|
164
|
+
const { width, height } = surfaceSize;
|
|
165
|
+
if (top + height <= anchorRect.top + 1 || top >= anchorRect.bottom - 1) {
|
|
166
|
+
const side = top + height <= anchorRect.top + 1 ? "top" : "bottom";
|
|
167
|
+
const middle = anchorRect.left + anchorRect.width / 2 - left;
|
|
168
|
+
return {
|
|
169
|
+
side,
|
|
170
|
+
offset: Math.min(Math.max(middle, ARROW), width - ARROW)
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const side = left + width <= anchorRect.left + 1 ? "left" : "right";
|
|
174
|
+
const middle = anchorRect.top + anchorRect.height / 2 - top;
|
|
175
|
+
return {
|
|
176
|
+
side,
|
|
177
|
+
offset: Math.min(Math.max(middle, ARROW), height - ARROW)
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
const isSameArrow = (a, b) => a !== null && a.side === b.side && a.offset === b.offset;
|
|
181
|
+
const getArrowStyle = ({ side, offset }) => {
|
|
182
|
+
const half = ARROW / 2;
|
|
183
|
+
if (side === "top") return {
|
|
184
|
+
bottom: -4,
|
|
185
|
+
left: offset - half
|
|
186
|
+
};
|
|
187
|
+
if (side === "bottom") return {
|
|
188
|
+
top: -4,
|
|
189
|
+
left: offset - half
|
|
190
|
+
};
|
|
191
|
+
if (side === "left") return {
|
|
192
|
+
right: -4,
|
|
193
|
+
top: offset - half
|
|
194
|
+
};
|
|
195
|
+
return {
|
|
196
|
+
left: -4,
|
|
197
|
+
top: offset - half
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
const mergeForwarded = (own, forwarded) => Object.fromEntries(Object.entries(forwarded).filter(([, value]) => value !== void 0).map(([name, value]) => {
|
|
201
|
+
const current = own[name];
|
|
202
|
+
if (typeof value === "function" && typeof current === "function") return [name, (...args) => {
|
|
203
|
+
current(...args);
|
|
204
|
+
value(...args);
|
|
205
|
+
}];
|
|
206
|
+
if (name === "aria-describedby" && current) return [name, `${String(current)} ${String(value)}`];
|
|
207
|
+
return [name, value];
|
|
208
|
+
}));
|
|
209
|
+
const getChildName = (title, own) => {
|
|
210
|
+
const isHidden = own["aria-hidden"] === true || own["aria-hidden"] === "true";
|
|
211
|
+
const isNamed = own["aria-label"] !== void 0 || own["aria-labelledby"] !== void 0;
|
|
212
|
+
return typeof title === "string" && !isHidden && !isNamed ? { "aria-label": title } : {};
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* @description A short description of one child, shown on hover, keyboard focus and a long touch -
|
|
216
|
+
* a `role="tooltip"` in a `Portal`, placed beside its child and flipped for want of room. The
|
|
217
|
+
* child is named by it (`aria-label`) or described by it (`aria-describedby`, with
|
|
218
|
+
* `shouldDescribeChild`). It opens and closes after their delays, stays open while the pointer is
|
|
219
|
+
* on the tooltip itself, closes on Escape, and never takes or traps the focus.
|
|
220
|
+
*/
|
|
221
|
+
function Tooltip({ children, anchorPosition, title, placement: placementProp, hasArrow: hasArrowProp, enterDelay: enterDelayProp, leaveDelay: leaveDelayProp, enterTouchDelay: enterTouchDelayProp, leaveTouchDelay: leaveTouchDelayProp, shouldDescribeChild: shouldDescribeChildProp, isDescriptionPersistent: isDescriptionPersistentProp, isOpen: isOpenProp, defaultOpen = false, onOpen, onClose, isInteractive: isInteractiveProp, shouldWrapDisabledChild: shouldWrapDisabledChildProp, shouldOpenOnHover: shouldOpenOnHoverProp, shouldOpenOnFocus: shouldOpenOnFocusProp, shouldOpenOnTouch: shouldOpenOnTouchProp, slots, slotProps, layer: layerProp, borderRadius: borderRadiusProp, bg: bgProp, textColor: textColorProp, className, "data-testid": dataTestid, ref: forwardedRef, ...forwarded }) {
|
|
222
|
+
const dp = useDefaultProps("Tooltip");
|
|
223
|
+
const placement = placementProp ?? dp.placement ?? "top";
|
|
224
|
+
const hasArrow = hasArrowProp ?? dp.hasArrow ?? false;
|
|
225
|
+
const shouldDescribeChild = shouldDescribeChildProp ?? dp.shouldDescribeChild ?? false;
|
|
226
|
+
const isDescriptionPersistent = isDescriptionPersistentProp ?? dp.isDescriptionPersistent ?? false;
|
|
227
|
+
const isInteractive = isInteractiveProp ?? dp.isInteractive ?? true;
|
|
228
|
+
const shouldWrapDisabledChild = shouldWrapDisabledChildProp ?? dp.shouldWrapDisabledChild ?? true;
|
|
229
|
+
const layer = layerProp ?? dp.layer ?? "tooltip";
|
|
230
|
+
const borderRadius = borderRadiusProp ?? dp.borderRadius;
|
|
231
|
+
const bg = bgProp ?? dp.bg;
|
|
232
|
+
const textColor = textColorProp ?? dp.textColor;
|
|
233
|
+
const id = useId();
|
|
234
|
+
const isAtPoint = anchorPosition !== void 0;
|
|
235
|
+
const { isOpen, childHandlers, surfaceHandlers } = useTooltip({
|
|
236
|
+
isOpen: isOpenProp,
|
|
237
|
+
defaultOpen,
|
|
238
|
+
isAtPoint,
|
|
239
|
+
onOpen,
|
|
240
|
+
onClose,
|
|
241
|
+
enterDelay: enterDelayProp ?? dp.enterDelay ?? 100,
|
|
242
|
+
leaveDelay: leaveDelayProp ?? dp.leaveDelay ?? 0,
|
|
243
|
+
enterTouchDelay: enterTouchDelayProp ?? dp.enterTouchDelay ?? 700,
|
|
244
|
+
leaveTouchDelay: leaveTouchDelayProp ?? dp.leaveTouchDelay ?? 1500,
|
|
245
|
+
shouldOpenOnHover: shouldOpenOnHoverProp ?? dp.shouldOpenOnHover ?? true,
|
|
246
|
+
shouldOpenOnFocus: shouldOpenOnFocusProp ?? dp.shouldOpenOnFocus ?? true,
|
|
247
|
+
shouldOpenOnTouch: shouldOpenOnTouchProp ?? dp.shouldOpenOnTouch ?? true
|
|
248
|
+
});
|
|
249
|
+
const hasTitle = title !== void 0 && title !== null && title !== "";
|
|
250
|
+
const isShown = isOpen && hasTitle;
|
|
251
|
+
const anchorRef = useRef(null);
|
|
252
|
+
const noAnchorRef = useRef(null);
|
|
253
|
+
const surfaceRef = useRef(null);
|
|
254
|
+
const childProps = children?.props ?? {};
|
|
255
|
+
const forwardedProps = mergeForwarded(childProps, forwarded);
|
|
256
|
+
const own = {
|
|
257
|
+
...childProps,
|
|
258
|
+
...forwardedProps
|
|
259
|
+
};
|
|
260
|
+
const isChildDisabled = shouldWrapDisabledChild && own.disabled === true;
|
|
261
|
+
const childRef = useMergedRefs(childProps.ref, forwardedRef);
|
|
262
|
+
const ref = useMergedRefs(isChildDisabled ? void 0 : anchorRef, childRef);
|
|
263
|
+
const [arrow, setArrow] = useState(null);
|
|
264
|
+
const getOrigins = useCallback((context) => getTooltipOrigins(resolveTooltipPlacement(placement, context), context.isRtl), [placement]);
|
|
265
|
+
const onPlaced = useCallback((placed) => {
|
|
266
|
+
if (!hasArrow) return;
|
|
267
|
+
const next = getArrow(placed);
|
|
268
|
+
setArrow((current) => isSameArrow(current, next) ? current : next);
|
|
269
|
+
}, [hasArrow]);
|
|
270
|
+
useAnchoredPlacement({
|
|
271
|
+
isOpen: isShown,
|
|
272
|
+
anchorRef: anchorPosition ? noAnchorRef : anchorRef,
|
|
273
|
+
anchorPosition,
|
|
274
|
+
surfaceRef,
|
|
275
|
+
getOrigins,
|
|
276
|
+
margin: MARGIN,
|
|
277
|
+
gap: GAP,
|
|
278
|
+
onPlaced
|
|
279
|
+
});
|
|
280
|
+
const handlers = Object.fromEntries(Object.entries(childHandlers).map(([name, handler]) => [name, (event) => {
|
|
281
|
+
own[name]?.(event);
|
|
282
|
+
handler(event);
|
|
283
|
+
}]));
|
|
284
|
+
const ownDescription = own["aria-describedby"];
|
|
285
|
+
const names = getChildName(title, own);
|
|
286
|
+
const descriptionId = `${id}-description`;
|
|
287
|
+
const hasPersistentDescription = children !== void 0 && shouldDescribeChild && isDescriptionPersistent && hasTitle;
|
|
288
|
+
const describedBy = (shown) => hasPersistentDescription ? [ownDescription, descriptionId].filter(Boolean).join(" ") : [ownDescription, shown ? id : void 0].filter(Boolean).join(" ") || void 0;
|
|
289
|
+
const ariaProps = shouldDescribeChild ? { "aria-describedby": describedBy(isShown) } : names;
|
|
290
|
+
const child = children ? cloneElement(children, {
|
|
291
|
+
...forwardedProps,
|
|
292
|
+
...isChildDisabled || isAtPoint ? {} : handlers,
|
|
293
|
+
...ariaProps,
|
|
294
|
+
ref
|
|
295
|
+
}) : null;
|
|
296
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
297
|
+
isChildDisabled && !isAtPoint ? /* @__PURE__ */ jsx(TooltipTarget, {
|
|
298
|
+
ref: anchorRef,
|
|
299
|
+
...handlers,
|
|
300
|
+
children: child
|
|
301
|
+
}) : child,
|
|
302
|
+
hasPersistentDescription && /* @__PURE__ */ jsx(TooltipDescription, {
|
|
303
|
+
id: descriptionId,
|
|
304
|
+
children: title
|
|
305
|
+
}),
|
|
306
|
+
isShown && /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsxs(TooltipSurface, {
|
|
307
|
+
...slotProps?.root,
|
|
308
|
+
as: slots?.root,
|
|
309
|
+
ref: surfaceRef,
|
|
310
|
+
id,
|
|
311
|
+
role: "tooltip",
|
|
312
|
+
layer,
|
|
313
|
+
isInteractive,
|
|
314
|
+
borderRadius,
|
|
315
|
+
bg,
|
|
316
|
+
textColor,
|
|
317
|
+
className: [slotProps?.root?.className, className].filter(Boolean).join(" ") || void 0,
|
|
318
|
+
"data-testid": dataTestid ?? slotProps?.root?.["data-testid"],
|
|
319
|
+
...isAtPoint || !isInteractive ? {} : surfaceHandlers,
|
|
320
|
+
children: [title, hasArrow && arrow ? /* @__PURE__ */ jsx(TooltipArrow, {
|
|
321
|
+
...slotProps?.arrow,
|
|
322
|
+
as: slots?.arrow,
|
|
323
|
+
style: {
|
|
324
|
+
...slotProps?.arrow?.style,
|
|
325
|
+
...getArrowStyle(arrow)
|
|
326
|
+
},
|
|
327
|
+
"aria-hidden": "true"
|
|
328
|
+
}) : null]
|
|
329
|
+
}) })
|
|
330
|
+
] });
|
|
331
|
+
}
|
|
332
|
+
export { Tooltip as t };
|
package/dist/Tooltip.cjs
CHANGED
|
@@ -1,312 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
const require_themeDefault = require("./themeDefault-DbPHBbNO.cjs");
|
|
5
|
-
const require_getSurfaceRadius = require("./getSurfaceRadius-DwOn3ALC.cjs");
|
|
6
|
-
const require_useControlled = require("./useControlled-CzCxM4J3.cjs");
|
|
7
|
-
const require_Portal = require("./Portal.cjs");
|
|
8
|
-
const require_useAnchoredPlacement = require("./useAnchoredPlacement-BSfjNMut.cjs");
|
|
9
|
-
const require_useMergedRefs = require("./useMergedRefs-BtctsnmX.cjs");
|
|
10
|
-
const require_getTooltipOrigins = require("./getTooltipOrigins-8b5zQafY.cjs");
|
|
11
|
-
let react = require("react");
|
|
12
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
13
|
-
let _soroush_tech_styled_system_should_forward_prop = require("@soroush.tech/styled-system/should-forward-prop");
|
|
14
|
-
// src/Tooltip/hooks/useTooltip.ts
|
|
15
|
-
const isKeyboardFocus = (event) => {
|
|
16
|
-
try {
|
|
17
|
-
return event.target.matches(":focus-visible");
|
|
18
|
-
} catch {
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* The state of a tooltip: whether it is open (its own, or its owner's), the timers that open and
|
|
24
|
-
* close it, and the handlers its child and the tooltip itself take. Opening and closing are
|
|
25
|
-
* delayed; moving from the child onto the tooltip does not close it, so its text can be read and
|
|
26
|
-
* selected (WCAG 1.4.13); Escape closes it at once.
|
|
27
|
-
*/
|
|
28
|
-
function useTooltip({ isOpen: isOpenProp, defaultOpen, isAtPoint = false, onOpen, onClose, enterDelay, leaveDelay, enterTouchDelay, leaveTouchDelay, shouldOpenOnHover, shouldOpenOnFocus, shouldOpenOnTouch }) {
|
|
29
|
-
const [isOpen, setIsOpen] = require_useControlled.useControlled({
|
|
30
|
-
controlled: isOpenProp,
|
|
31
|
-
default: defaultOpen
|
|
32
|
-
});
|
|
33
|
-
const timer = (0, react.useRef)(void 0);
|
|
34
|
-
const latest = (0, react.useRef)({
|
|
35
|
-
isOpen,
|
|
36
|
-
isOpenProp,
|
|
37
|
-
isAtPoint,
|
|
38
|
-
onOpen,
|
|
39
|
-
onClose
|
|
40
|
-
});
|
|
41
|
-
(0, react.useEffect)(() => {
|
|
42
|
-
latest.current = {
|
|
43
|
-
isOpen,
|
|
44
|
-
isOpenProp,
|
|
45
|
-
isAtPoint,
|
|
46
|
-
onOpen,
|
|
47
|
-
onClose
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
const clear = (0, react.useCallback)(() => window.clearTimeout(timer.current), []);
|
|
51
|
-
const ask = (0, react.useCallback)((next, event, delay) => {
|
|
52
|
-
clear();
|
|
53
|
-
timer.current = window.setTimeout(() => {
|
|
54
|
-
const current = latest.current;
|
|
55
|
-
if (current.isOpen === next) return;
|
|
56
|
-
if (next && current.isAtPoint) return;
|
|
57
|
-
if (current.isOpenProp === void 0) setIsOpen(next);
|
|
58
|
-
(next ? current.onOpen : current.onClose)?.(event);
|
|
59
|
-
}, delay);
|
|
60
|
-
}, [clear, setIsOpen]);
|
|
61
|
-
(0, react.useEffect)(() => clear, [clear]);
|
|
62
|
-
(0, react.useEffect)(() => {
|
|
63
|
-
if (!isOpen) return void 0;
|
|
64
|
-
const handleKeyDown = (event) => {
|
|
65
|
-
if (event.key === "Escape") ask(false, event, 0);
|
|
66
|
-
};
|
|
67
|
-
document.addEventListener("keydown", handleKeyDown);
|
|
68
|
-
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
69
|
-
}, [isOpen, ask]);
|
|
70
|
-
return {
|
|
71
|
-
isOpen,
|
|
72
|
-
childHandlers: {
|
|
73
|
-
onMouseEnter: (event) => {
|
|
74
|
-
if (shouldOpenOnHover) ask(true, event, enterDelay);
|
|
75
|
-
},
|
|
76
|
-
onMouseLeave: (event) => {
|
|
77
|
-
if (shouldOpenOnHover) ask(false, event, leaveDelay);
|
|
78
|
-
},
|
|
79
|
-
onFocus: (event) => {
|
|
80
|
-
if (shouldOpenOnFocus && isKeyboardFocus(event)) ask(true, event, enterDelay);
|
|
81
|
-
},
|
|
82
|
-
onBlur: (event) => {
|
|
83
|
-
if (shouldOpenOnFocus) ask(false, event, leaveDelay);
|
|
84
|
-
},
|
|
85
|
-
onTouchStart: (event) => {
|
|
86
|
-
if (shouldOpenOnTouch) ask(true, event, enterTouchDelay);
|
|
87
|
-
},
|
|
88
|
-
onTouchEnd: (event) => {
|
|
89
|
-
if (shouldOpenOnTouch) ask(false, event, leaveTouchDelay);
|
|
90
|
-
},
|
|
91
|
-
onTouchCancel: (event) => {
|
|
92
|
-
if (shouldOpenOnTouch) ask(false, event, leaveTouchDelay);
|
|
93
|
-
},
|
|
94
|
-
onPointerDown: (event) => {
|
|
95
|
-
if (event.pointerType !== "touch") ask(false, event, 0);
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
surfaceHandlers: {
|
|
99
|
-
onMouseEnter: () => {
|
|
100
|
-
if (shouldOpenOnHover) clear();
|
|
101
|
-
},
|
|
102
|
-
onMouseLeave: (event) => {
|
|
103
|
-
if (shouldOpenOnHover) ask(false, event, leaveDelay);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
// src/Tooltip/Tooltip.tsx
|
|
109
|
-
const MARGIN = 8;
|
|
110
|
-
const GAP = 8;
|
|
111
|
-
const ARROW = 8;
|
|
112
|
-
const TooltipSurface = require_src.styled("div", {
|
|
113
|
-
name: "Tooltip",
|
|
114
|
-
label: "Tooltip",
|
|
115
|
-
shouldForwardProp: (0, _soroush_tech_styled_system_should_forward_prop.createShouldForwardProp)([
|
|
116
|
-
"layer",
|
|
117
|
-
"isInteractive",
|
|
118
|
-
"borderRadius",
|
|
119
|
-
"bg",
|
|
120
|
-
"textColor"
|
|
121
|
-
])
|
|
122
|
-
})(({ theme, layer, isInteractive, borderRadius, bg, textColor }) => ({
|
|
123
|
-
position: "fixed",
|
|
124
|
-
...!isInteractive && { pointerEvents: "none" },
|
|
125
|
-
top: 0,
|
|
126
|
-
left: 0,
|
|
127
|
-
visibility: "hidden",
|
|
128
|
-
zIndex: theme.zOrder[layer],
|
|
129
|
-
boxSizing: "border-box",
|
|
130
|
-
maxWidth: "20rem",
|
|
131
|
-
padding: `${theme.space[.5]} ${theme.space[1]}`,
|
|
132
|
-
borderRadius: require_getSurfaceRadius.getSurfaceRadius(theme, borderRadius),
|
|
133
|
-
boxShadow: theme.shadows[4],
|
|
134
|
-
backgroundColor: (0, require_src.src_exports.get)(theme, `background.${bg ?? "modal"}`),
|
|
135
|
-
color: (0, require_src.src_exports.get)(theme, `text.${textColor ?? require_themeDefault.themeDefault(theme, "textColor", "initial")}`),
|
|
136
|
-
fontFamily: (0, require_src.src_exports.get)(theme, "fonts.body"),
|
|
137
|
-
fontSize: theme.fontSizes[0],
|
|
138
|
-
lineHeight: (0, require_src.src_exports.get)(theme, "lineHeights.base"),
|
|
139
|
-
overflowWrap: "break-word"
|
|
140
|
-
}));
|
|
141
|
-
const TooltipDescription = require_src.styled("span", { label: "TooltipDescription" })({
|
|
142
|
-
position: "absolute",
|
|
143
|
-
width: 1,
|
|
144
|
-
height: 1,
|
|
145
|
-
margin: -1,
|
|
146
|
-
padding: 0,
|
|
147
|
-
border: 0,
|
|
148
|
-
overflow: "hidden",
|
|
149
|
-
clip: "rect(0 0 0 0)",
|
|
150
|
-
whiteSpace: "nowrap"
|
|
151
|
-
});
|
|
152
|
-
const TooltipTarget = require_src.styled("span", { label: "TooltipTarget" })({ display: "inline-grid" });
|
|
153
|
-
const TooltipArrow = require_src.styled("span", {
|
|
154
|
-
name: "Tooltip",
|
|
155
|
-
slot: "arrow",
|
|
156
|
-
label: "TooltipArrow"
|
|
157
|
-
})({
|
|
158
|
-
position: "absolute",
|
|
159
|
-
width: ARROW,
|
|
160
|
-
height: ARROW,
|
|
161
|
-
backgroundColor: "inherit",
|
|
162
|
-
transform: "rotate(45deg)",
|
|
163
|
-
pointerEvents: "none"
|
|
164
|
-
});
|
|
165
|
-
const getArrow = ({ anchorRect, surfaceSize, top, left }) => {
|
|
166
|
-
const { width, height } = surfaceSize;
|
|
167
|
-
if (top + height <= anchorRect.top + 1 || top >= anchorRect.bottom - 1) {
|
|
168
|
-
const side = top + height <= anchorRect.top + 1 ? "top" : "bottom";
|
|
169
|
-
const middle = anchorRect.left + anchorRect.width / 2 - left;
|
|
170
|
-
return {
|
|
171
|
-
side,
|
|
172
|
-
offset: Math.min(Math.max(middle, ARROW), width - ARROW)
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
const side = left + width <= anchorRect.left + 1 ? "left" : "right";
|
|
176
|
-
const middle = anchorRect.top + anchorRect.height / 2 - top;
|
|
177
|
-
return {
|
|
178
|
-
side,
|
|
179
|
-
offset: Math.min(Math.max(middle, ARROW), height - ARROW)
|
|
180
|
-
};
|
|
181
|
-
};
|
|
182
|
-
const isSameArrow = (a, b) => a !== null && a.side === b.side && a.offset === b.offset;
|
|
183
|
-
const getArrowStyle = ({ side, offset }) => {
|
|
184
|
-
const half = ARROW / 2;
|
|
185
|
-
if (side === "top") return {
|
|
186
|
-
bottom: -4,
|
|
187
|
-
left: offset - half
|
|
188
|
-
};
|
|
189
|
-
if (side === "bottom") return {
|
|
190
|
-
top: -4,
|
|
191
|
-
left: offset - half
|
|
192
|
-
};
|
|
193
|
-
if (side === "left") return {
|
|
194
|
-
right: -4,
|
|
195
|
-
top: offset - half
|
|
196
|
-
};
|
|
197
|
-
return {
|
|
198
|
-
left: -4,
|
|
199
|
-
top: offset - half
|
|
200
|
-
};
|
|
201
|
-
};
|
|
202
|
-
/**
|
|
203
|
-
* @description A short description of one child, shown on hover, keyboard focus and a long touch -
|
|
204
|
-
* a `role="tooltip"` in a `Portal`, placed beside its child and flipped for want of room. The
|
|
205
|
-
* child is named by it (`aria-label`) or described by it (`aria-describedby`, with
|
|
206
|
-
* `shouldDescribeChild`). It opens and closes after their delays, stays open while the pointer is
|
|
207
|
-
* on the tooltip itself, closes on Escape, and never takes or traps the focus.
|
|
208
|
-
*/
|
|
209
|
-
function Tooltip({ children, anchorPosition, title, placement: placementProp, hasArrow: hasArrowProp, enterDelay: enterDelayProp, leaveDelay: leaveDelayProp, enterTouchDelay: enterTouchDelayProp, leaveTouchDelay: leaveTouchDelayProp, shouldDescribeChild: shouldDescribeChildProp, isDescriptionPersistent: isDescriptionPersistentProp, isOpen: isOpenProp, defaultOpen = false, onOpen, onClose, isInteractive: isInteractiveProp, shouldOpenOnHover: shouldOpenOnHoverProp, shouldOpenOnFocus: shouldOpenOnFocusProp, shouldOpenOnTouch: shouldOpenOnTouchProp, slots, slotProps, layer: layerProp, borderRadius: borderRadiusProp, bg: bgProp, textColor: textColorProp, className, "data-testid": dataTestid }) {
|
|
210
|
-
const dp = require_theme.useDefaultProps("Tooltip");
|
|
211
|
-
const placement = placementProp ?? dp.placement ?? "top";
|
|
212
|
-
const hasArrow = hasArrowProp ?? dp.hasArrow ?? false;
|
|
213
|
-
const shouldDescribeChild = shouldDescribeChildProp ?? dp.shouldDescribeChild ?? false;
|
|
214
|
-
const isDescriptionPersistent = isDescriptionPersistentProp ?? dp.isDescriptionPersistent ?? false;
|
|
215
|
-
const isInteractive = isInteractiveProp ?? dp.isInteractive ?? true;
|
|
216
|
-
const layer = layerProp ?? dp.layer ?? "tooltip";
|
|
217
|
-
const borderRadius = borderRadiusProp ?? dp.borderRadius;
|
|
218
|
-
const bg = bgProp ?? dp.bg;
|
|
219
|
-
const textColor = textColorProp ?? dp.textColor;
|
|
220
|
-
const id = (0, react.useId)();
|
|
221
|
-
const isAtPoint = anchorPosition !== void 0;
|
|
222
|
-
const { isOpen, childHandlers, surfaceHandlers } = useTooltip({
|
|
223
|
-
isOpen: isOpenProp,
|
|
224
|
-
defaultOpen,
|
|
225
|
-
isAtPoint,
|
|
226
|
-
onOpen,
|
|
227
|
-
onClose,
|
|
228
|
-
enterDelay: enterDelayProp ?? dp.enterDelay ?? 100,
|
|
229
|
-
leaveDelay: leaveDelayProp ?? dp.leaveDelay ?? 0,
|
|
230
|
-
enterTouchDelay: enterTouchDelayProp ?? dp.enterTouchDelay ?? 700,
|
|
231
|
-
leaveTouchDelay: leaveTouchDelayProp ?? dp.leaveTouchDelay ?? 1500,
|
|
232
|
-
shouldOpenOnHover: shouldOpenOnHoverProp ?? dp.shouldOpenOnHover ?? true,
|
|
233
|
-
shouldOpenOnFocus: shouldOpenOnFocusProp ?? dp.shouldOpenOnFocus ?? true,
|
|
234
|
-
shouldOpenOnTouch: shouldOpenOnTouchProp ?? dp.shouldOpenOnTouch ?? true
|
|
235
|
-
});
|
|
236
|
-
const hasTitle = title !== void 0 && title !== null && title !== "";
|
|
237
|
-
const isShown = isOpen && hasTitle;
|
|
238
|
-
const anchorRef = (0, react.useRef)(null);
|
|
239
|
-
const noAnchorRef = (0, react.useRef)(null);
|
|
240
|
-
const surfaceRef = (0, react.useRef)(null);
|
|
241
|
-
const own = children?.props ?? {};
|
|
242
|
-
const isChildDisabled = own.disabled === true;
|
|
243
|
-
const ref = require_useMergedRefs.useMergedRefs(isChildDisabled ? void 0 : anchorRef, own.ref);
|
|
244
|
-
const [arrow, setArrow] = (0, react.useState)(null);
|
|
245
|
-
const getOrigins = (0, react.useCallback)((context) => require_getTooltipOrigins.getTooltipOrigins(require_getTooltipOrigins.resolveTooltipPlacement(placement, context), context.isRtl), [placement]);
|
|
246
|
-
const onPlaced = (0, react.useCallback)((placed) => {
|
|
247
|
-
if (!hasArrow) return;
|
|
248
|
-
const next = getArrow(placed);
|
|
249
|
-
setArrow((current) => isSameArrow(current, next) ? current : next);
|
|
250
|
-
}, [hasArrow]);
|
|
251
|
-
require_useAnchoredPlacement.useAnchoredPlacement({
|
|
252
|
-
isOpen: isShown,
|
|
253
|
-
anchorRef: anchorPosition ? noAnchorRef : anchorRef,
|
|
254
|
-
anchorPosition,
|
|
255
|
-
surfaceRef,
|
|
256
|
-
getOrigins,
|
|
257
|
-
margin: MARGIN,
|
|
258
|
-
gap: GAP,
|
|
259
|
-
onPlaced
|
|
260
|
-
});
|
|
261
|
-
const handlers = Object.fromEntries(Object.entries(childHandlers).map(([name, handler]) => [name, (event) => {
|
|
262
|
-
own[name]?.(event);
|
|
263
|
-
handler(event);
|
|
264
|
-
}]));
|
|
265
|
-
const ownDescription = own["aria-describedby"];
|
|
266
|
-
const names = typeof title === "string" && own["aria-label"] === void 0 && own["aria-labelledby"] === void 0 ? { "aria-label": title } : {};
|
|
267
|
-
const descriptionId = `${id}-description`;
|
|
268
|
-
const hasPersistentDescription = children !== void 0 && shouldDescribeChild && isDescriptionPersistent && hasTitle;
|
|
269
|
-
const describedBy = (shown) => hasPersistentDescription ? [ownDescription, descriptionId].filter(Boolean).join(" ") : [ownDescription, shown ? id : void 0].filter(Boolean).join(" ") || void 0;
|
|
270
|
-
const ariaProps = shouldDescribeChild ? { "aria-describedby": describedBy(isShown) } : names;
|
|
271
|
-
const child = children ? (0, react.cloneElement)(children, {
|
|
272
|
-
...isChildDisabled || isAtPoint ? {} : handlers,
|
|
273
|
-
...ariaProps,
|
|
274
|
-
ref
|
|
275
|
-
}) : null;
|
|
276
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
277
|
-
isChildDisabled && !isAtPoint ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TooltipTarget, {
|
|
278
|
-
ref: anchorRef,
|
|
279
|
-
...handlers,
|
|
280
|
-
children: child
|
|
281
|
-
}) : child,
|
|
282
|
-
hasPersistentDescription && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TooltipDescription, {
|
|
283
|
-
id: descriptionId,
|
|
284
|
-
children: title
|
|
285
|
-
}),
|
|
286
|
-
isShown && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Portal.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(TooltipSurface, {
|
|
287
|
-
...slotProps?.root,
|
|
288
|
-
as: slots?.root,
|
|
289
|
-
ref: surfaceRef,
|
|
290
|
-
id,
|
|
291
|
-
role: "tooltip",
|
|
292
|
-
layer,
|
|
293
|
-
isInteractive,
|
|
294
|
-
borderRadius,
|
|
295
|
-
bg,
|
|
296
|
-
textColor,
|
|
297
|
-
className: [slotProps?.root?.className, className].filter(Boolean).join(" ") || void 0,
|
|
298
|
-
"data-testid": dataTestid ?? slotProps?.root?.["data-testid"],
|
|
299
|
-
...isAtPoint || !isInteractive ? {} : surfaceHandlers,
|
|
300
|
-
children: [title, hasArrow && arrow ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TooltipArrow, {
|
|
301
|
-
...slotProps?.arrow,
|
|
302
|
-
as: slots?.arrow,
|
|
303
|
-
style: {
|
|
304
|
-
...slotProps?.arrow?.style,
|
|
305
|
-
...getArrowStyle(arrow)
|
|
306
|
-
},
|
|
307
|
-
"aria-hidden": "true"
|
|
308
|
-
}) : null]
|
|
309
|
-
}) })
|
|
310
|
-
] });
|
|
311
|
-
}
|
|
312
|
-
exports.Tooltip = Tooltip;
|
|
2
|
+
const require_Tooltip = require("./Tooltip-CrPRvmj3.cjs");
|
|
3
|
+
exports.Tooltip = require_Tooltip.Tooltip;
|
package/dist/Tooltip.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { nt as Theme } from "./index-
|
|
1
|
+
import { nt as Theme } from "./index-C6a3kDn2.cjs";
|
|
2
2
|
import { n as PopoverPosition } from "./computePopoverPosition-JgOwCM7k.cjs";
|
|
3
|
-
import { ElementType, HTMLAttributes, ReactElement, ReactNode, SyntheticEvent } from "react";
|
|
3
|
+
import { ElementType, HTMLAttributes, ReactElement, ReactNode, Ref, SyntheticEvent } from "react";
|
|
4
4
|
/** A side of its child a tooltip sits on - and, after the dash, which end of that side it lines up with. */
|
|
5
5
|
type FixedTooltipPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
|
|
6
6
|
/** A fixed placement, or `auto` - the side with the most room, chosen as it is placed. */
|
|
@@ -16,7 +16,14 @@ interface TooltipSlotProps {
|
|
|
16
16
|
root?: SlotProps;
|
|
17
17
|
arrow?: SlotProps;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* What a parent that clones its child (a `Menu` with a `Tooltip` for a trigger) hands the tooltip
|
|
21
|
+
* instead: it is not the tooltip's, so it goes on to the child. The tooltip's own props are left out.
|
|
22
|
+
*/
|
|
23
|
+
type TooltipForwardedProps = Omit<HTMLAttributes<HTMLElement>, 'title' | 'children' | 'className' | 'color'> & {
|
|
24
|
+
ref?: Ref<HTMLElement>;
|
|
25
|
+
};
|
|
26
|
+
interface TooltipProps extends TooltipForwardedProps {
|
|
20
27
|
/**
|
|
21
28
|
* The one element the tooltip is about - it holds a `ref` and takes the handlers. Without it, the
|
|
22
29
|
* tooltip is at `anchorPosition`, and open when `isOpen` says so.
|
|
@@ -62,6 +69,12 @@ interface TooltipProps {
|
|
|
62
69
|
onOpen?: (event: Event | SyntheticEvent) => void;
|
|
63
70
|
/** Fired when it asks to close. */
|
|
64
71
|
onClose?: (event: Event | SyntheticEvent) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Whether a disabled child (`disabled`) is wrapped in an element of its own, which takes the pointer
|
|
74
|
+
* handlers and the placement, since a disabled control sends no pointer events. Left out for a child
|
|
75
|
+
* that is only marked disabled and still takes them - a menu row. Default: `true`.
|
|
76
|
+
*/
|
|
77
|
+
shouldWrapDisabledChild?: boolean;
|
|
65
78
|
/**
|
|
66
79
|
* Whether the pointer can be moved onto the tooltip, which then stays open (WCAG 1.4.13). With
|
|
67
80
|
* `false` it takes no pointer events - a click goes to what is under it - and closes as the
|
|
@@ -92,5 +105,5 @@ interface TooltipProps {
|
|
|
92
105
|
* `shouldDescribeChild`). It opens and closes after their delays, stays open while the pointer is
|
|
93
106
|
* on the tooltip itself, closes on Escape, and never takes or traps the focus.
|
|
94
107
|
*/
|
|
95
|
-
declare function Tooltip({ children, anchorPosition, title, placement: placementProp, hasArrow: hasArrowProp, enterDelay: enterDelayProp, leaveDelay: leaveDelayProp, enterTouchDelay: enterTouchDelayProp, leaveTouchDelay: leaveTouchDelayProp, shouldDescribeChild: shouldDescribeChildProp, isDescriptionPersistent: isDescriptionPersistentProp, isOpen: isOpenProp, defaultOpen, onOpen, onClose, isInteractive: isInteractiveProp, shouldOpenOnHover: shouldOpenOnHoverProp, shouldOpenOnFocus: shouldOpenOnFocusProp, shouldOpenOnTouch: shouldOpenOnTouchProp, slots, slotProps, layer: layerProp, borderRadius: borderRadiusProp, bg: bgProp, textColor: textColorProp, className, 'data-testid': dataTestid }: Readonly<TooltipProps>): import("react").JSX.Element;
|
|
96
|
-
export { Tooltip, type TooltipPlacement, TooltipProps, TooltipSlotProps, TooltipSlots };
|
|
108
|
+
declare function Tooltip({ children, anchorPosition, title, placement: placementProp, hasArrow: hasArrowProp, enterDelay: enterDelayProp, leaveDelay: leaveDelayProp, enterTouchDelay: enterTouchDelayProp, leaveTouchDelay: leaveTouchDelayProp, shouldDescribeChild: shouldDescribeChildProp, isDescriptionPersistent: isDescriptionPersistentProp, isOpen: isOpenProp, defaultOpen, onOpen, onClose, isInteractive: isInteractiveProp, shouldWrapDisabledChild: shouldWrapDisabledChildProp, shouldOpenOnHover: shouldOpenOnHoverProp, shouldOpenOnFocus: shouldOpenOnFocusProp, shouldOpenOnTouch: shouldOpenOnTouchProp, slots, slotProps, layer: layerProp, borderRadius: borderRadiusProp, bg: bgProp, textColor: textColorProp, className, 'data-testid': dataTestid, ref: forwardedRef, ...forwarded }: Readonly<TooltipProps>): import("react").JSX.Element;
|
|
109
|
+
export { Tooltip, TooltipForwardedProps, type TooltipPlacement, TooltipProps, TooltipSlotProps, TooltipSlots };
|