@dnb/eufemia 9.32.0 → 9.32.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/cjs/components/slider/SliderThumb.js +17 -4
  3. package/cjs/components/slider/SliderTrack.js +3 -6
  4. package/cjs/components/slider/hooks/useSliderEvents.d.ts +2 -2
  5. package/cjs/components/slider/hooks/useSliderEvents.js +3 -2
  6. package/cjs/components/tooltip/Tooltip.js +21 -18
  7. package/cjs/components/tooltip/TooltipContainer.js +42 -17
  8. package/cjs/components/tooltip/TooltipHelpers.d.ts +1 -1
  9. package/cjs/components/tooltip/TooltipHelpers.js +5 -9
  10. package/cjs/components/tooltip/TooltipPortal.d.ts +1 -1
  11. package/cjs/components/tooltip/TooltipPortal.js +47 -30
  12. package/cjs/components/tooltip/TooltipWithEvents.d.ts +1 -1
  13. package/cjs/components/tooltip/TooltipWithEvents.js +69 -41
  14. package/cjs/components/tooltip/types.d.ts +1 -0
  15. package/cjs/shared/Eufemia.js +1 -1
  16. package/cjs/shared/component-helper.js +1 -1
  17. package/cjs/style/dnb-ui-elements.css +31 -16
  18. package/cjs/style/dnb-ui-elements.min.css +1 -1
  19. package/cjs/style/dnb-ui-tags.css +60 -31
  20. package/cjs/style/dnb-ui-tags.min.css +1 -1
  21. package/cjs/style/elements/ui-spacing.scss +3 -1
  22. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.css +31 -16
  23. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +1 -1
  24. package/cjs/style/themes/theme-ui/dnb-theme-ui.css +31 -16
  25. package/cjs/style/themes/theme-ui/dnb-theme-ui.min.css +1 -1
  26. package/components/slider/SliderThumb.js +18 -5
  27. package/components/slider/SliderTrack.js +3 -6
  28. package/components/slider/hooks/useSliderEvents.d.ts +2 -2
  29. package/components/slider/hooks/useSliderEvents.js +3 -2
  30. package/components/tooltip/Tooltip.js +21 -18
  31. package/components/tooltip/TooltipContainer.js +41 -18
  32. package/components/tooltip/TooltipHelpers.d.ts +1 -1
  33. package/components/tooltip/TooltipHelpers.js +5 -9
  34. package/components/tooltip/TooltipPortal.d.ts +1 -1
  35. package/components/tooltip/TooltipPortal.js +46 -29
  36. package/components/tooltip/TooltipWithEvents.d.ts +1 -1
  37. package/components/tooltip/TooltipWithEvents.js +67 -42
  38. package/components/tooltip/types.d.ts +1 -0
  39. package/es/components/slider/SliderThumb.js +18 -5
  40. package/es/components/slider/SliderTrack.js +3 -6
  41. package/es/components/slider/hooks/useSliderEvents.d.ts +2 -2
  42. package/es/components/slider/hooks/useSliderEvents.js +3 -2
  43. package/es/components/tooltip/Tooltip.js +13 -15
  44. package/es/components/tooltip/TooltipContainer.js +37 -20
  45. package/es/components/tooltip/TooltipHelpers.d.ts +1 -1
  46. package/es/components/tooltip/TooltipHelpers.js +5 -9
  47. package/es/components/tooltip/TooltipPortal.d.ts +1 -1
  48. package/es/components/tooltip/TooltipPortal.js +44 -29
  49. package/es/components/tooltip/TooltipWithEvents.d.ts +1 -1
  50. package/es/components/tooltip/TooltipWithEvents.js +69 -43
  51. package/es/components/tooltip/types.d.ts +1 -0
  52. package/es/shared/Eufemia.js +1 -1
  53. package/es/shared/component-helper.js +1 -1
  54. package/es/style/dnb-ui-elements.css +31 -16
  55. package/es/style/dnb-ui-elements.min.css +1 -1
  56. package/es/style/dnb-ui-tags.css +60 -31
  57. package/es/style/dnb-ui-tags.min.css +1 -1
  58. package/es/style/elements/ui-spacing.scss +3 -1
  59. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.css +31 -16
  60. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +1 -1
  61. package/es/style/themes/theme-ui/dnb-theme-ui.css +31 -16
  62. package/es/style/themes/theme-ui/dnb-theme-ui.min.css +1 -1
  63. package/esm/dnb-ui-basis.min.mjs +1 -1
  64. package/esm/dnb-ui-components.min.mjs +1 -1
  65. package/esm/dnb-ui-elements.min.mjs +3 -3
  66. package/esm/dnb-ui-extensions.min.mjs +1 -1
  67. package/esm/dnb-ui-lib.min.mjs +2 -2
  68. package/esm/dnb-ui-web-components.min.mjs +2 -2
  69. package/package.json +1 -1
  70. package/shared/Eufemia.js +1 -1
  71. package/shared/component-helper.js +1 -1
  72. package/style/dnb-ui-elements.css +31 -16
  73. package/style/dnb-ui-elements.min.css +1 -1
  74. package/style/dnb-ui-tags.css +60 -31
  75. package/style/dnb-ui-tags.min.css +1 -1
  76. package/style/elements/ui-spacing.scss +3 -1
  77. package/style/themes/theme-eiendom/dnb-theme-eiendom.css +31 -16
  78. package/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +1 -1
  79. package/style/themes/theme-ui/dnb-theme-ui.css +31 -16
  80. package/style/themes/theme-ui/dnb-theme-ui.min.css +1 -1
  81. package/umd/dnb-ui-basis.min.js +1 -1
  82. package/umd/dnb-ui-components.min.js +1 -1
  83. package/umd/dnb-ui-elements.min.js +2 -2
  84. package/umd/dnb-ui-extensions.min.js +1 -1
  85. package/umd/dnb-ui-lib.min.js +2 -2
  86. package/umd/dnb-ui-web-components.min.js +2 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to @dnb/eufemia will be documented in this file. See
4
4
  [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [9.32.1](https://github.com/dnbexperience/eufemia/compare/v9.32.0...v9.32.1) (2022-10-09)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **Tooltip:** make skipPortal properly inline and accessible to screen readers ([#1613](https://github.com/dnbexperience/eufemia/issues/1613)) ([0d32910](https://github.com/dnbexperience/eufemia/commit/0d32910fe64a541b6b6b99bc04f01bacdf558b0f))
12
+ * **Tooltip:** remove left over DOM elements when component unmounts ([#1612](https://github.com/dnbexperience/eufemia/issues/1612)) ([ddd26ed](https://github.com/dnbexperience/eufemia/commit/ddd26ed9dd5ab3c858c843def8598a486d3212ea))
13
+
6
14
  # [9.32.0](https://github.com/dnbexperience/eufemia/compare/v9.31.0...v9.32.0) (2022-10-06)
7
15
 
8
16
 
@@ -126,6 +126,12 @@ function Thumb(_ref) {
126
126
 
127
127
  var onMouseLeaveHandler = function onMouseLeaveHandler() {
128
128
  setShowTooltip(false);
129
+
130
+ try {
131
+ elemRef.current.dispatchEvent(new Event('mouseleave'));
132
+ } catch (e) {
133
+ (0, _componentHelper.warn)(e);
134
+ }
129
135
  };
130
136
 
131
137
  var _useSliderEvents = (0, _useSliderEvents2.useSliderEvents)(),
@@ -156,6 +162,12 @@ function Thumb(_ref) {
156
162
  helperParams.onFocus = function (event) {
157
163
  onHelperFocusHandler(event);
158
164
  onMouseEnterHandler();
165
+
166
+ try {
167
+ elemRef.current.dispatchEvent(new Event('mouseenter'));
168
+ } catch (e) {
169
+ (0, _componentHelper.warn)(e);
170
+ }
159
171
  };
160
172
  }
161
173
 
@@ -165,8 +177,7 @@ function Thumb(_ref) {
165
177
 
166
178
  return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("span", {
167
179
  className: "dnb-slider__thumb",
168
- style: style,
169
- ref: elemRef
180
+ style: style
170
181
  }, _react.default.createElement("input", _extends({
171
182
  type: "range",
172
183
  className: "dnb-slider__button-helper",
@@ -190,12 +201,14 @@ function Thumb(_ref) {
190
201
  type: "",
191
202
  variant: "secondary",
192
203
  disabled: disabled,
193
- skeleton: skeleton
204
+ skeleton: skeleton,
205
+ innerRef: elemRef
194
206
  }, thumbParams)), tooltip && _react.default.createElement(_Tooltip.default, {
195
207
  key: "group-".concat(currentIndex),
196
208
  targetElement: elemRef,
197
209
  animatePosition: shouldAnimate,
198
- active: showTooltip || alwaysShowTooltip,
210
+ active: Boolean(showTooltip || alwaysShowTooltip),
211
+ showDelay: 1,
199
212
  hideDelay: 300
200
213
  }, number || value, shouldAnimate)));
201
214
  }
@@ -50,8 +50,7 @@ function SliderMainTrack(_ref) {
50
50
  onInit = allProps.onInit;
51
51
 
52
52
  var _useSliderEvents = (0, _useSliderEvents2.useSliderEvents)(),
53
- onTrackMouseUpHandler = _useSliderEvents.onTrackMouseUpHandler,
54
- onThumbMouseDownHandler = _useSliderEvents.onThumbMouseDownHandler,
53
+ onTrackMouseDownHandler = _useSliderEvents.onTrackMouseDownHandler,
55
54
  removeEvents = _useSliderEvents.removeEvents;
56
55
 
57
56
  _react.default.useEffect(function () {
@@ -75,10 +74,8 @@ function SliderMainTrack(_ref) {
75
74
  }, []);
76
75
 
77
76
  var trackParams = {
78
- onTouchStart: onTrackMouseUpHandler,
79
- onTouchStartCapture: onThumbMouseDownHandler,
80
- onMouseDown: onTrackMouseUpHandler,
81
- onMouseDownCapture: onThumbMouseDownHandler
77
+ onTouchStart: onTrackMouseDownHandler,
78
+ onMouseDown: onTrackMouseDownHandler
82
79
  };
83
80
  return _react.default.createElement("span", _extends({
84
81
  id: id,
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  export declare function useSliderEvents(): {
3
- onThumbMouseDownHandler: (event: React.SyntheticEvent) => void;
3
+ onThumbMouseDownHandler: (event: MouseEvent | TouchEvent | React.SyntheticEvent) => void;
4
4
  onThumbMouseUpHandler: () => void;
5
- onTrackMouseUpHandler: (event: MouseEvent | TouchEvent) => void;
5
+ onTrackMouseDownHandler: (event: MouseEvent | TouchEvent) => void;
6
6
  onHelperChangeHandler: (event: React.FormEvent<HTMLInputElement>) => void;
7
7
  onHelperFocusHandler: (event: React.FormEvent<HTMLInputElement>) => void;
8
8
  removeEvents: () => void;
@@ -33,7 +33,8 @@ function useSliderEvents() {
33
33
  onDragStart = allProps.onDragStart,
34
34
  onDragEnd = allProps.onDragEnd;
35
35
 
36
- var onTrackMouseUpHandler = function onTrackMouseUpHandler(event) {
36
+ var onTrackMouseDownHandler = function onTrackMouseDownHandler(event) {
37
+ onThumbMouseDownHandler(event);
37
38
  var percent = (0, _SliderHelpers.calculatePercent)(trackRef.current, event, isVertical);
38
39
  emitChange(event, (0, _SliderHelpers.percentToValue)(percent, min, max, isReverse));
39
40
  setShouldAnimate(true);
@@ -121,7 +122,7 @@ function useSliderEvents() {
121
122
  return {
122
123
  onThumbMouseDownHandler: onThumbMouseDownHandler,
123
124
  onThumbMouseUpHandler: onThumbMouseUpHandler,
124
- onTrackMouseUpHandler: onTrackMouseUpHandler,
125
+ onTrackMouseDownHandler: onTrackMouseDownHandler,
125
126
  onHelperChangeHandler: onHelperChangeHandler,
126
127
  onHelperFocusHandler: onHelperFocusHandler,
127
128
  removeEvents: removeEvents
@@ -57,12 +57,8 @@ var _componentHelper = require("../../shared/component-helper");
57
57
 
58
58
  var _SpacingHelper = require("../space/SpacingHelper");
59
59
 
60
- var _TooltipContainer = _interopRequireDefault(require("./TooltipContainer"));
61
-
62
60
  var _TooltipWithEvents = _interopRequireDefault(require("./TooltipWithEvents"));
63
61
 
64
- var _TooltipPortal = _interopRequireDefault(require("./TooltipPortal"));
65
-
66
62
  var _TooltipHelpers = require("./TooltipHelpers");
67
63
 
68
64
  var _withSnakeCaseProps = require("../../shared/helpers/withSnakeCaseProps");
@@ -120,13 +116,26 @@ function Tooltip(localProps) {
120
116
  align = props.align,
121
117
  params = _objectWithoutProperties(props, _excluded);
122
118
 
123
- var _React$useState = _react.default.useState(function () {
119
+ var target = targetElement || targetSelector;
120
+
121
+ var _React$useState = _react.default.useState(),
122
+ _React$useState2 = _slicedToArray(_React$useState, 2),
123
+ element = _React$useState2[0],
124
+ setElement = _React$useState2[1];
125
+
126
+ var _React$useState3 = _react.default.useState(function () {
124
127
  return props.id || (0, _componentHelper.makeUniqueId)();
125
128
  }),
126
- _React$useState2 = _slicedToArray(_React$useState, 1),
127
- internalId = _React$useState2[0];
129
+ _React$useState4 = _slicedToArray(_React$useState3, 1),
130
+ internalId = _React$useState4[0];
128
131
 
129
132
  props.internalId = internalId;
133
+
134
+ _react.default.useEffect(function () {
135
+ var element = (0, _TooltipHelpers.getTargetElement)((0, _TooltipHelpers.getRefElement)(target));
136
+ setElement(element);
137
+ }, [target]);
138
+
130
139
  var classes = (0, _classnames.default)('dnb-tooltip', (0, _SpacingHelper.createSpacingClasses)(props), className, size === 'large' && 'dnb-tooltip--large');
131
140
 
132
141
  var attributes = _objectSpread({
@@ -135,20 +144,14 @@ function Tooltip(localProps) {
135
144
 
136
145
  (0, _componentHelper.validateDOMAttributes)(localProps, attributes);
137
146
 
138
- if (!(0, _componentHelper.isTrue)(props.active)) {
139
- delete props.active;
147
+ if (target && !element) {
148
+ return null;
140
149
  }
141
150
 
142
- return _react.default.createElement(_react.default.Fragment, null, skipPortal ? _react.default.createElement(_TooltipContainer.default, _extends({
143
- target: targetElement,
144
- attributes: attributes
145
- }, props), props.children) : targetElement ? _react.default.createElement(_TooltipWithEvents.default, _extends({
146
- target: targetElement,
147
- attributes: attributes
148
- }, props), props.children) : targetSelector && _react.default.createElement(_TooltipPortal.default, _extends({
149
- target: targetSelector,
151
+ return _react.default.createElement(_TooltipWithEvents.default, _extends({
152
+ target: element,
150
153
  attributes: attributes
151
- }, props), props.children));
154
+ }, props), props.children);
152
155
  }
153
156
 
154
157
  var _default = Tooltip;
@@ -79,11 +79,16 @@ function TooltipContainer(props) {
79
79
  attributes = props.attributes,
80
80
  arrow = props.arrow,
81
81
  position = props.position,
82
+ align = props.align,
83
+ group = props.group,
84
+ hideDelay = props.hideDelay,
82
85
  animatePosition = props.animatePosition,
83
86
  fixedPosition = props.fixedPosition,
84
87
  noAnimation = props.noAnimation,
88
+ skipPortal = props.skipPortal,
85
89
  useHover = props.useHover,
86
- children = props.children;
90
+ children = props.children,
91
+ target = props.targetElement;
87
92
 
88
93
  var _React$useState = _react.default.useState(null),
89
94
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -134,7 +139,7 @@ function TooltipContainer(props) {
134
139
  }
135
140
 
136
141
  try {
137
- resizeObserver.current = new ResizeObserver(function (entries) {
142
+ resizeObserver.current = new ResizeObserver(function () {
138
143
  clearTimeout(debounceTimeout.current);
139
144
  debounceTimeout.current = setTimeout(function () {
140
145
  return forceRerender(getBodySize());
@@ -161,19 +166,31 @@ function TooltipContainer(props) {
161
166
  return removePositionObserver;
162
167
  }, [isActive]);
163
168
 
169
+ var offsetLeft = _react.default.useRef(0);
170
+
171
+ var offsetTop = _react.default.useRef(0);
172
+
164
173
  _react.default.useLayoutEffect(function () {
174
+ if (!isActive) {
175
+ if (group && wasActive) {
176
+ clearTimeout(debounceTimeout.current);
177
+ debounceTimeout.current = setTimeout(function () {
178
+ return setStyle(null);
179
+ }, hideDelay);
180
+ }
181
+
182
+ return;
183
+ }
184
+
165
185
  var element = elementRef === null || elementRef === void 0 ? void 0 : elementRef.current;
166
- var target = props.targetElement,
167
- align = props.align,
168
- fixedPosition = props.fixedPosition;
169
186
 
170
187
  if (typeof window === 'undefined' || !element || !(target !== null && target !== void 0 && target.getBoundingClientRect)) {
171
188
  return;
172
189
  }
173
190
 
191
+ var alignOffset = 0;
174
192
  var elementWidth = element.offsetWidth;
175
193
  var elementHeight = element.offsetHeight;
176
- var alignOffset = 0;
177
194
  var rect = target.getBoundingClientRect();
178
195
  var targetBodySize = {
179
196
  width: target.offsetWidth,
@@ -185,16 +202,21 @@ function TooltipContainer(props) {
185
202
  targetBodySize.height = rect.height;
186
203
  }
187
204
 
205
+ if (skipPortal && (!offsetLeft.current || !offsetTop.current)) {
206
+ offsetLeft.current = (0, _helpers.getOffsetLeft)(element) - offset.current;
207
+ offsetTop.current = (0, _helpers.getOffsetTop)(element) - offset.current;
208
+ }
209
+
188
210
  var scrollY = window.scrollY !== undefined ? window.scrollY : window.pageYOffset;
189
211
  var scrollX = window.scrollX !== undefined ? window.scrollX : window.pageXOffset;
190
212
 
191
- var _top = ((0, _componentHelper.isTrue)(fixedPosition) ? 0 : scrollY) + rect.top;
213
+ var _top = ((0, _componentHelper.isTrue)(fixedPosition) ? 0 : scrollY) + rect.top - offsetTop.current;
192
214
 
193
215
  var useMouseWhen = targetBodySize.width > 400;
194
216
  var mousePos = (0, _helpers.getOffsetLeft)(target) + rect.left / 2 + (element ? element.offsetWidth : 0);
195
217
  var widthBased = scrollX + rect.left;
196
218
 
197
- var _left = useMouseWhen && mousePos < targetBodySize.width ? mousePos : widthBased;
219
+ var _left = (useMouseWhen && mousePos < targetBodySize.width ? mousePos : widthBased) - offsetLeft.current;
198
220
 
199
221
  var style = _objectSpread({}, props.style);
200
222
 
@@ -241,9 +263,7 @@ function TooltipContainer(props) {
241
263
 
242
264
  if (stylesFromPosition[position]) {
243
265
  stylesFromPosition[position]();
244
- }
245
-
246
- if (stylesFromArrow[arrow]) {
266
+ } else if (stylesFromArrow[arrow]) {
247
267
  stylesFromArrow[arrow]();
248
268
  }
249
269
 
@@ -261,10 +281,8 @@ function TooltipContainer(props) {
261
281
  style.top = 0;
262
282
  }
263
283
 
264
- if (isActive) {
265
- setStyle(style);
266
- }
267
- }, [isActive, arrow, position, children, renewStyles]);
284
+ setStyle(style);
285
+ }, [active, arrow, position, children, renewStyles]);
268
286
 
269
287
  var handleMouseEnter = function handleMouseEnter() {
270
288
  if ((0, _componentHelper.isTrue)(active) && useHover !== false) {
@@ -278,12 +296,19 @@ function TooltipContainer(props) {
278
296
  }
279
297
  };
280
298
 
299
+ var handlePropagation = function handlePropagation(e) {
300
+ return e.stopPropagation();
301
+ };
302
+
281
303
  return _react.default.createElement("span", _extends({
282
304
  role: "tooltip",
283
- "aria-hidden": true,
305
+ "aria-hidden": target ? true : undefined,
284
306
  ref: elementRef,
285
307
  onMouseEnter: handleMouseEnter,
286
- onMouseLeave: handleMouseLeave
308
+ onMouseLeave: handleMouseLeave,
309
+ onMouseMove: handlePropagation,
310
+ onMouseDown: handlePropagation,
311
+ onTouchStart: handlePropagation
287
312
  }, attributes, {
288
313
  className: (0, _classnames.default)(attributes === null || attributes === void 0 ? void 0 : attributes.className, isActive ? 'dnb-tooltip--active' : wasActive && 'dnb-tooltip--hide', (0, _componentHelper.isTrue)(animatePosition) && 'dnb-tooltip--animate_position', (0, _componentHelper.isTrue)(noAnimation) && 'dnb-tooltip--no-animation', (0, _componentHelper.isTrue)(fixedPosition) && 'dnb-tooltip--fixed'),
289
314
  style: _objectSpread(_objectSpread({}, style), attributes.style)
@@ -25,7 +25,7 @@ export declare const defaultProps: {
25
25
  tooltip: any;
26
26
  };
27
27
  export declare function getTargetElement(target: HTMLElement): HTMLElement;
28
- export declare function useHandleAria(targetElement: React.RefObject<HTMLElement>, internalId: string): void;
28
+ export declare function useHandleAria(targetElement: HTMLElement, internalId: string): void;
29
29
  export declare function getPropsFromTooltipProp(localProps: any): any;
30
30
  export declare function getRefElement(target: React.RefObject<HTMLElement>): any;
31
31
  export declare const isTouch: (type: string) => boolean;
@@ -58,14 +58,10 @@ function getTargetElement(target) {
58
58
  function useHandleAria(targetElement, internalId) {
59
59
  _react.default.useEffect(function () {
60
60
  try {
61
- var elem = getTargetElement(getRefElement(targetElement));
62
-
63
- if (!(elem !== null && elem !== void 0 && elem.classList.contains('dnb-tooltip__wrapper'))) {
64
- var existing = {
65
- 'aria-describedby': elem.getAttribute('aria-describedby')
66
- };
67
- elem.setAttribute('aria-describedby', (0, _componentHelper.combineDescribedBy)(existing, internalId));
68
- }
61
+ var existing = {
62
+ 'aria-describedby': targetElement.getAttribute('aria-describedby')
63
+ };
64
+ targetElement.setAttribute('aria-describedby', (0, _componentHelper.combineDescribedBy)(existing, internalId));
69
65
  } catch (e) {}
70
66
  }, [targetElement, internalId]);
71
67
  }
@@ -86,7 +82,7 @@ function getRefElement(target) {
86
82
  element = getRefElement(unknownTarget.current._ref);
87
83
  }
88
84
 
89
- if (Object.prototype.hasOwnProperty.call(element, 'current')) {
85
+ if (element && Object.prototype.hasOwnProperty.call(element, 'current')) {
90
86
  element = element.current;
91
87
  }
92
88
 
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
  import { TooltipProps } from './types';
7
7
  declare type TooltipPortalProps = {
8
- target: HTMLElement;
8
+ targetElement: HTMLElement;
9
9
  active: boolean;
10
10
  keepInDOM?: boolean;
11
11
  group?: string;
@@ -41,8 +41,6 @@ var _componentHelper = require("../../shared/component-helper");
41
41
 
42
42
  var _TooltipContainer = _interopRequireDefault(require("./TooltipContainer"));
43
43
 
44
- var _TooltipHelpers = require("./TooltipHelpers");
45
-
46
44
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
47
45
 
48
46
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -70,7 +68,7 @@ if (typeof globalThis !== 'undefined') {
70
68
 
71
69
  function TooltipPortal(props) {
72
70
  var active = props.active,
73
- target = props.target,
71
+ targetElement = props.targetElement,
74
72
  hideDelay = props.hideDelay,
75
73
  keepInDOM = props.keepInDOM,
76
74
  noAnimation = props.noAnimation,
@@ -90,42 +88,59 @@ function TooltipPortal(props) {
90
88
  return props.group || (0, _componentHelper.makeUniqueId)();
91
89
  }),
92
90
  _React$useState6 = _slicedToArray(_React$useState5, 1),
93
- group = _React$useState6[0];
91
+ id = _React$useState6[0];
94
92
 
95
93
  var isInDOM = _react.default.useRef(false);
96
94
 
97
95
  var hasGroup = props.group;
98
96
 
99
- if (tooltipPortal[group]) {
100
- tooltipPortal[group].inDOM = isInDOM.current;
101
- }
102
-
103
97
  var makePortal = function makePortal() {
104
- if (!tooltipPortal[group]) {
105
- tooltipPortal[group] = {
106
- node: hasGroup ? createGroupElement(group) : createRootElement('dnb-tooltip__portal')
98
+ if (!tooltipPortal[id]) {
99
+ tooltipPortal[id] = {
100
+ count: 0,
101
+ node: hasGroup ? createGroupElement(id) : createRootElement()
107
102
  };
108
103
  }
109
104
  };
110
105
 
111
- var removeFromDOM = function removeFromDOM() {
112
- if (!keepInDOM && hasGroup && tooltipPortal[group] && !tooltipPortal[group].inDOM) {
113
- _reactDom.default.unmountComponentAtNode(tooltipPortal[group].node);
106
+ var removeFromDOM = function removeFromDOM(hide) {
107
+ if (isActive && hide) {
108
+ return;
109
+ }
110
+
111
+ var ref = tooltipPortal[id];
112
+
113
+ if (ref !== null && ref !== void 0 && ref.node) {
114
+ ref.count--;
115
+
116
+ if (ref.count <= 0) {
117
+ if (hasGroup) {
118
+ _reactDom.default.unmountComponentAtNode(ref.node);
119
+
120
+ createRootElement().removeChild(ref.node);
121
+ }
122
+
123
+ delete tooltipPortal[id];
124
+ }
114
125
  }
115
126
  };
116
127
 
117
128
  _react.default.useEffect(function () {
118
- var _tooltipPortal$group, _tooltipPortal$group2;
129
+ var _tooltipPortal$id, _tooltipPortal$id2;
119
130
 
120
131
  setIsMounted(true);
121
- clearTimeout((_tooltipPortal$group = tooltipPortal[group]) === null || _tooltipPortal$group === void 0 ? void 0 : _tooltipPortal$group.delayTimeout);
122
- clearTimeout((_tooltipPortal$group2 = tooltipPortal[group]) === null || _tooltipPortal$group2 === void 0 ? void 0 : _tooltipPortal$group2.hiddenTimeout);
132
+ clearTimeout((_tooltipPortal$id = tooltipPortal[id]) === null || _tooltipPortal$id === void 0 ? void 0 : _tooltipPortal$id.delayTimeout);
133
+ clearTimeout((_tooltipPortal$id2 = tooltipPortal[id]) === null || _tooltipPortal$id2 === void 0 ? void 0 : _tooltipPortal$id2.hiddenTimeout);
123
134
 
124
135
  if (active) {
125
136
  makePortal();
126
137
  setIsActive(true);
127
138
  isInDOM.current = true;
128
139
 
140
+ if (!isMounted) {
141
+ tooltipPortal[id].count++;
142
+ }
143
+
129
144
  if (hasGroup) {
130
145
  renderPortal(true);
131
146
  }
@@ -140,19 +155,19 @@ function TooltipPortal(props) {
140
155
 
141
156
  var delayHidden = function delayHidden() {
142
157
  isInDOM.current = false;
143
- removeFromDOM();
158
+ removeFromDOM(true);
144
159
  };
145
160
 
146
161
  if (noAnimation || globalThis.IS_TEST) {
147
162
  delayRender();
148
163
  delayHidden();
149
- } else if (tooltipPortal[group]) {
164
+ } else if (tooltipPortal[id]) {
150
165
  var delay = parseFloat(String(hideDelay));
151
- tooltipPortal[group].delayTimeout = setTimeout(delayRender, delay);
152
- tooltipPortal[group].hiddenTimeout = setTimeout(delayHidden, delay + 300);
166
+ tooltipPortal[id].delayTimeout = setTimeout(delayRender, delay);
167
+ tooltipPortal[id].hiddenTimeout = setTimeout(delayHidden, delay + 300);
153
168
  }
154
169
  }
155
- }, [children, active, group, hideDelay, noAnimation]);
170
+ }, [children, active, id, hideDelay, noAnimation]);
156
171
 
157
172
  _react.default.useEffect(function () {
158
173
  if (keepInDOM) {
@@ -163,13 +178,13 @@ function TooltipPortal(props) {
163
178
  }, []);
164
179
 
165
180
  var renderPortal = function renderPortal(isActive) {
166
- var _tooltipPortal$group3;
181
+ var _tooltipPortal$id3;
167
182
 
168
- var root = (_tooltipPortal$group3 = tooltipPortal[group]) === null || _tooltipPortal$group3 === void 0 ? void 0 : _tooltipPortal$group3.node;
183
+ var root = (_tooltipPortal$id3 = tooltipPortal[id]) === null || _tooltipPortal$id3 === void 0 ? void 0 : _tooltipPortal$id3.node;
169
184
 
170
185
  if (root && hasGroup && isInDOM.current) {
171
186
  _reactDom.default.render(_react.default.createElement(_TooltipContainer.default, _extends({}, props, {
172
- targetElement: (0, _TooltipHelpers.getTargetElement)(target),
187
+ targetElement: targetElement,
173
188
  active: isActive
174
189
  })), root);
175
190
  }
@@ -178,13 +193,13 @@ function TooltipPortal(props) {
178
193
  };
179
194
 
180
195
  if (!hasGroup) {
181
- var _tooltipPortal$group4;
196
+ var _tooltipPortal$id4;
182
197
 
183
- var root = (_tooltipPortal$group4 = tooltipPortal[group]) === null || _tooltipPortal$group4 === void 0 ? void 0 : _tooltipPortal$group4.node;
198
+ var root = (_tooltipPortal$id4 = tooltipPortal[id]) === null || _tooltipPortal$id4 === void 0 ? void 0 : _tooltipPortal$id4.node;
184
199
 
185
200
  if (root) {
186
201
  return _reactDom.default.createPortal(isInDOM.current || keepInDOM ? _react.default.createElement(_TooltipContainer.default, _extends({}, props, {
187
- targetElement: (0, _TooltipHelpers.getTargetElement)(target),
202
+ targetElement: targetElement,
188
203
  active: isActive
189
204
  }), children) : null, root);
190
205
  }
@@ -201,14 +216,16 @@ var createGroupElement = function createGroupElement(id) {
201
216
  var elem = document.createElement('div');
202
217
  elem.classList.add('dnb-tooltip__group');
203
218
  elem.setAttribute('id', id);
204
- createRootElement('dnb-tooltip__portal').appendChild(elem);
219
+ createRootElement().appendChild(elem);
205
220
  return elem;
206
221
  } catch (e) {
207
222
  (0, _componentHelper.warn)(e);
208
223
  }
209
224
  };
210
225
 
211
- var createRootElement = function createRootElement(className) {
226
+ var createRootElement = function createRootElement() {
227
+ var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'dnb-tooltip__portal';
228
+
212
229
  try {
213
230
  var element = document.querySelector(".".concat(className));
214
231
 
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
  import { TooltipProps } from './types';
7
7
  declare type TooltipWithEventsProps = {
8
- target: React.ReactElement & React.RefObject<HTMLElement>;
8
+ target: HTMLElement | React.ReactElement;
9
9
  active: boolean;
10
10
  internalId: string;
11
11
  };