@underverse-ui/underverse 2.0.35 → 2.0.37
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/api-reference.json +1 -1
- package/dist/DatePicker-FDOTQMNL.js +15 -0
- package/dist/{EmojiPicker-6H52Q4YE.js → EmojiPicker-Z7QPW4DA.js} +5 -4
- package/dist/EmojiPicker-Z7QPW4DA.js.map +1 -0
- package/dist/chunk-5GMQ23IU.js +719 -0
- package/dist/chunk-5GMQ23IU.js.map +1 -0
- package/dist/{chunk-L73HBI6E.js → chunk-5VCM2Z7M.js} +6 -4
- package/dist/{chunk-L73HBI6E.js.map → chunk-5VCM2Z7M.js.map} +1 -1
- package/dist/{chunk-H4AVZA4K.js → chunk-6K6CKZUL.js} +469 -360
- package/dist/chunk-6K6CKZUL.js.map +1 -0
- package/dist/{chunk-6FAHXNDQ.js → chunk-6XQTRIP6.js} +10 -349
- package/dist/chunk-6XQTRIP6.js.map +1 -0
- package/dist/chunk-EN33T3LJ.js +358 -0
- package/dist/chunk-EN33T3LJ.js.map +1 -0
- package/dist/{chunk-F2P3DJSC.js → chunk-GZ7EDNGF.js} +333 -1022
- package/dist/chunk-GZ7EDNGF.js.map +1 -0
- package/dist/{chunk-WFQV7XFC.js → chunk-JABD2ONI.js} +3 -3
- package/dist/chunk-JG3U26V6.js +1692 -0
- package/dist/chunk-JG3U26V6.js.map +1 -0
- package/dist/{chunk-W3QTP2DM.js → chunk-TSBKJELM.js} +2 -2
- package/dist/index.cjs +13513 -13323
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +1942 -3569
- package/dist/index.js.map +1 -1
- package/dist/{menu-bar-MUISXLMR.js → menu-bar-VXAMTP3E.js} +6 -4
- package/dist/{menu-bar-MUISXLMR.js.map → menu-bar-VXAMTP3E.js.map} +1 -1
- package/dist/ueditor.cjs +2803 -1098
- package/dist/ueditor.cjs.map +1 -1
- package/dist/ueditor.js +6 -4
- package/package.json +1 -1
- package/dist/chunk-6FAHXNDQ.js.map +0 -1
- package/dist/chunk-F2P3DJSC.js.map +0 -1
- package/dist/chunk-H4AVZA4K.js.map +0 -1
- /package/dist/{EmojiPicker-6H52Q4YE.js.map → DatePicker-FDOTQMNL.js.map} +0 -0
- /package/dist/{chunk-WFQV7XFC.js.map → chunk-JABD2ONI.js.map} +0 -0
- /package/dist/{chunk-W3QTP2DM.js.map → chunk-TSBKJELM.js.map} +0 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import {
|
|
2
|
+
chainEventHandlers,
|
|
3
|
+
cn,
|
|
4
|
+
mergeRefs,
|
|
5
|
+
resolveUEditorPortalContainer,
|
|
6
|
+
useUEditorPortalContainerGetter
|
|
7
|
+
} from "./chunk-6XQTRIP6.js";
|
|
8
|
+
|
|
9
|
+
// src/components/Tooltip.tsx
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
import { createPortal } from "react-dom";
|
|
12
|
+
|
|
13
|
+
// src/hooks/useHydrated.ts
|
|
14
|
+
import { useSyncExternalStore } from "react";
|
|
15
|
+
var subscribe = () => () => {
|
|
16
|
+
};
|
|
17
|
+
var getSnapshot = () => true;
|
|
18
|
+
var getServerSnapshot = () => false;
|
|
19
|
+
function useHydrated() {
|
|
20
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/components/Tooltip.tsx
|
|
24
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
25
|
+
var variantStyles = {
|
|
26
|
+
default: "bg-popover text-popover-foreground border-border/50",
|
|
27
|
+
info: "bg-info text-info-foreground border-info/20",
|
|
28
|
+
warning: "bg-warning text-warning-foreground border-warning/20",
|
|
29
|
+
error: "bg-destructive text-destructive-foreground border-destructive/20",
|
|
30
|
+
success: "bg-success text-success-foreground border-success/20"
|
|
31
|
+
};
|
|
32
|
+
var clamp = (value, min, max) => Math.max(min, Math.min(max, value));
|
|
33
|
+
function getTransformOrigin(side) {
|
|
34
|
+
switch (side) {
|
|
35
|
+
case "top":
|
|
36
|
+
return "center bottom";
|
|
37
|
+
case "bottom":
|
|
38
|
+
return "center top";
|
|
39
|
+
case "left":
|
|
40
|
+
return "right center";
|
|
41
|
+
case "right":
|
|
42
|
+
return "left center";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function computeTooltipPosition(args) {
|
|
46
|
+
const { triggerRect, contentSize, placement, offset, padding, viewport } = args;
|
|
47
|
+
let side = placement;
|
|
48
|
+
const fitsTop = triggerRect.top - offset - contentSize.height >= padding;
|
|
49
|
+
const fitsBottom = triggerRect.bottom + offset + contentSize.height <= viewport.height - padding;
|
|
50
|
+
const fitsLeft = triggerRect.left - offset - contentSize.width >= padding;
|
|
51
|
+
const fitsRight = triggerRect.right + offset + contentSize.width <= viewport.width - padding;
|
|
52
|
+
if (side === "top" && !fitsTop && fitsBottom) side = "bottom";
|
|
53
|
+
if (side === "bottom" && !fitsBottom && fitsTop) side = "top";
|
|
54
|
+
if (side === "left" && !fitsLeft && fitsRight) side = "right";
|
|
55
|
+
if (side === "right" && !fitsRight && fitsLeft) side = "left";
|
|
56
|
+
const centerX = triggerRect.left + triggerRect.width / 2;
|
|
57
|
+
const centerY = triggerRect.top + triggerRect.height / 2;
|
|
58
|
+
let left = 0;
|
|
59
|
+
let top = 0;
|
|
60
|
+
if (side === "top") {
|
|
61
|
+
top = triggerRect.top - offset - contentSize.height;
|
|
62
|
+
left = centerX - contentSize.width / 2;
|
|
63
|
+
} else if (side === "bottom") {
|
|
64
|
+
top = triggerRect.bottom + offset;
|
|
65
|
+
left = centerX - contentSize.width / 2;
|
|
66
|
+
} else if (side === "left") {
|
|
67
|
+
top = centerY - contentSize.height / 2;
|
|
68
|
+
left = triggerRect.left - offset - contentSize.width;
|
|
69
|
+
} else {
|
|
70
|
+
top = centerY - contentSize.height / 2;
|
|
71
|
+
left = triggerRect.right + offset;
|
|
72
|
+
}
|
|
73
|
+
left = clamp(left, padding, viewport.width - contentSize.width - padding);
|
|
74
|
+
top = clamp(top, padding, viewport.height - contentSize.height - padding);
|
|
75
|
+
return { top, left, side };
|
|
76
|
+
}
|
|
77
|
+
var Tooltip = React.forwardRef(({
|
|
78
|
+
children,
|
|
79
|
+
content,
|
|
80
|
+
placement = "top",
|
|
81
|
+
delay = { open: 200, close: 300 },
|
|
82
|
+
className,
|
|
83
|
+
disabled = false,
|
|
84
|
+
variant = "default",
|
|
85
|
+
asChild = true,
|
|
86
|
+
...triggerPassthroughProps
|
|
87
|
+
}, forwardedRef) => {
|
|
88
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
89
|
+
const isMounted = useHydrated();
|
|
90
|
+
const triggerRef = React.useRef(null);
|
|
91
|
+
const positionerRef = React.useRef(null);
|
|
92
|
+
const panelRef = React.useRef(null);
|
|
93
|
+
const timeoutRef = React.useRef(void 0);
|
|
94
|
+
const lastAppliedRef = React.useRef(null);
|
|
95
|
+
const openedByPointerRef = React.useRef(false);
|
|
96
|
+
const triggerSelector = React.useId();
|
|
97
|
+
const tooltipId = React.useId();
|
|
98
|
+
const getPortalContainer = useUEditorPortalContainerGetter();
|
|
99
|
+
const portalContainer = isOpen ? resolveUEditorPortalContainer(getPortalContainer) : null;
|
|
100
|
+
const portalDocument = portalContainer?.ownerDocument ?? null;
|
|
101
|
+
const portalWindow = portalDocument?.defaultView ?? null;
|
|
102
|
+
const delayOpen = typeof delay === "object" ? delay.open || 700 : delay;
|
|
103
|
+
const delayClose = typeof delay === "object" ? delay.close || 300 : delay;
|
|
104
|
+
const offset = 8;
|
|
105
|
+
const padding = 8;
|
|
106
|
+
const updatePosition = React.useCallback(() => {
|
|
107
|
+
const triggerEl = triggerRef.current;
|
|
108
|
+
const positionerEl = positionerRef.current;
|
|
109
|
+
const panelEl = panelRef.current;
|
|
110
|
+
if (!triggerEl || !positionerEl || !panelEl) return;
|
|
111
|
+
const triggerRect = triggerEl.getBoundingClientRect();
|
|
112
|
+
const measuredWidth = panelEl.offsetWidth;
|
|
113
|
+
const measuredHeight = panelEl.offsetHeight;
|
|
114
|
+
const rect = panelEl.getBoundingClientRect();
|
|
115
|
+
const contentWidth = measuredWidth || rect.width;
|
|
116
|
+
const contentHeight = measuredHeight || rect.height;
|
|
117
|
+
const next = computeTooltipPosition({
|
|
118
|
+
triggerRect,
|
|
119
|
+
contentSize: { width: contentWidth, height: contentHeight },
|
|
120
|
+
placement,
|
|
121
|
+
offset,
|
|
122
|
+
padding,
|
|
123
|
+
viewport: {
|
|
124
|
+
width: portalWindow?.innerWidth ?? window.innerWidth,
|
|
125
|
+
height: portalWindow?.innerHeight ?? window.innerHeight
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
const top = Math.round(next.top);
|
|
129
|
+
const left = Math.round(next.left);
|
|
130
|
+
const prev = lastAppliedRef.current;
|
|
131
|
+
const same = prev && Math.abs(prev.top - top) < 0.5 && Math.abs(prev.left - left) < 0.5 && prev.side === next.side;
|
|
132
|
+
if (same) return;
|
|
133
|
+
lastAppliedRef.current = { top, left, side: next.side };
|
|
134
|
+
positionerEl.style.transform = `translate3d(${left}px, ${top}px, 0)`;
|
|
135
|
+
panelEl.style.transformOrigin = getTransformOrigin(next.side);
|
|
136
|
+
if (positionerEl.style.visibility !== "visible") positionerEl.style.visibility = "visible";
|
|
137
|
+
}, [placement, portalWindow]);
|
|
138
|
+
const handleMouseEnter = () => {
|
|
139
|
+
if (disabled) return;
|
|
140
|
+
openedByPointerRef.current = true;
|
|
141
|
+
clearTimeout(timeoutRef.current);
|
|
142
|
+
timeoutRef.current = setTimeout(() => {
|
|
143
|
+
setIsOpen(true);
|
|
144
|
+
}, delayOpen);
|
|
145
|
+
};
|
|
146
|
+
const handleMouseLeave = () => {
|
|
147
|
+
clearTimeout(timeoutRef.current);
|
|
148
|
+
timeoutRef.current = setTimeout(() => {
|
|
149
|
+
setIsOpen(false);
|
|
150
|
+
}, delayClose);
|
|
151
|
+
};
|
|
152
|
+
const closeNow = React.useCallback(() => {
|
|
153
|
+
clearTimeout(timeoutRef.current);
|
|
154
|
+
openedByPointerRef.current = false;
|
|
155
|
+
setIsOpen(false);
|
|
156
|
+
}, []);
|
|
157
|
+
const handleFocus = () => {
|
|
158
|
+
if (disabled) return;
|
|
159
|
+
openedByPointerRef.current = false;
|
|
160
|
+
setIsOpen(true);
|
|
161
|
+
};
|
|
162
|
+
const handleBlur = () => {
|
|
163
|
+
openedByPointerRef.current = false;
|
|
164
|
+
setIsOpen(false);
|
|
165
|
+
};
|
|
166
|
+
React.useEffect(() => {
|
|
167
|
+
return () => clearTimeout(timeoutRef.current);
|
|
168
|
+
}, []);
|
|
169
|
+
React.useEffect(() => {
|
|
170
|
+
if (isOpen) return;
|
|
171
|
+
clearTimeout(timeoutRef.current);
|
|
172
|
+
}, [isOpen]);
|
|
173
|
+
React.useLayoutEffect(() => {
|
|
174
|
+
if (!isOpen || !portalWindow) {
|
|
175
|
+
lastAppliedRef.current = null;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
updatePosition();
|
|
179
|
+
let raf1 = 0;
|
|
180
|
+
let raf2 = 0;
|
|
181
|
+
raf1 = portalWindow.requestAnimationFrame(() => {
|
|
182
|
+
updatePosition();
|
|
183
|
+
raf2 = portalWindow.requestAnimationFrame(() => updatePosition());
|
|
184
|
+
});
|
|
185
|
+
return () => {
|
|
186
|
+
portalWindow.cancelAnimationFrame(raf1);
|
|
187
|
+
portalWindow.cancelAnimationFrame(raf2);
|
|
188
|
+
};
|
|
189
|
+
}, [isOpen, portalWindow, updatePosition]);
|
|
190
|
+
React.useEffect(() => {
|
|
191
|
+
if (!isOpen || !portalDocument || !portalWindow) return;
|
|
192
|
+
let raf = 0;
|
|
193
|
+
const handler = () => {
|
|
194
|
+
portalWindow.cancelAnimationFrame(raf);
|
|
195
|
+
raf = portalWindow.requestAnimationFrame(() => updatePosition());
|
|
196
|
+
};
|
|
197
|
+
handler();
|
|
198
|
+
portalWindow.addEventListener("resize", handler);
|
|
199
|
+
portalWindow.addEventListener("scroll", handler, true);
|
|
200
|
+
portalDocument.addEventListener("scroll", handler, true);
|
|
201
|
+
return () => {
|
|
202
|
+
portalWindow.cancelAnimationFrame(raf);
|
|
203
|
+
portalWindow.removeEventListener("resize", handler);
|
|
204
|
+
portalWindow.removeEventListener("scroll", handler, true);
|
|
205
|
+
portalDocument.removeEventListener("scroll", handler, true);
|
|
206
|
+
};
|
|
207
|
+
}, [isOpen, portalDocument, portalWindow, updatePosition]);
|
|
208
|
+
React.useEffect(() => {
|
|
209
|
+
if (!isOpen || !portalWindow) return;
|
|
210
|
+
const ResizeObserverCtor = portalWindow.ResizeObserver;
|
|
211
|
+
if (!ResizeObserverCtor) return;
|
|
212
|
+
const ro = new ResizeObserverCtor(() => updatePosition());
|
|
213
|
+
if (triggerRef.current) ro.observe(triggerRef.current);
|
|
214
|
+
if (panelRef.current) ro.observe(panelRef.current);
|
|
215
|
+
return () => ro.disconnect();
|
|
216
|
+
}, [isOpen, portalWindow, updatePosition]);
|
|
217
|
+
React.useEffect(() => {
|
|
218
|
+
if (!isOpen || !portalDocument) return;
|
|
219
|
+
const handleDocumentKeyDown = (event) => {
|
|
220
|
+
if (event.key === "Escape") closeNow();
|
|
221
|
+
};
|
|
222
|
+
const handleDocumentPointerMove = (event) => {
|
|
223
|
+
if (!openedByPointerRef.current) return;
|
|
224
|
+
const triggerEl = triggerRef.current;
|
|
225
|
+
if (!triggerEl) {
|
|
226
|
+
closeNow();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const rect = triggerEl.getBoundingClientRect();
|
|
230
|
+
const tolerance = 2;
|
|
231
|
+
const insideTrigger = event.clientX >= rect.left - tolerance && event.clientX <= rect.right + tolerance && event.clientY >= rect.top - tolerance && event.clientY <= rect.bottom + tolerance;
|
|
232
|
+
if (!insideTrigger) closeNow();
|
|
233
|
+
};
|
|
234
|
+
portalDocument.addEventListener("pointerdown", closeNow, true);
|
|
235
|
+
portalDocument.addEventListener("keydown", handleDocumentKeyDown);
|
|
236
|
+
portalDocument.addEventListener("pointermove", handleDocumentPointerMove, true);
|
|
237
|
+
return () => {
|
|
238
|
+
portalDocument.removeEventListener("pointerdown", closeNow, true);
|
|
239
|
+
portalDocument.removeEventListener("keydown", handleDocumentKeyDown);
|
|
240
|
+
portalDocument.removeEventListener("pointermove", handleDocumentPointerMove, true);
|
|
241
|
+
};
|
|
242
|
+
}, [closeNow, isOpen, portalDocument]);
|
|
243
|
+
const childProps = children.props;
|
|
244
|
+
const childRef = childProps.ref;
|
|
245
|
+
const passthroughRef = mergeRefs(forwardedRef, childRef, (node) => {
|
|
246
|
+
triggerRef.current = node;
|
|
247
|
+
});
|
|
248
|
+
if (disabled || !content) {
|
|
249
|
+
if (!asChild) return children;
|
|
250
|
+
return React.cloneElement(children, {
|
|
251
|
+
...triggerPassthroughProps,
|
|
252
|
+
ref: passthroughRef
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const triggerProps = {
|
|
256
|
+
...triggerPassthroughProps,
|
|
257
|
+
ref: passthroughRef,
|
|
258
|
+
"data-underverse-tooltip-trigger": triggerSelector,
|
|
259
|
+
"aria-describedby": isOpen ? [childProps["aria-describedby"], triggerPassthroughProps["aria-describedby"], tooltipId].filter(Boolean).join(" ") : childProps["aria-describedby"] ?? triggerPassthroughProps["aria-describedby"],
|
|
260
|
+
onMouseEnter: chainEventHandlers(
|
|
261
|
+
triggerPassthroughProps.onMouseEnter,
|
|
262
|
+
childProps.onMouseEnter,
|
|
263
|
+
(e) => {
|
|
264
|
+
triggerRef.current = e.currentTarget;
|
|
265
|
+
handleMouseEnter();
|
|
266
|
+
}
|
|
267
|
+
),
|
|
268
|
+
onMouseLeave: chainEventHandlers(
|
|
269
|
+
triggerPassthroughProps.onMouseLeave,
|
|
270
|
+
childProps.onMouseLeave,
|
|
271
|
+
(e) => {
|
|
272
|
+
triggerRef.current = e.currentTarget;
|
|
273
|
+
handleMouseLeave();
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
onPointerDown: chainEventHandlers(
|
|
277
|
+
triggerPassthroughProps.onPointerDown,
|
|
278
|
+
childProps.onPointerDown,
|
|
279
|
+
(e) => {
|
|
280
|
+
triggerRef.current = e.currentTarget;
|
|
281
|
+
closeNow();
|
|
282
|
+
}
|
|
283
|
+
),
|
|
284
|
+
onClick: chainEventHandlers(
|
|
285
|
+
triggerPassthroughProps.onClick,
|
|
286
|
+
childProps.onClick,
|
|
287
|
+
(e) => {
|
|
288
|
+
triggerRef.current = e.currentTarget;
|
|
289
|
+
closeNow();
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
onFocus: chainEventHandlers(
|
|
293
|
+
triggerPassthroughProps.onFocus,
|
|
294
|
+
childProps.onFocus,
|
|
295
|
+
(e) => {
|
|
296
|
+
triggerRef.current = e.currentTarget;
|
|
297
|
+
handleFocus();
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
onBlur: chainEventHandlers(
|
|
301
|
+
triggerPassthroughProps.onBlur,
|
|
302
|
+
childProps.onBlur,
|
|
303
|
+
() => {
|
|
304
|
+
handleBlur();
|
|
305
|
+
}
|
|
306
|
+
)
|
|
307
|
+
};
|
|
308
|
+
const trigger = asChild ? React.cloneElement(children, triggerProps) : /* @__PURE__ */ jsx("span", { ...triggerProps, children });
|
|
309
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
310
|
+
trigger,
|
|
311
|
+
isMounted && isOpen && portalContainer && createPortal(
|
|
312
|
+
/* @__PURE__ */ jsx(
|
|
313
|
+
"div",
|
|
314
|
+
{
|
|
315
|
+
ref: positionerRef,
|
|
316
|
+
style: {
|
|
317
|
+
position: "fixed",
|
|
318
|
+
top: 0,
|
|
319
|
+
left: 0,
|
|
320
|
+
transform: "translate3d(0, 0, 0)",
|
|
321
|
+
zIndex: 99999,
|
|
322
|
+
visibility: "hidden",
|
|
323
|
+
pointerEvents: "none",
|
|
324
|
+
willChange: "transform"
|
|
325
|
+
},
|
|
326
|
+
children: /* @__PURE__ */ jsx(
|
|
327
|
+
"div",
|
|
328
|
+
{
|
|
329
|
+
ref: panelRef,
|
|
330
|
+
id: tooltipId,
|
|
331
|
+
role: "tooltip",
|
|
332
|
+
style: {
|
|
333
|
+
opacity: 1,
|
|
334
|
+
transition: "opacity 150ms",
|
|
335
|
+
transformOrigin: getTransformOrigin(placement)
|
|
336
|
+
},
|
|
337
|
+
className: cn(
|
|
338
|
+
"px-3 py-2 text-sm font-medium rounded-xl shadow-lg border",
|
|
339
|
+
"max-w-xs wrap-break-word backdrop-blur-sm",
|
|
340
|
+
variantStyles[variant],
|
|
341
|
+
className
|
|
342
|
+
),
|
|
343
|
+
children: content
|
|
344
|
+
}
|
|
345
|
+
)
|
|
346
|
+
}
|
|
347
|
+
),
|
|
348
|
+
portalContainer
|
|
349
|
+
)
|
|
350
|
+
] });
|
|
351
|
+
});
|
|
352
|
+
Tooltip.displayName = "Tooltip";
|
|
353
|
+
|
|
354
|
+
export {
|
|
355
|
+
useHydrated,
|
|
356
|
+
Tooltip
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=chunk-EN33T3LJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Tooltip.tsx","../src/hooks/useHydrated.ts"],"sourcesContent":["\"use client\";\n\n/* eslint-disable react-hooks/refs -- Tooltip composes child refs and updates them only from ref/event callbacks; the compiler cannot prove that cloneElement defers those callbacks. */\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/cn\";\nimport { useHydrated } from \"../hooks/useHydrated\";\nimport { chainEventHandlers, mergeRefs } from \"../utils/react-compose\";\nimport { resolveUEditorPortalContainer, useUEditorPortalContainerGetter } from \"./UEditor/portal-context\";\n\ntype Side = \"top\" | \"right\" | \"bottom\" | \"left\";\ntype TooltipPlacement = Side;\n\n/** Public props for the `Tooltip` component. */\ntype TooltipProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\" | \"content\"> & {\n children: React.ReactElement;\n content: React.ReactNode;\n placement?: TooltipPlacement;\n delay?: number | { open?: number; close?: number };\n className?: string;\n disabled?: boolean;\n variant?: \"default\" | \"info\" | \"warning\" | \"error\" | \"success\";\n /** When true, augment the child directly instead of adding a wrapper. Default: true */\n asChild?: boolean;\n};\n\nconst variantStyles = {\n default: \"bg-popover text-popover-foreground border-border/50\",\n info: \"bg-info text-info-foreground border-info/20\",\n warning: \"bg-warning text-warning-foreground border-warning/20\",\n error: \"bg-destructive text-destructive-foreground border-destructive/20\",\n success: \"bg-success text-success-foreground border-success/20\",\n};\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nfunction getTransformOrigin(side: Side) {\n switch (side) {\n case \"top\":\n return \"center bottom\";\n case \"bottom\":\n return \"center top\";\n case \"left\":\n return \"right center\";\n case \"right\":\n return \"left center\";\n }\n}\n\nfunction computeTooltipPosition(args: {\n triggerRect: DOMRect;\n contentSize: { width: number; height: number };\n placement: TooltipPlacement;\n offset: number;\n padding: number;\n viewport: { width: number; height: number };\n}): { top: number; left: number; side: Side } {\n const { triggerRect, contentSize, placement, offset, padding, viewport } = args;\n let side: Side = placement;\n\n const fitsTop = triggerRect.top - offset - contentSize.height >= padding;\n const fitsBottom = triggerRect.bottom + offset + contentSize.height <= viewport.height - padding;\n const fitsLeft = triggerRect.left - offset - contentSize.width >= padding;\n const fitsRight = triggerRect.right + offset + contentSize.width <= viewport.width - padding;\n\n if (side === \"top\" && !fitsTop && fitsBottom) side = \"bottom\";\n if (side === \"bottom\" && !fitsBottom && fitsTop) side = \"top\";\n if (side === \"left\" && !fitsLeft && fitsRight) side = \"right\";\n if (side === \"right\" && !fitsRight && fitsLeft) side = \"left\";\n\n const centerX = triggerRect.left + triggerRect.width / 2;\n const centerY = triggerRect.top + triggerRect.height / 2;\n\n let left = 0;\n let top = 0;\n\n if (side === \"top\") {\n top = triggerRect.top - offset - contentSize.height;\n left = centerX - contentSize.width / 2;\n } else if (side === \"bottom\") {\n top = triggerRect.bottom + offset;\n left = centerX - contentSize.width / 2;\n } else if (side === \"left\") {\n top = centerY - contentSize.height / 2;\n left = triggerRect.left - offset - contentSize.width;\n } else {\n top = centerY - contentSize.height / 2;\n left = triggerRect.right + offset;\n }\n\n left = clamp(left, padding, viewport.width - contentSize.width - padding);\n top = clamp(top, padding, viewport.height - contentSize.height - padding);\n\n return { top, left, side };\n}\n\nexport const Tooltip = React.forwardRef<HTMLElement, TooltipProps>(({\n children,\n content,\n placement = \"top\",\n delay = { open: 200, close: 300 },\n className,\n disabled = false,\n variant = \"default\",\n asChild = true,\n ...triggerPassthroughProps\n}, forwardedRef) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const isMounted = useHydrated();\n const triggerRef = React.useRef<HTMLElement>(null);\n const positionerRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const timeoutRef = React.useRef<NodeJS.Timeout | undefined>(undefined);\n const lastAppliedRef = React.useRef<{ top: number; left: number; side: Side } | null>(null);\n const openedByPointerRef = React.useRef(false);\n const triggerSelector = React.useId();\n const tooltipId = React.useId();\n const getPortalContainer = useUEditorPortalContainerGetter();\n const portalContainer = isOpen ? resolveUEditorPortalContainer(getPortalContainer) : null;\n const portalDocument = portalContainer?.ownerDocument ?? null;\n const portalWindow = portalDocument?.defaultView ?? null;\n\n const delayOpen = typeof delay === \"object\" ? delay.open || 700 : delay;\n const delayClose = typeof delay === \"object\" ? delay.close || 300 : delay;\n\n const offset = 8;\n const padding = 8;\n\n const updatePosition = React.useCallback(() => {\n const triggerEl = triggerRef.current;\n const positionerEl = positionerRef.current;\n const panelEl = panelRef.current;\n if (!triggerEl || !positionerEl || !panelEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const measuredWidth = panelEl.offsetWidth;\n const measuredHeight = panelEl.offsetHeight;\n const rect = panelEl.getBoundingClientRect();\n\n const contentWidth = measuredWidth || rect.width;\n const contentHeight = measuredHeight || rect.height;\n\n const next = computeTooltipPosition({\n triggerRect,\n contentSize: { width: contentWidth, height: contentHeight },\n placement,\n offset,\n padding,\n viewport: {\n width: portalWindow?.innerWidth ?? window.innerWidth,\n height: portalWindow?.innerHeight ?? window.innerHeight,\n },\n });\n\n const top = Math.round(next.top);\n const left = Math.round(next.left);\n\n const prev = lastAppliedRef.current;\n const same = prev && Math.abs(prev.top - top) < 0.5 && Math.abs(prev.left - left) < 0.5 && prev.side === next.side;\n if (same) return;\n\n lastAppliedRef.current = { top, left, side: next.side };\n positionerEl.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n panelEl.style.transformOrigin = getTransformOrigin(next.side);\n if (positionerEl.style.visibility !== \"visible\") positionerEl.style.visibility = \"visible\";\n }, [placement, portalWindow]);\n\n const handleMouseEnter = () => {\n if (disabled) return;\n openedByPointerRef.current = true;\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setIsOpen(true);\n }, delayOpen);\n };\n\n const handleMouseLeave = () => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setIsOpen(false);\n }, delayClose);\n };\n\n const closeNow = React.useCallback(() => {\n clearTimeout(timeoutRef.current);\n openedByPointerRef.current = false;\n setIsOpen(false);\n }, []);\n\n const handleFocus = () => {\n if (disabled) return;\n openedByPointerRef.current = false;\n setIsOpen(true);\n };\n\n const handleBlur = () => {\n openedByPointerRef.current = false;\n setIsOpen(false);\n };\n\n React.useEffect(() => {\n return () => clearTimeout(timeoutRef.current);\n }, []);\n\n React.useEffect(() => {\n if (isOpen) return;\n clearTimeout(timeoutRef.current);\n }, [isOpen]);\n\n // Compute a stable position right after opening (before paint), then re-check a couple frames later.\n React.useLayoutEffect(() => {\n if (!isOpen || !portalWindow) {\n lastAppliedRef.current = null;\n return;\n }\n updatePosition();\n let raf1 = 0;\n let raf2 = 0;\n raf1 = portalWindow.requestAnimationFrame(() => {\n updatePosition();\n raf2 = portalWindow.requestAnimationFrame(() => updatePosition());\n });\n return () => {\n portalWindow.cancelAnimationFrame(raf1);\n portalWindow.cancelAnimationFrame(raf2);\n };\n }, [isOpen, portalWindow, updatePosition]);\n\n React.useEffect(() => {\n if (!isOpen || !portalDocument || !portalWindow) return;\n let raf = 0;\n const handler = () => {\n portalWindow.cancelAnimationFrame(raf);\n raf = portalWindow.requestAnimationFrame(() => updatePosition());\n };\n handler();\n portalWindow.addEventListener(\"resize\", handler);\n portalWindow.addEventListener(\"scroll\", handler, true);\n portalDocument.addEventListener(\"scroll\", handler, true);\n return () => {\n portalWindow.cancelAnimationFrame(raf);\n portalWindow.removeEventListener(\"resize\", handler);\n portalWindow.removeEventListener(\"scroll\", handler, true);\n portalDocument.removeEventListener(\"scroll\", handler, true);\n };\n }, [isOpen, portalDocument, portalWindow, updatePosition]);\n\n React.useEffect(() => {\n if (!isOpen || !portalWindow) return;\n const ResizeObserverCtor = portalWindow.ResizeObserver;\n if (!ResizeObserverCtor) return;\n const ro = new ResizeObserverCtor(() => updatePosition());\n if (triggerRef.current) ro.observe(triggerRef.current);\n if (panelRef.current) ro.observe(panelRef.current);\n return () => ro.disconnect();\n }, [isOpen, portalWindow, updatePosition]);\n\n React.useEffect(() => {\n if (!isOpen || !portalDocument) return;\n\n const handleDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeNow();\n };\n\n const handleDocumentPointerMove = (event: PointerEvent) => {\n if (!openedByPointerRef.current) return;\n\n const triggerEl = triggerRef.current;\n if (!triggerEl) {\n closeNow();\n return;\n }\n\n const rect = triggerEl.getBoundingClientRect();\n const tolerance = 2;\n const insideTrigger =\n event.clientX >= rect.left - tolerance &&\n event.clientX <= rect.right + tolerance &&\n event.clientY >= rect.top - tolerance &&\n event.clientY <= rect.bottom + tolerance;\n\n if (!insideTrigger) closeNow();\n };\n\n portalDocument.addEventListener(\"pointerdown\", closeNow, true);\n portalDocument.addEventListener(\"keydown\", handleDocumentKeyDown);\n portalDocument.addEventListener(\"pointermove\", handleDocumentPointerMove, true);\n\n return () => {\n portalDocument.removeEventListener(\"pointerdown\", closeNow, true);\n portalDocument.removeEventListener(\"keydown\", handleDocumentKeyDown);\n portalDocument.removeEventListener(\"pointermove\", handleDocumentPointerMove, true);\n };\n }, [closeNow, isOpen, portalDocument]);\n\n const childProps = children.props as React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> };\n const childRef = childProps.ref;\n const passthroughRef = mergeRefs<HTMLElement>(forwardedRef, childRef, (node) => {\n triggerRef.current = node;\n });\n\n if (disabled || !content) {\n if (!asChild) return children;\n return React.cloneElement(children as React.ReactElement<any>, {\n ...triggerPassthroughProps,\n ref: passthroughRef,\n });\n }\n\n const triggerProps = {\n ...triggerPassthroughProps,\n ref: passthroughRef,\n \"data-underverse-tooltip-trigger\": triggerSelector,\n \"aria-describedby\": isOpen\n ? [childProps[\"aria-describedby\"], triggerPassthroughProps[\"aria-describedby\"], tooltipId].filter(Boolean).join(\" \")\n : childProps[\"aria-describedby\"] ?? triggerPassthroughProps[\"aria-describedby\"],\n onMouseEnter: chainEventHandlers<React.MouseEvent<HTMLElement>>(\n triggerPassthroughProps.onMouseEnter,\n childProps.onMouseEnter,\n (e) => {\n triggerRef.current = e.currentTarget as HTMLElement;\n handleMouseEnter();\n },\n ),\n onMouseLeave: chainEventHandlers<React.MouseEvent<HTMLElement>>(\n triggerPassthroughProps.onMouseLeave,\n childProps.onMouseLeave,\n (e) => {\n triggerRef.current = e.currentTarget as HTMLElement;\n handleMouseLeave();\n },\n ),\n onPointerDown: chainEventHandlers<React.PointerEvent<HTMLElement>>(\n triggerPassthroughProps.onPointerDown,\n childProps.onPointerDown,\n (e) => {\n triggerRef.current = e.currentTarget as HTMLElement;\n closeNow();\n },\n ),\n onClick: chainEventHandlers<React.MouseEvent<HTMLElement>>(\n triggerPassthroughProps.onClick,\n childProps.onClick,\n (e) => {\n triggerRef.current = e.currentTarget as HTMLElement;\n closeNow();\n },\n ),\n onFocus: chainEventHandlers<React.FocusEvent<HTMLElement>>(\n triggerPassthroughProps.onFocus,\n childProps.onFocus,\n (e) => {\n triggerRef.current = e.currentTarget as HTMLElement;\n handleFocus();\n },\n ),\n onBlur: chainEventHandlers<React.FocusEvent<HTMLElement>>(\n triggerPassthroughProps.onBlur,\n childProps.onBlur,\n () => {\n handleBlur();\n },\n ),\n } satisfies React.HTMLAttributes<HTMLElement> & {\n ref: React.Ref<HTMLElement>;\n \"data-underverse-tooltip-trigger\": string;\n };\n\n const trigger = asChild ? (\n React.cloneElement(children, triggerProps)\n ) : (\n <span {...triggerProps}>{children}</span>\n );\n\n return (\n <>\n {trigger}\n {isMounted &&\n isOpen &&\n portalContainer &&\n createPortal(\n <div\n ref={positionerRef}\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n transform: \"translate3d(0, 0, 0)\",\n zIndex: 99999,\n visibility: \"hidden\",\n pointerEvents: \"none\",\n willChange: \"transform\",\n }}\n >\n <div\n ref={panelRef}\n id={tooltipId}\n role=\"tooltip\"\n style={{\n opacity: 1,\n transition: \"opacity 150ms\",\n transformOrigin: getTransformOrigin(placement),\n }}\n className={cn(\n \"px-3 py-2 text-sm font-medium rounded-xl shadow-lg border\",\n \"max-w-xs wrap-break-word backdrop-blur-sm\",\n variantStyles[variant],\n className,\n )}\n >\n {content}\n </div>\n </div>,\n portalContainer,\n )}\n </>\n );\n});\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\nconst subscribe = () => () => {};\nconst getSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\nexport function useHydrated() {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n"],"mappings":"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","names":[]}
|