@redocly/theme 0.1.32 → 0.1.33

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.
@@ -44,7 +44,9 @@ var styled_components_1 = __importStar(require("styled-components"));
44
44
  var hooks_1 = require("../hooks");
45
45
  function TooltipComponent(_a) {
46
46
  var children = _a.children, isOpen = _a.isOpen, tip = _a.tip, _b = _a.withArrow, withArrow = _b === void 0 ? true : _b, _c = _a.placement, placement = _c === void 0 ? 'top' : _c, _d = _a.className, className = _d === void 0 ? 'default' : _d, width = _a.width, dataTestId = _a.dataTestId;
47
+ var ref = (0, react_1.useRef)(null);
47
48
  var _e = (0, hooks_1.useControl)(isOpen), isOpened = _e.isOpened, handleOpen = _e.handleOpen, handleClose = _e.handleClose;
49
+ (0, hooks_1.useOutsideClick)(ref, handleClose);
48
50
  var isControlled = isOpen !== undefined;
49
51
  (0, react_1.useEffect)(function () {
50
52
  if (isControlled) {
@@ -61,7 +63,7 @@ function TooltipComponent(_a) {
61
63
  onMouseLeave: handleClose,
62
64
  onClick: handleClose,
63
65
  };
64
- return (react_1.default.createElement(TooltipWrapper, __assign({}, controllers, { className: "tooltip-".concat(className), "data-component-name": "Tooltip/Tooltip" }),
66
+ return (react_1.default.createElement(TooltipWrapper, __assign({ ref: ref }, controllers, { className: "tooltip-".concat(className), "data-component-name": "Tooltip/Tooltip" }),
65
67
  children,
66
68
  isOpened && (react_1.default.createElement(TooltipBody, { "data-cy": dataTestId || (typeof tip === 'string' ? tip : ''), placement: placement, width: width, withArrow: withArrow }, tip))));
67
69
  }
@@ -86,7 +88,7 @@ var PLACEMENTS = {
86
88
  }),
87
89
  };
88
90
  var TooltipWrapper = styled_components_1.default.div(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n position: relative;\n display: inline-block;\n"], ["\n position: relative;\n display: inline-block;\n"])));
89
- var TooltipBody = styled_components_1.default.span(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n pointer-events: none;\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"], ["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n pointer-events: none;\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"])), function (_a) {
91
+ var TooltipBody = styled_components_1.default.span(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"], ["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"])), function (_a) {
90
92
  var width = _a.width;
91
93
  return width || '120px';
92
94
  }, function (_a) {
package/hooks/index.d.ts CHANGED
@@ -5,3 +5,4 @@ export * from '../hooks/useActiveHeading';
5
5
  export * from '../hooks/useActiveSectionId';
6
6
  export * from '../hooks/useFullHeight';
7
7
  export * from '../hooks/useNavbarHeight';
8
+ export * from '../hooks/useOutsideClick';
package/hooks/index.js CHANGED
@@ -21,3 +21,4 @@ __exportStar(require("../hooks/useActiveHeading"), exports);
21
21
  __exportStar(require("../hooks/useActiveSectionId"), exports);
22
22
  __exportStar(require("../hooks/useFullHeight"), exports);
23
23
  __exportStar(require("../hooks/useNavbarHeight"), exports);
24
+ __exportStar(require("../hooks/useOutsideClick"), exports);
@@ -0,0 +1,2 @@
1
+ import { MutableRefObject } from 'react';
2
+ export declare function useOutsideClick(ref: MutableRefObject<HTMLElement | null>, handler: (event: MouseEvent | TouchEvent) => void): void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOutsideClick = void 0;
4
+ var react_1 = require("react");
5
+ function useOutsideClick(ref, handler) {
6
+ (0, react_1.useEffect)(function () {
7
+ var listener = function (event) {
8
+ if (!ref.current || ref.current.contains(event.target)) {
9
+ return;
10
+ }
11
+ handler(event);
12
+ };
13
+ document.addEventListener('mousedown', listener);
14
+ document.addEventListener('touchstart', listener);
15
+ return function () {
16
+ document.removeEventListener('mousedown', listener);
17
+ document.removeEventListener('touchstart', listener);
18
+ };
19
+ }, [ref, handler]);
20
+ }
21
+ exports.useOutsideClick = useOutsideClick;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.1.32",
3
+ "version": "0.1.33",
4
4
  "description": "Shared UI components",
5
5
  "author": "team@redocly.com",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1,8 +1,8 @@
1
1
  import type { PropsWithChildren, ReactNode } from 'react';
2
- import React, { useEffect, memo } from 'react';
2
+ import React, { useEffect, memo, useRef } from 'react';
3
3
  import styled, { css } from 'styled-components';
4
4
 
5
- import { useControl } from '@theme/hooks';
5
+ import { useControl, useOutsideClick } from '@theme/hooks';
6
6
 
7
7
  export interface TooltipProps {
8
8
  tip: string | ReactNode;
@@ -24,8 +24,11 @@ export function TooltipComponent({
24
24
  width,
25
25
  dataTestId,
26
26
  }: PropsWithChildren<TooltipProps>): JSX.Element {
27
+ const ref = useRef<HTMLDivElement | null>(null);
27
28
  const { isOpened, handleOpen, handleClose } = useControl(isOpen);
28
29
 
30
+ useOutsideClick(ref, handleClose);
31
+
29
32
  const isControlled = isOpen !== undefined;
30
33
 
31
34
  useEffect(() => {
@@ -46,6 +49,7 @@ export function TooltipComponent({
46
49
 
47
50
  return (
48
51
  <TooltipWrapper
52
+ ref={ref}
49
53
  {...controllers}
50
54
  className={`tooltip-${className}`}
51
55
  data-component-name="Tooltip/Tooltip"
@@ -169,7 +173,6 @@ const TooltipBody = styled.span<
169
173
  overflow-wrap: break-word;
170
174
 
171
175
  border-radius: var(--global-border-radius);
172
- pointer-events: none;
173
176
  transition: opacity 0.3s ease-out;
174
177
 
175
178
  font-size: 13px;
@@ -5,3 +5,4 @@ export * from '@theme/hooks/useActiveHeading';
5
5
  export * from '@theme/hooks/useActiveSectionId';
6
6
  export * from '@theme/hooks/useFullHeight';
7
7
  export * from '@theme/hooks/useNavbarHeight';
8
+ export * from '@theme/hooks/useOutsideClick';
@@ -0,0 +1,21 @@
1
+ import { MutableRefObject, useEffect } from 'react';
2
+
3
+ export function useOutsideClick(
4
+ ref: MutableRefObject<HTMLElement | null>,
5
+ handler: (event: MouseEvent | TouchEvent) => void,
6
+ ): void {
7
+ useEffect(() => {
8
+ const listener = (event: MouseEvent | TouchEvent) => {
9
+ if (!ref.current || ref.current.contains(event.target as Node)) {
10
+ return;
11
+ }
12
+ handler(event);
13
+ };
14
+ document.addEventListener('mousedown', listener);
15
+ document.addEventListener('touchstart', listener);
16
+ return () => {
17
+ document.removeEventListener('mousedown', listener);
18
+ document.removeEventListener('touchstart', listener);
19
+ };
20
+ }, [ref, handler]);
21
+ }