@underverse-ui/underverse 2.0.21 → 2.0.22

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  EmojiGridButton,
3
3
  formatEmojiCountLabel
4
- } from "./chunk-SBDZKVUJ.js";
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-RSLY7UU2.js";
58
+ } from "./chunk-LWAKD7EK.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-PZCD342B.js";
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-SFPFCRI4.js");
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-JXYQ5CH5.js");
14507
+ const { MenuBar } = await import("./menu-bar-5FG5RVXQ.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-MSTO23JM.js.map
14976
+ //# sourceMappingURL=chunk-EVY3BTAU.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getPanelBorderRadiusClass,
3
3
  useUnderverseUIConfig
4
- } from "./chunk-RSLY7UU2.js";
4
+ } from "./chunk-LWAKD7EK.js";
5
5
  import {
6
6
  cn,
7
7
  useGlobalI18n
8
- } from "./chunk-PZCD342B.js";
8
+ } from "./chunk-A4GUPKHM.js";
9
9
 
10
10
  // src/components/Modal.tsx
11
11
  import * as React from "react";
@@ -196,4 +196,4 @@ var Modal_default = Modal;
196
196
  export {
197
197
  Modal_default
198
198
  };
199
- //# sourceMappingURL=chunk-NJ53GV74.js.map
199
+ //# sourceMappingURL=chunk-F6KCGIJX.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EmojiGridButton
3
- } from "./chunk-SBDZKVUJ.js";
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-PZCD342B.js";
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-LQCKCWVZ.js.map
208
+ //# sourceMappingURL=chunk-F7MX3XXK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-PZCD342B.js";
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-SBDZKVUJ.js.map
74
+ //# sourceMappingURL=chunk-LRIRY4DG.js.map
@@ -11,7 +11,7 @@ import {
11
11
  setRefValue,
12
12
  useSmartTranslations,
13
13
  useUEditorPortalContainerGetter
14
- } from "./chunk-PZCD342B.js";
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 portalContainer = isOpen ? resolveUEditorPortalContainer(getPortalContainer, contextGetPortalContainer) : null;
371
- const portalDocument = portalContainer?.ownerDocument ?? null;
372
- const portalWindow = portalDocument?.defaultView ?? null;
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 || !portalWindow) return;
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) return;
391
- const triggerRect = triggerEl.getBoundingClientRect();
392
- const widthWanted = matchTriggerWidth ? triggerRect.width : contentWidth;
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
- const prevApplied = lastAppliedRef.current;
400
- const measuredWidth = positionerEl.offsetWidth;
401
- const measuredHeight = positionerEl.offsetHeight;
402
- const contentRect = positionerEl.getBoundingClientRect();
403
- const contentBoxWidth = measuredWidth || contentRect.width;
404
- const contentBoxHeight = Math.max(measuredHeight, contentRect.height, contentEl.scrollHeight);
405
- const next = computePopoverPosition({
406
- triggerRect,
407
- contentSize: { width: contentBoxWidth, height: contentBoxHeight },
408
- placement,
409
- offset,
410
- padding,
411
- viewport: {
412
- width: portalWindow.innerWidth,
413
- height: portalWindow.innerHeight
414
- },
415
- constrainToAvailableHeight
416
- });
417
- const top = Math.round(next.top);
418
- const left = Math.round(next.left);
419
- const applied = prevApplied && 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;
420
- if (applied) return;
421
- lastAppliedRef.current = {
422
- top,
423
- left,
424
- side: next.side,
425
- align: next.align,
426
- width: widthPx,
427
- availableHeight: next.availableHeight
428
- };
429
- positionerEl.style.transform = `translate3d(${left}px, ${top}px, 0)`;
430
- positionerEl.style.setProperty("--underverse-popover-available-height", `${next.availableHeight}px`);
431
- positionerEl.dataset.side = next.side;
432
- positionerEl.dataset.align = next.align;
433
- panelEl.style.transformOrigin = getTransformOrigin(next.side, next.align);
434
- if (positionerEl.style.visibility !== "visible") positionerEl.style.visibility = "visible";
435
- if (positionerEl.style.pointerEvents !== "auto") positionerEl.style.pointerEvents = "auto";
436
- }, [placement, matchTriggerWidth, contentWidth, portalWindow, constrainToAvailableHeight]);
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, contentEl.scrollHeight);
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 || !portalWindow) return;
525
+ if (!isOpen || !portalContainer) return;
439
526
  updatePosition();
440
- let raf1 = 0;
441
- let raf2 = 0;
442
- raf1 = portalWindow.requestAnimationFrame(() => {
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
- if (!isOpen || !portalWindow) return;
453
- let raf = 0;
454
- const tick = () => {
455
- updatePosition();
456
- raf = portalWindow.requestAnimationFrame(tick);
457
- };
458
- raf = portalWindow.requestAnimationFrame(tick);
459
- return () => portalWindow.cancelAnimationFrame(raf);
460
- }, [isOpen, portalWindow, updatePosition]);
461
- React2.useEffect(() => {
462
- if (!isOpen || !portalDocument || !portalWindow) return;
463
- let raf = 0;
464
- const handler = () => {
465
- portalWindow.cancelAnimationFrame(raf);
466
- raf = portalWindow.requestAnimationFrame(() => updatePosition());
467
- };
468
- handler();
469
- portalWindow.addEventListener("resize", handler);
470
- portalWindow.addEventListener("scroll", handler, true);
471
- portalDocument.addEventListener("scroll", handler, true);
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
- portalWindow.cancelAnimationFrame(raf);
474
- portalWindow.removeEventListener("resize", handler);
475
- portalWindow.removeEventListener("scroll", handler, true);
476
- portalDocument.removeEventListener("scroll", handler, true);
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
- }, [isOpen, portalDocument, portalWindow, updatePosition]);
581
+ }, [
582
+ cancelScheduledPositionUpdate,
583
+ closeWhenPositioningIsUnsafe,
584
+ isOpen,
585
+ portalContainer,
586
+ schedulePositionUpdate
587
+ ]);
479
588
  React2.useEffect(() => {
480
- if (!isOpen || !portalWindow) return;
481
- const ResizeObserverCtor = portalWindow.ResizeObserver;
482
- if (!ResizeObserverCtor) return;
483
- const ro = new ResizeObserverCtor(() => updatePosition());
484
- if (positionerRef.current) ro.observe(positionerRef.current);
485
- if (triggerRef.current) ro.observe(triggerRef.current);
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 triggerEl = triggerRef.current;
599
+ const currentTrigger = triggerRef.current;
499
600
  const popoverEl = positionerRef.current;
500
- if (!triggerEl || !popoverEl) return;
501
- if (triggerEl.contains(target)) return;
601
+ if (!currentTrigger || !popoverEl) return;
602
+ if (currentTrigger.contains(target)) return;
502
603
  if (popoverEl.contains(target)) return;
503
- if (target instanceof portalWindow.Element && target.closest("[data-popover]")) return;
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
- portalDocument.addEventListener("mousedown", handleClickOutside);
512
- portalDocument.addEventListener("keydown", handleEscape);
612
+ ownerDocument.addEventListener("mousedown", handleClickOutside);
613
+ ownerDocument.addEventListener("keydown", handleEscape);
513
614
  return () => {
514
- portalDocument.removeEventListener("mousedown", handleClickOutside);
515
- portalDocument.removeEventListener("keydown", handleEscape);
615
+ ownerDocument.removeEventListener("mousedown", handleClickOutside);
616
+ ownerDocument.removeEventListener("keydown", handleEscape);
516
617
  };
517
- }, [isOpen, portalDocument, portalWindow, setIsOpen]);
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: mergeRefs(childRef, (node) => {
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 portalWindow = resolveUEditorPortalContainer(getPortalContainer)?.ownerDocument.defaultView;
818
- const scheduleFrame = portalWindow?.requestAnimationFrame.bind(portalWindow) ?? requestAnimationFrame;
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, getPortalContainer, setOpen, triggerOnKeyDown]);
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-RSLY7UU2.js.map
4791
+ //# sourceMappingURL=chunk-LWAKD7EK.js.map