@entur/tooltip 2.5.23 → 2.5.24

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.
@@ -19,68 +19,77 @@ function _extends() {
19
19
  _extends = Object.assign || function (target) {
20
20
  for (var i = 1; i < arguments.length; i++) {
21
21
  var source = arguments[i];
22
+
22
23
  for (var key in source) {
23
24
  if (Object.prototype.hasOwnProperty.call(source, key)) {
24
25
  target[key] = source[key];
25
26
  }
26
27
  }
27
28
  }
29
+
28
30
  return target;
29
31
  };
32
+
30
33
  return _extends.apply(this, arguments);
31
34
  }
35
+
32
36
  function _objectWithoutPropertiesLoose(source, excluded) {
33
37
  if (source == null) return {};
34
38
  var target = {};
35
39
  var sourceKeys = Object.keys(source);
36
40
  var key, i;
41
+
37
42
  for (i = 0; i < sourceKeys.length; i++) {
38
43
  key = sourceKeys[i];
39
44
  if (excluded.indexOf(key) >= 0) continue;
40
45
  target[key] = source[key];
41
46
  }
47
+
42
48
  return target;
43
49
  }
44
50
 
45
51
  var _excluded$1 = ["placement", "content", "children", "className", "isOpen", "disableHoverListener", "disableFocusListener", "showCloseButton", "variant", "popperModifiers"];
46
52
  var Tooltip = function Tooltip(_ref) {
47
53
  var placement = _ref.placement,
48
- content = _ref.content,
49
- children = _ref.children,
50
- className = _ref.className,
51
- _ref$isOpen = _ref.isOpen,
52
- isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
53
- _ref$disableHoverList = _ref.disableHoverListener,
54
- disableHoverListener = _ref$disableHoverList === void 0 ? false : _ref$disableHoverList,
55
- _ref$disableFocusList = _ref.disableFocusListener,
56
- disableFocusListener = _ref$disableFocusList === void 0 ? false : _ref$disableFocusList,
57
- _ref$showCloseButton = _ref.showCloseButton,
58
- showCloseButton = _ref$showCloseButton === void 0 ? true : _ref$showCloseButton,
59
- variant = _ref.variant,
60
- _ref$popperModifiers = _ref.popperModifiers,
61
- popperModifiers = _ref$popperModifiers === void 0 ? [{
62
- name: 'offset',
63
- options: {
64
- offset: [0, 10]
65
- }
66
- }] : _ref$popperModifiers,
67
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
54
+ content = _ref.content,
55
+ children = _ref.children,
56
+ className = _ref.className,
57
+ _ref$isOpen = _ref.isOpen,
58
+ isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
59
+ _ref$disableHoverList = _ref.disableHoverListener,
60
+ disableHoverListener = _ref$disableHoverList === void 0 ? false : _ref$disableHoverList,
61
+ _ref$disableFocusList = _ref.disableFocusListener,
62
+ disableFocusListener = _ref$disableFocusList === void 0 ? false : _ref$disableFocusList,
63
+ _ref$showCloseButton = _ref.showCloseButton,
64
+ showCloseButton = _ref$showCloseButton === void 0 ? true : _ref$showCloseButton,
65
+ variant = _ref.variant,
66
+ _ref$popperModifiers = _ref.popperModifiers,
67
+ popperModifiers = _ref$popperModifiers === void 0 ? [{
68
+ name: 'offset',
69
+ options: {
70
+ offset: [0, 10]
71
+ }
72
+ }] : _ref$popperModifiers,
73
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
74
+
68
75
  var _useState = React.useState(isOpen || false),
69
- showTooltip = _useState[0],
70
- setShowTooltip = _useState[1];
76
+ showTooltip = _useState[0],
77
+ setShowTooltip = _useState[1];
78
+
71
79
  var hoverTimer;
80
+
72
81
  var handleOpen = function handleOpen(event) {
73
82
  event.persist();
74
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- Typescript interprets this differently depending on whether it's run in Jest or not
75
- // @ts-ignore -- for some reason, the type checker thinks that this setTimeout is run in node; it is not, because it is run in the browser
76
83
  hoverTimer = setTimeout(function () {
77
84
  setShowTooltip(true);
78
85
  }, 150);
79
86
  };
87
+
80
88
  var onMouseExit = function onMouseExit() {
81
89
  setShowTooltip(false);
82
90
  clearTimeout(hoverTimer);
83
91
  };
92
+
84
93
  React__default["default"].useEffect(function () {
85
94
  return function () {
86
95
  clearTimeout(hoverTimer);
@@ -96,32 +105,40 @@ var Tooltip = function Tooltip(_ref) {
96
105
  }
97
106
  }, [content]);
98
107
  var popperPlacement = placement;
108
+
99
109
  if (placement.includes('-')) {
100
110
  if (placement.includes('right')) {
101
111
  popperPlacement = placement.replace('right', 'end');
102
112
  }
113
+
103
114
  if (placement.includes('left')) {
104
115
  popperPlacement = placement.replace('left', 'start');
105
116
  }
106
117
  }
118
+
107
119
  var childProps = {};
108
120
  childProps['aria-describedby'] = tooltipId;
121
+
109
122
  if (!disableFocusListener) {
110
123
  childProps.onFocus = function () {
111
124
  return setShowTooltip(true);
112
125
  };
126
+
113
127
  childProps.onBlur = function () {
114
128
  return setShowTooltip(false);
115
129
  };
116
130
  }
131
+
117
132
  if (!disableHoverListener) {
118
133
  childProps.onMouseEnter = function (e) {
119
134
  return handleOpen(e);
120
135
  };
136
+
121
137
  childProps.onMouseLeave = function () {
122
138
  return onMouseExit();
123
139
  };
124
140
  }
141
+
125
142
  return React__default["default"].createElement(reactPopper.Manager, null, React__default["default"].createElement(reactPopper.Reference, null, function (_ref2) {
126
143
  var ref = _ref2.ref;
127
144
  return React.cloneElement(children, _extends({
@@ -135,8 +152,8 @@ var Tooltip = function Tooltip(_ref) {
135
152
  placement: popperPlacement
136
153
  }, function (_ref3) {
137
154
  var ref = _ref3.ref,
138
- style = _ref3.style,
139
- popperPlacement = _ref3.placement;
155
+ style = _ref3.style,
156
+ popperPlacement = _ref3.placement;
140
157
  return React__default["default"].createElement("div", _extends({
141
158
  className: classNames__default["default"]('eds-tooltip', className, "eds-tooltip--" + popperPlacement, {
142
159
  'eds-tooltip--error': variant === 'error'
@@ -157,37 +174,45 @@ var Tooltip = function Tooltip(_ref) {
157
174
 
158
175
  var _excluded = ["children"];
159
176
  var PopoverContext = /*#__PURE__*/React.createContext(undefined);
177
+
160
178
  var usePopoverContext = function usePopoverContext() {
161
179
  var context = React.useContext(PopoverContext);
180
+
162
181
  if (context == null) {
163
182
  throw Error('usePopoverContext must be used within <Popover/>');
164
183
  }
184
+
165
185
  return context;
166
186
  };
187
+
167
188
  var Popover = function Popover(_ref) {
168
189
  var children = _ref.children,
169
- _ref$placement = _ref.placement,
170
- placement = _ref$placement === void 0 ? 'bottom-start' : _ref$placement;
190
+ _ref$placement = _ref.placement,
191
+ placement = _ref$placement === void 0 ? 'bottom-start' : _ref$placement;
192
+
171
193
  var _React$useState = React__default["default"].useState(false),
172
- showPopover = _React$useState[0],
173
- setShowPopover = _React$useState[1];
194
+ showPopover = _React$useState[0],
195
+ setShowPopover = _React$useState[1];
196
+
174
197
  var triggerElement = React__default["default"].useRef(null);
175
198
  var contentElement = React__default["default"].useRef(null);
199
+
176
200
  var _usePopper = reactPopper.usePopper(triggerElement.current, contentElement.current, {
177
- modifiers: [{
178
- name: 'arrow',
179
- enabled: false
180
- }, {
181
- name: 'offset',
182
- options: {
183
- offset: [0, 8]
184
- }
185
- }],
186
- placement: placement
187
- }),
188
- styles = _usePopper.styles,
189
- attributes = _usePopper.attributes,
190
- forceUpdate = _usePopper.forceUpdate;
201
+ modifiers: [{
202
+ name: 'arrow',
203
+ enabled: false
204
+ }, {
205
+ name: 'offset',
206
+ options: {
207
+ offset: [0, 8]
208
+ }
209
+ }],
210
+ placement: placement
211
+ }),
212
+ styles = _usePopper.styles,
213
+ attributes = _usePopper.attributes,
214
+ forceUpdate = _usePopper.forceUpdate;
215
+
191
216
  React__default["default"].useEffect(function () {
192
217
  if (forceUpdate) {
193
218
  forceUpdate();
@@ -227,8 +252,8 @@ var Popover = function Popover(_ref) {
227
252
  }
228
253
  },
229
254
  onBlur: function onBlur(event) {
230
- var elementReceivingFocus = event.relatedTarget;
231
- // The check for 'tabindex=-1' is a special case for focus handling in Docz
255
+ var elementReceivingFocus = event.relatedTarget; // The check for 'tabindex=-1' is a special case for focus handling in Docz
256
+
232
257
  if (!elementReceivingFocus || elementReceivingFocus.getAttribute('tabindex') === '-1') return;
233
258
  var focusElementIsPopover = elementContainsElement(contentElement.current, elementReceivingFocus);
234
259
  var focusElementIsTrigger = elementContainsElement(triggerElement.current, elementReceivingFocus);
@@ -254,25 +279,31 @@ var Popover = function Popover(_ref) {
254
279
  };
255
280
  var PopoverTrigger = function PopoverTrigger(_ref2) {
256
281
  var children = _ref2.children;
282
+
257
283
  var _usePopoverContext = usePopoverContext(),
258
- triggerProps = _usePopoverContext.triggerProps;
284
+ triggerProps = _usePopoverContext.triggerProps;
285
+
259
286
  var child = React__default["default"].Children.only(children);
260
287
  return React.cloneElement(child, triggerProps());
261
288
  };
262
289
  var PopoverCloseButton = function PopoverCloseButton(_ref3) {
263
290
  var children = _ref3.children,
264
- rest = _objectWithoutPropertiesLoose(_ref3, _excluded);
291
+ rest = _objectWithoutPropertiesLoose(_ref3, _excluded);
292
+
265
293
  var _usePopoverContext2 = usePopoverContext(),
266
- closeButtonProps = _usePopoverContext2.closeButtonProps;
294
+ closeButtonProps = _usePopoverContext2.closeButtonProps;
295
+
267
296
  return React.cloneElement(children, _extends({}, closeButtonProps, rest));
268
297
  };
269
298
  var PopoverContent = /*#__PURE__*/React__default["default"].forwardRef(function (_ref4, ref) {
270
299
  var children = _ref4.children;
300
+
271
301
  var _usePopoverContext3 = usePopoverContext(),
272
- showPopover = _usePopoverContext3.showPopover,
273
- attributes = _usePopoverContext3.attributes,
274
- styles = _usePopoverContext3.styles,
275
- popoverContentProps = _usePopoverContext3.popoverContentProps;
302
+ showPopover = _usePopoverContext3.showPopover,
303
+ attributes = _usePopoverContext3.attributes,
304
+ styles = _usePopoverContext3.styles,
305
+ popoverContentProps = _usePopoverContext3.popoverContentProps;
306
+
276
307
  var props = popoverContentProps({
277
308
  ref: ref
278
309
  });
@@ -284,37 +315,46 @@ var PopoverContent = /*#__PURE__*/React__default["default"].forwardRef(function
284
315
  "aria-hidden": !showPopover
285
316
  }, attributes.styles, props), children);
286
317
  });
318
+
287
319
  function elementContainsEventTarget(element, event) {
288
320
  if (!element) {
289
321
  return false;
290
322
  }
323
+
291
324
  if (element.contains(event.target)) {
292
325
  return true;
293
- }
294
- // For elements inside a Shadow DOM we need to check the composedPath
326
+ } // For elements inside a Shadow DOM we need to check the composedPath
327
+
328
+
295
329
  if (event.composed && event.composedPath) {
296
330
  var contains = event.composedPath().find(function (target) {
297
331
  if (target === window) {
298
332
  return false;
299
333
  }
334
+
300
335
  return element.contains(target);
301
336
  });
302
337
  return contains ? true : false;
303
338
  }
339
+
304
340
  return false;
305
341
  }
342
+
306
343
  function elementContainsElement(parent, child) {
307
344
  if (!parent) return false;
308
345
  return parent === child || parent.contains(child);
309
346
  }
347
+
310
348
  function useOnClickOutside(ref, buttonRef, handler) {
311
349
  React__default["default"].useEffect(function () {
312
350
  var listener = function listener(event) {
313
351
  if (elementContainsEventTarget(ref.current, event) || elementContainsEventTarget(buttonRef.current, event)) {
314
352
  return;
315
353
  }
354
+
316
355
  handler();
317
356
  };
357
+
318
358
  document.addEventListener('mousedown', listener);
319
359
  document.addEventListener('touchstart', listener);
320
360
  return function () {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.development.js","sources":["../src/Tooltip.tsx","../src/Popover.tsx","../src/index.tsx"],"sourcesContent":["import React, { cloneElement, useState } from 'react';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport classNames from 'classnames';\nimport { useRandomId } from '@entur/utils';\nimport { Placement as PopperPlacementProps } from '@popperjs/core';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement:\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'left'\n | 'right'\n | 'bottom-left' // bottom-start\n | 'bottom'\n | 'bottom-right'; // bottom-end\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltipen skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'error';\n /** En array av modifiers som sendes til Popper, rammeverket som brukes til plassering av Tooltip\n * @default [{ name: 'offset', options: { offset: [0, 10]} }]\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n showCloseButton = true,\n variant,\n popperModifiers = [\n {\n name: 'offset',\n options: { offset: [0, 10] },\n },\n ],\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen || false);\n let hoverTimer: number;\n\n const handleOpen: (event: React.MouseEvent) => void = event => {\n event.persist();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- Typescript interprets this differently depending on whether it's run in Jest or not\n // @ts-ignore -- for some reason, the type checker thinks that this setTimeout is run in node; it is not, because it is run in the browser\n hoverTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n const onMouseExit: () => void = () => {\n setShowTooltip(false);\n clearTimeout(hoverTimer);\n };\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverTimer);\n };\n });\n\n const tooltipId = useRandomId('eds-tooltip');\n React.useEffect(() => {\n setShowTooltip(isOpen);\n }, [isOpen]);\n\n React.useEffect(() => {\n if (!content) {\n setShowTooltip(false);\n }\n }, [content]);\n\n let popperPlacement = placement as PopperPlacementProps;\n if (placement.includes('-')) {\n if (placement.includes('right')) {\n popperPlacement = placement.replace(\n 'right',\n 'end',\n ) as PopperPlacementProps;\n }\n if (placement.includes('left')) {\n popperPlacement = placement.replace(\n 'left',\n 'start',\n ) as PopperPlacementProps;\n }\n }\n\n const childProps: {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n } = {};\n childProps['aria-describedby'] = tooltipId;\n if (!disableFocusListener) {\n childProps.onFocus = () => setShowTooltip(true);\n childProps.onBlur = () => setShowTooltip(false);\n }\n if (!disableHoverListener) {\n childProps.onMouseEnter = e => handleOpen(e);\n childProps.onMouseLeave = () => onMouseExit();\n }\n\n return (\n <Manager>\n <Reference>\n {({ ref }) =>\n cloneElement(children, {\n ref: ref,\n ...childProps,\n })\n }\n </Reference>\n {showTooltip && (\n <Popper\n modifiers={[{ name: 'arrow', enabled: false }, ...popperModifiers]}\n placement={popperPlacement}\n >\n {({ ref, style, placement: popperPlacement }) => (\n <div\n className={classNames(\n 'eds-tooltip',\n className,\n `eds-tooltip--${popperPlacement}`,\n { 'eds-tooltip--error': variant === 'error' },\n )}\n ref={ref}\n style={style}\n role=\"tooltip\"\n id={tooltipId}\n data-placement={popperPlacement}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n )}\n </Popper>\n )}\n </Manager>\n );\n};\n","import React, { cloneElement, createContext, useContext } from 'react';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\nimport { Contrast } from '@entur/layout';\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n}) => {\n const [showPopover, setShowPopover] = React.useState(false);\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n };\n return buttonProps;\n }, [triggerElement, showPopover]);\n\n useOnClickOutside(contentElement, triggerElement, () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsEventTarget(element: HTMLElement | null, event: Event) {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains ? true : false;\n }\n\n return false;\n}\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLDivElement>,\n buttonRef: React.RefObject<HTMLButtonElement>,\n handler: () => void,\n) {\n React.useEffect(() => {\n const listener = (event: Event) => {\n if (\n elementContainsEventTarget(ref.current, event) ||\n elementContainsEventTarget(buttonRef.current, event)\n ) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, buttonRef, handler]);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n"],"names":["Tooltip","placement","content","children","className","isOpen","disableHoverListener","disableFocusListener","showCloseButton","variant","popperModifiers","name","options","offset","rest","useState","showTooltip","setShowTooltip","hoverTimer","handleOpen","event","persist","setTimeout","onMouseExit","clearTimeout","React","useEffect","tooltipId","useRandomId","popperPlacement","includes","replace","childProps","onFocus","onBlur","onMouseEnter","e","onMouseLeave","Manager","Reference","ref","cloneElement","Popper","modifiers","enabled","style","classNames","role","id","IconButton","onClick","CloseIcon","PopoverContext","createContext","undefined","usePopoverContext","context","useContext","Error","Popover","showPopover","setShowPopover","triggerElement","useRef","contentElement","usePopper","current","styles","attributes","forceUpdate","triggerProps","useCallback","buttonProps","preventDefault","prev","useOnClickOutside","closeButtonProps","popoverContentProps","contentProps","onKeyDown","key","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","elementContainsElement","focusElementIsTrigger","isValidBlur","contextValue","Provider","value","PopoverTrigger","child","Children","only","PopoverCloseButton","PopoverContent","forwardRef","props","Contrast","popper","elementContainsEventTarget","element","contains","target","composed","composedPath","find","window","parent","buttonRef","handler","listener","document","addEventListener","removeEventListener","warnAboutMissingStyles"],"mappings":"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"}
1
+ {"version":3,"file":"tooltip.cjs.development.js","sources":["../src/Tooltip.tsx","../src/Popover.tsx","../src/index.tsx"],"sourcesContent":["import React, { cloneElement, useState } from 'react';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport classNames from 'classnames';\nimport { useRandomId } from '@entur/utils';\nimport { Placement as PopperPlacementProps } from '@popperjs/core';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement:\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'left'\n | 'right'\n | 'bottom-left' // bottom-start\n | 'bottom'\n | 'bottom-right'; // bottom-end\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltipen skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'error';\n /** En array av modifiers som sendes til Popper, rammeverket som brukes til plassering av Tooltip\n * @default [{ name: 'offset', options: { offset: [0, 10]} }]\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n showCloseButton = true,\n variant,\n popperModifiers = [\n {\n name: 'offset',\n options: { offset: [0, 10] },\n },\n ],\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen || false);\n let hoverTimer: NodeJS.Timeout;\n\n const handleOpen: (event: React.MouseEvent) => void = event => {\n event.persist();\n hoverTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n const onMouseExit: () => void = () => {\n setShowTooltip(false);\n clearTimeout(hoverTimer);\n };\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverTimer);\n };\n });\n\n const tooltipId = useRandomId('eds-tooltip');\n React.useEffect(() => {\n setShowTooltip(isOpen);\n }, [isOpen]);\n\n React.useEffect(() => {\n if (!content) {\n setShowTooltip(false);\n }\n }, [content]);\n\n let popperPlacement = placement as PopperPlacementProps;\n if (placement.includes('-')) {\n if (placement.includes('right')) {\n popperPlacement = placement.replace(\n 'right',\n 'end',\n ) as PopperPlacementProps;\n }\n if (placement.includes('left')) {\n popperPlacement = placement.replace(\n 'left',\n 'start',\n ) as PopperPlacementProps;\n }\n }\n\n const childProps: {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n } = {};\n childProps['aria-describedby'] = tooltipId;\n if (!disableFocusListener) {\n childProps.onFocus = () => setShowTooltip(true);\n childProps.onBlur = () => setShowTooltip(false);\n }\n if (!disableHoverListener) {\n childProps.onMouseEnter = e => handleOpen(e);\n childProps.onMouseLeave = () => onMouseExit();\n }\n\n return (\n <Manager>\n <Reference>\n {({ ref }) =>\n cloneElement(children, {\n ref: ref,\n ...childProps,\n })\n }\n </Reference>\n {showTooltip && (\n <Popper\n modifiers={[{ name: 'arrow', enabled: false }, ...popperModifiers]}\n placement={popperPlacement}\n >\n {({ ref, style, placement: popperPlacement }) => (\n <div\n className={classNames(\n 'eds-tooltip',\n className,\n `eds-tooltip--${popperPlacement}`,\n { 'eds-tooltip--error': variant === 'error' },\n )}\n ref={ref}\n style={style}\n role=\"tooltip\"\n id={tooltipId}\n data-placement={popperPlacement}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n )}\n </Popper>\n )}\n </Manager>\n );\n};\n","import React, { cloneElement, createContext, useContext } from 'react';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\nimport { Contrast } from '@entur/layout';\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n}) => {\n const [showPopover, setShowPopover] = React.useState(false);\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n };\n return buttonProps;\n }, [triggerElement, showPopover]);\n\n useOnClickOutside(contentElement, triggerElement, () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsEventTarget(element: HTMLElement | null, event: Event) {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains ? true : false;\n }\n\n return false;\n}\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLDivElement>,\n buttonRef: React.RefObject<HTMLButtonElement>,\n handler: () => void,\n) {\n React.useEffect(() => {\n const listener = (event: Event) => {\n if (\n elementContainsEventTarget(ref.current, event) ||\n elementContainsEventTarget(buttonRef.current, event)\n ) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, buttonRef, handler]);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n"],"names":["Tooltip","placement","content","children","className","isOpen","disableHoverListener","disableFocusListener","showCloseButton","variant","popperModifiers","name","options","offset","rest","useState","showTooltip","setShowTooltip","hoverTimer","handleOpen","event","persist","setTimeout","onMouseExit","clearTimeout","React","useEffect","tooltipId","useRandomId","popperPlacement","includes","replace","childProps","onFocus","onBlur","onMouseEnter","e","onMouseLeave","Manager","Reference","ref","cloneElement","Popper","modifiers","enabled","style","classNames","role","id","IconButton","onClick","CloseIcon","PopoverContext","createContext","undefined","usePopoverContext","context","useContext","Error","Popover","showPopover","setShowPopover","triggerElement","useRef","contentElement","usePopper","current","styles","attributes","forceUpdate","triggerProps","useCallback","buttonProps","preventDefault","prev","useOnClickOutside","closeButtonProps","popoverContentProps","contentProps","onKeyDown","key","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","elementContainsElement","focusElementIsTrigger","isValidBlur","contextValue","Provider","value","PopoverTrigger","child","Children","only","PopoverCloseButton","PopoverContent","forwardRef","props","Contrast","popper","elementContainsEventTarget","element","contains","target","composed","composedPath","find","window","parent","buttonRef","handler","listener","document","addEventListener","removeEventListener","warnAboutMissingStyles"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.production.min.js","sources":["../src/Popover.tsx","../src/index.tsx","../src/Tooltip.tsx"],"sourcesContent":["import React, { cloneElement, createContext, useContext } from 'react';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\nimport { Contrast } from '@entur/layout';\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n}) => {\n const [showPopover, setShowPopover] = React.useState(false);\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n };\n return buttonProps;\n }, [triggerElement, showPopover]);\n\n useOnClickOutside(contentElement, triggerElement, () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsEventTarget(element: HTMLElement | null, event: Event) {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains ? true : false;\n }\n\n return false;\n}\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLDivElement>,\n buttonRef: React.RefObject<HTMLButtonElement>,\n handler: () => void,\n) {\n React.useEffect(() => {\n const listener = (event: Event) => {\n if (\n elementContainsEventTarget(ref.current, event) ||\n elementContainsEventTarget(buttonRef.current, event)\n ) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, buttonRef, handler]);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n","import React, { cloneElement, useState } from 'react';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport classNames from 'classnames';\nimport { useRandomId } from '@entur/utils';\nimport { Placement as PopperPlacementProps } from '@popperjs/core';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement:\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'left'\n | 'right'\n | 'bottom-left' // bottom-start\n | 'bottom'\n | 'bottom-right'; // bottom-end\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltipen skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'error';\n /** En array av modifiers som sendes til Popper, rammeverket som brukes til plassering av Tooltip\n * @default [{ name: 'offset', options: { offset: [0, 10]} }]\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n showCloseButton = true,\n variant,\n popperModifiers = [\n {\n name: 'offset',\n options: { offset: [0, 10] },\n },\n ],\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen || false);\n let hoverTimer: number;\n\n const handleOpen: (event: React.MouseEvent) => void = event => {\n event.persist();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- Typescript interprets this differently depending on whether it's run in Jest or not\n // @ts-ignore -- for some reason, the type checker thinks that this setTimeout is run in node; it is not, because it is run in the browser\n hoverTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n const onMouseExit: () => void = () => {\n setShowTooltip(false);\n clearTimeout(hoverTimer);\n };\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverTimer);\n };\n });\n\n const tooltipId = useRandomId('eds-tooltip');\n React.useEffect(() => {\n setShowTooltip(isOpen);\n }, [isOpen]);\n\n React.useEffect(() => {\n if (!content) {\n setShowTooltip(false);\n }\n }, [content]);\n\n let popperPlacement = placement as PopperPlacementProps;\n if (placement.includes('-')) {\n if (placement.includes('right')) {\n popperPlacement = placement.replace(\n 'right',\n 'end',\n ) as PopperPlacementProps;\n }\n if (placement.includes('left')) {\n popperPlacement = placement.replace(\n 'left',\n 'start',\n ) as PopperPlacementProps;\n }\n }\n\n const childProps: {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n } = {};\n childProps['aria-describedby'] = tooltipId;\n if (!disableFocusListener) {\n childProps.onFocus = () => setShowTooltip(true);\n childProps.onBlur = () => setShowTooltip(false);\n }\n if (!disableHoverListener) {\n childProps.onMouseEnter = e => handleOpen(e);\n childProps.onMouseLeave = () => onMouseExit();\n }\n\n return (\n <Manager>\n <Reference>\n {({ ref }) =>\n cloneElement(children, {\n ref: ref,\n ...childProps,\n })\n }\n </Reference>\n {showTooltip && (\n <Popper\n modifiers={[{ name: 'arrow', enabled: false }, ...popperModifiers]}\n placement={popperPlacement}\n >\n {({ ref, style, placement: popperPlacement }) => (\n <div\n className={classNames(\n 'eds-tooltip',\n className,\n `eds-tooltip--${popperPlacement}`,\n { 'eds-tooltip--error': variant === 'error' },\n )}\n ref={ref}\n style={style}\n role=\"tooltip\"\n id={tooltipId}\n data-placement={popperPlacement}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n )}\n </Popper>\n )}\n </Manager>\n );\n};\n"],"names":["PopoverContext","createContext","undefined","usePopoverContext","context","useContext","Error","PopoverContent","React","forwardRef","ref","children","showPopover","attributes","styles","props","popoverContentProps","Contrast","className","classNames","style","popper","elementContainsEventTarget","element","event","contains","target","composed","composedPath","find","window","elementContainsElement","parent","child","warnAboutMissingStyles","_ref$placement","placement","useState","setShowPopover","triggerElement","useRef","contentElement","usePopper","current","modifiers","name","enabled","options","offset","forceUpdate","useEffect","buttonRef","handler","triggerProps","useCallback","onClick","e","preventDefault","prev","listener","document","addEventListener","removeEventListener","closeButtonProps","role","onKeyDown","key","onBlur","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","focusElementIsTrigger","Provider","value","rest","cloneElement","Children","only","hoverTimer","content","_ref$isOpen","isOpen","_ref$disableHoverList","disableHoverListener","_ref$disableFocusList","disableFocusListener","_ref$showCloseButton","showCloseButton","variant","_ref$popperModifiers","popperModifiers","showTooltip","setShowTooltip","clearTimeout","tooltipId","useRandomId","popperPlacement","includes","replace","childProps","onFocus","onMouseEnter","persist","setTimeout","onMouseLeave","Manager","Reference","Popper","id","IconButton","CloseIcon"],"mappings":"80BAyBMA,EAAiBC,qBACrBC,GAEIC,EAAoB,WACxB,IAAMC,EAAUC,aAAWL,GAC3B,GAAe,MAAXI,EACF,MAAME,MAAM,oDAEd,OAAOF,GA+IIG,EAAiBC,UAAMC,YAGlC,WAAeC,OAAZC,IAAAA,WAEDR,IADMS,IAAAA,YAAaC,IAAAA,WAAYC,IAAAA,OAE3BC,GAAQC,IAF2BA,qBAEP,CAAEN,IAAAA,IACpC,OACEF,wBAACS,cACCC,UAAWC,UACT,cACA,CACE,uBAAwBP,GAE1B,gBAEFQ,MAAON,EAAOO,sBACAT,GACVC,EAAWC,OACXC,GAEHJ,MAKP,SAASW,EAA2BC,EAA6BC,GAC/D,SAAKD,KAIDA,EAAQE,SAASD,EAAME,SAKvBF,EAAMG,UAAYH,EAAMI,cACTJ,EAAMI,eAAeC,MAAK,SAAAH,GACzC,OAAIA,IAAWI,QAGRP,EAAQE,SAASC,QAQ9B,SAASK,EACPC,EACAC,GAEA,QAAKD,IACEA,IAAWC,GAASD,EAAOP,SAASQ,ICnO7CC,yBAAuB,2BD0CwB,gBAC7CvB,IAAAA,SAAQwB,IACRC,UAAAA,aAAY,mBAE0B5B,UAAM6B,UAAS,GAA9CzB,OAAa0B,OACdC,EAAiB/B,UAAMgC,OAAO,MAC9BC,EAAiBjC,UAAMgC,OAAO,QAEQE,YAC1CH,EAAeI,QACfF,EAAeE,QACf,CACEC,UAAW,CACT,CAAEC,KAAM,QAASC,SAAS,GAC1B,CACED,KAAM,SACNE,QAAS,CACPC,OAAQ,CAAC,EAAG,MAIlBZ,UAAWA,IAbPtB,IAAAA,OAAQD,IAAAA,WAAYoC,IAAAA,YAiB5BzC,UAAM0C,WAAU,WACVD,GACFA,MAED,CAACrC,EAAaqC,IAEjB,IA8JAvC,EACAyC,EACAC,EAhKMC,EAAe7C,UAAM8C,aAAY,WAUrC,MAToB,CAClBC,QAAS,SAACC,GACRA,EAAEC,iBACFnB,GAAe,SAAAoB,GAAI,OAAKA,MAE1B,gBAAiB,SACjB,gBAAiB9C,EACjBF,IAAK6B,KAGN,CAACA,EAAgB3B,IAuJpBJ,UAAM0C,WAAU,WACd,IAAMS,EAAW,SAACnC,GAEdF,EAA2BZ,EAAIiC,QAASnB,IACxCF,EAA2B6B,EAAUR,QAASnB,IAKhD4B,KAMF,OAHAQ,SAASC,iBAAiB,YAAaF,GACvCC,SAASC,iBAAiB,aAAcF,GAEjC,WACLC,SAASE,oBAAoB,YAAaH,GAC1CC,SAASE,oBAAoB,aAAcH,MAE5C,CAvBHjD,EAjJkB+B,EAkJlBU,EAlJkCZ,EAmJlCa,EAnJkD,WAAA,OAChDd,GAAe,MAEjB,IAAMyB,EAAmB,CACvBR,QAAS,SAACC,GACRA,EAAEC,iBACFnB,GAAe,KAGbtB,EAAsBR,UAAM8C,aAAY,WA8B5C,MA7BqB,CACnBU,KAAM,SACN,aAAc,QACdtD,IAAK+B,EACLwB,UAAW,SAACzC,GACQ,WAAdA,EAAM0C,KACRtD,GAAe0B,GAAe,IAGlC6B,OAAQ,SAAC3C,GACP,IAAM4C,EAAwB5C,EAAM6C,cAEpC,GACGD,GACkD,OAAnDA,EAAsBE,aAAa,YAFrC,CAKA,IAAMC,EAAwBxC,EAC5BU,EAAeE,QACfyB,GAEII,EAAwBzC,EAC5BQ,EAAeI,QACfyB,GAGExD,IADiB2D,IAA0BC,GACflC,GAAe,QAIlD,CAACG,EAAgB7B,IAWpB,OACEJ,wBAACR,EAAeyE,UAASC,MAXe,CACxC9D,YAAAA,EACA2B,eAAAA,EACAE,eAAAA,EACA3B,OAAAA,EACAD,WAAAA,EACAG,oBAAAA,EACA+C,iBAAAA,EACAV,aAAAA,IAIG1C,+BAqB8D,gBACnEA,IAAAA,SACGgE,WAE0BxE,IAC7B,OAAOyE,eAAajE,SADZoD,iBACgDY,qDAhBG,gBAAGhE,IAAAA,SACtD0C,EAAiBlD,IAAjBkD,aACFpB,EAAQzB,UAAMqE,SAASC,KAAKnE,GAClC,OAAOiE,eAAa3C,EAAOoB,sBEhGkB,gBAmBzC0B,EAlBJ3C,IAAAA,UACA4C,IAAAA,QACArE,IAAAA,SACAO,IAAAA,UAAS+D,IACTC,OAAAA,gBAAcC,IACdC,qBAAAA,gBAA4BC,IAC5BC,qBAAAA,gBAA4BC,IAC5BC,gBAAAA,gBACAC,IAAAA,QAAOC,IACPC,gBAAAA,aAAkB,CAChB,CACE9C,KAAM,SACNE,QAAS,CAAEC,OAAQ,CAAC,EAAG,SAGxB2B,WAEmCtC,WAAS6C,IAAU,GAAlDU,OAAaC,OAepBrF,UAAM0C,WAAU,WACd,OAAO,WACL4C,aAAaf,OAIjB,IAAMgB,EAAYC,cAAY,eAC9BxF,UAAM0C,WAAU,WACd2C,EAAeX,KACd,CAACA,IAEJ1E,UAAM0C,WAAU,WACT8B,GACHa,GAAe,KAEhB,CAACb,IAEJ,IAAIiB,EAAkB7D,EAClBA,EAAU8D,SAAS,OACjB9D,EAAU8D,SAAS,WACrBD,EAAkB7D,EAAU+D,QAC1B,QACA,QAGA/D,EAAU8D,SAAS,UACrBD,EAAkB7D,EAAU+D,QAC1B,OACA,WAKN,IAAMC,EAMF,GAWJ,OAVAA,EAAW,oBAAsBL,EAC5BT,IACHc,EAAWC,QAAU,WAAA,OAAMR,GAAe,IAC1CO,EAAWjC,OAAS,WAAA,OAAM0B,GAAe,KAEtCT,IACHgB,EAAWE,aAAe,SAAA9C,GAAC,OAAeA,EAzDpC+C,eAGNxB,EAAayB,YAAW,WACtBX,GAAe,KACd,OAqDHO,EAAWK,aAAe,WAAA,OAlD1BZ,GAAe,QACfC,aAAaf,KAqDbvE,wBAACkG,eACClG,wBAACmG,kBACE,YAAM,OACL/B,eAAajE,KACXD,MAFAA,KAGG0F,OAIRR,GACCpF,wBAACoG,UACChE,WAAY,CAAEC,KAAM,QAASC,SAAS,WAAY6C,GAClDvD,UAAW6D,IAEV,YAAA,IAAGvF,IAAAA,IAAKU,IAAAA,MAAkB6E,IAAX7D,UAAS,OACvB5B,iCACEU,UAAWC,UACT,cACAD,kBACgB+E,EAChB,CAAE,qBAAkC,UAAZR,IAE1B/E,IAAKA,EACLU,MAAOA,EACP4C,KAAK,UACL6C,GAAId,mBACYE,GACZtB,GAEHK,EACAE,GAAUM,GACThF,wBAACsG,cACC5F,UAAU,4BACVqC,QAAS,WAAA,OAAMsC,GAAe,KAE9BrF,wBAACuG"}
1
+ {"version":3,"file":"tooltip.cjs.production.min.js","sources":["../src/Popover.tsx","../src/index.tsx","../src/Tooltip.tsx"],"sourcesContent":["import React, { cloneElement, createContext, useContext } from 'react';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\nimport { Contrast } from '@entur/layout';\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n}) => {\n const [showPopover, setShowPopover] = React.useState(false);\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n };\n return buttonProps;\n }, [triggerElement, showPopover]);\n\n useOnClickOutside(contentElement, triggerElement, () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsEventTarget(element: HTMLElement | null, event: Event) {\n if (!element) {\n return false;\n }\n\n if (element.contains(event.target as Node)) {\n return true;\n }\n\n // For elements inside a Shadow DOM we need to check the composedPath\n if (event.composed && event.composedPath) {\n const contains = event.composedPath().find(target => {\n if (target === window) {\n return false;\n }\n return element.contains(target as Node);\n });\n return contains ? true : false;\n }\n\n return false;\n}\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLDivElement>,\n buttonRef: React.RefObject<HTMLButtonElement>,\n handler: () => void,\n) {\n React.useEffect(() => {\n const listener = (event: Event) => {\n if (\n elementContainsEventTarget(ref.current, event) ||\n elementContainsEventTarget(buttonRef.current, event)\n ) {\n return;\n }\n\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, buttonRef, handler]);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n","import React, { cloneElement, useState } from 'react';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport classNames from 'classnames';\nimport { useRandomId } from '@entur/utils';\nimport { Placement as PopperPlacementProps } from '@popperjs/core';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement:\n | 'top'\n | 'top-left'\n | 'top-right'\n | 'left'\n | 'right'\n | 'bottom-left' // bottom-start\n | 'bottom'\n | 'bottom-right'; // bottom-end\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltipen skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'error';\n /** En array av modifiers som sendes til Popper, rammeverket som brukes til plassering av Tooltip\n * @default [{ name: 'offset', options: { offset: [0, 10]} }]\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n showCloseButton = true,\n variant,\n popperModifiers = [\n {\n name: 'offset',\n options: { offset: [0, 10] },\n },\n ],\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen || false);\n let hoverTimer: NodeJS.Timeout;\n\n const handleOpen: (event: React.MouseEvent) => void = event => {\n event.persist();\n hoverTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n const onMouseExit: () => void = () => {\n setShowTooltip(false);\n clearTimeout(hoverTimer);\n };\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverTimer);\n };\n });\n\n const tooltipId = useRandomId('eds-tooltip');\n React.useEffect(() => {\n setShowTooltip(isOpen);\n }, [isOpen]);\n\n React.useEffect(() => {\n if (!content) {\n setShowTooltip(false);\n }\n }, [content]);\n\n let popperPlacement = placement as PopperPlacementProps;\n if (placement.includes('-')) {\n if (placement.includes('right')) {\n popperPlacement = placement.replace(\n 'right',\n 'end',\n ) as PopperPlacementProps;\n }\n if (placement.includes('left')) {\n popperPlacement = placement.replace(\n 'left',\n 'start',\n ) as PopperPlacementProps;\n }\n }\n\n const childProps: {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n } = {};\n childProps['aria-describedby'] = tooltipId;\n if (!disableFocusListener) {\n childProps.onFocus = () => setShowTooltip(true);\n childProps.onBlur = () => setShowTooltip(false);\n }\n if (!disableHoverListener) {\n childProps.onMouseEnter = e => handleOpen(e);\n childProps.onMouseLeave = () => onMouseExit();\n }\n\n return (\n <Manager>\n <Reference>\n {({ ref }) =>\n cloneElement(children, {\n ref: ref,\n ...childProps,\n })\n }\n </Reference>\n {showTooltip && (\n <Popper\n modifiers={[{ name: 'arrow', enabled: false }, ...popperModifiers]}\n placement={popperPlacement}\n >\n {({ ref, style, placement: popperPlacement }) => (\n <div\n className={classNames(\n 'eds-tooltip',\n className,\n `eds-tooltip--${popperPlacement}`,\n { 'eds-tooltip--error': variant === 'error' },\n )}\n ref={ref}\n style={style}\n role=\"tooltip\"\n id={tooltipId}\n data-placement={popperPlacement}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n )}\n </Popper>\n )}\n </Manager>\n );\n};\n"],"names":["PopoverContext","createContext","undefined","usePopoverContext","context","useContext","Error","PopoverContent","React","forwardRef","ref","children","showPopover","attributes","styles","props","popoverContentProps","Contrast","className","classNames","style","popper","elementContainsEventTarget","element","event","contains","target","composed","composedPath","find","window","elementContainsElement","parent","child","warnAboutMissingStyles","placement","useState","setShowPopover","triggerElement","useRef","contentElement","usePopper","current","modifiers","name","enabled","options","offset","forceUpdate","useEffect","buttonRef","handler","triggerProps","useCallback","onClick","e","preventDefault","prev","listener","document","addEventListener","removeEventListener","closeButtonProps","role","onKeyDown","key","onBlur","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","focusElementIsTrigger","Provider","value","rest","cloneElement","Children","only","hoverTimer","content","isOpen","disableHoverListener","disableFocusListener","showCloseButton","variant","popperModifiers","showTooltip","setShowTooltip","clearTimeout","tooltipId","useRandomId","popperPlacement","includes","replace","childProps","onFocus","onMouseEnter","persist","setTimeout","onMouseLeave","Manager","Reference","Popper","id","IconButton","CloseIcon"],"mappings":"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"}