@amboss/design-system 1.19.0 → 1.19.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/build/cjs/src/components/UserHighlightTooltip/UserHighlightTooltip.js +115 -4
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.d.ts +8 -3
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.js +116 -5
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,15 +1,126 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
var
|
|
4
|
+
var TooltipContent = require('../Tooltip/TooltipContent.js');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
7
|
|
|
8
8
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const SHOW_HIDE_DELAY = 200;
|
|
11
|
+
function UserHighlightTooltip(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
content,
|
|
14
|
+
contentPadding = "m",
|
|
15
|
+
placement = "auto",
|
|
16
|
+
maxWidth,
|
|
17
|
+
portalContainer,
|
|
18
|
+
"data-e2e-test-id": dataE2eTestId,
|
|
19
|
+
triggerElements,
|
|
20
|
+
selectedRange,
|
|
21
|
+
onVisibilityChange
|
|
22
|
+
} = _ref;
|
|
23
|
+
const tooltipId = React.useMemo(() => `DSUserHighlightTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
24
|
+
const isTooltipHovered = React.useRef(false);
|
|
25
|
+
const showTooltipTimeoutId = React.useRef(null);
|
|
26
|
+
const hideTooltipTimeoutId = React.useRef(null);
|
|
27
|
+
const triggerHovered = React.useRef(false);
|
|
28
|
+
const rangeRef = React.useRef(null);
|
|
29
|
+
React.useEffect(() => {
|
|
30
|
+
if (selectedRange) {
|
|
31
|
+
rangeRef.current = selectedRange;
|
|
32
|
+
} else {
|
|
33
|
+
const range = document.createRange();
|
|
34
|
+
range.setStart(triggerElements[0], 0);
|
|
35
|
+
range.setEnd(triggerElements[triggerElements.length - 1], 1);
|
|
36
|
+
rangeRef.current = range;
|
|
37
|
+
}
|
|
38
|
+
}, [triggerElements, selectedRange]);
|
|
39
|
+
const [tooltipVisible, setTooltipVisible] = React.useState(false);
|
|
40
|
+
const toggleVisibility = React.useCallback(status => {
|
|
41
|
+
setTooltipVisible(status);
|
|
42
|
+
if (onVisibilityChange) {
|
|
43
|
+
onVisibilityChange(status);
|
|
44
|
+
}
|
|
45
|
+
}, [onVisibilityChange]);
|
|
46
|
+
const handleTooltipPointerEnter = () => {
|
|
47
|
+
isTooltipHovered.current = true;
|
|
48
|
+
};
|
|
49
|
+
const hideTooltipAfterDelay = React.useCallback(() => {
|
|
50
|
+
// Delay removing tooltip from DOM to allow hover over highlight element || tooltip element
|
|
51
|
+
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
52
|
+
if (!triggerHovered.current && !isTooltipHovered.current && tooltipVisible) {
|
|
53
|
+
toggleVisibility(false);
|
|
54
|
+
}
|
|
55
|
+
}, SHOW_HIDE_DELAY);
|
|
56
|
+
}, [toggleVisibility, tooltipVisible]);
|
|
57
|
+
const handleTooltipPointerLeave = () => {
|
|
58
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
59
|
+
isTooltipHovered.current = false;
|
|
60
|
+
hideTooltipAfterDelay();
|
|
61
|
+
};
|
|
62
|
+
const handleTriggerPointerEnter = React.useCallback(() => {
|
|
63
|
+
triggerHovered.current = true;
|
|
64
|
+
if (!tooltipVisible) {
|
|
65
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
66
|
+
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
67
|
+
showTooltipTimeoutId.current = setTimeout(() => {
|
|
68
|
+
if (!tooltipVisible && triggerHovered.current) {
|
|
69
|
+
toggleVisibility(true);
|
|
70
|
+
}
|
|
71
|
+
}, SHOW_HIDE_DELAY);
|
|
72
|
+
}
|
|
73
|
+
}, [toggleVisibility, tooltipVisible]);
|
|
74
|
+
const handleTriggerPointerLeave = React.useCallback(() => {
|
|
75
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
76
|
+
triggerHovered.current = false;
|
|
77
|
+
hideTooltipAfterDelay();
|
|
78
|
+
}, [hideTooltipAfterDelay]);
|
|
79
|
+
React.useEffect(() => () => {
|
|
80
|
+
// clear timers
|
|
81
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
82
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
83
|
+
}, []);
|
|
84
|
+
|
|
85
|
+
// event listeners
|
|
86
|
+
React.useEffect(() => {
|
|
87
|
+
triggerElements.forEach(node => {
|
|
88
|
+
node.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
89
|
+
node.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
90
|
+
});
|
|
91
|
+
return () => {
|
|
92
|
+
triggerElements.forEach(node => {
|
|
93
|
+
node.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
94
|
+
node.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
}, [handleTriggerPointerEnter, handleTriggerPointerLeave, triggerElements]);
|
|
98
|
+
React.useEffect(() => {
|
|
99
|
+
triggerElements.forEach(node => {
|
|
100
|
+
if (tooltipVisible) {
|
|
101
|
+
node.setAttribute("aria-describedby", tooltipId);
|
|
102
|
+
} else {
|
|
103
|
+
node.removeAttribute("aria-describedby");
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}, [tooltipId, tooltipVisible, triggerElements]);
|
|
107
|
+
if (!rangeRef.current) return null;
|
|
108
|
+
return /*#__PURE__*/React__default.default.createElement(TooltipContent.TooltipContent, {
|
|
109
|
+
dataDSId: "UserHighlightTooltip",
|
|
110
|
+
content: content,
|
|
111
|
+
placement: placement,
|
|
112
|
+
portalContainer: portalContainer,
|
|
113
|
+
dataE2eTestId: dataE2eTestId,
|
|
114
|
+
isVisible: tooltipVisible,
|
|
115
|
+
tooltipId: tooltipId,
|
|
116
|
+
triggerRef: rangeRef,
|
|
117
|
+
"aria-hidden": true,
|
|
118
|
+
role: "tooltip",
|
|
119
|
+
contentPadding: contentPadding,
|
|
120
|
+
maxWidth: maxWidth,
|
|
121
|
+
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
122
|
+
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
123
|
+
});
|
|
13
124
|
}
|
|
14
125
|
|
|
15
126
|
exports.UserHighlightTooltip = UserHighlightTooltip;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type {
|
|
3
|
-
export type UserHighlightTooltipProps =
|
|
4
|
-
|
|
2
|
+
import type { TooltipContentProps } from "../Tooltip/TooltipContent";
|
|
3
|
+
export type UserHighlightTooltipProps = Pick<TooltipContentProps, "content" | "placement" | "portalContainer" | "contentPadding" | "maxWidth"> & {
|
|
4
|
+
"data-e2e-test-id"?: string;
|
|
5
|
+
onVisibilityChange?: (isVisible: boolean) => void;
|
|
6
|
+
triggerElements: HTMLElement[];
|
|
7
|
+
selectedRange?: Range;
|
|
8
|
+
};
|
|
9
|
+
export declare function UserHighlightTooltip({ content, contentPadding, placement, maxWidth, portalContainer, "data-e2e-test-id": dataE2eTestId, triggerElements, selectedRange, onVisibilityChange, }: UserHighlightTooltipProps): React.ReactElement;
|
|
@@ -1,9 +1,120 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
1
|
+
import React, { useMemo, useRef, useEffect, useState, useCallback } from 'react';
|
|
2
|
+
import { TooltipContent } from '../Tooltip/TooltipContent.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const SHOW_HIDE_DELAY = 200;
|
|
5
|
+
function UserHighlightTooltip(_ref) {
|
|
6
|
+
let {
|
|
7
|
+
content,
|
|
8
|
+
contentPadding = "m",
|
|
9
|
+
placement = "auto",
|
|
10
|
+
maxWidth,
|
|
11
|
+
portalContainer,
|
|
12
|
+
"data-e2e-test-id": dataE2eTestId,
|
|
13
|
+
triggerElements,
|
|
14
|
+
selectedRange,
|
|
15
|
+
onVisibilityChange
|
|
16
|
+
} = _ref;
|
|
17
|
+
const tooltipId = useMemo(() => `DSUserHighlightTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
18
|
+
const isTooltipHovered = useRef(false);
|
|
19
|
+
const showTooltipTimeoutId = useRef(null);
|
|
20
|
+
const hideTooltipTimeoutId = useRef(null);
|
|
21
|
+
const triggerHovered = useRef(false);
|
|
22
|
+
const rangeRef = useRef(null);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (selectedRange) {
|
|
25
|
+
rangeRef.current = selectedRange;
|
|
26
|
+
} else {
|
|
27
|
+
const range = document.createRange();
|
|
28
|
+
range.setStart(triggerElements[0], 0);
|
|
29
|
+
range.setEnd(triggerElements[triggerElements.length - 1], 1);
|
|
30
|
+
rangeRef.current = range;
|
|
31
|
+
}
|
|
32
|
+
}, [triggerElements, selectedRange]);
|
|
33
|
+
const [tooltipVisible, setTooltipVisible] = useState(false);
|
|
34
|
+
const toggleVisibility = useCallback(status => {
|
|
35
|
+
setTooltipVisible(status);
|
|
36
|
+
if (onVisibilityChange) {
|
|
37
|
+
onVisibilityChange(status);
|
|
38
|
+
}
|
|
39
|
+
}, [onVisibilityChange]);
|
|
40
|
+
const handleTooltipPointerEnter = () => {
|
|
41
|
+
isTooltipHovered.current = true;
|
|
42
|
+
};
|
|
43
|
+
const hideTooltipAfterDelay = useCallback(() => {
|
|
44
|
+
// Delay removing tooltip from DOM to allow hover over highlight element || tooltip element
|
|
45
|
+
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
46
|
+
if (!triggerHovered.current && !isTooltipHovered.current && tooltipVisible) {
|
|
47
|
+
toggleVisibility(false);
|
|
48
|
+
}
|
|
49
|
+
}, SHOW_HIDE_DELAY);
|
|
50
|
+
}, [toggleVisibility, tooltipVisible]);
|
|
51
|
+
const handleTooltipPointerLeave = () => {
|
|
52
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
53
|
+
isTooltipHovered.current = false;
|
|
54
|
+
hideTooltipAfterDelay();
|
|
55
|
+
};
|
|
56
|
+
const handleTriggerPointerEnter = useCallback(() => {
|
|
57
|
+
triggerHovered.current = true;
|
|
58
|
+
if (!tooltipVisible) {
|
|
59
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
60
|
+
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
61
|
+
showTooltipTimeoutId.current = setTimeout(() => {
|
|
62
|
+
if (!tooltipVisible && triggerHovered.current) {
|
|
63
|
+
toggleVisibility(true);
|
|
64
|
+
}
|
|
65
|
+
}, SHOW_HIDE_DELAY);
|
|
66
|
+
}
|
|
67
|
+
}, [toggleVisibility, tooltipVisible]);
|
|
68
|
+
const handleTriggerPointerLeave = useCallback(() => {
|
|
69
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
70
|
+
triggerHovered.current = false;
|
|
71
|
+
hideTooltipAfterDelay();
|
|
72
|
+
}, [hideTooltipAfterDelay]);
|
|
73
|
+
useEffect(() => () => {
|
|
74
|
+
// clear timers
|
|
75
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
76
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
77
|
+
}, []);
|
|
78
|
+
|
|
79
|
+
// event listeners
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
triggerElements.forEach(node => {
|
|
82
|
+
node.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
83
|
+
node.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
84
|
+
});
|
|
85
|
+
return () => {
|
|
86
|
+
triggerElements.forEach(node => {
|
|
87
|
+
node.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
88
|
+
node.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
}, [handleTriggerPointerEnter, handleTriggerPointerLeave, triggerElements]);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
triggerElements.forEach(node => {
|
|
94
|
+
if (tooltipVisible) {
|
|
95
|
+
node.setAttribute("aria-describedby", tooltipId);
|
|
96
|
+
} else {
|
|
97
|
+
node.removeAttribute("aria-describedby");
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}, [tooltipId, tooltipVisible, triggerElements]);
|
|
101
|
+
if (!rangeRef.current) return null;
|
|
102
|
+
return /*#__PURE__*/React.createElement(TooltipContent, {
|
|
103
|
+
dataDSId: "UserHighlightTooltip",
|
|
104
|
+
content: content,
|
|
105
|
+
placement: placement,
|
|
106
|
+
portalContainer: portalContainer,
|
|
107
|
+
dataE2eTestId: dataE2eTestId,
|
|
108
|
+
isVisible: tooltipVisible,
|
|
109
|
+
tooltipId: tooltipId,
|
|
110
|
+
triggerRef: rangeRef,
|
|
111
|
+
"aria-hidden": true,
|
|
112
|
+
role: "tooltip",
|
|
113
|
+
contentPadding: contentPadding,
|
|
114
|
+
maxWidth: maxWidth,
|
|
115
|
+
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
116
|
+
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
117
|
+
});
|
|
7
118
|
}
|
|
8
119
|
|
|
9
120
|
export { UserHighlightTooltip };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserHighlightTooltip.js","sources":["../../../../../src/components/UserHighlightTooltip/UserHighlightTooltip.tsx"],"sourcesContent":["import React from \"react\";\nimport type { BaseTooltipProps } from \"../Tooltip/BaseTooltip\";\nimport { BaseTooltip } from \"../Tooltip/BaseTooltip\";\n\nexport type UserHighlightTooltipProps = BaseTooltipProps;\n\nexport function UserHighlightTooltip(\n props: UserHighlightTooltipProps\n): React.ReactElement {\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n return <BaseTooltip {...props} />;\n}\n"],"names":["UserHighlightTooltip","props","React","createElement","BaseTooltip"],"mappings":";;;AAMO,SAASA,oBAAoBA,CAClCC,KAAgC,EACZ;AACpB;AACA,EAAA,oBAAOC,KAAA,CAAAC,aAAA,CAACC,WAAW,EAAKH,KAAQ,CAAC,CAAA;AACnC;;;;"}
|
|
1
|
+
{"version":3,"file":"UserHighlightTooltip.js","sources":["../../../../../src/components/UserHighlightTooltip/UserHighlightTooltip.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { TooltipContentProps } from \"../Tooltip/TooltipContent\";\nimport { TooltipContent } from \"../Tooltip/TooltipContent\";\n\nexport type UserHighlightTooltipProps = Pick<\n TooltipContentProps,\n \"content\" | \"placement\" | \"portalContainer\" | \"contentPadding\" | \"maxWidth\"\n> & {\n \"data-e2e-test-id\"?: string;\n onVisibilityChange?: (isVisible: boolean) => void;\n triggerElements: HTMLElement[];\n selectedRange?: Range;\n};\n\nconst SHOW_HIDE_DELAY = 200;\n\nexport function UserHighlightTooltip({\n content,\n contentPadding = \"m\",\n placement = \"auto\",\n maxWidth,\n portalContainer,\n \"data-e2e-test-id\": dataE2eTestId,\n triggerElements,\n selectedRange,\n onVisibilityChange,\n}: UserHighlightTooltipProps): React.ReactElement {\n const tooltipId = useMemo(\n () => `DSUserHighlightTooltip_${Math.floor(Date.now() * Math.random())}`,\n []\n );\n\n const isTooltipHovered = useRef(false);\n const showTooltipTimeoutId = useRef(null);\n const hideTooltipTimeoutId = useRef(null);\n const triggerHovered = useRef(false);\n const rangeRef = useRef<Range>(null);\n\n useEffect(() => {\n if (selectedRange) {\n rangeRef.current = selectedRange;\n } else {\n const range = document.createRange();\n range.setStart(triggerElements[0], 0);\n range.setEnd(triggerElements[triggerElements.length - 1], 1);\n rangeRef.current = range;\n }\n }, [triggerElements, selectedRange]);\n\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const toggleVisibility = useCallback(\n (status: boolean) => {\n setTooltipVisible(status);\n\n if (onVisibilityChange) {\n onVisibilityChange(status);\n }\n },\n [onVisibilityChange]\n );\n\n const handleTooltipPointerEnter = () => {\n isTooltipHovered.current = true;\n };\n\n const hideTooltipAfterDelay = useCallback(() => {\n // Delay removing tooltip from DOM to allow hover over highlight element || tooltip element\n hideTooltipTimeoutId.current = setTimeout(() => {\n if (\n !triggerHovered.current &&\n !isTooltipHovered.current &&\n tooltipVisible\n ) {\n toggleVisibility(false);\n }\n }, SHOW_HIDE_DELAY);\n }, [toggleVisibility, tooltipVisible]);\n\n const handleTooltipPointerLeave = () => {\n clearTimeout(hideTooltipTimeoutId.current);\n isTooltipHovered.current = false;\n\n hideTooltipAfterDelay();\n };\n\n const handleTriggerPointerEnter = useCallback(() => {\n triggerHovered.current = true;\n if (!tooltipVisible) {\n clearTimeout(showTooltipTimeoutId.current);\n // Delay show tooltip to prevent flickering when mouse moves quickly over trigger\n showTooltipTimeoutId.current = setTimeout(() => {\n if (!tooltipVisible && triggerHovered.current) {\n toggleVisibility(true);\n }\n }, SHOW_HIDE_DELAY);\n }\n }, [toggleVisibility, tooltipVisible]);\n\n const handleTriggerPointerLeave = useCallback(() => {\n clearTimeout(hideTooltipTimeoutId.current);\n triggerHovered.current = false;\n\n hideTooltipAfterDelay();\n }, [hideTooltipAfterDelay]);\n\n useEffect(\n () => () => {\n // clear timers\n clearTimeout(showTooltipTimeoutId.current);\n clearTimeout(hideTooltipTimeoutId.current);\n },\n []\n );\n\n // event listeners\n useEffect(() => {\n triggerElements.forEach((node) => {\n node.addEventListener(\"pointerenter\", handleTriggerPointerEnter);\n node.addEventListener(\"pointerleave\", handleTriggerPointerLeave);\n });\n return () => {\n triggerElements.forEach((node) => {\n node.removeEventListener(\"pointerenter\", handleTriggerPointerEnter);\n node.removeEventListener(\"pointerleave\", handleTriggerPointerLeave);\n });\n };\n }, [handleTriggerPointerEnter, handleTriggerPointerLeave, triggerElements]);\n\n useEffect(() => {\n triggerElements.forEach((node) => {\n if (tooltipVisible) {\n node.setAttribute(\"aria-describedby\", tooltipId);\n } else {\n node.removeAttribute(\"aria-describedby\");\n }\n });\n }, [tooltipId, tooltipVisible, triggerElements]);\n\n if (!rangeRef.current) return null;\n\n return (\n <TooltipContent\n dataDSId=\"UserHighlightTooltip\"\n content={content}\n placement={placement}\n portalContainer={portalContainer}\n dataE2eTestId={dataE2eTestId}\n isVisible={tooltipVisible}\n tooltipId={tooltipId}\n triggerRef={rangeRef}\n aria-hidden\n role=\"tooltip\"\n contentPadding={contentPadding}\n maxWidth={maxWidth}\n onTooltipPointerEnter={handleTooltipPointerEnter}\n onTooltipPointerLeave={handleTooltipPointerLeave}\n />\n );\n}\n"],"names":["SHOW_HIDE_DELAY","UserHighlightTooltip","_ref","content","contentPadding","placement","maxWidth","portalContainer","dataE2eTestId","triggerElements","selectedRange","onVisibilityChange","tooltipId","useMemo","Math","floor","Date","now","random","isTooltipHovered","useRef","showTooltipTimeoutId","hideTooltipTimeoutId","triggerHovered","rangeRef","useEffect","current","range","document","createRange","setStart","setEnd","length","tooltipVisible","setTooltipVisible","useState","toggleVisibility","useCallback","status","handleTooltipPointerEnter","hideTooltipAfterDelay","setTimeout","handleTooltipPointerLeave","clearTimeout","handleTriggerPointerEnter","handleTriggerPointerLeave","forEach","node","addEventListener","removeEventListener","setAttribute","removeAttribute","React","createElement","TooltipContent","dataDSId","isVisible","triggerRef","role","onTooltipPointerEnter","onTooltipPointerLeave"],"mappings":"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"}
|