@underverse-ui/underverse 1.0.120 → 1.0.122

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.
package/CHANGELOG.md CHANGED
@@ -6,7 +6,7 @@ All notable changes to `@underverse-ui/underverse` are documented in this file.
6
6
 
7
7
  ### Fixed
8
8
 
9
- - `Tooltip` now closes immediately when its trigger is pressed or when document-level pointer/Escape interactions indicate an overlay flow has taken over. This prevents portal tooltips from sticking on screen after opening dropdowns, popovers, or modals from a tooltip trigger, without overriding the normal hover close delay on pointer movement.
9
+ - `Tooltip` now closes immediately when its trigger is pressed, when `Escape` is pressed, or when document-level pointer interactions show the pointer is outside the trigger. This prevents portal tooltips from sticking on screen after opening dropdowns, popovers, modals, or when a modal/portal layout misses the trigger `mouseleave`.
10
10
 
11
11
  ## [1.0.34] - 2026-02-24
12
12
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@underverse-ui/underverse",
3
- "version": "1.0.120",
3
+ "version": "1.0.122",
4
4
  "sourceEntry": "src/index.ts",
5
5
  "totalExports": 232,
6
6
  "exports": [
package/dist/index.cjs CHANGED
@@ -3047,6 +3047,7 @@ var Tooltip = React10.forwardRef(({
3047
3047
  const panelRef = React10.useRef(null);
3048
3048
  const timeoutRef = React10.useRef(void 0);
3049
3049
  const lastAppliedRef = React10.useRef(null);
3050
+ const openedByPointerRef = React10.useRef(false);
3050
3051
  const triggerSelector = React10.useId();
3051
3052
  const delayOpen = typeof delay === "object" ? delay.open || 700 : delay;
3052
3053
  const delayClose = typeof delay === "object" ? delay.close || 300 : delay;
@@ -3090,6 +3091,7 @@ var Tooltip = React10.forwardRef(({
3090
3091
  }, [placement]);
3091
3092
  const handleMouseEnter = () => {
3092
3093
  if (disabled) return;
3094
+ openedByPointerRef.current = true;
3093
3095
  clearTimeout(timeoutRef.current);
3094
3096
  timeoutRef.current = setTimeout(() => {
3095
3097
  setIsOpen(true);
@@ -3103,13 +3105,16 @@ var Tooltip = React10.forwardRef(({
3103
3105
  };
3104
3106
  const closeNow = React10.useCallback(() => {
3105
3107
  clearTimeout(timeoutRef.current);
3108
+ openedByPointerRef.current = false;
3106
3109
  setIsOpen(false);
3107
3110
  }, []);
3108
3111
  const handleFocus = () => {
3109
3112
  if (disabled) return;
3113
+ openedByPointerRef.current = false;
3110
3114
  setIsOpen(true);
3111
3115
  };
3112
3116
  const handleBlur = () => {
3117
+ openedByPointerRef.current = false;
3113
3118
  setIsOpen(false);
3114
3119
  };
3115
3120
  React10.useEffect(() => {
@@ -3167,11 +3172,25 @@ var Tooltip = React10.forwardRef(({
3167
3172
  const handleDocumentKeyDown = (event) => {
3168
3173
  if (event.key === "Escape") closeNow();
3169
3174
  };
3175
+ const handleDocumentPointerMove = (event) => {
3176
+ if (!openedByPointerRef.current) return;
3177
+ const triggerEl = triggerRef.current;
3178
+ if (!triggerEl) {
3179
+ closeNow();
3180
+ return;
3181
+ }
3182
+ const rect = triggerEl.getBoundingClientRect();
3183
+ const tolerance = 2;
3184
+ const insideTrigger = event.clientX >= rect.left - tolerance && event.clientX <= rect.right + tolerance && event.clientY >= rect.top - tolerance && event.clientY <= rect.bottom + tolerance;
3185
+ if (!insideTrigger) closeNow();
3186
+ };
3170
3187
  document.addEventListener("pointerdown", closeNow, true);
3171
3188
  document.addEventListener("keydown", handleDocumentKeyDown);
3189
+ document.addEventListener("pointermove", handleDocumentPointerMove, true);
3172
3190
  return () => {
3173
3191
  document.removeEventListener("pointerdown", closeNow, true);
3174
3192
  document.removeEventListener("keydown", handleDocumentKeyDown);
3193
+ document.removeEventListener("pointermove", handleDocumentPointerMove, true);
3175
3194
  };
3176
3195
  }, [closeNow, isOpen]);
3177
3196
  const childProps = children.props;
@@ -5498,7 +5517,7 @@ var Modal = ({
5498
5517
  {
5499
5518
  ref: modalContentRef,
5500
5519
  className: cn(
5501
- "relative w-full rounded-2xl md:rounded-3xl bg-card text-card-foreground shadow-xl",
5520
+ "relative w-full rounded-2xl md:rounded-3xl border border-border/40 bg-card text-card-foreground shadow-xl",
5502
5521
  "transition-all duration-200 ease-out",
5503
5522
  maxWidthClass,
5504
5523
  fullWidth && "mx-0",