@homecode/ui 5.3.12 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/esm/index.js +1 -0
  2. package/dist/esm/src/components/Autocomplete/Autocomplete.js +2 -1
  3. package/dist/esm/src/components/InputFile/InputFile.js +2 -1
  4. package/dist/esm/src/components/Table/Table.js +2 -2
  5. package/dist/esm/src/components/Table/Table.styl.js +2 -2
  6. package/dist/esm/src/components/TextWithDeferTooltip/TextWithDeferTooltip.js +36 -0
  7. package/dist/esm/src/components/TextWithDeferTooltip/TextWithDeferTooltip.styl.js +7 -0
  8. package/dist/esm/src/components/Tooltip/Tooltip.js +9 -80
  9. package/dist/esm/src/components/Tooltip/Tooltip.styl.js +2 -2
  10. package/dist/esm/src/components/Tooltip/TooltipCore.js +19 -0
  11. package/dist/esm/src/components/Tooltip/TooltipOverTrigger.js +133 -0
  12. package/dist/esm/src/components/Tooltip/TooltipSimple.js +66 -0
  13. package/dist/esm/types/src/components/Table/Table.types.d.ts +1 -1
  14. package/dist/esm/types/src/components/TextWithDeferTooltip/TextWithDeferTooltip.d.ts +3 -0
  15. package/dist/esm/types/src/components/TextWithDeferTooltip/TextWithDeferTooltip.types.d.ts +9 -0
  16. package/dist/esm/types/src/components/TextWithDeferTooltip/index.d.ts +2 -0
  17. package/dist/esm/types/src/components/Tooltip/Tooltip.d.ts +2 -1
  18. package/dist/esm/types/src/components/Tooltip/TooltipCore.d.ts +21 -0
  19. package/dist/esm/types/src/components/Tooltip/TooltipOverTrigger.d.ts +4 -0
  20. package/dist/esm/types/src/components/Tooltip/TooltipSimple.d.ts +3 -0
  21. package/dist/esm/types/src/components/index.d.ts +1 -0
  22. package/graphify-out/.graphify_labels.json +0 -16
  23. package/graphify-out/2026-07-06/.graphify_labels.json +205 -0
  24. package/graphify-out/2026-07-06/GRAPH_REPORT.md +982 -0
  25. package/graphify-out/2026-07-06/cost.json +12 -0
  26. package/graphify-out/2026-07-06/graph.json +69192 -0
  27. package/graphify-out/2026-07-06/manifest.json +2262 -0
  28. package/graphify-out/GRAPH_REPORT.md +144 -186
  29. package/graphify-out/cache/ast/bed2f246f6c9c3ea5684794da1d417f0b93566753c0a3d0e754c68004dc2c09d.json +1 -0
  30. package/graphify-out/cache/ast/c041441cf64e84e32561e522d6d368ea363be52429220a3310c91a358c1a0871.json +1 -0
  31. package/graphify-out/cache/stat-index.json +1 -1
  32. package/graphify-out/graph.html +4 -4
  33. package/graphify-out/graph.json +3564 -2548
  34. package/graphify-out/manifest.json +42 -27
  35. package/package.json +1 -1
package/dist/esm/index.js CHANGED
@@ -49,6 +49,7 @@ export { Spinner } from './src/components/Spinner/Spinner.js';
49
49
  export { Table } from './src/components/Table/Table.js';
50
50
  export { Tabs } from './src/components/Tabs/Tabs.js';
51
51
  export { TextShimmer } from './src/components/TextShimmer/TextShimmer.js';
52
+ export { TextWithDeferTooltip } from './src/components/TextWithDeferTooltip/TextWithDeferTooltip.js';
52
53
  export { Tooltip } from './src/components/Tooltip/Tooltip.js';
53
54
  export { H1, H2, H3, H4, H5, H6 } from './src/components/Text/Text.js';
54
55
  export { Theme } from './src/components/Theme/Theme.js';
@@ -25,7 +25,7 @@ import 'justorm/react';
25
25
  import 'nanoid';
26
26
  import '../Checkbox/Checkbox.styl.js';
27
27
  import '../Chip/Chip.styl.js';
28
- import '../Tooltip/Tooltip.styl.js';
28
+ import '../Tooltip/Tooltip.js';
29
29
  import '../Card/Card.js';
30
30
  import '../Container/Container.js';
31
31
  import '../DatePicker/DatePicker.styl.js';
@@ -68,6 +68,7 @@ import '../Slider/Slider.styl.js';
68
68
  import '../Table/Table.styl.js';
69
69
  import '../Tabs/Tabs.styl.js';
70
70
  import '../TextShimmer/TextShimmer.js';
71
+ import '../TextWithDeferTooltip/TextWithDeferTooltip.styl.js';
71
72
  import '../Text/Text.js';
72
73
  import '../Theme/Theme.defaults.js';
73
74
  import '../Theme/ThemeProvider.js';
@@ -30,7 +30,7 @@ import '../RequiredStar/RequiredStar.styl.js';
30
30
  import '../Select/Select.styl.js';
31
31
  import '../Checkbox/Checkbox.styl.js';
32
32
  import '../Chip/Chip.styl.js';
33
- import '../Tooltip/Tooltip.styl.js';
33
+ import '../Tooltip/Tooltip.js';
34
34
  import '../Card/Card.js';
35
35
  import '../Container/Container.js';
36
36
  import '../DatePicker/DatePicker.styl.js';
@@ -68,6 +68,7 @@ import '../Slider/Slider.styl.js';
68
68
  import '../Table/Table.styl.js';
69
69
  import '../Tabs/Tabs.styl.js';
70
70
  import '../TextShimmer/TextShimmer.js';
71
+ import '../TextWithDeferTooltip/TextWithDeferTooltip.styl.js';
71
72
  import '../Text/Text.js';
72
73
  import '../Theme/Theme.defaults.js';
73
74
  import '../Theme/ThemeProvider.js';
@@ -16,8 +16,8 @@ class Table extends Component {
16
16
  return (jsx("td", { className: cn(sticky && S.sticky), children: render ? render(data) : data[dataField || id] }, id));
17
17
  }
18
18
  render() {
19
- const { className, columns, isLoading = false, loadingText, blur, data, clear, size = 'm', } = this.props;
20
- return (jsxs("div", { className: cn(S.root, S[`size-${size}`], clear && S.clear, blur && S.blur, className), children: [jsx(Scroll, { x: true, y: true, offset: { x: { before: 10, after: 10 } }, className: S.scroll, xScrollbarClassName: S.xScrollbar, yScrollbarClassName: S.yScrollbar, children: jsxs("table", { children: [jsx("thead", { children: jsx("tr", { children: columns.map(this.renderHeaderColumn) }) }), jsx("tbody", { children: data.map(this.renderRow) })] }) }), jsx(Paranja, { inline: true, visible: isLoading, blur: blur, children: isLoading && (loadingText ?? jsx(Spinner, {})) })] }));
19
+ const { className, columns, isLoading = false, loadingText, blur, data, variant = 'default', size = 'm', } = this.props;
20
+ return (jsxs("div", { className: cn(S.root, S[`size-${size}`], S[`variant-${variant}`], blur && S.blur, className), children: [jsx(Scroll, { x: true, y: true, offset: { x: { before: 10, after: 10 } }, className: S.scroll, xScrollbarClassName: S.xScrollbar, yScrollbarClassName: S.yScrollbar, children: jsxs("table", { children: [jsx("thead", { children: jsx("tr", { children: columns.map(this.renderHeaderColumn) }) }), jsx("tbody", { children: data.map(this.renderRow) })] }) }), jsx(Paranja, { inline: true, visible: isLoading, blur: blur, children: isLoading && (loadingText ?? jsx(Spinner, {})) })] }));
21
21
  }
22
22
  }
23
23
 
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
2
2
 
3
- var css_248z = ".Table_root__PxLR-{--brad:var(--border-radius-l);border-radius:var(--border-radius-l);border-radius:var(--brad);max-height:100%;overflow:hidden;position:relative}.Table_root__PxLR- table{min-width:100%}.Table_root__PxLR- tbody{overflow-scrolling:touch;overflow:auto}.Table_root__PxLR- thead{position:sticky;top:0;z-index:1}.Table_root__PxLR- td,.Table_root__PxLR- th{min-width:5em;padding:var(--cell-padding);text-align:left}.Table_root__PxLR- td{vertical-align:top}.Table_root__PxLR- tr:last-child td{border-bottom-left-radius:var(--brad);border-bottom-right-radius:var(--brad);padding-bottom:var(--last-row-padding-bottom)}.Table_root__PxLR-:not(.Table_clear__pGt1B){box-shadow:0 0 0 2px var(--accent-color-alpha-100)}.Table_root__PxLR-:not(.Table_clear__pGt1B) th{background-color:var(--accent-color-alpha-100)}.Table_root__PxLR-:not(.Table_clear__pGt1B) td{box-shadow:inset 0 1px 0 0 var(--accent-color-alpha-100)}.Table_size-xs__z1E3a{--cell-padding:2px;--last-row-padding-bottom:var(--p-4)}.Table_size-s__9PBIX{--cell-padding:var(--p-1);--last-row-padding-bottom:var(--p-5)}.Table_size-m__wNH3x{--cell-padding:var(--p-2);--last-row-padding-bottom:var(--p-5)}.Table_size-l__lCN-O{--cell-padding:var(--p-5);--last-row-padding-bottom:var(--p-8)}.Table_size-xl__QS-V3{--cell-padding:var(--p-8);--last-row-padding-bottom:var(--p-8)}.Table_scroll__a04XZ{position:static}.Table_xScrollbar__FODoD{transform:translateY(4px)}.Table_yScrollbar__KwMOv{transform:translateX(4px)}.Table_sticky__99lks{background-color:var(--decent-color);left:0;position:sticky;z-index:1}th.Table_sticky__99lks{background-color:var(--accent-color);color:var(--decent-color)}.Table_blur__UwMAo .Table_sticky__99lks{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background-color:var(--decent-color-alpha-500)}.Table_blur__UwMAo th.Table_sticky__99lks{background-color:var(--accent-color-alpha-500);color:var(--decent-color-alpha-800)}";
4
- var S = {"root":"Table_root__PxLR-","clear":"Table_clear__pGt1B","size-xs":"Table_size-xs__z1E3a","size-s":"Table_size-s__9PBIX","size-m":"Table_size-m__wNH3x","size-l":"Table_size-l__lCN-O","size-xl":"Table_size-xl__QS-V3","scroll":"Table_scroll__a04XZ","xScrollbar":"Table_xScrollbar__FODoD","yScrollbar":"Table_yScrollbar__KwMOv","sticky":"Table_sticky__99lks","blur":"Table_blur__UwMAo"};
3
+ var css_248z = ".Table_root__PxLR-{--brad:var(--border-radius-l);border-radius:var(--border-radius-l);border-radius:var(--brad);max-height:100%;overflow:hidden;position:relative}.Table_root__PxLR- table{min-width:100%}.Table_root__PxLR- tbody{overflow-scrolling:touch;overflow:auto}.Table_root__PxLR- thead{position:sticky;top:0;z-index:1}.Table_root__PxLR- td,.Table_root__PxLR- th{min-width:5em;padding:var(--cell-padding);text-align:left}.Table_root__PxLR- td{vertical-align:top}.Table_root__PxLR- tr:last-child td{border-bottom-left-radius:var(--brad);border-bottom-right-radius:var(--brad);padding-bottom:var(--last-row-padding-bottom)}.Table_variant-default__86px7{box-shadow:0 0 0 2px var(--accent-color-alpha-100)}.Table_variant-default__86px7 th{background-color:var(--accent-color-alpha-100)}.Table_variant-default__86px7 td{box-shadow:inset 0 1px 0 0 var(--accent-color-alpha-100)}.Table_variant-plain__orPhH th{border-bottom:1px solid var(--accent-color-alpha-100)}.Table_variant-plain__orPhH td,.Table_variant-plain__orPhH th{border-bottom:1px solid var(--accent-color-alpha-100);border-right:1px solid var(--accent-color-alpha-100)}.Table_variant-plain__orPhH td:last-child,.Table_variant-plain__orPhH th:last-child{border-right:none}.Table_variant-plain__orPhH tr:last-child td{border-bottom:none}.Table_size-xs__z1E3a{--cell-padding:2px;--last-row-padding-bottom:var(--p-4)}.Table_size-s__9PBIX{--cell-padding:var(--p-1);--last-row-padding-bottom:var(--p-5)}.Table_size-m__wNH3x{--cell-padding:var(--p-2);--last-row-padding-bottom:var(--p-5)}.Table_size-l__lCN-O{--cell-padding:var(--p-5);--last-row-padding-bottom:var(--p-8)}.Table_size-xl__QS-V3{--cell-padding:var(--p-8);--last-row-padding-bottom:var(--p-8)}.Table_scroll__a04XZ{position:static}.Table_xScrollbar__FODoD{transform:translateY(4px)}.Table_yScrollbar__KwMOv{transform:translateX(4px)}.Table_sticky__99lks{background-color:var(--decent-color);left:0;position:sticky;z-index:1}th.Table_sticky__99lks{background-color:var(--accent-color);color:var(--decent-color)}.Table_blur__UwMAo .Table_sticky__99lks{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background-color:var(--decent-color-alpha-500)}.Table_blur__UwMAo th.Table_sticky__99lks{background-color:var(--accent-color-alpha-500);color:var(--decent-color-alpha-800)}";
4
+ var S = {"root":"Table_root__PxLR-","variant-default":"Table_variant-default__86px7","variant-plain":"Table_variant-plain__orPhH","size-xs":"Table_size-xs__z1E3a","size-s":"Table_size-s__9PBIX","size-m":"Table_size-m__wNH3x","size-l":"Table_size-l__lCN-O","size-xl":"Table_size-xl__QS-V3","scroll":"Table_scroll__a04XZ","xScrollbar":"Table_xScrollbar__FODoD","yScrollbar":"Table_yScrollbar__KwMOv","sticky":"Table_sticky__99lks","blur":"Table_blur__UwMAo"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { S as default };
@@ -0,0 +1,36 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef } from 'react';
3
+ import { Tooltip } from '../Tooltip/Tooltip.js';
4
+ import S from './TextWithDeferTooltip.styl.js';
5
+
6
+ function TextWithDeferTooltip({ className, children, width, maxWidth, side = 'bottom', overTrigger = false, ...props }) {
7
+ const [withTooltip, setWithTooltip] = useState(false);
8
+ const [tooltipWidth, setTooltipWidth] = useState();
9
+ const ref = useRef(null);
10
+ const handleMouseLeave = () => setWithTooltip(false);
11
+ const handleMouseEnter = () => {
12
+ if (!ref.current)
13
+ return;
14
+ const isOverflowingHorizontally = ref.current.scrollWidth - ref.current.clientWidth > 3;
15
+ const isOverflowingVertically = ref.current.scrollHeight - ref.current.clientHeight > 3;
16
+ if (isOverflowingHorizontally || isOverflowingVertically) {
17
+ if (width != null) {
18
+ setTooltipWidth(width);
19
+ }
20
+ else {
21
+ setTooltipWidth(ref.current.getBoundingClientRect().width);
22
+ }
23
+ setWithTooltip(true);
24
+ }
25
+ };
26
+ const tooltipContent = maxWidth != null || tooltipWidth != null ? (jsx("div", { style: {
27
+ ...(maxWidth != null && { maxWidth: `${maxWidth}px` }),
28
+ ...(tooltipWidth != null &&
29
+ !overTrigger && { width: `${tooltipWidth}px` }),
30
+ }, children: children })) : (children);
31
+ return (jsx(Tooltip, { className: S.tooltipTrigger, content: tooltipContent, contentClassName: (maxWidth != null || tooltipWidth != null) && !overTrigger
32
+ ? S.tooltipShell
33
+ : undefined, disabled: !withTooltip, direction: overTrigger ? 'bottom' : side, overTrigger: overTrigger, children: jsx("div", { ref: ref, className: className, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ...props, children: children }) }));
34
+ }
35
+
36
+ export { TextWithDeferTooltip };
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
2
+
3
+ var css_248z = ".TextWithDeferTooltip_tooltipTrigger__bmoIx{box-sizing:border-box;display:block!important;max-width:100%;width:100%}.TextWithDeferTooltip_tooltipShell__PXlL4{max-width:none!important}";
4
+ var S = {"tooltipTrigger":"TextWithDeferTooltip_tooltipTrigger__bmoIx","tooltipShell":"TextWithDeferTooltip_tooltipShell__PXlL4"};
5
+ styleInject(css_248z);
6
+
7
+ export { S as default };
@@ -1,86 +1,15 @@
1
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
- import { useRef, useEffect } from 'react';
3
- import S from './Tooltip.styl.js';
4
- import cn from 'classnames';
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { lazy, Suspense } from 'react';
3
+ import { TooltipSimple } from './TooltipSimple.js';
5
4
 
6
- /**
7
- * TooltipBase component contains the core tooltip functionality including:
8
- * - Positioning logic that calculates optimal tooltip placement based on direction
9
- * - Event handlers for mouse and keyboard interactions (hover, focus)
10
- * - Viewport boundary detection to keep tooltips visible
11
- * - Delay handling for show/hide animations
12
- * - Popover API integration for native browser tooltip behavior
13
- *
14
- * This component should only be used when the tooltip is enabled and has content.
15
- * For disabled tooltips, use the main Tooltip component which returns early.
16
- */
17
- const TooltipBase = ({ className, contentClassName, children, content, delay = 0, direction = 'top', blur = false, }) => {
18
- const triggerRef = useRef(null);
19
- const tooltipRef = useRef(null);
20
- const timeoutRef = useRef();
21
- useEffect(() => {
22
- const trigger = triggerRef.current;
23
- const tooltip = tooltipRef.current;
24
- if (!trigger || !tooltip)
25
- return;
26
- const positionTooltip = () => {
27
- const rect = trigger.getBoundingClientRect();
28
- const tooltipRect = tooltip.getBoundingClientRect();
29
- let top = 0;
30
- let left = 0;
31
- switch (direction) {
32
- case 'top':
33
- top = rect.top - tooltipRect.height - 8;
34
- left = rect.left + rect.width / 2 - tooltipRect.width / 2;
35
- break;
36
- case 'bottom':
37
- top = rect.bottom + 8;
38
- left = rect.left + rect.width / 2 - tooltipRect.width / 2;
39
- break;
40
- case 'left':
41
- top = rect.top + rect.height / 2 - tooltipRect.height / 2;
42
- left = rect.left - tooltipRect.width - 8;
43
- break;
44
- case 'right':
45
- top = rect.top + rect.height / 2 - tooltipRect.height / 2;
46
- left = rect.right + 8;
47
- break;
48
- }
49
- // Ensure tooltip stays within viewport
50
- const padding = 10;
51
- left = Math.max(padding, Math.min(left, window.innerWidth - tooltipRect.width - padding));
52
- top = Math.max(padding, Math.min(top, window.innerHeight - tooltipRect.height - padding));
53
- tooltip.style.left = `${left}px`;
54
- tooltip.style.top = `${top}px`;
55
- };
56
- const showTooltip = () => {
57
- timeoutRef.current = window.setTimeout(() => {
58
- tooltip.showPopover?.();
59
- positionTooltip();
60
- }, delay);
61
- };
62
- const hideTooltip = () => {
63
- clearTimeout(timeoutRef.current);
64
- tooltip.hidePopover?.();
65
- };
66
- trigger.addEventListener('mouseenter', showTooltip);
67
- trigger.addEventListener('mouseleave', hideTooltip);
68
- trigger.addEventListener('focus', showTooltip);
69
- trigger.addEventListener('blur', hideTooltip);
70
- return () => {
71
- clearTimeout(timeoutRef.current);
72
- trigger.removeEventListener('mouseenter', showTooltip);
73
- trigger.removeEventListener('mouseleave', hideTooltip);
74
- trigger.removeEventListener('focus', showTooltip);
75
- trigger.removeEventListener('blur', hideTooltip);
76
- };
77
- }, [content, delay, direction]);
78
- return (jsxs(Fragment, { children: [jsx("div", { ref: triggerRef, className: cn(S.trigger, className), children: children }), jsx("div", { ref: tooltipRef, popover: "manual", className: cn(S.tooltip, blur && S.blur, contentClassName), "data-direction": direction, children: content })] }));
79
- };
80
- const Tooltip = ({ className, contentClassName, children, content, delay = 0, direction = 'top', blur = false, disabled = false, }) => {
5
+ const LazyTooltipOverTrigger = lazy(() => import('./TooltipOverTrigger.js'));
6
+ const Tooltip = ({ className, contentClassName, children, content, delay = 0, direction = 'top', blur = false, disabled = false, overTrigger = false, }) => {
81
7
  if (disabled || !content)
82
8
  return jsx(Fragment, { children: children });
83
- return (jsx(TooltipBase, { className: className, contentClassName: contentClassName, children: children, content: content, delay: delay, direction: direction, blur: blur }));
9
+ if (overTrigger) {
10
+ return (jsx(Suspense, { fallback: jsx(Fragment, { children: children }), children: jsx(LazyTooltipOverTrigger, { className: className, contentClassName: contentClassName, content: content, delay: delay, direction: direction, blur: blur, children: children }) }));
11
+ }
12
+ return (jsx(TooltipSimple, { className: className, contentClassName: contentClassName, content: content, delay: delay, direction: direction, blur: blur, children: children }));
84
13
  };
85
14
 
86
15
  export { Tooltip };
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
2
2
 
3
- var css_248z = ".Tooltip_trigger__9GSNV{display:inline-block}.Tooltip_tooltip__tzL8q{word-wrap:break-word;background:var(--decent-color-alpha-900);border-radius:4px;box-shadow:0 0 0 1px var(--accent-color-alpha-100);color:var(--accent-color);font-size:14px;line-height:1.4;margin:0;max-width:250px;padding:6px 12px;pointer-events:none;position:fixed;z-index:9999}.Tooltip_tooltip__tzL8q.Tooltip_blur__SQYHW{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:var(--decent-color-alpha-500)}.Tooltip_tooltip__tzL8q:after{content:\"\";position:absolute}.Tooltip_tooltip__tzL8q[data-direction=top]{transform:translateY(0)}.Tooltip_tooltip__tzL8q[data-direction=top]:after{left:50%;top:100%;transform:translateX(-50%)}.Tooltip_tooltip__tzL8q[data-direction=bottom]{transform:translateY(0)}.Tooltip_tooltip__tzL8q[data-direction=bottom]:after{bottom:100%;left:50%;transform:translateX(-50%)}.Tooltip_tooltip__tzL8q[data-direction=left]{transform:translateX(0)}.Tooltip_tooltip__tzL8q[data-direction=left]:after{left:100%;top:50%;transform:translateY(-50%)}.Tooltip_tooltip__tzL8q[data-direction=right]{transform:translateX(0)}.Tooltip_tooltip__tzL8q[data-direction=right]:after{right:100%;top:50%;transform:translateY(-50%)}.Tooltip_tooltip__tzL8q:popover-open{animation:Tooltip_fadeIn__Buhx4 .2s ease-out}@keyframes Tooltip_fadeIn__Buhx4{0%{opacity:0}to{opacity:1}}";
4
- var S = {"trigger":"Tooltip_trigger__9GSNV","tooltip":"Tooltip_tooltip__tzL8q","blur":"Tooltip_blur__SQYHW","fadeIn":"Tooltip_fadeIn__Buhx4"};
3
+ var css_248z = ".Tooltip_trigger__9GSNV{display:inline-block}.Tooltip_tooltip__tzL8q{word-wrap:break-word;background:var(--decent-color-alpha-900);border-radius:4px;box-shadow:0 0 0 1px var(--accent-color-alpha-100);color:var(--accent-color);font-size:14px;line-height:1.4;margin:0;max-width:250px;padding:6px 12px;pointer-events:none;position:fixed;z-index:9999}.Tooltip_tooltip__tzL8q.Tooltip_blur__SQYHW{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:var(--decent-color-alpha-500)}.Tooltip_tooltip__tzL8q:after{content:\"\";position:absolute}.Tooltip_tooltip__tzL8q[data-direction=top]{transform:translateY(0)}.Tooltip_tooltip__tzL8q[data-direction=top]:after{left:50%;top:100%;transform:translateX(-50%)}.Tooltip_tooltip__tzL8q[data-direction=bottom]{transform:translateY(0)}.Tooltip_tooltip__tzL8q[data-direction=bottom]:after{bottom:100%;left:50%;transform:translateX(-50%)}.Tooltip_tooltip__tzL8q[data-direction=left]{transform:translateX(0)}.Tooltip_tooltip__tzL8q[data-direction=left]:after{left:100%;top:50%;transform:translateY(-50%)}.Tooltip_tooltip__tzL8q[data-direction=right]{transform:translateX(0)}.Tooltip_tooltip__tzL8q[data-direction=right]:after{right:100%;top:50%;transform:translateY(-50%)}.Tooltip_tooltip__tzL8q:popover-open{animation:Tooltip_fadeIn__Buhx4 .2s ease-out}.Tooltip_tooltip__tzL8q.Tooltip_tooltipOverTrigger__gRUoT{word-wrap:normal;box-sizing:border-box;height:-moz-fit-content;height:fit-content;max-width:none}.Tooltip_tooltip__tzL8q.Tooltip_tooltipOverTrigger__gRUoT:after{display:none}.Tooltip_tooltip__tzL8q.Tooltip_tooltipOverTrigger__gRUoT:popover-open{animation:Tooltip_fadeIn__Buhx4 .15s ease-out}@keyframes Tooltip_fadeIn__Buhx4{0%{opacity:0}to{opacity:1}}";
4
+ var S = {"trigger":"Tooltip_trigger__9GSNV","tooltip":"Tooltip_tooltip__tzL8q","blur":"Tooltip_blur__SQYHW","fadeIn":"Tooltip_fadeIn__Buhx4","tooltipOverTrigger":"Tooltip_tooltipOverTrigger__gRUoT"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { S as default };
@@ -0,0 +1,19 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useRef } from 'react';
3
+ import S from './Tooltip.styl.js';
4
+ import cn from 'classnames';
5
+
6
+ const TooltipCore = ({ className, contentClassName, children, content, delay = 0, direction = 'top', blur = false, tooltipExtraClass, dataDirection = direction, usePositionSetup, }) => {
7
+ const triggerRef = useRef(null);
8
+ const tooltipRef = useRef(null);
9
+ usePositionSetup({
10
+ triggerRef,
11
+ tooltipRef,
12
+ content,
13
+ delay,
14
+ direction,
15
+ });
16
+ return (jsxs(Fragment, { children: [jsx("div", { ref: triggerRef, className: cn(S.trigger, className), children: children }), jsx("div", { ref: tooltipRef, popover: "manual", className: cn(S.tooltip, blur && S.blur, tooltipExtraClass, contentClassName), "data-direction": dataDirection, children: content })] }));
17
+ };
18
+
19
+ export { TooltipCore };
@@ -0,0 +1,133 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useCallback, useLayoutEffect, useEffect } from 'react';
3
+ import S from './Tooltip.styl.js';
4
+ import { TooltipCore } from './TooltipCore.js';
5
+
6
+ const TRIGGER_TEXT_STYLE_PROPS = [
7
+ 'font-family',
8
+ 'font-size',
9
+ 'font-weight',
10
+ 'font-style',
11
+ 'font-variant',
12
+ 'font-stretch',
13
+ 'line-height',
14
+ 'letter-spacing',
15
+ 'word-spacing',
16
+ 'text-transform',
17
+ 'text-indent',
18
+ 'text-decoration-line',
19
+ 'text-decoration-color',
20
+ 'text-decoration-style',
21
+ 'text-decoration-thickness',
22
+ 'text-underline-offset',
23
+ 'font-feature-settings',
24
+ 'font-variation-settings',
25
+ 'font-kerning',
26
+ 'font-optical-sizing',
27
+ 'font-synthesis',
28
+ 'font-variant-numeric',
29
+ 'font-variant-ligatures',
30
+ 'font-variant-caps',
31
+ 'font-variant-east-asian',
32
+ 'tab-size',
33
+ 'color',
34
+ 'word-break',
35
+ 'overflow-wrap',
36
+ 'hyphens',
37
+ ];
38
+ function applyTriggerTextStyles(contentEl, computed) {
39
+ for (const prop of TRIGGER_TEXT_STYLE_PROPS) {
40
+ contentEl.style.setProperty(prop, computed.getPropertyValue(prop));
41
+ }
42
+ }
43
+ function clearTriggerTextStyles(contentEl) {
44
+ for (const prop of TRIGGER_TEXT_STYLE_PROPS) {
45
+ contentEl.style.removeProperty(prop);
46
+ }
47
+ }
48
+ function parsePx(value) {
49
+ return Number.parseFloat(value) || 0;
50
+ }
51
+ function applyOverTriggerStyles(contentEl, triggerEl) {
52
+ const rect = triggerEl.getBoundingClientRect();
53
+ const triggerComputed = window.getComputedStyle(triggerEl);
54
+ const contentComputed = window.getComputedStyle(contentEl);
55
+ const paddingLeft = parsePx(contentComputed.paddingLeft);
56
+ const paddingRight = parsePx(contentComputed.paddingRight);
57
+ const paddingTop = parsePx(contentComputed.paddingTop);
58
+ const borderLeft = parsePx(contentComputed.borderLeftWidth);
59
+ const borderRight = parsePx(contentComputed.borderRightWidth);
60
+ const borderTop = parsePx(contentComputed.borderTopWidth);
61
+ contentEl.style.setProperty('left', `${rect.left - paddingLeft - borderLeft}px`);
62
+ contentEl.style.setProperty('top', `${rect.top - paddingTop - borderTop}px`);
63
+ contentEl.style.setProperty('transform', 'none');
64
+ contentEl.style.width = `${rect.width + paddingLeft + paddingRight + borderLeft + borderRight}px`;
65
+ contentEl.style.boxSizing = 'border-box';
66
+ applyTriggerTextStyles(contentEl, triggerComputed);
67
+ }
68
+ function clearOverTriggerStyles(contentEl) {
69
+ if (!contentEl)
70
+ return;
71
+ contentEl.style.removeProperty('left');
72
+ contentEl.style.removeProperty('top');
73
+ contentEl.style.removeProperty('transform');
74
+ contentEl.style.removeProperty('width');
75
+ contentEl.style.removeProperty('box-sizing');
76
+ clearTriggerTextStyles(contentEl);
77
+ }
78
+ const useOverTriggerPositionSetup = ({ triggerRef, tooltipRef, content, delay, }) => {
79
+ const timeoutRef = useRef();
80
+ const updateOverTriggerPosition = useCallback(() => {
81
+ const triggerEl = triggerRef.current;
82
+ const contentEl = tooltipRef.current;
83
+ if (!triggerEl || !contentEl)
84
+ return;
85
+ applyOverTriggerStyles(contentEl, triggerEl);
86
+ }, [tooltipRef, triggerRef]);
87
+ useLayoutEffect(() => {
88
+ let frameId = 0;
89
+ const tick = () => {
90
+ updateOverTriggerPosition();
91
+ frameId = requestAnimationFrame(tick);
92
+ };
93
+ tick();
94
+ window.addEventListener('scroll', updateOverTriggerPosition, true);
95
+ window.addEventListener('resize', updateOverTriggerPosition);
96
+ return () => {
97
+ cancelAnimationFrame(frameId);
98
+ window.removeEventListener('scroll', updateOverTriggerPosition, true);
99
+ window.removeEventListener('resize', updateOverTriggerPosition);
100
+ clearOverTriggerStyles(tooltipRef.current);
101
+ };
102
+ }, [tooltipRef, updateOverTriggerPosition]);
103
+ useEffect(() => {
104
+ const trigger = triggerRef.current;
105
+ const tooltip = tooltipRef.current;
106
+ if (!trigger || !tooltip)
107
+ return;
108
+ const showTooltip = () => {
109
+ timeoutRef.current = window.setTimeout(() => {
110
+ tooltip.showPopover?.();
111
+ updateOverTriggerPosition();
112
+ }, delay);
113
+ };
114
+ const hideTooltip = () => {
115
+ clearTimeout(timeoutRef.current);
116
+ tooltip.hidePopover?.();
117
+ };
118
+ trigger.addEventListener('mouseenter', showTooltip);
119
+ trigger.addEventListener('mouseleave', hideTooltip);
120
+ trigger.addEventListener('focus', showTooltip);
121
+ trigger.addEventListener('blur', hideTooltip);
122
+ return () => {
123
+ clearTimeout(timeoutRef.current);
124
+ trigger.removeEventListener('mouseenter', showTooltip);
125
+ trigger.removeEventListener('mouseleave', hideTooltip);
126
+ trigger.removeEventListener('focus', showTooltip);
127
+ trigger.removeEventListener('blur', hideTooltip);
128
+ };
129
+ }, [content, delay, tooltipRef, triggerRef, updateOverTriggerPosition]);
130
+ };
131
+ const TooltipOverTrigger = (props) => (jsx(TooltipCore, { usePositionSetup: useOverTriggerPositionSetup, tooltipExtraClass: S.tooltipOverTrigger, dataDirection: undefined, ...props }));
132
+
133
+ export { TooltipOverTrigger as default };
@@ -0,0 +1,66 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useEffect } from 'react';
3
+ import { TooltipCore } from './TooltipCore.js';
4
+
5
+ const useSimplePositionSetup = ({ triggerRef, tooltipRef, content, delay, direction, }) => {
6
+ const timeoutRef = useRef();
7
+ useEffect(() => {
8
+ const trigger = triggerRef.current;
9
+ const tooltip = tooltipRef.current;
10
+ if (!trigger || !tooltip)
11
+ return;
12
+ const positionTooltip = () => {
13
+ const rect = trigger.getBoundingClientRect();
14
+ const tooltipRect = tooltip.getBoundingClientRect();
15
+ let top = 0;
16
+ let left = 0;
17
+ switch (direction) {
18
+ case 'top':
19
+ top = rect.top - tooltipRect.height - 8;
20
+ left = rect.left + rect.width / 2 - tooltipRect.width / 2;
21
+ break;
22
+ case 'bottom':
23
+ top = rect.bottom + 8;
24
+ left = rect.left + rect.width / 2 - tooltipRect.width / 2;
25
+ break;
26
+ case 'left':
27
+ top = rect.top + rect.height / 2 - tooltipRect.height / 2;
28
+ left = rect.left - tooltipRect.width - 8;
29
+ break;
30
+ case 'right':
31
+ top = rect.top + rect.height / 2 - tooltipRect.height / 2;
32
+ left = rect.right + 8;
33
+ break;
34
+ }
35
+ const padding = 10;
36
+ left = Math.max(padding, Math.min(left, window.innerWidth - tooltipRect.width - padding));
37
+ top = Math.max(padding, Math.min(top, window.innerHeight - tooltipRect.height - padding));
38
+ tooltip.style.left = `${left}px`;
39
+ tooltip.style.top = `${top}px`;
40
+ };
41
+ const showTooltip = () => {
42
+ timeoutRef.current = window.setTimeout(() => {
43
+ tooltip.showPopover?.();
44
+ positionTooltip();
45
+ }, delay);
46
+ };
47
+ const hideTooltip = () => {
48
+ clearTimeout(timeoutRef.current);
49
+ tooltip.hidePopover?.();
50
+ };
51
+ trigger.addEventListener('mouseenter', showTooltip);
52
+ trigger.addEventListener('mouseleave', hideTooltip);
53
+ trigger.addEventListener('focus', showTooltip);
54
+ trigger.addEventListener('blur', hideTooltip);
55
+ return () => {
56
+ clearTimeout(timeoutRef.current);
57
+ trigger.removeEventListener('mouseenter', showTooltip);
58
+ trigger.removeEventListener('mouseleave', hideTooltip);
59
+ trigger.removeEventListener('focus', showTooltip);
60
+ trigger.removeEventListener('blur', hideTooltip);
61
+ };
62
+ }, [content, delay, direction, tooltipRef, triggerRef]);
63
+ };
64
+ const TooltipSimple = (props) => jsx(TooltipCore, { usePositionSetup: useSimplePositionSetup, ...props });
65
+
66
+ export { TooltipSimple };
@@ -12,7 +12,7 @@ export type Data = {
12
12
  className?: string;
13
13
  } & any;
14
14
  export type Props = ComponentType & {
15
- clear?: boolean;
15
+ variant?: 'default' | 'clear' | 'plain';
16
16
  columns: Column[];
17
17
  data: Data[];
18
18
  isLoading?: boolean;
@@ -0,0 +1,3 @@
1
+ import type { TextWithDeferTooltipProps } from './TextWithDeferTooltip.types';
2
+ declare function TextWithDeferTooltip({ className, children, width, maxWidth, side, overTrigger, ...props }: TextWithDeferTooltipProps): JSX.Element;
3
+ export { TextWithDeferTooltip };
@@ -0,0 +1,9 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export type TooltipSide = 'top' | 'bottom' | 'left' | 'right';
3
+ export type Props = HTMLAttributes<HTMLDivElement> & {
4
+ width?: number;
5
+ maxWidth?: number;
6
+ side?: TooltipSide;
7
+ overTrigger?: boolean;
8
+ };
9
+ export type TextWithDeferTooltipProps = Props;
@@ -0,0 +1,2 @@
1
+ export { TextWithDeferTooltip } from './TextWithDeferTooltip';
2
+ export type { TextWithDeferTooltipProps, TooltipSide, } from './TextWithDeferTooltip.types';
@@ -8,10 +8,11 @@ export interface TooltipProps {
8
8
  direction?: 'top' | 'bottom' | 'left' | 'right';
9
9
  blur?: boolean;
10
10
  disabled?: boolean;
11
+ overTrigger?: boolean;
11
12
  }
12
13
  declare module 'react' {
13
14
  interface HTMLAttributes<T> {
14
15
  popover?: string;
15
16
  }
16
17
  }
17
- export declare const Tooltip: ({ className, contentClassName, children, content, delay, direction, blur, disabled, }: TooltipProps) => JSX.Element;
18
+ export declare const Tooltip: ({ className, contentClassName, children, content, delay, direction, blur, disabled, overTrigger, }: TooltipProps) => JSX.Element;
@@ -0,0 +1,21 @@
1
+ /// <reference types="uilib/components/tooltip/types" />
2
+ export interface TooltipPositionSetupOptions {
3
+ triggerRef: React.RefObject<HTMLDivElement | null>;
4
+ tooltipRef: React.RefObject<HTMLDivElement | null>;
5
+ content?: React.ReactNode;
6
+ delay: number;
7
+ direction: 'top' | 'bottom' | 'left' | 'right';
8
+ }
9
+ export interface TooltipCoreProps {
10
+ className?: string;
11
+ contentClassName?: string;
12
+ children: React.ReactNode;
13
+ content?: React.ReactNode;
14
+ delay?: number;
15
+ direction?: 'top' | 'bottom' | 'left' | 'right';
16
+ blur?: boolean;
17
+ tooltipExtraClass?: string;
18
+ dataDirection?: 'top' | 'bottom' | 'left' | 'right';
19
+ usePositionSetup: (options: TooltipPositionSetupOptions) => void;
20
+ }
21
+ export declare const TooltipCore: ({ className, contentClassName, children, content, delay, direction, blur, tooltipExtraClass, dataDirection, usePositionSetup, }: TooltipCoreProps) => JSX.Element;
@@ -0,0 +1,4 @@
1
+ /// <reference types="uilib/components/tooltip/types" />
2
+ import type { TooltipProps } from './Tooltip';
3
+ declare const TooltipOverTrigger: (props: Omit<TooltipProps, 'disabled' | 'overTrigger'>) => JSX.Element;
4
+ export default TooltipOverTrigger;
@@ -0,0 +1,3 @@
1
+ /// <reference types="uilib/components/tooltip/types" />
2
+ import type { TooltipProps } from './Tooltip';
3
+ export declare const TooltipSimple: (props: Omit<TooltipProps, 'disabled' | 'overTrigger'>) => JSX.Element;
@@ -47,6 +47,7 @@ export * from './Spinner/Spinner';
47
47
  export * from './Table/Table';
48
48
  export * from './Tabs/Tabs';
49
49
  export * from './TextShimmer/TextShimmer';
50
+ export * from './TextWithDeferTooltip';
50
51
  export * from './Tooltip/Tooltip';
51
52
  export * from './Text/Text';
52
53
  export * from './Theme/Theme';
@@ -171,49 +171,33 @@
171
171
  "169": "Community 169",
172
172
  "170": "Community 170",
173
173
  "171": "Community 171",
174
- "172": "Community 172",
175
174
  "173": "Community 173",
176
- "174": "Community 174",
177
175
  "175": "Community 175",
178
176
  "176": "Community 176",
179
- "177": "Community 177",
180
- "178": "Community 178",
181
177
  "179": "Community 179",
182
178
  "180": "Community 180",
183
- "181": "Community 181",
184
179
  "182": "Community 182",
185
180
  "183": "Community 183",
186
181
  "184": "Community 184",
187
- "185": "Community 185",
188
- "186": "Community 186",
189
182
  "187": "Community 187",
190
183
  "188": "Community 188",
191
184
  "189": "Community 189",
192
- "190": "Community 190",
193
- "191": "Community 191",
194
185
  "192": "Community 192",
195
- "193": "Community 193",
196
186
  "194": "Community 194",
197
187
  "195": "Community 195",
198
- "196": "Community 196",
199
188
  "197": "Community 197",
200
189
  "198": "Community 198",
201
190
  "199": "Community 199",
202
191
  "200": "Community 200",
203
192
  "201": "Community 201",
204
193
  "202": "Community 202",
205
- "203": "Community 203",
206
194
  "204": "Community 204",
207
195
  "205": "Community 205",
208
- "206": "Community 206",
209
196
  "207": "Community 207",
210
- "208": "Community 208",
211
- "209": "Community 209",
212
197
  "210": "Community 210",
213
198
  "211": "Community 211",
214
199
  "212": "Community 212",
215
200
  "213": "Community 213",
216
- "214": "Community 214",
217
201
  "215": "Community 215",
218
202
  "216": "Community 216"
219
203
  }