@amboss/design-system 1.17.7 → 1.18.0
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/Toggletip/Toggletip.js +3 -2
- package/build/cjs/src/components/Tooltip/BaseTooltip.js +163 -0
- package/build/cjs/src/components/Tooltip/Tooltip.js +8 -144
- package/build/cjs/src/components/UserHighlightTooltip/UserHighlightTooltip.js +15 -0
- package/build/cjs/src/index.js +2 -0
- package/build/esm/src/components/Toggletip/Toggletip.d.ts +5 -10
- package/build/esm/src/components/Toggletip/Toggletip.js +3 -2
- package/build/esm/src/components/Toggletip/Toggletip.js.map +1 -1
- package/build/esm/src/components/Tooltip/BaseTooltip.d.ts +11 -0
- package/build/esm/src/components/Tooltip/BaseTooltip.js +158 -0
- package/build/esm/src/components/Tooltip/BaseTooltip.js.map +1 -0
- package/build/esm/src/components/Tooltip/Tooltip.d.ts +6 -16
- package/build/esm/src/components/Tooltip/Tooltip.js +8 -145
- package/build/esm/src/components/Tooltip/Tooltip.js.map +1 -1
- package/build/esm/src/components/Tooltip/types.d.ts +8 -0
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.d.ts +4 -0
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.js +10 -0
- package/build/esm/src/components/UserHighlightTooltip/UserHighlightTooltip.js.map +1 -0
- package/build/esm/src/index.d.ts +1 -0
- package/build/esm/src/index.js +1 -0
- package/build/esm/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -27,6 +27,7 @@ function Toggletip(_ref2) {
|
|
|
27
27
|
externalTriggerRef,
|
|
28
28
|
portalContainer,
|
|
29
29
|
isVisible: isToggletipVisible,
|
|
30
|
+
dismissOnOutsideClick = true,
|
|
30
31
|
"data-e2e-test-id": dataE2eTestId,
|
|
31
32
|
onVisibilityChange
|
|
32
33
|
} = _ref2;
|
|
@@ -101,8 +102,9 @@ function Toggletip(_ref2) {
|
|
|
101
102
|
}) : null;
|
|
102
103
|
const contentElm = /*#__PURE__*/React__default.default.createElement(FocusTrap__default.default, {
|
|
103
104
|
focusTrapOptions: {
|
|
104
|
-
clickOutsideDeactivates: handleClickOutsideDeactivates,
|
|
105
|
+
clickOutsideDeactivates: dismissOnOutsideClick && handleClickOutsideDeactivates,
|
|
105
106
|
// de-active focus trap on outside click
|
|
107
|
+
allowOutsideClick: true,
|
|
106
108
|
escapeDeactivates: true,
|
|
107
109
|
// de-activate focus trap on escape key
|
|
108
110
|
fallbackFocus: `#${tooltipId}`,
|
|
@@ -122,7 +124,6 @@ function Toggletip(_ref2) {
|
|
|
122
124
|
dataE2eTestId: dataE2eTestId,
|
|
123
125
|
isVisible: isVisible,
|
|
124
126
|
tooltipId: tooltipId,
|
|
125
|
-
tabIndex: -1,
|
|
126
127
|
triggerRef: triggerRef
|
|
127
128
|
});
|
|
128
129
|
return /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, triggerElm, tooltipElm);
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var TooltipContent = require('./TooltipContent.js');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
9
|
+
|
|
10
|
+
const SHOW_HIDE_DELAY = 200;
|
|
11
|
+
function BaseTooltip(_ref) {
|
|
12
|
+
let {
|
|
13
|
+
placement = "auto",
|
|
14
|
+
content,
|
|
15
|
+
children,
|
|
16
|
+
externalTriggerRef,
|
|
17
|
+
portalContainer,
|
|
18
|
+
contentPadding = "m",
|
|
19
|
+
maxWidth,
|
|
20
|
+
"data-e2e-test-id": dataE2eTestId,
|
|
21
|
+
onVisibilityChange
|
|
22
|
+
} = _ref;
|
|
23
|
+
const tooltipId = React.useMemo(() => `DSTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
24
|
+
const [isVisible, setVisible] = React.useState(false);
|
|
25
|
+
const triggeredByEvent = React.useRef(null); // indicates if triggered by hover or focus
|
|
26
|
+
const isTooltipHovered = React.useRef(false);
|
|
27
|
+
const isTriggerHovered = React.useRef(false);
|
|
28
|
+
const hideTooltipTimeoutId = React.useRef(null);
|
|
29
|
+
const showTooltipTimeoutId = React.useRef(null);
|
|
30
|
+
const internalTriggerRef = React.useRef(null);
|
|
31
|
+
const triggerRef = externalTriggerRef || internalTriggerRef;
|
|
32
|
+
const toggleVisibility = React.useCallback(status => {
|
|
33
|
+
setVisible(status);
|
|
34
|
+
if (onVisibilityChange) {
|
|
35
|
+
onVisibilityChange(status);
|
|
36
|
+
}
|
|
37
|
+
}, [onVisibilityChange]);
|
|
38
|
+
const handleTriggerPointerEnter = React.useCallback(() => {
|
|
39
|
+
isTriggerHovered.current = true;
|
|
40
|
+
if (!isTooltipHovered.current) {
|
|
41
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
42
|
+
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
43
|
+
showTooltipTimeoutId.current = setTimeout(() => {
|
|
44
|
+
if (isTriggerHovered.current) {
|
|
45
|
+
triggeredByEvent.current = "hover";
|
|
46
|
+
toggleVisibility(true);
|
|
47
|
+
}
|
|
48
|
+
}, SHOW_HIDE_DELAY);
|
|
49
|
+
}
|
|
50
|
+
}, [toggleVisibility]);
|
|
51
|
+
const handleTriggerPointerLeave = React.useCallback(() => {
|
|
52
|
+
isTriggerHovered.current = false;
|
|
53
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
54
|
+
// Delay removing tooltip from DOM to allow hover over tooltip element
|
|
55
|
+
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
56
|
+
if (!isTooltipHovered.current && triggeredByEvent.current === "hover" && !isTriggerHovered.current) {
|
|
57
|
+
toggleVisibility(false);
|
|
58
|
+
}
|
|
59
|
+
}, SHOW_HIDE_DELAY);
|
|
60
|
+
}, [toggleVisibility]);
|
|
61
|
+
const handleTriggerFocus = React.useCallback(() => {
|
|
62
|
+
triggeredByEvent.current = "focus";
|
|
63
|
+
toggleVisibility(true);
|
|
64
|
+
}, [toggleVisibility]);
|
|
65
|
+
const handleTriggerBlur = React.useCallback(() => {
|
|
66
|
+
if (triggeredByEvent.current === "focus") {
|
|
67
|
+
toggleVisibility(false);
|
|
68
|
+
}
|
|
69
|
+
}, [toggleVisibility]);
|
|
70
|
+
const handleTriggerKeyDown = React.useCallback(evt => {
|
|
71
|
+
if (evt.key === "Escape") {
|
|
72
|
+
toggleVisibility(false);
|
|
73
|
+
}
|
|
74
|
+
}, [toggleVisibility]);
|
|
75
|
+
const handleTooltipPointerEnter = () => {
|
|
76
|
+
isTooltipHovered.current = true;
|
|
77
|
+
};
|
|
78
|
+
const handleTooltipPointerLeave = () => {
|
|
79
|
+
isTooltipHovered.current = false;
|
|
80
|
+
if (triggeredByEvent.current === "hover") {
|
|
81
|
+
toggleVisibility(false);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
React.useEffect(() => () => {
|
|
85
|
+
// clear timers
|
|
86
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
87
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
88
|
+
}, []);
|
|
89
|
+
React.useEffect(() => {
|
|
90
|
+
let trigger;
|
|
91
|
+
if (externalTriggerRef?.current && !children) {
|
|
92
|
+
trigger = externalTriggerRef.current;
|
|
93
|
+
trigger.setAttribute("tabindex", "0");
|
|
94
|
+
trigger.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
95
|
+
trigger.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
96
|
+
trigger.addEventListener("focus", handleTriggerFocus);
|
|
97
|
+
trigger.addEventListener("blur", handleTriggerBlur);
|
|
98
|
+
trigger.addEventListener("keydown", handleTriggerKeyDown);
|
|
99
|
+
}
|
|
100
|
+
return () => {
|
|
101
|
+
if (trigger) {
|
|
102
|
+
trigger.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
103
|
+
trigger.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
104
|
+
trigger.removeEventListener("focus", handleTriggerFocus);
|
|
105
|
+
trigger.removeEventListener("blur", handleTriggerBlur);
|
|
106
|
+
trigger.removeEventListener("keydown", handleTriggerKeyDown);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}, [externalTriggerRef, children, handleTriggerPointerEnter, handleTriggerPointerLeave, handleTriggerFocus, handleTriggerBlur, handleTriggerKeyDown]);
|
|
110
|
+
React.useEffect(() => {
|
|
111
|
+
if (externalTriggerRef?.current && !children) {
|
|
112
|
+
const trigger = externalTriggerRef.current;
|
|
113
|
+
if (isVisible) {
|
|
114
|
+
trigger.setAttribute("aria-describedby", tooltipId);
|
|
115
|
+
} else {
|
|
116
|
+
trigger.removeAttribute("aria-describedby");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, [externalTriggerRef, children, tooltipId, isVisible]);
|
|
120
|
+
const triggerElm = children ? /*#__PURE__*/React__default.default.cloneElement(children, {
|
|
121
|
+
ref: triggerRef,
|
|
122
|
+
...(isVisible && {
|
|
123
|
+
"aria-describedby": tooltipId
|
|
124
|
+
}),
|
|
125
|
+
tabIndex: 0,
|
|
126
|
+
onPointerEnter: handleTriggerPointerEnter,
|
|
127
|
+
onPointerLeave: handleTriggerPointerLeave,
|
|
128
|
+
onFocus: evt => {
|
|
129
|
+
handleTriggerFocus();
|
|
130
|
+
if (children.props.onFocus) {
|
|
131
|
+
children.props.onFocus(evt);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
onBlur: evt => {
|
|
135
|
+
handleTriggerBlur();
|
|
136
|
+
if (children.props.onBlur) {
|
|
137
|
+
if (children.props.onBlur) {
|
|
138
|
+
children.props.onBlur(evt);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
onKeyDown: handleTriggerKeyDown
|
|
143
|
+
}) : null;
|
|
144
|
+
const tooltipElm = /*#__PURE__*/React__default.default.createElement(TooltipContent.TooltipContent, {
|
|
145
|
+
dataDSId: "Tooltip",
|
|
146
|
+
content: content,
|
|
147
|
+
placement: placement,
|
|
148
|
+
portalContainer: portalContainer,
|
|
149
|
+
dataE2eTestId: dataE2eTestId,
|
|
150
|
+
isVisible: isVisible,
|
|
151
|
+
tooltipId: tooltipId,
|
|
152
|
+
triggerRef: triggerRef,
|
|
153
|
+
"aria-hidden": true,
|
|
154
|
+
role: "tooltip",
|
|
155
|
+
contentPadding: contentPadding,
|
|
156
|
+
maxWidth: maxWidth,
|
|
157
|
+
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
158
|
+
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
159
|
+
});
|
|
160
|
+
return /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, triggerElm, tooltipElm);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
exports.BaseTooltip = BaseTooltip;
|
|
@@ -1,163 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _extends = require('@babel/runtime/helpers/extends');
|
|
3
4
|
var React = require('react');
|
|
4
5
|
var Text = require('../Typography/Text/Text.js');
|
|
5
|
-
var
|
|
6
|
+
var BaseTooltip = require('./BaseTooltip.js');
|
|
6
7
|
|
|
7
8
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
9
|
|
|
10
|
+
var _extends__default = /*#__PURE__*/_interopDefault(_extends);
|
|
9
11
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
10
12
|
|
|
11
|
-
const SHOW_HIDE_DELAY = 200;
|
|
12
13
|
function Tooltip(_ref) {
|
|
13
14
|
let {
|
|
14
|
-
placement = "auto",
|
|
15
15
|
content,
|
|
16
|
-
|
|
17
|
-
externalTriggerRef,
|
|
18
|
-
portalContainer,
|
|
19
|
-
"data-e2e-test-id": dataE2eTestId,
|
|
20
|
-
onVisibilityChange
|
|
16
|
+
...rest
|
|
21
17
|
} = _ref;
|
|
22
|
-
const tooltipId = React.useMemo(() => `DSTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
23
|
-
const [isVisible, setVisible] = React.useState(false);
|
|
24
|
-
const triggeredByEvent = React.useRef(null); // indicates if triggered by hover or focus
|
|
25
|
-
const isTooltipHovered = React.useRef(false);
|
|
26
|
-
const isTriggerHovered = React.useRef(false);
|
|
27
|
-
const hideTooltipTimeoutId = React.useRef(null);
|
|
28
|
-
const showTooltipTimeoutId = React.useRef(null);
|
|
29
|
-
const internalTriggerRef = React.useRef(null);
|
|
30
|
-
const triggerRef = externalTriggerRef || internalTriggerRef;
|
|
31
|
-
const toggleVisibility = React.useCallback(status => {
|
|
32
|
-
setVisible(status);
|
|
33
|
-
if (onVisibilityChange) {
|
|
34
|
-
onVisibilityChange(status);
|
|
35
|
-
}
|
|
36
|
-
}, [onVisibilityChange]);
|
|
37
|
-
const handleTriggerPointerEnter = React.useCallback(() => {
|
|
38
|
-
isTriggerHovered.current = true;
|
|
39
|
-
if (!isTooltipHovered.current) {
|
|
40
|
-
clearTimeout(showTooltipTimeoutId.current);
|
|
41
|
-
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
42
|
-
showTooltipTimeoutId.current = setTimeout(() => {
|
|
43
|
-
if (isTriggerHovered.current) {
|
|
44
|
-
triggeredByEvent.current = "hover";
|
|
45
|
-
toggleVisibility(true);
|
|
46
|
-
}
|
|
47
|
-
}, SHOW_HIDE_DELAY);
|
|
48
|
-
}
|
|
49
|
-
}, [toggleVisibility]);
|
|
50
|
-
const handleTriggerPointerLeave = React.useCallback(() => {
|
|
51
|
-
isTriggerHovered.current = false;
|
|
52
|
-
clearTimeout(hideTooltipTimeoutId.current);
|
|
53
|
-
// Delay removing tooltip from DOM to allow hover over tooltip element
|
|
54
|
-
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
55
|
-
if (!isTooltipHovered.current && triggeredByEvent.current === "hover" && !isTriggerHovered.current) {
|
|
56
|
-
toggleVisibility(false);
|
|
57
|
-
}
|
|
58
|
-
}, SHOW_HIDE_DELAY);
|
|
59
|
-
}, [toggleVisibility]);
|
|
60
|
-
const handleTriggerFocus = React.useCallback(() => {
|
|
61
|
-
triggeredByEvent.current = "focus";
|
|
62
|
-
toggleVisibility(true);
|
|
63
|
-
}, [toggleVisibility]);
|
|
64
|
-
const handleTriggerBlur = React.useCallback(() => {
|
|
65
|
-
if (triggeredByEvent.current === "focus") {
|
|
66
|
-
toggleVisibility(false);
|
|
67
|
-
}
|
|
68
|
-
}, [toggleVisibility]);
|
|
69
|
-
const handleTriggerKeyDown = React.useCallback(evt => {
|
|
70
|
-
if (evt.key === "Escape") {
|
|
71
|
-
toggleVisibility(false);
|
|
72
|
-
}
|
|
73
|
-
}, [toggleVisibility]);
|
|
74
|
-
const handleTooltipPointerEnter = () => {
|
|
75
|
-
isTooltipHovered.current = true;
|
|
76
|
-
};
|
|
77
|
-
const handleTooltipPointerLeave = () => {
|
|
78
|
-
isTooltipHovered.current = false;
|
|
79
|
-
if (triggeredByEvent.current === "hover") {
|
|
80
|
-
toggleVisibility(false);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
React.useEffect(() => () => {
|
|
84
|
-
// clear timers
|
|
85
|
-
clearTimeout(showTooltipTimeoutId.current);
|
|
86
|
-
clearTimeout(hideTooltipTimeoutId.current);
|
|
87
|
-
}, []);
|
|
88
|
-
React.useEffect(() => {
|
|
89
|
-
let trigger;
|
|
90
|
-
if (externalTriggerRef?.current && !children) {
|
|
91
|
-
trigger = externalTriggerRef.current;
|
|
92
|
-
trigger.setAttribute("tabindex", "0");
|
|
93
|
-
trigger.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
94
|
-
trigger.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
95
|
-
trigger.addEventListener("focus", handleTriggerFocus);
|
|
96
|
-
trigger.addEventListener("blur", handleTriggerBlur);
|
|
97
|
-
trigger.addEventListener("keydown", handleTriggerKeyDown);
|
|
98
|
-
}
|
|
99
|
-
return () => {
|
|
100
|
-
if (trigger) {
|
|
101
|
-
trigger.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
102
|
-
trigger.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
103
|
-
trigger.removeEventListener("focus", handleTriggerFocus);
|
|
104
|
-
trigger.removeEventListener("blur", handleTriggerBlur);
|
|
105
|
-
trigger.removeEventListener("keydown", handleTriggerKeyDown);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
}, [externalTriggerRef, children, handleTriggerPointerEnter, handleTriggerPointerLeave, handleTriggerFocus, handleTriggerBlur, handleTriggerKeyDown]);
|
|
109
|
-
React.useEffect(() => {
|
|
110
|
-
if (externalTriggerRef?.current && !children) {
|
|
111
|
-
const trigger = externalTriggerRef.current;
|
|
112
|
-
if (isVisible) {
|
|
113
|
-
trigger.setAttribute("aria-describedby", tooltipId);
|
|
114
|
-
} else {
|
|
115
|
-
trigger.removeAttribute("aria-describedby");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}, [externalTriggerRef, children, tooltipId, isVisible]);
|
|
119
|
-
const triggerElm = children ? /*#__PURE__*/React__default.default.cloneElement(children, {
|
|
120
|
-
ref: triggerRef,
|
|
121
|
-
...(isVisible && {
|
|
122
|
-
"aria-describedby": tooltipId
|
|
123
|
-
}),
|
|
124
|
-
tabIndex: 0,
|
|
125
|
-
onPointerEnter: handleTriggerPointerEnter,
|
|
126
|
-
onPointerLeave: handleTriggerPointerLeave,
|
|
127
|
-
onFocus: evt => {
|
|
128
|
-
handleTriggerFocus();
|
|
129
|
-
if (children.props.onFocus) {
|
|
130
|
-
children.props.onFocus(evt);
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
onBlur: evt => {
|
|
134
|
-
handleTriggerBlur();
|
|
135
|
-
if (children.props.onBlur) {
|
|
136
|
-
if (children.props.onBlur) {
|
|
137
|
-
children.props.onBlur(evt);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
onKeyDown: handleTriggerKeyDown
|
|
142
|
-
}) : null;
|
|
143
18
|
const contentElm = /*#__PURE__*/React__default.default.createElement(Text.Text, {
|
|
144
19
|
size: "s"
|
|
145
20
|
}, content);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
content: contentElm
|
|
149
|
-
|
|
150
|
-
portalContainer: portalContainer,
|
|
151
|
-
dataE2eTestId: dataE2eTestId,
|
|
152
|
-
isVisible: isVisible,
|
|
153
|
-
tooltipId: tooltipId,
|
|
154
|
-
triggerRef: triggerRef,
|
|
155
|
-
"aria-hidden": true,
|
|
156
|
-
role: "tooltip",
|
|
157
|
-
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
158
|
-
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
159
|
-
});
|
|
160
|
-
return /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, triggerElm, tooltipElm);
|
|
21
|
+
/* eslint-disable-next-line react/jsx-props-no-spreading */
|
|
22
|
+
return /*#__PURE__*/React__default.default.createElement(BaseTooltip.BaseTooltip, _extends__default.default({
|
|
23
|
+
content: contentElm
|
|
24
|
+
}, rest));
|
|
161
25
|
}
|
|
162
26
|
|
|
163
27
|
exports.Tooltip = Tooltip;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var BaseTooltip = require('../Tooltip/BaseTooltip.js');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
9
|
+
|
|
10
|
+
function UserHighlightTooltip(props) {
|
|
11
|
+
/* eslint-disable-next-line react/jsx-props-no-spreading */
|
|
12
|
+
return /*#__PURE__*/React__default.default.createElement(BaseTooltip.BaseTooltip, props);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.UserHighlightTooltip = UserHighlightTooltip;
|
package/build/cjs/src/index.js
CHANGED
|
@@ -50,6 +50,7 @@ var Tooltip = require('./components/Tooltip/Tooltip.js');
|
|
|
50
50
|
var Tag = require('./components/Tag/Tag.js');
|
|
51
51
|
var TagGroup = require('./components/TagGroup/TagGroup.js');
|
|
52
52
|
var Toggletip = require('./components/Toggletip/Toggletip.js');
|
|
53
|
+
var UserHighlightTooltip = require('./components/UserHighlightTooltip/UserHighlightTooltip.js');
|
|
53
54
|
var Input = require('./components/Form/Input/Input.js');
|
|
54
55
|
var PasswordInput = require('./components/Form/PasswordInput/PasswordInput.js');
|
|
55
56
|
var DataTable = require('./components/DataTable/DataTable.js');
|
|
@@ -132,6 +133,7 @@ exports.MAX_TAG_WIDTH = Tag.MAX_TAG_WIDTH;
|
|
|
132
133
|
exports.Tag = Tag.Tag;
|
|
133
134
|
exports.TagGroup = TagGroup.TagGroup;
|
|
134
135
|
exports.Toggletip = Toggletip.Toggletip;
|
|
136
|
+
exports.UserHighlightTooltip = UserHighlightTooltip.UserHighlightTooltip;
|
|
135
137
|
exports.Input = Input.Input;
|
|
136
138
|
exports.PasswordInput = PasswordInput.PasswordInput;
|
|
137
139
|
exports.BaseDataTable = DataTable.BaseDataTable;
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import React, { ReactElement
|
|
1
|
+
import React, { ReactElement } from "react";
|
|
2
2
|
import type { TooltipContentProps } from "../Tooltip/TooltipContent";
|
|
3
|
+
import type { TooltipConditionalProps } from "../Tooltip/types";
|
|
3
4
|
type BaseProps = Pick<TooltipContentProps, "placement" | "portalContainer" | "contentPadding" | "maxWidth"> & {
|
|
4
5
|
content: ReactElement;
|
|
5
6
|
"data-e2e-test-id"?: string;
|
|
6
7
|
isVisible?: boolean;
|
|
7
8
|
onVisibilityChange?: (isVisible: boolean) => void;
|
|
9
|
+
dismissOnOutsideClick?: boolean;
|
|
8
10
|
};
|
|
9
|
-
type
|
|
10
|
-
|
|
11
|
-
children: React.ReactElement;
|
|
12
|
-
} | {
|
|
13
|
-
children?: never;
|
|
14
|
-
externalTriggerRef: MutableRefObject<any>;
|
|
15
|
-
};
|
|
16
|
-
export type ToggletipProps = BaseProps & ConditionalProps;
|
|
17
|
-
export declare function Toggletip({ placement, content, children, contentPadding, maxWidth, externalTriggerRef, portalContainer, isVisible: isToggletipVisible, "data-e2e-test-id": dataE2eTestId, onVisibilityChange, }: ToggletipProps): React.ReactElement;
|
|
11
|
+
export type ToggletipProps = BaseProps & TooltipConditionalProps;
|
|
12
|
+
export declare function Toggletip({ placement, content, children, contentPadding, maxWidth, externalTriggerRef, portalContainer, isVisible: isToggletipVisible, dismissOnOutsideClick, "data-e2e-test-id": dataE2eTestId, onVisibilityChange, }: ToggletipProps): React.ReactElement;
|
|
18
13
|
export {};
|
|
@@ -20,6 +20,7 @@ function Toggletip(_ref2) {
|
|
|
20
20
|
externalTriggerRef,
|
|
21
21
|
portalContainer,
|
|
22
22
|
isVisible: isToggletipVisible,
|
|
23
|
+
dismissOnOutsideClick = true,
|
|
23
24
|
"data-e2e-test-id": dataE2eTestId,
|
|
24
25
|
onVisibilityChange
|
|
25
26
|
} = _ref2;
|
|
@@ -94,8 +95,9 @@ function Toggletip(_ref2) {
|
|
|
94
95
|
}) : null;
|
|
95
96
|
const contentElm = /*#__PURE__*/React.createElement(FocusTrap, {
|
|
96
97
|
focusTrapOptions: {
|
|
97
|
-
clickOutsideDeactivates: handleClickOutsideDeactivates,
|
|
98
|
+
clickOutsideDeactivates: dismissOnOutsideClick && handleClickOutsideDeactivates,
|
|
98
99
|
// de-active focus trap on outside click
|
|
100
|
+
allowOutsideClick: true,
|
|
99
101
|
escapeDeactivates: true,
|
|
100
102
|
// de-activate focus trap on escape key
|
|
101
103
|
fallbackFocus: `#${tooltipId}`,
|
|
@@ -115,7 +117,6 @@ function Toggletip(_ref2) {
|
|
|
115
117
|
dataE2eTestId: dataE2eTestId,
|
|
116
118
|
isVisible: isVisible,
|
|
117
119
|
tooltipId: tooltipId,
|
|
118
|
-
tabIndex: -1,
|
|
119
120
|
triggerRef: triggerRef
|
|
120
121
|
});
|
|
121
122
|
return /*#__PURE__*/React.createElement(React.Fragment, null, triggerElm, tooltipElm);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toggletip.js","sources":["../../../../../src/components/Toggletip/Toggletip.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n ReactElement,\n MutableRefObject,\n PropsWithChildren,\n} from \"react\";\nimport FocusTrap from \"focus-trap-react\";\nimport type { TooltipContentProps } from \"../Tooltip/TooltipContent\";\nimport { TooltipContent } from \"../Tooltip/TooltipContent\";\n\ntype BaseProps = Pick<\n TooltipContentProps,\n \"placement\" | \"portalContainer\" | \"contentPadding\" | \"maxWidth\"\n> & {\n // Toggletip content\n content: ReactElement;\n \"data-e2e-test-id\"?: string;\n // Programmatically toggle Toggletip visibility with this prop\n isVisible?: boolean;\n /* Called when tooltip appears and disappears */\n onVisibilityChange?: (isVisible: boolean) => void;\n};\n\ntype ConditionalProps =\n | {\n externalTriggerRef?: never;\n /* Trigger element - wrap trigger element within Toggletip - takes precedence over external trigger prop */\n children: React.ReactElement;\n }\n | {\n children?: never;\n /* Trigger element ref - pass in an external trigger element */\n externalTriggerRef: MutableRefObject<any>;\n };\n\nexport type ToggletipProps = BaseProps & ConditionalProps;\n\nconst FocusTrapContent = React.forwardRef<\n HTMLDivElement,\n PropsWithChildren<unknown>\n>(({ children }, ref) => <div ref={ref}>{children}</div>);\n\nexport function Toggletip({\n placement = \"auto\",\n content,\n children,\n contentPadding = \"m\",\n maxWidth,\n externalTriggerRef,\n portalContainer,\n isVisible: isToggletipVisible,\n \"data-e2e-test-id\": dataE2eTestId,\n onVisibilityChange,\n}: ToggletipProps): React.ReactElement {\n const tooltipId = useMemo(\n () => `DSToggletip_${Math.floor(Date.now() * Math.random())}`,\n []\n );\n const [isVisible, setVisible] = useState(isToggletipVisible);\n const internalTriggerRef = useRef(null);\n const triggerRef = externalTriggerRef || internalTriggerRef;\n const isOutsideClickOnTrigger = useRef(false);\n\n const toggleVisibility = useCallback(\n (status: boolean) => {\n setVisible(status);\n\n if (onVisibilityChange) {\n onVisibilityChange(status);\n }\n },\n [onVisibilityChange]\n );\n\n // Outside click is also fired when the Toggletip is open and trigger is clicked. `isOutsideClickOnTrigger` saves this condition and we check for it so as to not toggle the Toggletip twice.\n const handleTriggerClick = useCallback(() => {\n if (!isOutsideClickOnTrigger.current) {\n toggleVisibility(!isVisible);\n } else {\n // reset this value so that Toggletip can open in next click\n isOutsideClickOnTrigger.current = false;\n }\n }, [toggleVisibility, isVisible]);\n\n const handleClickOutsideDeactivates = useCallback(\n (evt) => {\n if (triggerRef.current.contains(evt.target)) {\n isOutsideClickOnTrigger.current = true;\n }\n return true;\n },\n [triggerRef, isOutsideClickOnTrigger]\n );\n\n useEffect(() => {\n toggleVisibility(isToggletipVisible);\n }, [isToggletipVisible, toggleVisibility]);\n\n useEffect(() => {\n let trigger: HTMLElement;\n\n if (externalTriggerRef?.current && !children) {\n trigger = externalTriggerRef.current;\n\n trigger.setAttribute(\"tabindex\", \"0\");\n trigger.addEventListener(\"click\", handleTriggerClick);\n }\n\n return () => {\n if (trigger) {\n trigger.removeEventListener(\"click\", handleTriggerClick);\n }\n };\n }, [externalTriggerRef, children, handleTriggerClick]);\n\n useEffect(() => {\n if (externalTriggerRef?.current && !children) {\n const trigger = externalTriggerRef.current;\n\n if (isVisible) {\n trigger.setAttribute(\"aria-expanded\", true);\n trigger.setAttribute(\"aria-controls\", tooltipId);\n } else {\n trigger.removeAttribute(\"aria-expanded\");\n trigger.removeAttribute(\"aria-controls\");\n }\n }\n }, [externalTriggerRef, children, tooltipId, isVisible]);\n\n const triggerElm = children\n ? React.cloneElement(children, {\n ref: triggerRef,\n ...(isVisible && {\n \"aria-expanded\": true,\n \"aria-controls\": tooltipId,\n }),\n tabIndex: 0,\n onClick: (evt: React.MouseEvent) => {\n handleTriggerClick();\n if (children.props.onClick) {\n children.props.onClick(evt);\n }\n },\n })\n : null;\n\n const contentElm = (\n <FocusTrap\n focusTrapOptions={{\n clickOutsideDeactivates: handleClickOutsideDeactivates, // de-active focus trap on outside click\n escapeDeactivates: true, // de-activate focus trap on escape key\n fallbackFocus: `#${tooltipId}`, // set focus to tooltip content container if it has no focusable element\n onDeactivate: () => {\n toggleVisibility(false);\n },\n }}\n >\n <FocusTrapContent>{content}</FocusTrapContent>\n </FocusTrap>\n );\n const tooltipElm = (\n <TooltipContent\n dataDSId=\"Toggletip\"\n content={contentElm}\n contentPadding={contentPadding}\n maxWidth={maxWidth}\n placement={placement}\n portalContainer={portalContainer}\n dataE2eTestId={dataE2eTestId}\n isVisible={isVisible}\n tooltipId={tooltipId}\n tabIndex={-1}\n triggerRef={triggerRef}\n />\n );\n return (\n <>\n {triggerElm}\n {tooltipElm}\n </>\n );\n}\n"],"names":["FocusTrapContent","React","forwardRef","_ref","ref","children","createElement","Toggletip","_ref2","placement","content","contentPadding","maxWidth","externalTriggerRef","portalContainer","isVisible","isToggletipVisible","dataE2eTestId","onVisibilityChange","tooltipId","useMemo","Math","floor","Date","now","random","setVisible","useState","internalTriggerRef","useRef","triggerRef","isOutsideClickOnTrigger","toggleVisibility","useCallback","status","handleTriggerClick","current","handleClickOutsideDeactivates","evt","contains","target","useEffect","trigger","setAttribute","addEventListener","removeEventListener","removeAttribute","triggerElm","cloneElement","tabIndex","onClick","props","contentElm","FocusTrap","focusTrapOptions","clickOutsideDeactivates","escapeDeactivates","fallbackFocus","onDeactivate","tooltipElm","TooltipContent","dataDSId","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Toggletip.js","sources":["../../../../../src/components/Toggletip/Toggletip.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n ReactElement,\n PropsWithChildren,\n} from \"react\";\nimport FocusTrap from \"focus-trap-react\";\nimport type { TooltipContentProps } from \"../Tooltip/TooltipContent\";\nimport { TooltipContent } from \"../Tooltip/TooltipContent\";\nimport type { TooltipConditionalProps } from \"../Tooltip/types\";\n\ntype BaseProps = Pick<\n TooltipContentProps,\n \"placement\" | \"portalContainer\" | \"contentPadding\" | \"maxWidth\"\n> & {\n // Toggletip content\n content: ReactElement;\n \"data-e2e-test-id\"?: string;\n // Programmatically toggle Toggletip visibility with this prop\n isVisible?: boolean;\n /* Called when Toggletip appears and disappears */\n onVisibilityChange?: (isVisible: boolean) => void;\n /* Controls whether Toggletip closes on outside click */\n dismissOnOutsideClick?: boolean;\n};\n\nexport type ToggletipProps = BaseProps & TooltipConditionalProps;\n\nconst FocusTrapContent = React.forwardRef<\n HTMLDivElement,\n PropsWithChildren<unknown>\n>(({ children }, ref) => <div ref={ref}>{children}</div>);\n\nexport function Toggletip({\n placement = \"auto\",\n content,\n children,\n contentPadding = \"m\",\n maxWidth,\n externalTriggerRef,\n portalContainer,\n isVisible: isToggletipVisible,\n dismissOnOutsideClick = true,\n \"data-e2e-test-id\": dataE2eTestId,\n onVisibilityChange,\n}: ToggletipProps): React.ReactElement {\n const tooltipId = useMemo(\n () => `DSToggletip_${Math.floor(Date.now() * Math.random())}`,\n []\n );\n const [isVisible, setVisible] = useState(isToggletipVisible);\n const internalTriggerRef = useRef(null);\n const triggerRef = externalTriggerRef || internalTriggerRef;\n const isOutsideClickOnTrigger = useRef(false);\n\n const toggleVisibility = useCallback(\n (status: boolean) => {\n setVisible(status);\n\n if (onVisibilityChange) {\n onVisibilityChange(status);\n }\n },\n [onVisibilityChange]\n );\n\n // Outside click is also fired when the Toggletip is open and trigger is clicked. `isOutsideClickOnTrigger` saves this condition and we check for it so as to not toggle the Toggletip twice.\n const handleTriggerClick = useCallback(() => {\n if (!isOutsideClickOnTrigger.current) {\n toggleVisibility(!isVisible);\n } else {\n // reset this value so that Toggletip can open in next click\n isOutsideClickOnTrigger.current = false;\n }\n }, [toggleVisibility, isVisible]);\n\n const handleClickOutsideDeactivates = useCallback(\n (evt) => {\n if (triggerRef.current.contains(evt.target)) {\n isOutsideClickOnTrigger.current = true;\n }\n return true;\n },\n [triggerRef, isOutsideClickOnTrigger]\n );\n\n useEffect(() => {\n toggleVisibility(isToggletipVisible);\n }, [isToggletipVisible, toggleVisibility]);\n\n useEffect(() => {\n let trigger: HTMLElement;\n\n if (externalTriggerRef?.current && !children) {\n trigger = externalTriggerRef.current;\n\n trigger.setAttribute(\"tabindex\", \"0\");\n trigger.addEventListener(\"click\", handleTriggerClick);\n }\n\n return () => {\n if (trigger) {\n trigger.removeEventListener(\"click\", handleTriggerClick);\n }\n };\n }, [externalTriggerRef, children, handleTriggerClick]);\n\n useEffect(() => {\n if (externalTriggerRef?.current && !children) {\n const trigger = externalTriggerRef.current;\n\n if (isVisible) {\n trigger.setAttribute(\"aria-expanded\", true);\n trigger.setAttribute(\"aria-controls\", tooltipId);\n } else {\n trigger.removeAttribute(\"aria-expanded\");\n trigger.removeAttribute(\"aria-controls\");\n }\n }\n }, [externalTriggerRef, children, tooltipId, isVisible]);\n\n const triggerElm = children\n ? React.cloneElement(children, {\n ref: triggerRef,\n ...(isVisible && {\n \"aria-expanded\": true,\n \"aria-controls\": tooltipId,\n }),\n tabIndex: 0,\n onClick: (evt: React.MouseEvent) => {\n handleTriggerClick();\n if (children.props.onClick) {\n children.props.onClick(evt);\n }\n },\n })\n : null;\n\n const contentElm = (\n <FocusTrap\n focusTrapOptions={{\n clickOutsideDeactivates:\n dismissOnOutsideClick && handleClickOutsideDeactivates, // de-active focus trap on outside click\n allowOutsideClick: true,\n escapeDeactivates: true, // de-activate focus trap on escape key\n fallbackFocus: `#${tooltipId}`, // set focus to tooltip content container if it has no focusable element\n onDeactivate: () => {\n toggleVisibility(false);\n },\n }}\n >\n <FocusTrapContent>{content}</FocusTrapContent>\n </FocusTrap>\n );\n const tooltipElm = (\n <TooltipContent\n dataDSId=\"Toggletip\"\n content={contentElm}\n contentPadding={contentPadding}\n maxWidth={maxWidth}\n placement={placement}\n portalContainer={portalContainer}\n dataE2eTestId={dataE2eTestId}\n isVisible={isVisible}\n tooltipId={tooltipId}\n triggerRef={triggerRef}\n />\n );\n\n return (\n <>\n {triggerElm}\n {tooltipElm}\n </>\n );\n}\n"],"names":["FocusTrapContent","React","forwardRef","_ref","ref","children","createElement","Toggletip","_ref2","placement","content","contentPadding","maxWidth","externalTriggerRef","portalContainer","isVisible","isToggletipVisible","dismissOnOutsideClick","dataE2eTestId","onVisibilityChange","tooltipId","useMemo","Math","floor","Date","now","random","setVisible","useState","internalTriggerRef","useRef","triggerRef","isOutsideClickOnTrigger","toggleVisibility","useCallback","status","handleTriggerClick","current","handleClickOutsideDeactivates","evt","contains","target","useEffect","trigger","setAttribute","addEventListener","removeEventListener","removeAttribute","triggerElm","cloneElement","tabIndex","onClick","props","contentElm","FocusTrap","focusTrapOptions","clickOutsideDeactivates","allowOutsideClick","escapeDeactivates","fallbackFocus","onDeactivate","tooltipElm","TooltipContent","dataDSId","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { TooltipContentProps } from "./TooltipContent";
|
|
3
|
+
import { TooltipConditionalProps } from "./types";
|
|
4
|
+
type BaseProps = Pick<TooltipContentProps, "placement" | "portalContainer" | "contentPadding" | "maxWidth"> & {
|
|
5
|
+
content: React.ReactElement;
|
|
6
|
+
"data-e2e-test-id"?: string;
|
|
7
|
+
onVisibilityChange?: (isVisible: boolean) => void;
|
|
8
|
+
};
|
|
9
|
+
export type BaseTooltipProps = BaseProps & TooltipConditionalProps;
|
|
10
|
+
export declare function BaseTooltip({ placement, content, children, externalTriggerRef, portalContainer, contentPadding, maxWidth, "data-e2e-test-id": dataE2eTestId, onVisibilityChange, }: BaseTooltipProps): React.ReactElement;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import React, { useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { TooltipContent } from './TooltipContent.js';
|
|
3
|
+
|
|
4
|
+
const SHOW_HIDE_DELAY = 200;
|
|
5
|
+
function BaseTooltip(_ref) {
|
|
6
|
+
let {
|
|
7
|
+
placement = "auto",
|
|
8
|
+
content,
|
|
9
|
+
children,
|
|
10
|
+
externalTriggerRef,
|
|
11
|
+
portalContainer,
|
|
12
|
+
contentPadding = "m",
|
|
13
|
+
maxWidth,
|
|
14
|
+
"data-e2e-test-id": dataE2eTestId,
|
|
15
|
+
onVisibilityChange
|
|
16
|
+
} = _ref;
|
|
17
|
+
const tooltipId = useMemo(() => `DSTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
18
|
+
const [isVisible, setVisible] = useState(false);
|
|
19
|
+
const triggeredByEvent = useRef(null); // indicates if triggered by hover or focus
|
|
20
|
+
const isTooltipHovered = useRef(false);
|
|
21
|
+
const isTriggerHovered = useRef(false);
|
|
22
|
+
const hideTooltipTimeoutId = useRef(null);
|
|
23
|
+
const showTooltipTimeoutId = useRef(null);
|
|
24
|
+
const internalTriggerRef = useRef(null);
|
|
25
|
+
const triggerRef = externalTriggerRef || internalTriggerRef;
|
|
26
|
+
const toggleVisibility = useCallback(status => {
|
|
27
|
+
setVisible(status);
|
|
28
|
+
if (onVisibilityChange) {
|
|
29
|
+
onVisibilityChange(status);
|
|
30
|
+
}
|
|
31
|
+
}, [onVisibilityChange]);
|
|
32
|
+
const handleTriggerPointerEnter = useCallback(() => {
|
|
33
|
+
isTriggerHovered.current = true;
|
|
34
|
+
if (!isTooltipHovered.current) {
|
|
35
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
36
|
+
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
37
|
+
showTooltipTimeoutId.current = setTimeout(() => {
|
|
38
|
+
if (isTriggerHovered.current) {
|
|
39
|
+
triggeredByEvent.current = "hover";
|
|
40
|
+
toggleVisibility(true);
|
|
41
|
+
}
|
|
42
|
+
}, SHOW_HIDE_DELAY);
|
|
43
|
+
}
|
|
44
|
+
}, [toggleVisibility]);
|
|
45
|
+
const handleTriggerPointerLeave = useCallback(() => {
|
|
46
|
+
isTriggerHovered.current = false;
|
|
47
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
48
|
+
// Delay removing tooltip from DOM to allow hover over tooltip element
|
|
49
|
+
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
50
|
+
if (!isTooltipHovered.current && triggeredByEvent.current === "hover" && !isTriggerHovered.current) {
|
|
51
|
+
toggleVisibility(false);
|
|
52
|
+
}
|
|
53
|
+
}, SHOW_HIDE_DELAY);
|
|
54
|
+
}, [toggleVisibility]);
|
|
55
|
+
const handleTriggerFocus = useCallback(() => {
|
|
56
|
+
triggeredByEvent.current = "focus";
|
|
57
|
+
toggleVisibility(true);
|
|
58
|
+
}, [toggleVisibility]);
|
|
59
|
+
const handleTriggerBlur = useCallback(() => {
|
|
60
|
+
if (triggeredByEvent.current === "focus") {
|
|
61
|
+
toggleVisibility(false);
|
|
62
|
+
}
|
|
63
|
+
}, [toggleVisibility]);
|
|
64
|
+
const handleTriggerKeyDown = useCallback(evt => {
|
|
65
|
+
if (evt.key === "Escape") {
|
|
66
|
+
toggleVisibility(false);
|
|
67
|
+
}
|
|
68
|
+
}, [toggleVisibility]);
|
|
69
|
+
const handleTooltipPointerEnter = () => {
|
|
70
|
+
isTooltipHovered.current = true;
|
|
71
|
+
};
|
|
72
|
+
const handleTooltipPointerLeave = () => {
|
|
73
|
+
isTooltipHovered.current = false;
|
|
74
|
+
if (triggeredByEvent.current === "hover") {
|
|
75
|
+
toggleVisibility(false);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
useEffect(() => () => {
|
|
79
|
+
// clear timers
|
|
80
|
+
clearTimeout(showTooltipTimeoutId.current);
|
|
81
|
+
clearTimeout(hideTooltipTimeoutId.current);
|
|
82
|
+
}, []);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
let trigger;
|
|
85
|
+
if (externalTriggerRef?.current && !children) {
|
|
86
|
+
trigger = externalTriggerRef.current;
|
|
87
|
+
trigger.setAttribute("tabindex", "0");
|
|
88
|
+
trigger.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
89
|
+
trigger.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
90
|
+
trigger.addEventListener("focus", handleTriggerFocus);
|
|
91
|
+
trigger.addEventListener("blur", handleTriggerBlur);
|
|
92
|
+
trigger.addEventListener("keydown", handleTriggerKeyDown);
|
|
93
|
+
}
|
|
94
|
+
return () => {
|
|
95
|
+
if (trigger) {
|
|
96
|
+
trigger.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
97
|
+
trigger.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
98
|
+
trigger.removeEventListener("focus", handleTriggerFocus);
|
|
99
|
+
trigger.removeEventListener("blur", handleTriggerBlur);
|
|
100
|
+
trigger.removeEventListener("keydown", handleTriggerKeyDown);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}, [externalTriggerRef, children, handleTriggerPointerEnter, handleTriggerPointerLeave, handleTriggerFocus, handleTriggerBlur, handleTriggerKeyDown]);
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (externalTriggerRef?.current && !children) {
|
|
106
|
+
const trigger = externalTriggerRef.current;
|
|
107
|
+
if (isVisible) {
|
|
108
|
+
trigger.setAttribute("aria-describedby", tooltipId);
|
|
109
|
+
} else {
|
|
110
|
+
trigger.removeAttribute("aria-describedby");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}, [externalTriggerRef, children, tooltipId, isVisible]);
|
|
114
|
+
const triggerElm = children ? /*#__PURE__*/React.cloneElement(children, {
|
|
115
|
+
ref: triggerRef,
|
|
116
|
+
...(isVisible && {
|
|
117
|
+
"aria-describedby": tooltipId
|
|
118
|
+
}),
|
|
119
|
+
tabIndex: 0,
|
|
120
|
+
onPointerEnter: handleTriggerPointerEnter,
|
|
121
|
+
onPointerLeave: handleTriggerPointerLeave,
|
|
122
|
+
onFocus: evt => {
|
|
123
|
+
handleTriggerFocus();
|
|
124
|
+
if (children.props.onFocus) {
|
|
125
|
+
children.props.onFocus(evt);
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
onBlur: evt => {
|
|
129
|
+
handleTriggerBlur();
|
|
130
|
+
if (children.props.onBlur) {
|
|
131
|
+
if (children.props.onBlur) {
|
|
132
|
+
children.props.onBlur(evt);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
onKeyDown: handleTriggerKeyDown
|
|
137
|
+
}) : null;
|
|
138
|
+
const tooltipElm = /*#__PURE__*/React.createElement(TooltipContent, {
|
|
139
|
+
dataDSId: "Tooltip",
|
|
140
|
+
content: content,
|
|
141
|
+
placement: placement,
|
|
142
|
+
portalContainer: portalContainer,
|
|
143
|
+
dataE2eTestId: dataE2eTestId,
|
|
144
|
+
isVisible: isVisible,
|
|
145
|
+
tooltipId: tooltipId,
|
|
146
|
+
triggerRef: triggerRef,
|
|
147
|
+
"aria-hidden": true,
|
|
148
|
+
role: "tooltip",
|
|
149
|
+
contentPadding: contentPadding,
|
|
150
|
+
maxWidth: maxWidth,
|
|
151
|
+
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
152
|
+
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
153
|
+
});
|
|
154
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, triggerElm, tooltipElm);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export { BaseTooltip };
|
|
158
|
+
//# sourceMappingURL=BaseTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseTooltip.js","sources":["../../../../../src/components/Tooltip/BaseTooltip.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport type { TooltipContentProps } from \"./TooltipContent\";\nimport { TooltipContent } from \"./TooltipContent\";\nimport { TooltipConditionalProps } from \"./types\";\n\ntype BaseProps = Pick<\n TooltipContentProps,\n \"placement\" | \"portalContainer\" | \"contentPadding\" | \"maxWidth\"\n> & {\n /* Tooltip content */\n content: React.ReactElement;\n \"data-e2e-test-id\"?: string;\n /* Called when tooltip appears and disappears */\n onVisibilityChange?: (isVisible: boolean) => void;\n};\n\nexport type BaseTooltipProps = BaseProps & TooltipConditionalProps;\n\nconst SHOW_HIDE_DELAY = 200;\n\nexport function BaseTooltip({\n placement = \"auto\",\n content,\n children,\n externalTriggerRef,\n portalContainer,\n contentPadding = \"m\",\n maxWidth,\n \"data-e2e-test-id\": dataE2eTestId,\n onVisibilityChange,\n}: BaseTooltipProps): React.ReactElement {\n const tooltipId = useMemo(\n () => `DSTooltip_${Math.floor(Date.now() * Math.random())}`,\n []\n );\n const [isVisible, setVisible] = useState(false);\n const triggeredByEvent = useRef(null); // indicates if triggered by hover or focus\n const isTooltipHovered = useRef(false);\n const isTriggerHovered = useRef(false);\n const hideTooltipTimeoutId = useRef(null);\n const showTooltipTimeoutId = useRef(null);\n const internalTriggerRef = useRef(null);\n const triggerRef = externalTriggerRef || internalTriggerRef;\n\n const toggleVisibility = useCallback(\n (status: boolean) => {\n setVisible(status);\n\n if (onVisibilityChange) {\n onVisibilityChange(status);\n }\n },\n [onVisibilityChange]\n );\n\n const handleTriggerPointerEnter = useCallback(() => {\n isTriggerHovered.current = true;\n if (!isTooltipHovered.current) {\n clearTimeout(showTooltipTimeoutId.current);\n // Delay show tooltip to prevent flickering when mouse moves quickly over trigger\n showTooltipTimeoutId.current = setTimeout(() => {\n if (isTriggerHovered.current) {\n triggeredByEvent.current = \"hover\";\n toggleVisibility(true);\n }\n }, SHOW_HIDE_DELAY);\n }\n }, [toggleVisibility]);\n\n const handleTriggerPointerLeave = useCallback(() => {\n isTriggerHovered.current = false;\n clearTimeout(hideTooltipTimeoutId.current);\n // Delay removing tooltip from DOM to allow hover over tooltip element\n hideTooltipTimeoutId.current = setTimeout(() => {\n if (\n !isTooltipHovered.current &&\n triggeredByEvent.current === \"hover\" &&\n !isTriggerHovered.current\n ) {\n toggleVisibility(false);\n }\n }, SHOW_HIDE_DELAY);\n }, [toggleVisibility]);\n\n const handleTriggerFocus = useCallback(() => {\n triggeredByEvent.current = \"focus\";\n toggleVisibility(true);\n }, [toggleVisibility]);\n\n const handleTriggerBlur = useCallback(() => {\n if (triggeredByEvent.current === \"focus\") {\n toggleVisibility(false);\n }\n }, [toggleVisibility]);\n\n const handleTriggerKeyDown = useCallback(\n (evt) => {\n if (evt.key === \"Escape\") {\n toggleVisibility(false);\n }\n },\n [toggleVisibility]\n );\n\n const handleTooltipPointerEnter = () => {\n isTooltipHovered.current = true;\n };\n\n const handleTooltipPointerLeave = () => {\n isTooltipHovered.current = false;\n if (triggeredByEvent.current === \"hover\") {\n toggleVisibility(false);\n }\n };\n\n useEffect(\n () => () => {\n // clear timers\n clearTimeout(showTooltipTimeoutId.current);\n clearTimeout(hideTooltipTimeoutId.current);\n },\n []\n );\n\n useEffect(() => {\n let trigger: HTMLElement;\n\n if (externalTriggerRef?.current && !children) {\n trigger = externalTriggerRef.current;\n\n trigger.setAttribute(\"tabindex\", \"0\");\n trigger.addEventListener(\"pointerenter\", handleTriggerPointerEnter);\n trigger.addEventListener(\"pointerleave\", handleTriggerPointerLeave);\n trigger.addEventListener(\"focus\", handleTriggerFocus);\n trigger.addEventListener(\"blur\", handleTriggerBlur);\n trigger.addEventListener(\"keydown\", handleTriggerKeyDown);\n }\n\n return () => {\n if (trigger) {\n trigger.removeEventListener(\"pointerenter\", handleTriggerPointerEnter);\n trigger.removeEventListener(\"pointerleave\", handleTriggerPointerLeave);\n trigger.removeEventListener(\"focus\", handleTriggerFocus);\n trigger.removeEventListener(\"blur\", handleTriggerBlur);\n trigger.removeEventListener(\"keydown\", handleTriggerKeyDown);\n }\n };\n }, [\n externalTriggerRef,\n children,\n handleTriggerPointerEnter,\n handleTriggerPointerLeave,\n handleTriggerFocus,\n handleTriggerBlur,\n handleTriggerKeyDown,\n ]);\n\n useEffect(() => {\n if (externalTriggerRef?.current && !children) {\n const trigger = externalTriggerRef.current;\n\n if (isVisible) {\n trigger.setAttribute(\"aria-describedby\", tooltipId);\n } else {\n trigger.removeAttribute(\"aria-describedby\");\n }\n }\n }, [externalTriggerRef, children, tooltipId, isVisible]);\n\n const triggerElm = children\n ? React.cloneElement(children, {\n ref: triggerRef,\n ...(isVisible && {\n \"aria-describedby\": tooltipId,\n }),\n tabIndex: 0,\n onPointerEnter: handleTriggerPointerEnter,\n onPointerLeave: handleTriggerPointerLeave,\n onFocus: (evt: FocusEvent) => {\n handleTriggerFocus();\n if (children.props.onFocus) {\n children.props.onFocus(evt);\n }\n },\n onBlur: (evt: FocusEvent) => {\n handleTriggerBlur();\n if (children.props.onBlur) {\n if (children.props.onBlur) {\n children.props.onBlur(evt);\n }\n }\n },\n onKeyDown: handleTriggerKeyDown,\n })\n : null;\n\n const tooltipElm = (\n <TooltipContent\n dataDSId=\"Tooltip\"\n content={content}\n placement={placement}\n portalContainer={portalContainer}\n dataE2eTestId={dataE2eTestId}\n isVisible={isVisible}\n tooltipId={tooltipId}\n triggerRef={triggerRef}\n aria-hidden\n role=\"tooltip\"\n contentPadding={contentPadding}\n maxWidth={maxWidth}\n onTooltipPointerEnter={handleTooltipPointerEnter}\n onTooltipPointerLeave={handleTooltipPointerLeave}\n />\n );\n return (\n <>\n {triggerElm}\n {tooltipElm}\n </>\n );\n}\n"],"names":["SHOW_HIDE_DELAY","BaseTooltip","_ref","placement","content","children","externalTriggerRef","portalContainer","contentPadding","maxWidth","dataE2eTestId","onVisibilityChange","tooltipId","useMemo","Math","floor","Date","now","random","isVisible","setVisible","useState","triggeredByEvent","useRef","isTooltipHovered","isTriggerHovered","hideTooltipTimeoutId","showTooltipTimeoutId","internalTriggerRef","triggerRef","toggleVisibility","useCallback","status","handleTriggerPointerEnter","current","clearTimeout","setTimeout","handleTriggerPointerLeave","handleTriggerFocus","handleTriggerBlur","handleTriggerKeyDown","evt","key","handleTooltipPointerEnter","handleTooltipPointerLeave","useEffect","trigger","setAttribute","addEventListener","removeEventListener","removeAttribute","triggerElm","React","cloneElement","ref","tabIndex","onPointerEnter","onPointerLeave","onFocus","props","onBlur","onKeyDown","tooltipElm","createElement","TooltipContent","dataDSId","role","onTooltipPointerEnter","onTooltipPointerLeave","Fragment"],"mappings":"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"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import type {
|
|
3
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { BaseTooltipProps } from "./BaseTooltip";
|
|
3
|
+
import { TooltipConditionalProps } from "./types";
|
|
4
|
+
export type TooltipProps = Omit<BaseTooltipProps, "content" | "contentPadding" | "maxWidth"> & {
|
|
4
5
|
content: string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
};
|
|
8
|
-
type ConditionalProps = {
|
|
9
|
-
externalTriggerRef?: never;
|
|
10
|
-
children: React.ReactElement;
|
|
11
|
-
} | {
|
|
12
|
-
children?: never;
|
|
13
|
-
externalTriggerRef: MutableRefObject<any>;
|
|
14
|
-
};
|
|
15
|
-
export type TooltipProps = BaseProps & ConditionalProps;
|
|
16
|
-
export declare function Tooltip({ placement, content, children, externalTriggerRef, portalContainer, "data-e2e-test-id": dataE2eTestId, onVisibilityChange, }: TooltipProps): React.ReactElement;
|
|
17
|
-
export {};
|
|
6
|
+
} & TooltipConditionalProps;
|
|
7
|
+
export declare function Tooltip({ content, ...rest }: TooltipProps): React.ReactElement;
|
|
@@ -1,157 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _extends from '@babel/runtime/helpers/extends';
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import { Text } from '../Typography/Text/Text.js';
|
|
3
|
-
import {
|
|
4
|
+
import { BaseTooltip } from './BaseTooltip.js';
|
|
4
5
|
|
|
5
|
-
const SHOW_HIDE_DELAY = 200;
|
|
6
6
|
function Tooltip(_ref) {
|
|
7
7
|
let {
|
|
8
|
-
placement = "auto",
|
|
9
8
|
content,
|
|
10
|
-
|
|
11
|
-
externalTriggerRef,
|
|
12
|
-
portalContainer,
|
|
13
|
-
"data-e2e-test-id": dataE2eTestId,
|
|
14
|
-
onVisibilityChange
|
|
9
|
+
...rest
|
|
15
10
|
} = _ref;
|
|
16
|
-
const tooltipId = useMemo(() => `DSTooltip_${Math.floor(Date.now() * Math.random())}`, []);
|
|
17
|
-
const [isVisible, setVisible] = useState(false);
|
|
18
|
-
const triggeredByEvent = useRef(null); // indicates if triggered by hover or focus
|
|
19
|
-
const isTooltipHovered = useRef(false);
|
|
20
|
-
const isTriggerHovered = useRef(false);
|
|
21
|
-
const hideTooltipTimeoutId = useRef(null);
|
|
22
|
-
const showTooltipTimeoutId = useRef(null);
|
|
23
|
-
const internalTriggerRef = useRef(null);
|
|
24
|
-
const triggerRef = externalTriggerRef || internalTriggerRef;
|
|
25
|
-
const toggleVisibility = useCallback(status => {
|
|
26
|
-
setVisible(status);
|
|
27
|
-
if (onVisibilityChange) {
|
|
28
|
-
onVisibilityChange(status);
|
|
29
|
-
}
|
|
30
|
-
}, [onVisibilityChange]);
|
|
31
|
-
const handleTriggerPointerEnter = useCallback(() => {
|
|
32
|
-
isTriggerHovered.current = true;
|
|
33
|
-
if (!isTooltipHovered.current) {
|
|
34
|
-
clearTimeout(showTooltipTimeoutId.current);
|
|
35
|
-
// Delay show tooltip to prevent flickering when mouse moves quickly over trigger
|
|
36
|
-
showTooltipTimeoutId.current = setTimeout(() => {
|
|
37
|
-
if (isTriggerHovered.current) {
|
|
38
|
-
triggeredByEvent.current = "hover";
|
|
39
|
-
toggleVisibility(true);
|
|
40
|
-
}
|
|
41
|
-
}, SHOW_HIDE_DELAY);
|
|
42
|
-
}
|
|
43
|
-
}, [toggleVisibility]);
|
|
44
|
-
const handleTriggerPointerLeave = useCallback(() => {
|
|
45
|
-
isTriggerHovered.current = false;
|
|
46
|
-
clearTimeout(hideTooltipTimeoutId.current);
|
|
47
|
-
// Delay removing tooltip from DOM to allow hover over tooltip element
|
|
48
|
-
hideTooltipTimeoutId.current = setTimeout(() => {
|
|
49
|
-
if (!isTooltipHovered.current && triggeredByEvent.current === "hover" && !isTriggerHovered.current) {
|
|
50
|
-
toggleVisibility(false);
|
|
51
|
-
}
|
|
52
|
-
}, SHOW_HIDE_DELAY);
|
|
53
|
-
}, [toggleVisibility]);
|
|
54
|
-
const handleTriggerFocus = useCallback(() => {
|
|
55
|
-
triggeredByEvent.current = "focus";
|
|
56
|
-
toggleVisibility(true);
|
|
57
|
-
}, [toggleVisibility]);
|
|
58
|
-
const handleTriggerBlur = useCallback(() => {
|
|
59
|
-
if (triggeredByEvent.current === "focus") {
|
|
60
|
-
toggleVisibility(false);
|
|
61
|
-
}
|
|
62
|
-
}, [toggleVisibility]);
|
|
63
|
-
const handleTriggerKeyDown = useCallback(evt => {
|
|
64
|
-
if (evt.key === "Escape") {
|
|
65
|
-
toggleVisibility(false);
|
|
66
|
-
}
|
|
67
|
-
}, [toggleVisibility]);
|
|
68
|
-
const handleTooltipPointerEnter = () => {
|
|
69
|
-
isTooltipHovered.current = true;
|
|
70
|
-
};
|
|
71
|
-
const handleTooltipPointerLeave = () => {
|
|
72
|
-
isTooltipHovered.current = false;
|
|
73
|
-
if (triggeredByEvent.current === "hover") {
|
|
74
|
-
toggleVisibility(false);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
useEffect(() => () => {
|
|
78
|
-
// clear timers
|
|
79
|
-
clearTimeout(showTooltipTimeoutId.current);
|
|
80
|
-
clearTimeout(hideTooltipTimeoutId.current);
|
|
81
|
-
}, []);
|
|
82
|
-
useEffect(() => {
|
|
83
|
-
let trigger;
|
|
84
|
-
if (externalTriggerRef?.current && !children) {
|
|
85
|
-
trigger = externalTriggerRef.current;
|
|
86
|
-
trigger.setAttribute("tabindex", "0");
|
|
87
|
-
trigger.addEventListener("pointerenter", handleTriggerPointerEnter);
|
|
88
|
-
trigger.addEventListener("pointerleave", handleTriggerPointerLeave);
|
|
89
|
-
trigger.addEventListener("focus", handleTriggerFocus);
|
|
90
|
-
trigger.addEventListener("blur", handleTriggerBlur);
|
|
91
|
-
trigger.addEventListener("keydown", handleTriggerKeyDown);
|
|
92
|
-
}
|
|
93
|
-
return () => {
|
|
94
|
-
if (trigger) {
|
|
95
|
-
trigger.removeEventListener("pointerenter", handleTriggerPointerEnter);
|
|
96
|
-
trigger.removeEventListener("pointerleave", handleTriggerPointerLeave);
|
|
97
|
-
trigger.removeEventListener("focus", handleTriggerFocus);
|
|
98
|
-
trigger.removeEventListener("blur", handleTriggerBlur);
|
|
99
|
-
trigger.removeEventListener("keydown", handleTriggerKeyDown);
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
}, [externalTriggerRef, children, handleTriggerPointerEnter, handleTriggerPointerLeave, handleTriggerFocus, handleTriggerBlur, handleTriggerKeyDown]);
|
|
103
|
-
useEffect(() => {
|
|
104
|
-
if (externalTriggerRef?.current && !children) {
|
|
105
|
-
const trigger = externalTriggerRef.current;
|
|
106
|
-
if (isVisible) {
|
|
107
|
-
trigger.setAttribute("aria-describedby", tooltipId);
|
|
108
|
-
} else {
|
|
109
|
-
trigger.removeAttribute("aria-describedby");
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}, [externalTriggerRef, children, tooltipId, isVisible]);
|
|
113
|
-
const triggerElm = children ? /*#__PURE__*/React.cloneElement(children, {
|
|
114
|
-
ref: triggerRef,
|
|
115
|
-
...(isVisible && {
|
|
116
|
-
"aria-describedby": tooltipId
|
|
117
|
-
}),
|
|
118
|
-
tabIndex: 0,
|
|
119
|
-
onPointerEnter: handleTriggerPointerEnter,
|
|
120
|
-
onPointerLeave: handleTriggerPointerLeave,
|
|
121
|
-
onFocus: evt => {
|
|
122
|
-
handleTriggerFocus();
|
|
123
|
-
if (children.props.onFocus) {
|
|
124
|
-
children.props.onFocus(evt);
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
|
-
onBlur: evt => {
|
|
128
|
-
handleTriggerBlur();
|
|
129
|
-
if (children.props.onBlur) {
|
|
130
|
-
if (children.props.onBlur) {
|
|
131
|
-
children.props.onBlur(evt);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
onKeyDown: handleTriggerKeyDown
|
|
136
|
-
}) : null;
|
|
137
11
|
const contentElm = /*#__PURE__*/React.createElement(Text, {
|
|
138
12
|
size: "s"
|
|
139
13
|
}, content);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
content: contentElm
|
|
143
|
-
|
|
144
|
-
portalContainer: portalContainer,
|
|
145
|
-
dataE2eTestId: dataE2eTestId,
|
|
146
|
-
isVisible: isVisible,
|
|
147
|
-
tooltipId: tooltipId,
|
|
148
|
-
triggerRef: triggerRef,
|
|
149
|
-
"aria-hidden": true,
|
|
150
|
-
role: "tooltip",
|
|
151
|
-
onTooltipPointerEnter: handleTooltipPointerEnter,
|
|
152
|
-
onTooltipPointerLeave: handleTooltipPointerLeave
|
|
153
|
-
});
|
|
154
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, triggerElm, tooltipElm);
|
|
14
|
+
/* eslint-disable-next-line react/jsx-props-no-spreading */
|
|
15
|
+
return /*#__PURE__*/React.createElement(BaseTooltip, _extends({
|
|
16
|
+
content: contentElm
|
|
17
|
+
}, rest));
|
|
155
18
|
}
|
|
156
19
|
|
|
157
20
|
export { Tooltip };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","sources":["../../../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n MutableRefObject,\n} from \"react\";\nimport { Text } from \"../Typography/Text/Text\";\nimport type { TooltipContentProps } from \"./TooltipContent\";\nimport { TooltipContent } from \"./TooltipContent\";\n\ntype BaseProps = Pick<TooltipContentProps, \"placement\" | \"portalContainer\"> & {\n /* Tooltip content */\n content: string;\n \"data-e2e-test-id\"?: string;\n /* Called when tooltip appears and disappears */\n onVisibilityChange?: (isVisible: boolean) => void;\n};\n\ntype ConditionalProps =\n | {\n externalTriggerRef?: never;\n /* Trigger element - wrap trigger element within Tooltip - takes precedence over trigger prop */\n children: React.ReactElement;\n }\n | {\n children?: never;\n /* Trigger element ref - pass in an external trigger element */\n externalTriggerRef: MutableRefObject<any>;\n };\n\nexport type TooltipProps = BaseProps & ConditionalProps;\n\nconst SHOW_HIDE_DELAY = 200;\n\nexport function Tooltip({\n placement = \"auto\",\n content,\n children,\n externalTriggerRef,\n portalContainer,\n \"data-e2e-test-id\": dataE2eTestId,\n onVisibilityChange,\n}: TooltipProps): React.ReactElement {\n const tooltipId = useMemo(\n () => `DSTooltip_${Math.floor(Date.now() * Math.random())}`,\n []\n );\n const [isVisible, setVisible] = useState(false);\n const triggeredByEvent = useRef(null); // indicates if triggered by hover or focus\n const isTooltipHovered = useRef(false);\n const isTriggerHovered = useRef(false);\n const hideTooltipTimeoutId = useRef(null);\n const showTooltipTimeoutId = useRef(null);\n const internalTriggerRef = useRef(null);\n const triggerRef = externalTriggerRef || internalTriggerRef;\n\n const toggleVisibility = useCallback(\n (status: boolean) => {\n setVisible(status);\n\n if (onVisibilityChange) {\n onVisibilityChange(status);\n }\n },\n [onVisibilityChange]\n );\n\n const handleTriggerPointerEnter = useCallback(() => {\n isTriggerHovered.current = true;\n if (!isTooltipHovered.current) {\n clearTimeout(showTooltipTimeoutId.current);\n // Delay show tooltip to prevent flickering when mouse moves quickly over trigger\n showTooltipTimeoutId.current = setTimeout(() => {\n if (isTriggerHovered.current) {\n triggeredByEvent.current = \"hover\";\n toggleVisibility(true);\n }\n }, SHOW_HIDE_DELAY);\n }\n }, [toggleVisibility]);\n\n const handleTriggerPointerLeave = useCallback(() => {\n isTriggerHovered.current = false;\n clearTimeout(hideTooltipTimeoutId.current);\n // Delay removing tooltip from DOM to allow hover over tooltip element\n hideTooltipTimeoutId.current = setTimeout(() => {\n if (\n !isTooltipHovered.current &&\n triggeredByEvent.current === \"hover\" &&\n !isTriggerHovered.current\n ) {\n toggleVisibility(false);\n }\n }, SHOW_HIDE_DELAY);\n }, [toggleVisibility]);\n\n const handleTriggerFocus = useCallback(() => {\n triggeredByEvent.current = \"focus\";\n toggleVisibility(true);\n }, [toggleVisibility]);\n\n const handleTriggerBlur = useCallback(() => {\n if (triggeredByEvent.current === \"focus\") {\n toggleVisibility(false);\n }\n }, [toggleVisibility]);\n\n const handleTriggerKeyDown = useCallback(\n (evt) => {\n if (evt.key === \"Escape\") {\n toggleVisibility(false);\n }\n },\n [toggleVisibility]\n );\n\n const handleTooltipPointerEnter = () => {\n isTooltipHovered.current = true;\n };\n\n const handleTooltipPointerLeave = () => {\n isTooltipHovered.current = false;\n if (triggeredByEvent.current === \"hover\") {\n toggleVisibility(false);\n }\n };\n\n useEffect(\n () => () => {\n // clear timers\n clearTimeout(showTooltipTimeoutId.current);\n clearTimeout(hideTooltipTimeoutId.current);\n },\n []\n );\n\n useEffect(() => {\n let trigger: HTMLElement;\n\n if (externalTriggerRef?.current && !children) {\n trigger = externalTriggerRef.current;\n\n trigger.setAttribute(\"tabindex\", \"0\");\n trigger.addEventListener(\"pointerenter\", handleTriggerPointerEnter);\n trigger.addEventListener(\"pointerleave\", handleTriggerPointerLeave);\n trigger.addEventListener(\"focus\", handleTriggerFocus);\n trigger.addEventListener(\"blur\", handleTriggerBlur);\n trigger.addEventListener(\"keydown\", handleTriggerKeyDown);\n }\n\n return () => {\n if (trigger) {\n trigger.removeEventListener(\"pointerenter\", handleTriggerPointerEnter);\n trigger.removeEventListener(\"pointerleave\", handleTriggerPointerLeave);\n trigger.removeEventListener(\"focus\", handleTriggerFocus);\n trigger.removeEventListener(\"blur\", handleTriggerBlur);\n trigger.removeEventListener(\"keydown\", handleTriggerKeyDown);\n }\n };\n }, [\n externalTriggerRef,\n children,\n handleTriggerPointerEnter,\n handleTriggerPointerLeave,\n handleTriggerFocus,\n handleTriggerBlur,\n handleTriggerKeyDown,\n ]);\n\n useEffect(() => {\n if (externalTriggerRef?.current && !children) {\n const trigger = externalTriggerRef.current;\n\n if (isVisible) {\n trigger.setAttribute(\"aria-describedby\", tooltipId);\n } else {\n trigger.removeAttribute(\"aria-describedby\");\n }\n }\n }, [externalTriggerRef, children, tooltipId, isVisible]);\n\n const triggerElm = children\n ? React.cloneElement(children, {\n ref: triggerRef,\n ...(isVisible && {\n \"aria-describedby\": tooltipId,\n }),\n tabIndex: 0,\n onPointerEnter: handleTriggerPointerEnter,\n onPointerLeave: handleTriggerPointerLeave,\n onFocus: (evt: FocusEvent) => {\n handleTriggerFocus();\n if (children.props.onFocus) {\n children.props.onFocus(evt);\n }\n },\n onBlur: (evt: FocusEvent) => {\n handleTriggerBlur();\n if (children.props.onBlur) {\n if (children.props.onBlur) {\n children.props.onBlur(evt);\n }\n }\n },\n onKeyDown: handleTriggerKeyDown,\n })\n : null;\n const contentElm = <Text size=\"s\">{content}</Text>;\n const tooltipElm = (\n <TooltipContent\n dataDSId=\"Tooltip\"\n content={contentElm}\n placement={placement}\n portalContainer={portalContainer}\n dataE2eTestId={dataE2eTestId}\n isVisible={isVisible}\n tooltipId={tooltipId}\n triggerRef={triggerRef}\n aria-hidden\n role=\"tooltip\"\n onTooltipPointerEnter={handleTooltipPointerEnter}\n onTooltipPointerLeave={handleTooltipPointerLeave}\n />\n );\n return (\n <>\n {triggerElm}\n {tooltipElm}\n </>\n );\n}\n"],"names":["SHOW_HIDE_DELAY","Tooltip","_ref","placement","content","children","externalTriggerRef","portalContainer","dataE2eTestId","onVisibilityChange","tooltipId","useMemo","Math","floor","Date","now","random","isVisible","setVisible","useState","triggeredByEvent","useRef","isTooltipHovered","isTriggerHovered","hideTooltipTimeoutId","showTooltipTimeoutId","internalTriggerRef","triggerRef","toggleVisibility","useCallback","status","handleTriggerPointerEnter","current","clearTimeout","setTimeout","handleTriggerPointerLeave","handleTriggerFocus","handleTriggerBlur","handleTriggerKeyDown","evt","key","handleTooltipPointerEnter","handleTooltipPointerLeave","useEffect","trigger","setAttribute","addEventListener","removeEventListener","removeAttribute","triggerElm","React","cloneElement","ref","tabIndex","onPointerEnter","onPointerLeave","onFocus","props","onBlur","onKeyDown","contentElm","createElement","Text","size","tooltipElm","TooltipContent","dataDSId","role","onTooltipPointerEnter","onTooltipPointerLeave","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sources":["../../../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import React from \"react\";\nimport type { BaseTooltipProps } from \"./BaseTooltip\";\nimport { Text } from \"../Typography/Text/Text\";\nimport { BaseTooltip } from \"./BaseTooltip\";\nimport { TooltipConditionalProps } from \"./types\";\n\nexport type TooltipProps = Omit<\n BaseTooltipProps,\n \"content\" | \"contentPadding\" | \"maxWidth\"\n> & {\n /* Tooltip content */\n content: string;\n} & TooltipConditionalProps;\n\nexport function Tooltip({\n content,\n ...rest\n}: TooltipProps): React.ReactElement {\n const contentElm = <Text size=\"s\">{content}</Text>;\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n return <BaseTooltip content={contentElm} {...rest} />;\n}\n"],"names":["Tooltip","_ref","content","rest","contentElm","React","createElement","Text","size","BaseTooltip","_extends"],"mappings":";;;;;AAcO,SAASA,OAAOA,CAAAC,IAAA,EAGc;EAAA,IAHb;IACtBC,OAAO;IACP,GAAGC,IAAAA;AACS,GAAC,GAAAF,IAAA,CAAA;AACb,EAAA,MAAMG,UAAU,gBAAGC,KAAA,CAAAC,aAAA,CAACC,IAAI,EAAA;AAACC,IAAAA,IAAI,EAAC,GAAA;AAAG,GAAA,EAAEN,OAAc,CAAC,CAAA;AAClD;AACA,EAAA,oBAAOG,KAAA,CAAAC,aAAA,CAACG,WAAW,EAAAC,QAAA,CAAA;AAACR,IAAAA,OAAO,EAAEE,UAAAA;GAAgBD,EAAAA,IAAI,CAAG,CAAC,CAAA;AACvD;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BaseTooltip } from '../Tooltip/BaseTooltip.js';
|
|
3
|
+
|
|
4
|
+
function UserHighlightTooltip(props) {
|
|
5
|
+
/* eslint-disable-next-line react/jsx-props-no-spreading */
|
|
6
|
+
return /*#__PURE__*/React.createElement(BaseTooltip, props);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export { UserHighlightTooltip };
|
|
10
|
+
//# sourceMappingURL=UserHighlightTooltip.js.map
|
|
@@ -0,0 +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;;;;"}
|
package/build/esm/src/index.d.ts
CHANGED
package/build/esm/src/index.js
CHANGED
|
@@ -48,6 +48,7 @@ export { Tooltip } from './components/Tooltip/Tooltip.js';
|
|
|
48
48
|
export { MAX_TAG_WIDTH, Tag } from './components/Tag/Tag.js';
|
|
49
49
|
export { TagGroup } from './components/TagGroup/TagGroup.js';
|
|
50
50
|
export { Toggletip } from './components/Toggletip/Toggletip.js';
|
|
51
|
+
export { UserHighlightTooltip } from './components/UserHighlightTooltip/UserHighlightTooltip.js';
|
|
51
52
|
export { Input } from './components/Form/Input/Input.js';
|
|
52
53
|
export { PasswordInput } from './components/Form/PasswordInput/PasswordInput.js';
|
|
53
54
|
export { BaseDataTable, DataTable } from './components/DataTable/DataTable.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/index.ts"],"sourcesContent":["import {\n ambossVisualConfiguration,\n VisualConfig,\n} from \"../build-tokens/visualConfig\";\n\nexport type { VisualConfig };\nexport const { dark, light } = ambossVisualConfiguration;\nexport { ThemeProvider, CacheProvider } from \"@emotion/react\";\nexport { default as createCache } from \"@emotion/cache\";\nexport * from \"./components/Card/Card\";\nexport * from \"./components/Card/CardBox\";\nexport * from \"./components/Box/Box\";\nexport * from \"./components/Inline/Inline\";\nexport * from \"./components/Stack/Stack\";\nexport * from \"./components/Typography/Header/Header\";\nexport * from \"./components/Typography/Text/Text\";\nexport * from \"./components/Typography/TextClamped/TextClamped\";\nexport * from \"./components/Typography/StyledText/StyledText\";\nexport * from \"./components/Link/Link\";\nexport * from \"./components/Icon/Icon\";\nexport * from \"./components/Button/Button\";\nexport * from \"./components/Divider/Divider\";\nexport * from \"./components/Column/Columns\";\nexport * from \"./components/Tabs/Tabs\";\nexport * from \"./components/Badge/Badge\";\nexport * from \"./components/SearchResult/SearchResult\";\nexport * from \"./components/Form/ToggleButton/ToggleButton\";\nexport * from \"./components/DropdownMenu/DropdownMenu\";\nexport * from \"./components/Form/FormFieldGroup/FormFieldGroup\";\nexport * from \"./components/Form/Input\";\nexport * from \"./components/Form/Checkbox/Checkbox\";\nexport * from \"./components/Form/Toggle/Toggle\";\nexport * from \"./components/Form/Radio/Radio\";\nexport * from \"./components/Form/RadioButton/RadioButton\";\nexport * from \"./components/Form/Textarea/Textarea\";\nexport * from \"./components/Form/Select/Select\";\nexport * from \"./components/SubThemeProvider/SubThemeProvider\";\nexport * from \"./components/PictogramButton/PictogramButton\";\nexport * from \"./components/MediaViewerBar/MediaViewerBar\";\nexport * from \"./components/SegmentedProgressBar/SegmentedProgressBar\";\nexport * from \"./components/ProgressBar/ProgressBar\";\nexport * from \"./components/Container/Container\";\nexport * from \"./components/Form/PasswordInput\";\nexport * from \"./components/RoundButton/RoundButton\";\nexport * from \"./components/Notification/Notification\";\nexport * from \"./components/Logo/Logo\";\nexport * from \"./components/MediaItem/MediaItem\";\nexport * from \"./components/Callout/Callout\";\nexport * from \"./components/Patterns/Modal/Modal\";\nexport * from \"./components/Patterns/ButtonGroup/ButtonGroup\";\nexport * from \"./components/Collapsible/Collapsible\";\nexport * from \"./components/LoadingSpinner/LoadingSpinner\";\nexport * from \"./components/Pagination/Pagination\";\nexport * from \"./components/DataTable\";\nexport * from \"./components/Form/SegmentedControl/SegmentedControl\";\nexport * from \"./components/Tooltip/Tooltip\";\nexport * from \"./components/Tag/Tag\";\nexport * from \"./components/TagGroup/TagGroup\";\nexport * from \"./components/Toggletip/Toggletip\";\n"],"names":["dark","light","ambossVisualConfiguration"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/index.ts"],"sourcesContent":["import {\n ambossVisualConfiguration,\n VisualConfig,\n} from \"../build-tokens/visualConfig\";\n\nexport type { VisualConfig };\nexport const { dark, light } = ambossVisualConfiguration;\nexport { ThemeProvider, CacheProvider } from \"@emotion/react\";\nexport { default as createCache } from \"@emotion/cache\";\nexport * from \"./components/Card/Card\";\nexport * from \"./components/Card/CardBox\";\nexport * from \"./components/Box/Box\";\nexport * from \"./components/Inline/Inline\";\nexport * from \"./components/Stack/Stack\";\nexport * from \"./components/Typography/Header/Header\";\nexport * from \"./components/Typography/Text/Text\";\nexport * from \"./components/Typography/TextClamped/TextClamped\";\nexport * from \"./components/Typography/StyledText/StyledText\";\nexport * from \"./components/Link/Link\";\nexport * from \"./components/Icon/Icon\";\nexport * from \"./components/Button/Button\";\nexport * from \"./components/Divider/Divider\";\nexport * from \"./components/Column/Columns\";\nexport * from \"./components/Tabs/Tabs\";\nexport * from \"./components/Badge/Badge\";\nexport * from \"./components/SearchResult/SearchResult\";\nexport * from \"./components/Form/ToggleButton/ToggleButton\";\nexport * from \"./components/DropdownMenu/DropdownMenu\";\nexport * from \"./components/Form/FormFieldGroup/FormFieldGroup\";\nexport * from \"./components/Form/Input\";\nexport * from \"./components/Form/Checkbox/Checkbox\";\nexport * from \"./components/Form/Toggle/Toggle\";\nexport * from \"./components/Form/Radio/Radio\";\nexport * from \"./components/Form/RadioButton/RadioButton\";\nexport * from \"./components/Form/Textarea/Textarea\";\nexport * from \"./components/Form/Select/Select\";\nexport * from \"./components/SubThemeProvider/SubThemeProvider\";\nexport * from \"./components/PictogramButton/PictogramButton\";\nexport * from \"./components/MediaViewerBar/MediaViewerBar\";\nexport * from \"./components/SegmentedProgressBar/SegmentedProgressBar\";\nexport * from \"./components/ProgressBar/ProgressBar\";\nexport * from \"./components/Container/Container\";\nexport * from \"./components/Form/PasswordInput\";\nexport * from \"./components/RoundButton/RoundButton\";\nexport * from \"./components/Notification/Notification\";\nexport * from \"./components/Logo/Logo\";\nexport * from \"./components/MediaItem/MediaItem\";\nexport * from \"./components/Callout/Callout\";\nexport * from \"./components/Patterns/Modal/Modal\";\nexport * from \"./components/Patterns/ButtonGroup/ButtonGroup\";\nexport * from \"./components/Collapsible/Collapsible\";\nexport * from \"./components/LoadingSpinner/LoadingSpinner\";\nexport * from \"./components/Pagination/Pagination\";\nexport * from \"./components/DataTable\";\nexport * from \"./components/Form/SegmentedControl/SegmentedControl\";\nexport * from \"./components/Tooltip/Tooltip\";\nexport * from \"./components/Tag/Tag\";\nexport * from \"./components/TagGroup/TagGroup\";\nexport * from \"./components/Toggletip/Toggletip\";\nexport * from \"./components/UserHighlightTooltip/UserHighlightTooltip\";\n"],"names":["dark","light","ambossVisualConfiguration"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMa,MAAA;EAAEA,IAAI;AAAEC,EAAAA,KAAAA;AAAM,CAAC,GAAGC;;;;"}
|