@underverse-ui/underverse 1.0.121 → 1.0.123

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.121",
3
+ "version": "1.0.123",
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;
@@ -19309,6 +19328,7 @@ function Carousel({
19309
19328
  sideOpacity: effectiveAnimation === "stack" ? 0.8 : 0.86,
19310
19329
  farOpacity: effectiveAnimation === "stack" ? 0.5 : 0.48,
19311
19330
  sideOffset: effectiveAnimation === "stack" ? 20 : 28,
19331
+ verticalOffset: 0,
19312
19332
  rotate: 24,
19313
19333
  depthStep: effectiveAnimation === "stack" ? 60 : 90,
19314
19334
  blur: 1.1,
@@ -19478,22 +19498,23 @@ function Carousel({
19478
19498
  }
19479
19499
  if (effectiveAnimation === "stack") {
19480
19500
  const xOffset2 = distance * mergedEffectOptions.stackOffset;
19481
- const yOffset = absDistance * mergedEffectOptions.stackLift;
19501
+ const yOffset2 = absDistance * mergedEffectOptions.stackLift;
19482
19502
  const scale2 = distance === 0 ? mergedEffectOptions.mainScale : distance === 1 || distance === -1 ? mergedEffectOptions.sideScale : mergedEffectOptions.farScale;
19483
19503
  return {
19484
19504
  opacity: distance === 0 ? 1 : distance === 1 || distance === -1 ? mergedEffectOptions.sideOpacity : mergedEffectOptions.farOpacity,
19485
- transform: `translate3d(${xOffset2}px, ${yOffset}px, -${absDistance * mergedEffectOptions.depthStep}px) scale(${scale2})`,
19505
+ transform: `translate3d(${xOffset2}px, ${yOffset2}px, -${absDistance * mergedEffectOptions.depthStep}px) scale(${scale2})`,
19486
19506
  filter: distance === 0 ? "blur(0px)" : `blur(${Math.min(absDistance, 2) * mergedEffectOptions.blur}px)`,
19487
19507
  pointerEvents: "auto",
19488
19508
  zIndex: 30 - absDistance
19489
19509
  };
19490
19510
  }
19491
19511
  const xOffset = distance * mergedEffectOptions.sideOffset;
19512
+ const yOffset = mergedEffectOptions.verticalOffset ?? 0;
19492
19513
  const rotateY = distance * -mergedEffectOptions.rotate;
19493
19514
  const scale = distance === 0 ? mergedEffectOptions.mainScale : distance === 1 || distance === -1 ? mergedEffectOptions.sideScale : mergedEffectOptions.farScale;
19494
19515
  return {
19495
19516
  opacity: distance === 0 ? 1 : distance === 1 || distance === -1 ? mergedEffectOptions.sideOpacity : mergedEffectOptions.farOpacity,
19496
- transform: `translate3d(${xOffset}%, 0, -${absDistance * mergedEffectOptions.depthStep}px) rotateY(${rotateY}deg) scale(${scale})`,
19517
+ transform: `translate3d(${xOffset}%, ${yOffset}px, -${absDistance * mergedEffectOptions.depthStep}px) rotateY(${rotateY}deg) scale(${scale})`,
19497
19518
  filter: distance === 0 ? "blur(0px)" : `blur(${Math.min(absDistance, 2) * mergedEffectOptions.blur}px)`,
19498
19519
  pointerEvents: "auto",
19499
19520
  zIndex: 30 - absDistance