@underverse-ui/underverse 2.0.21 → 2.0.23
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/{EmojiPicker-SFPFCRI4.js → EmojiPicker-NV3GQYWI.js} +4 -4
- package/dist/{chunk-PZCD342B.js → chunk-A4GUPKHM.js} +4 -4
- package/dist/{chunk-PZCD342B.js.map → chunk-A4GUPKHM.js.map} +1 -1
- package/dist/{chunk-MSTO23JM.js → chunk-AEMS6WGX.js} +6 -6
- package/dist/{chunk-LQCKCWVZ.js → chunk-F7MX3XXK.js} +3 -3
- package/dist/{chunk-SBDZKVUJ.js → chunk-LRIRY4DG.js} +2 -2
- package/dist/{chunk-RSLY7UU2.js → chunk-O7AAN6W6.js} +233 -123
- package/dist/chunk-O7AAN6W6.js.map +1 -0
- package/dist/{chunk-NJ53GV74.js → chunk-ZQWVWDGS.js} +3 -3
- package/dist/index.cjs +235 -127
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -6
- package/dist/{menu-bar-JXYQ5CH5.js → menu-bar-E7MNW6UC.js} +4 -4
- package/dist/ueditor.cjs +234 -126
- package/dist/ueditor.cjs.map +1 -1
- package/dist/ueditor.js +4 -4
- package/package.json +3 -1
- package/dist/chunk-RSLY7UU2.js.map +0 -1
- /package/dist/{EmojiPicker-SFPFCRI4.js.map → EmojiPicker-NV3GQYWI.js.map} +0 -0
- /package/dist/{chunk-MSTO23JM.js.map → chunk-AEMS6WGX.js.map} +0 -0
- /package/dist/{chunk-LQCKCWVZ.js.map → chunk-F7MX3XXK.js.map} +0 -0
- /package/dist/{chunk-SBDZKVUJ.js.map → chunk-LRIRY4DG.js.map} +0 -0
- /package/dist/{chunk-NJ53GV74.js.map → chunk-ZQWVWDGS.js.map} +0 -0
- /package/dist/{menu-bar-JXYQ5CH5.js.map → menu-bar-E7MNW6UC.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EmojiGridButton,
|
|
3
3
|
formatEmojiCountLabel
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LRIRY4DG.js";
|
|
5
5
|
import {
|
|
6
6
|
COLUMN_RESIZE_LINE_THICKNESS,
|
|
7
7
|
CellBgColorIcon,
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
sanitizeUEditorUrl,
|
|
56
56
|
useEditorColors,
|
|
57
57
|
useSharedEditorUiRenderState
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-O7AAN6W6.js";
|
|
59
59
|
import {
|
|
60
60
|
Tooltip,
|
|
61
61
|
UEditorPortalProvider,
|
|
@@ -65,7 +65,7 @@ import {
|
|
|
65
65
|
resolveUEditorPortalContainer,
|
|
66
66
|
useSmartTranslations,
|
|
67
67
|
useUEditorPortalContainerGetter
|
|
68
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-A4GUPKHM.js";
|
|
69
69
|
|
|
70
70
|
// src/components/UEditor/prepare-content-for-save.ts
|
|
71
71
|
var MIME_EXTENSION_MAP = {
|
|
@@ -515,7 +515,7 @@ import { NodeViewWrapper, NodeViewContent } from "@tiptap/react";
|
|
|
515
515
|
import React from "react";
|
|
516
516
|
import { jsx } from "react/jsx-runtime";
|
|
517
517
|
var LazyBaseEmojiPicker = React.lazy(async () => {
|
|
518
|
-
const { EmojiPicker: EmojiPicker2 } = await import("./EmojiPicker-
|
|
518
|
+
const { EmojiPicker: EmojiPicker2 } = await import("./EmojiPicker-NV3GQYWI.js");
|
|
519
519
|
return { default: EmojiPicker2 };
|
|
520
520
|
});
|
|
521
521
|
var EmojiPicker = ({ onSelect }) => {
|
|
@@ -14504,7 +14504,7 @@ function useUEditorOutput({
|
|
|
14504
14504
|
// src/components/UEditor/UEditor.tsx
|
|
14505
14505
|
import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
14506
14506
|
var LazyMenuBar = React15.lazy(async () => {
|
|
14507
|
-
const { MenuBar } = await import("./menu-bar-
|
|
14507
|
+
const { MenuBar } = await import("./menu-bar-E7MNW6UC.js");
|
|
14508
14508
|
return { default: MenuBar };
|
|
14509
14509
|
});
|
|
14510
14510
|
var UEditor = React15.forwardRef(({
|
|
@@ -14973,4 +14973,4 @@ export {
|
|
|
14973
14973
|
prepareUEditorContentForSave,
|
|
14974
14974
|
UEditor_default
|
|
14975
14975
|
};
|
|
14976
|
-
//# sourceMappingURL=chunk-
|
|
14976
|
+
//# sourceMappingURL=chunk-AEMS6WGX.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EmojiGridButton
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LRIRY4DG.js";
|
|
4
4
|
import {
|
|
5
5
|
EMOJI_LIST
|
|
6
6
|
} from "./chunk-4TYW5K4J.js";
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
cn,
|
|
10
10
|
formControlOutlineClass,
|
|
11
11
|
useSmartTranslations
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-A4GUPKHM.js";
|
|
13
13
|
|
|
14
14
|
// src/components/EmojiPicker.tsx
|
|
15
15
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -205,4 +205,4 @@ export {
|
|
|
205
205
|
EmojiPicker,
|
|
206
206
|
EmojiPicker_default
|
|
207
207
|
};
|
|
208
|
-
//# sourceMappingURL=chunk-
|
|
208
|
+
//# sourceMappingURL=chunk-F7MX3XXK.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-A4GUPKHM.js";
|
|
4
4
|
|
|
5
5
|
// src/components/emoji-ui.tsx
|
|
6
6
|
import React from "react";
|
|
@@ -71,4 +71,4 @@ export {
|
|
|
71
71
|
getEmojiImageUrl,
|
|
72
72
|
EmojiGridButton
|
|
73
73
|
};
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-LRIRY4DG.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
setRefValue,
|
|
12
12
|
useSmartTranslations,
|
|
13
13
|
useUEditorPortalContainerGetter
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-A4GUPKHM.js";
|
|
15
15
|
|
|
16
16
|
// src/contexts/UnderverseConfigContext.tsx
|
|
17
17
|
import * as React from "react";
|
|
@@ -278,6 +278,26 @@ function overflowAmount(left, width, viewportWidth, padding) {
|
|
|
278
278
|
const overflowRight = Math.max(0, left + width - max);
|
|
279
279
|
return overflowLeft + overflowRight;
|
|
280
280
|
}
|
|
281
|
+
function getScrollAncestors(trigger, ownerWindow) {
|
|
282
|
+
const ancestors = [];
|
|
283
|
+
let current = trigger.parentElement;
|
|
284
|
+
while (current) {
|
|
285
|
+
try {
|
|
286
|
+
const style = ownerWindow.getComputedStyle(current);
|
|
287
|
+
const overflow = `${style.overflow} ${style.overflowX} ${style.overflowY}`;
|
|
288
|
+
if (/(auto|scroll|overlay|hidden)/.test(overflow)) ancestors.push(current);
|
|
289
|
+
} catch {
|
|
290
|
+
}
|
|
291
|
+
current = current.parentElement;
|
|
292
|
+
}
|
|
293
|
+
return ancestors;
|
|
294
|
+
}
|
|
295
|
+
function isFiniteRect(rect) {
|
|
296
|
+
return [rect.top, rect.right, rect.bottom, rect.left, rect.width, rect.height].every(Number.isFinite);
|
|
297
|
+
}
|
|
298
|
+
function isFullyOutsideViewport(rect, viewportWidth, viewportHeight) {
|
|
299
|
+
return rect.bottom < 0 || rect.right < 0 || rect.top > viewportHeight || rect.left > viewportWidth;
|
|
300
|
+
}
|
|
281
301
|
function computePopoverPosition(args) {
|
|
282
302
|
const { triggerRect, contentSize, placement, offset, padding, viewport, constrainToAvailableHeight } = args;
|
|
283
303
|
let { side, align } = normalizePlacement(placement);
|
|
@@ -360,17 +380,19 @@ var Popover = ({
|
|
|
360
380
|
const isControlled = open !== void 0;
|
|
361
381
|
const [internalOpen, setInternalOpen] = React2.useState(false);
|
|
362
382
|
const triggerRef = React2.useRef(null);
|
|
383
|
+
const [triggerDocument, setTriggerDocument] = React2.useState(null);
|
|
363
384
|
const positionerRef = React2.useRef(null);
|
|
364
385
|
const panelRef = React2.useRef(null);
|
|
386
|
+
const pendingFrameRef = React2.useRef(null);
|
|
387
|
+
const closeRequestedRef = React2.useRef(false);
|
|
365
388
|
const lastAppliedRef = React2.useRef(null);
|
|
366
389
|
const globalConfig = useUnderverseUIConfig();
|
|
367
390
|
const resolvedBorderMode = borderMode ?? globalConfig.popover?.borderMode ?? globalConfig.borderMode;
|
|
368
391
|
const isOpen = isControlled ? open : internalOpen;
|
|
369
392
|
const contextGetPortalContainer = useUEditorPortalContainerGetter();
|
|
370
|
-
const
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
useShadCNAnimations(portalDocument);
|
|
393
|
+
const requestedPortalContainer = isOpen && triggerDocument ? resolveUEditorPortalContainer(getPortalContainer, contextGetPortalContainer, triggerDocument) : null;
|
|
394
|
+
const portalContainer = requestedPortalContainer?.ownerDocument === triggerDocument ? requestedPortalContainer : triggerDocument?.body ?? null;
|
|
395
|
+
useShadCNAnimations(isOpen ? triggerDocument : null);
|
|
374
396
|
const setIsOpen = React2.useCallback(
|
|
375
397
|
(next) => {
|
|
376
398
|
if (!isControlled) setInternalOpen(next);
|
|
@@ -381,126 +403,205 @@ var Popover = ({
|
|
|
381
403
|
const offset = 4;
|
|
382
404
|
const padding = 8;
|
|
383
405
|
const initialPlacement = React2.useMemo(() => normalizePlacement(placement), [placement]);
|
|
406
|
+
const cancelScheduledPositionUpdate = React2.useCallback(() => {
|
|
407
|
+
const pending = pendingFrameRef.current;
|
|
408
|
+
if (!pending) return;
|
|
409
|
+
pendingFrameRef.current = null;
|
|
410
|
+
try {
|
|
411
|
+
pending.ownerWindow.cancelAnimationFrame(pending.frameId);
|
|
412
|
+
} catch {
|
|
413
|
+
}
|
|
414
|
+
}, []);
|
|
415
|
+
const closeWhenPositioningIsUnsafe = React2.useCallback(() => {
|
|
416
|
+
const positionerEl = positionerRef.current;
|
|
417
|
+
if (positionerEl) {
|
|
418
|
+
positionerEl.style.visibility = "hidden";
|
|
419
|
+
positionerEl.style.pointerEvents = "none";
|
|
420
|
+
}
|
|
421
|
+
if (closeRequestedRef.current) return;
|
|
422
|
+
closeRequestedRef.current = true;
|
|
423
|
+
setIsOpen(false);
|
|
424
|
+
}, [setIsOpen]);
|
|
384
425
|
const updatePosition = React2.useCallback(() => {
|
|
385
426
|
const triggerEl = triggerRef.current;
|
|
386
427
|
const positionerEl = positionerRef.current;
|
|
387
428
|
const panelEl = panelRef.current;
|
|
388
|
-
if (!triggerEl || !positionerEl || !panelEl
|
|
429
|
+
if (!triggerEl || !positionerEl || !panelEl) return;
|
|
430
|
+
const ownerDocument = triggerEl.ownerDocument;
|
|
431
|
+
const ownerWindow = ownerDocument.defaultView;
|
|
432
|
+
if (!ownerWindow || ownerWindow.closed || !triggerEl.isConnected || !positionerEl.isConnected || positionerEl.ownerDocument !== ownerDocument || panelEl.ownerDocument !== ownerDocument) {
|
|
433
|
+
closeWhenPositioningIsUnsafe();
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
389
436
|
const contentEl = panelEl.firstElementChild;
|
|
390
|
-
if (!contentEl)
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
const widthPx = widthWanted == null ? void 0 : Math.max(0, Math.round(widthWanted));
|
|
394
|
-
if (widthPx == null) {
|
|
395
|
-
if (positionerEl.style.width) positionerEl.style.width = "";
|
|
396
|
-
} else if (positionerEl.style.width !== `${widthPx}px`) {
|
|
397
|
-
positionerEl.style.width = `${widthPx}px`;
|
|
437
|
+
if (!contentEl) {
|
|
438
|
+
closeWhenPositioningIsUnsafe();
|
|
439
|
+
return;
|
|
398
440
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
width
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
441
|
+
try {
|
|
442
|
+
const triggerRect = triggerEl.getBoundingClientRect();
|
|
443
|
+
const viewportWidth = ownerWindow.innerWidth;
|
|
444
|
+
const viewportHeight = ownerWindow.innerHeight;
|
|
445
|
+
if (!isFiniteRect(triggerRect) || !Number.isFinite(viewportWidth) || !Number.isFinite(viewportHeight) || viewportWidth <= 0 || viewportHeight <= 0 || isFullyOutsideViewport(triggerRect, viewportWidth, viewportHeight)) {
|
|
446
|
+
closeWhenPositioningIsUnsafe();
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const widthWanted = matchTriggerWidth ? triggerRect.width : contentWidth;
|
|
450
|
+
const widthPx = widthWanted == null ? void 0 : Math.max(0, Math.round(widthWanted));
|
|
451
|
+
if (widthPx == null) {
|
|
452
|
+
if (positionerEl.style.width) positionerEl.style.width = "";
|
|
453
|
+
} else if (positionerEl.style.width !== `${widthPx}px`) {
|
|
454
|
+
positionerEl.style.width = `${widthPx}px`;
|
|
455
|
+
}
|
|
456
|
+
const prevApplied = lastAppliedRef.current;
|
|
457
|
+
const measuredWidth = positionerEl.offsetWidth;
|
|
458
|
+
const measuredHeight = positionerEl.offsetHeight;
|
|
459
|
+
const contentRect = positionerEl.getBoundingClientRect();
|
|
460
|
+
const contentBoxWidth = measuredWidth || contentRect.width;
|
|
461
|
+
const contentBoxHeight = Math.max(measuredHeight, contentRect.height);
|
|
462
|
+
const next = computePopoverPosition({
|
|
463
|
+
triggerRect,
|
|
464
|
+
contentSize: { width: contentBoxWidth, height: contentBoxHeight },
|
|
465
|
+
placement,
|
|
466
|
+
offset,
|
|
467
|
+
padding,
|
|
468
|
+
viewport: {
|
|
469
|
+
width: viewportWidth,
|
|
470
|
+
height: viewportHeight
|
|
471
|
+
},
|
|
472
|
+
constrainToAvailableHeight
|
|
473
|
+
});
|
|
474
|
+
const top = Math.round(next.top);
|
|
475
|
+
const left = Math.round(next.left);
|
|
476
|
+
const applied = prevApplied && prevApplied.positioner === positionerEl && Math.abs(prevApplied.top - top) < 0.5 && Math.abs(prevApplied.left - left) < 0.5 && prevApplied.side === next.side && prevApplied.align === next.align && prevApplied.width === widthPx && prevApplied.availableHeight === next.availableHeight;
|
|
477
|
+
if (applied) return;
|
|
478
|
+
lastAppliedRef.current = {
|
|
479
|
+
positioner: positionerEl,
|
|
480
|
+
top,
|
|
481
|
+
left,
|
|
482
|
+
side: next.side,
|
|
483
|
+
align: next.align,
|
|
484
|
+
width: widthPx,
|
|
485
|
+
availableHeight: next.availableHeight
|
|
486
|
+
};
|
|
487
|
+
positionerEl.style.transform = `translate3d(${left}px, ${top}px, 0)`;
|
|
488
|
+
positionerEl.style.setProperty("--underverse-popover-available-height", `${next.availableHeight}px`);
|
|
489
|
+
positionerEl.dataset.side = next.side;
|
|
490
|
+
positionerEl.dataset.align = next.align;
|
|
491
|
+
panelEl.style.transformOrigin = getTransformOrigin(next.side, next.align);
|
|
492
|
+
if (positionerEl.style.visibility !== "visible") positionerEl.style.visibility = "visible";
|
|
493
|
+
if (positionerEl.style.pointerEvents !== "auto") positionerEl.style.pointerEvents = "auto";
|
|
494
|
+
} catch {
|
|
495
|
+
closeWhenPositioningIsUnsafe();
|
|
496
|
+
}
|
|
497
|
+
}, [placement, matchTriggerWidth, contentWidth, constrainToAvailableHeight, closeWhenPositioningIsUnsafe]);
|
|
498
|
+
const schedulePositionUpdate = React2.useCallback(() => {
|
|
499
|
+
if (pendingFrameRef.current) return;
|
|
500
|
+
const triggerEl = triggerRef.current;
|
|
501
|
+
const ownerWindow = triggerEl?.ownerDocument.defaultView;
|
|
502
|
+
if (!triggerEl || !ownerWindow || ownerWindow.closed) {
|
|
503
|
+
closeWhenPositioningIsUnsafe();
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
try {
|
|
507
|
+
const frameId = ownerWindow.requestAnimationFrame(() => {
|
|
508
|
+
pendingFrameRef.current = null;
|
|
509
|
+
updatePosition();
|
|
510
|
+
});
|
|
511
|
+
pendingFrameRef.current = { ownerWindow, frameId };
|
|
512
|
+
} catch {
|
|
513
|
+
closeWhenPositioningIsUnsafe();
|
|
514
|
+
}
|
|
515
|
+
}, [closeWhenPositioningIsUnsafe, updatePosition]);
|
|
516
|
+
React2.useLayoutEffect(() => {
|
|
517
|
+
if (isOpen) {
|
|
518
|
+
closeRequestedRef.current = false;
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
lastAppliedRef.current = null;
|
|
522
|
+
cancelScheduledPositionUpdate();
|
|
523
|
+
}, [cancelScheduledPositionUpdate, isOpen]);
|
|
437
524
|
React2.useLayoutEffect(() => {
|
|
438
|
-
if (!isOpen || !
|
|
525
|
+
if (!isOpen || !portalContainer) return;
|
|
439
526
|
updatePosition();
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
updatePosition();
|
|
444
|
-
raf2 = portalWindow.requestAnimationFrame(() => updatePosition());
|
|
445
|
-
});
|
|
446
|
-
return () => {
|
|
447
|
-
portalWindow.cancelAnimationFrame(raf1);
|
|
448
|
-
portalWindow.cancelAnimationFrame(raf2);
|
|
449
|
-
};
|
|
450
|
-
}, [isOpen, portalWindow, updatePosition]);
|
|
527
|
+
schedulePositionUpdate();
|
|
528
|
+
return cancelScheduledPositionUpdate;
|
|
529
|
+
}, [cancelScheduledPositionUpdate, isOpen, portalContainer, schedulePositionUpdate, updatePosition]);
|
|
451
530
|
React2.useEffect(() => {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
531
|
+
const triggerEl = triggerRef.current;
|
|
532
|
+
const positionerEl = positionerRef.current;
|
|
533
|
+
if (!isOpen || !triggerEl || !positionerEl || !portalContainer) return;
|
|
534
|
+
const ownerDocument = triggerEl.ownerDocument;
|
|
535
|
+
const ownerWindow = ownerDocument.defaultView;
|
|
536
|
+
if (!ownerWindow || ownerWindow.closed || portalContainer.ownerDocument !== ownerDocument) {
|
|
537
|
+
closeWhenPositioningIsUnsafe();
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
const scrollAncestors = getScrollAncestors(triggerEl, ownerWindow);
|
|
541
|
+
const passiveOptions = { passive: true };
|
|
542
|
+
for (const ancestor of scrollAncestors) {
|
|
543
|
+
ancestor.addEventListener("scroll", schedulePositionUpdate, passiveOptions);
|
|
544
|
+
}
|
|
545
|
+
ownerWindow.addEventListener("scroll", schedulePositionUpdate, passiveOptions);
|
|
546
|
+
ownerWindow.addEventListener("resize", schedulePositionUpdate);
|
|
547
|
+
ownerDocument.addEventListener("scroll", schedulePositionUpdate, { capture: true, passive: true });
|
|
548
|
+
const visualViewport = ownerWindow.visualViewport;
|
|
549
|
+
visualViewport?.addEventListener("scroll", schedulePositionUpdate, passiveOptions);
|
|
550
|
+
visualViewport?.addEventListener("resize", schedulePositionUpdate);
|
|
551
|
+
const ResizeObserverCtor = ownerWindow.ResizeObserver;
|
|
552
|
+
const resizeObserver = ResizeObserverCtor ? new ResizeObserverCtor(schedulePositionUpdate) : null;
|
|
553
|
+
resizeObserver?.observe(triggerEl);
|
|
554
|
+
resizeObserver?.observe(positionerEl);
|
|
555
|
+
const contentEl = panelRef.current?.firstElementChild;
|
|
556
|
+
if (contentEl) resizeObserver?.observe(contentEl);
|
|
557
|
+
const MutationObserverCtor = ownerWindow.MutationObserver;
|
|
558
|
+
const mutationObserver = MutationObserverCtor ? new MutationObserverCtor(() => {
|
|
559
|
+
const currentTrigger = triggerRef.current;
|
|
560
|
+
if (!currentTrigger || !currentTrigger.isConnected || currentTrigger.ownerDocument !== ownerDocument) {
|
|
561
|
+
closeWhenPositioningIsUnsafe();
|
|
562
|
+
}
|
|
563
|
+
}) : null;
|
|
564
|
+
if (mutationObserver && ownerDocument.documentElement) {
|
|
565
|
+
mutationObserver.observe(ownerDocument.documentElement, { childList: true, subtree: true });
|
|
566
|
+
}
|
|
567
|
+
schedulePositionUpdate();
|
|
472
568
|
return () => {
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
569
|
+
for (const ancestor of scrollAncestors) {
|
|
570
|
+
ancestor.removeEventListener("scroll", schedulePositionUpdate);
|
|
571
|
+
}
|
|
572
|
+
ownerWindow.removeEventListener("scroll", schedulePositionUpdate);
|
|
573
|
+
ownerWindow.removeEventListener("resize", schedulePositionUpdate);
|
|
574
|
+
ownerDocument.removeEventListener("scroll", schedulePositionUpdate, true);
|
|
575
|
+
visualViewport?.removeEventListener("scroll", schedulePositionUpdate);
|
|
576
|
+
visualViewport?.removeEventListener("resize", schedulePositionUpdate);
|
|
577
|
+
resizeObserver?.disconnect();
|
|
578
|
+
mutationObserver?.disconnect();
|
|
579
|
+
cancelScheduledPositionUpdate();
|
|
477
580
|
};
|
|
478
|
-
}, [
|
|
581
|
+
}, [
|
|
582
|
+
cancelScheduledPositionUpdate,
|
|
583
|
+
closeWhenPositioningIsUnsafe,
|
|
584
|
+
isOpen,
|
|
585
|
+
portalContainer,
|
|
586
|
+
schedulePositionUpdate
|
|
587
|
+
]);
|
|
479
588
|
React2.useEffect(() => {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
const
|
|
484
|
-
if (
|
|
485
|
-
|
|
486
|
-
return () => ro.disconnect();
|
|
487
|
-
}, [isOpen, portalWindow, updatePosition]);
|
|
488
|
-
React2.useLayoutEffect(() => {
|
|
489
|
-
if (!isOpen) {
|
|
490
|
-
lastAppliedRef.current = null;
|
|
589
|
+
const triggerEl = triggerRef.current;
|
|
590
|
+
if (!isOpen || !triggerEl || !portalContainer) return;
|
|
591
|
+
const ownerDocument = triggerEl.ownerDocument;
|
|
592
|
+
const ownerWindow = ownerDocument.defaultView;
|
|
593
|
+
if (!ownerWindow || portalContainer.ownerDocument !== ownerDocument) {
|
|
594
|
+
closeWhenPositioningIsUnsafe();
|
|
491
595
|
return;
|
|
492
596
|
}
|
|
493
|
-
}, [isOpen]);
|
|
494
|
-
React2.useEffect(() => {
|
|
495
|
-
if (!isOpen || !portalDocument || !portalWindow) return;
|
|
496
597
|
const handleClickOutside = (event) => {
|
|
497
598
|
const target = event.target;
|
|
498
|
-
const
|
|
599
|
+
const currentTrigger = triggerRef.current;
|
|
499
600
|
const popoverEl = positionerRef.current;
|
|
500
|
-
if (!
|
|
501
|
-
if (
|
|
601
|
+
if (!currentTrigger || !popoverEl) return;
|
|
602
|
+
if (currentTrigger.contains(target)) return;
|
|
502
603
|
if (popoverEl.contains(target)) return;
|
|
503
|
-
if (target instanceof
|
|
604
|
+
if (target instanceof ownerWindow.Element && target.closest("[data-popover]")) return;
|
|
504
605
|
setIsOpen(false);
|
|
505
606
|
};
|
|
506
607
|
const handleEscape = (event) => {
|
|
@@ -508,18 +609,30 @@ var Popover = ({
|
|
|
508
609
|
setIsOpen(false);
|
|
509
610
|
}
|
|
510
611
|
};
|
|
511
|
-
|
|
512
|
-
|
|
612
|
+
ownerDocument.addEventListener("mousedown", handleClickOutside);
|
|
613
|
+
ownerDocument.addEventListener("keydown", handleEscape);
|
|
513
614
|
return () => {
|
|
514
|
-
|
|
515
|
-
|
|
615
|
+
ownerDocument.removeEventListener("mousedown", handleClickOutside);
|
|
616
|
+
ownerDocument.removeEventListener("keydown", handleEscape);
|
|
516
617
|
};
|
|
517
|
-
}, [
|
|
618
|
+
}, [closeWhenPositioningIsUnsafe, isOpen, portalContainer, setIsOpen]);
|
|
518
619
|
const handleTriggerClick = () => {
|
|
519
620
|
if (!disabled) {
|
|
520
621
|
setIsOpen(!isOpen);
|
|
521
622
|
}
|
|
522
623
|
};
|
|
624
|
+
const triggerProps = trigger.props;
|
|
625
|
+
const childRef = triggerProps.ref;
|
|
626
|
+
const setTriggerNode = React2.useCallback((node) => {
|
|
627
|
+
triggerRef.current = node;
|
|
628
|
+
if (node) {
|
|
629
|
+
setTriggerDocument((currentDocument) => currentDocument === node.ownerDocument ? currentDocument : node.ownerDocument);
|
|
630
|
+
}
|
|
631
|
+
}, []);
|
|
632
|
+
const composedTriggerRef = React2.useMemo(
|
|
633
|
+
() => mergeRefs(childRef, setTriggerNode),
|
|
634
|
+
[childRef, setTriggerNode]
|
|
635
|
+
);
|
|
523
636
|
const popoverContent = isOpen && portalContainer ? createPortal(
|
|
524
637
|
/* @__PURE__ */ jsx2(
|
|
525
638
|
"div",
|
|
@@ -575,13 +688,9 @@ var Popover = ({
|
|
|
575
688
|
) : null;
|
|
576
689
|
return /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
577
690
|
(() => {
|
|
578
|
-
const triggerProps = trigger.props;
|
|
579
|
-
const childRef = triggerProps.ref;
|
|
580
691
|
return React2.cloneElement(trigger, {
|
|
581
692
|
...triggerProps,
|
|
582
|
-
ref:
|
|
583
|
-
triggerRef.current = node;
|
|
584
|
-
}),
|
|
693
|
+
ref: composedTriggerRef,
|
|
585
694
|
onClick: chainEventHandlers(
|
|
586
695
|
(e) => {
|
|
587
696
|
triggerRef.current = e.currentTarget;
|
|
@@ -660,7 +769,6 @@ var DropdownMenu = ({
|
|
|
660
769
|
const [activeIndex, setActiveIndex] = useResettingIndex(open);
|
|
661
770
|
const parentMenu = React3.useContext(DropdownMenuContext);
|
|
662
771
|
const hoverCloseTimeoutRef = React3.useRef(null);
|
|
663
|
-
const getPortalContainer = useUEditorPortalContainerGetter();
|
|
664
772
|
const cancelHoverClose = React3.useCallback(() => {
|
|
665
773
|
if (hoverCloseTimeoutRef.current === null) return;
|
|
666
774
|
clearTimeout(hoverCloseTimeoutRef.current);
|
|
@@ -693,7 +801,6 @@ var DropdownMenu = ({
|
|
|
693
801
|
item.focus();
|
|
694
802
|
item.scrollIntoView({ block: "nearest" });
|
|
695
803
|
}, [getEnabledMenuItems, setActiveIndex]);
|
|
696
|
-
useShadCNAnimations();
|
|
697
804
|
const globalConfig = useUnderverseUIConfig();
|
|
698
805
|
const resolvedBorderMode = borderMode ?? globalConfig.dropdownMenu?.borderMode ?? globalConfig.borderMode;
|
|
699
806
|
React3.useEffect(() => {
|
|
@@ -814,8 +921,11 @@ var DropdownMenu = ({
|
|
|
814
921
|
triggerRef.current = node;
|
|
815
922
|
}, [childRef]);
|
|
816
923
|
const handleTriggerKeyDown = React3.useCallback((event) => {
|
|
817
|
-
const
|
|
818
|
-
const scheduleFrame =
|
|
924
|
+
const triggerWindow = event.currentTarget.ownerDocument.defaultView;
|
|
925
|
+
const scheduleFrame = (callback) => {
|
|
926
|
+
if (triggerWindow) triggerWindow.requestAnimationFrame(callback);
|
|
927
|
+
else callback(0);
|
|
928
|
+
};
|
|
819
929
|
if (!disabled) {
|
|
820
930
|
if (event.key === "ArrowDown") {
|
|
821
931
|
event.preventDefault();
|
|
@@ -834,7 +944,7 @@ var DropdownMenu = ({
|
|
|
834
944
|
}
|
|
835
945
|
}
|
|
836
946
|
triggerOnKeyDown?.(event);
|
|
837
|
-
}, [disabled, focusMenuItem, getEnabledMenuItems,
|
|
947
|
+
}, [disabled, focusMenuItem, getEnabledMenuItems, setOpen, triggerOnKeyDown]);
|
|
838
948
|
const handleTriggerClick = React3.useCallback((event) => {
|
|
839
949
|
if (openOnHover && !disabled) {
|
|
840
950
|
cancelHoverClose();
|
|
@@ -4678,4 +4788,4 @@ export {
|
|
|
4678
4788
|
EditorToolbar,
|
|
4679
4789
|
UEDITOR_PROSEMIRROR_CLASS_NAME
|
|
4680
4790
|
};
|
|
4681
|
-
//# sourceMappingURL=chunk-
|
|
4791
|
+
//# sourceMappingURL=chunk-O7AAN6W6.js.map
|