@loomhq/lens 10.54.0 → 10.54.2

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.
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  declare type DelaySpeed = 'immediate' | 'long';
3
3
  declare const TooltipBoxWrapper: import("@emotion/styled-base").StyledComponent<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, TooltipBoxProps, object>;
4
4
  export declare const TooltipBox: ({ children, maxWidth, onMouseEnter, onMouseLeave, layerProps, zIndex, ...rest }: TooltipBoxProps & React.ComponentProps<typeof TooltipBoxWrapper>) => JSX.Element;
5
- declare const Tooltip: ({ children, content, placement, keepOpen, triggerOffset, maxWidth, isInline, isDisabled, container, zIndex, verticalAlign, delay, ...rest }: TooltipProps) => JSX.Element;
5
+ declare const Tooltip: ({ children, content, placement, keepOpen, triggerOffset, maxWidth, isInline, isDisabled, container, tabIndex, zIndex, verticalAlign, delay, ...rest }: TooltipProps) => JSX.Element;
6
6
  export declare const availablePlacements: string[];
7
7
  declare type TooltipBoxProps = {
8
8
  children?: React.ReactNode;
@@ -9,13 +9,12 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React, { useState, useRef } from 'react';
12
+ import React, { useState, useRef, useEffect } from 'react';
13
13
  import { getColorValue, getFontWeight, getRadius, getShadow, getSize, getTextSize, u, } from '../../utilities';
14
14
  import { useHover, useLayer, mergeRefs } from 'react-laag';
15
15
  import ResizeObserver from 'resize-observer-polyfill';
16
16
  import styled from '@emotion/styled';
17
17
  import { textSizes } from '../../variables';
18
- import useFocusedElement from '../../hooks/use-focused-element';
19
18
  const placements = {
20
19
  topLeft: 'top-start',
21
20
  topCenter: 'top-center',
@@ -64,17 +63,60 @@ function getInitialDelaySpeed(delay) {
64
63
  }
65
64
  }
66
65
  const Tooltip = (_a) => {
67
- var { children, content, placement = 'topCenter', keepOpen, triggerOffset = 4, maxWidth = 26, isInline = true, isDisabled, container, zIndex = 1100, verticalAlign = 'middle', delay = 'immediate' } = _a, rest = __rest(_a, ["children", "content", "placement", "keepOpen", "triggerOffset", "maxWidth", "isInline", "isDisabled", "container", "zIndex", "verticalAlign", "delay"]);
66
+ var { children, content, placement = 'topCenter', keepOpen, triggerOffset = 4, maxWidth = 26, isInline = true, isDisabled, container, tabIndex = 0, zIndex = 1100, verticalAlign = 'middle', delay = 'immediate' } = _a, rest = __rest(_a, ["children", "content", "placement", "keepOpen", "triggerOffset", "maxWidth", "isInline", "isDisabled", "container", "tabIndex", "zIndex", "verticalAlign", "delay"]);
68
67
  const [show, hoverProps] = useHover({
69
68
  delayEnter: getInitialDelaySpeed(delay),
70
69
  delayLeave: 100,
71
70
  });
72
71
  const [isOverTooltip, setIsOverTooltip] = useState(false);
72
+ const [isOpen, setIsOpen] = useState(false);
73
73
  const focusRef = useRef();
74
- const isFocused = useFocusedElement(focusRef);
74
+ const isTooltipDisabled = !content || isDisabled;
75
75
  // show the tooltip if a user has focused or hovered on it AND it is not disabled
76
- const isOpen = (content && (show || (isOverTooltip && keepOpen)) && !isDisabled) ||
77
- (content && isFocused && !isDisabled);
76
+ useEffect(() => {
77
+ const keepTooltipOpenOnHover = isOverTooltip && keepOpen;
78
+ if (isTooltipDisabled) {
79
+ return;
80
+ }
81
+ if (show || keepTooltipOpenOnHover) {
82
+ setIsOpen(true);
83
+ }
84
+ // We have to watch this separately since hover and focus are managed separately. So, an element can be keyboard focused while another element is mouse hovered.
85
+ if (!show) {
86
+ setIsOpen(false);
87
+ }
88
+ }, [
89
+ content,
90
+ isDisabled,
91
+ isOverTooltip,
92
+ isTooltipDisabled,
93
+ keepOpen,
94
+ setIsOpen,
95
+ show,
96
+ ]);
97
+ const handleFocus = () => {
98
+ if (!isTooltipDisabled) {
99
+ setIsOpen(true);
100
+ }
101
+ };
102
+ const handleBlur = () => {
103
+ setIsOpen(false);
104
+ };
105
+ useEffect(() => {
106
+ if (!isOpen) {
107
+ return;
108
+ }
109
+ const keyListener = e => {
110
+ if (e.key === 'Escape') {
111
+ e.preventDefault();
112
+ handleBlur();
113
+ }
114
+ };
115
+ window.addEventListener('keydown', keyListener);
116
+ return () => {
117
+ window.removeEventListener('keydown', keyListener);
118
+ };
119
+ }, [isOpen, setIsOpen]);
78
120
  const { layerProps, triggerProps, renderLayer } = useLayer({
79
121
  isOpen,
80
122
  placement: placements[placement],
@@ -84,7 +126,7 @@ const Tooltip = (_a) => {
84
126
  auto: true,
85
127
  });
86
128
  return (React.createElement(React.Fragment, null,
87
- React.createElement(TooltipChildren, Object.assign({}, triggerProps, hoverProps, { isInline: isInline, verticalAlign: verticalAlign, tabIndex: isDisabled ? -1 : 0, ref: mergeRefs(triggerProps.ref, focusRef) }), children),
129
+ React.createElement(TooltipChildren, Object.assign({}, triggerProps, hoverProps, { onFocus: handleFocus, onBlur: handleBlur, isInline: isInline, verticalAlign: verticalAlign, tabIndex: isTooltipDisabled ? -1 : tabIndex, ref: mergeRefs(triggerProps.ref, focusRef) }), children),
88
130
  isOpen &&
89
131
  renderLayer(React.createElement("div", Object.assign({}, layerProps, { style: Object.assign(Object.assign({}, layerProps.style), { zIndex }) }),
90
132
  React.createElement(TooltipBox, Object.assign({ maxWidth: maxWidth, onMouseEnter: () => setIsOverTooltip(true), onMouseLeave: () => setIsOverTooltip(false) }, rest), content)))));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loomhq/lens",
3
- "version": "10.54.0",
3
+ "version": "10.54.2",
4
4
  "scripts": {
5
5
  "dev": "next",
6
6
  "build:next": "next build",