edvoyui-component-library-test-flight 0.0.221 → 0.0.223

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.
@@ -52,6 +52,10 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
52
52
  type: NumberConstructor;
53
53
  default: number;
54
54
  };
55
+ teleported: {
56
+ type: BooleanConstructor;
57
+ default: boolean;
58
+ };
55
59
  }>, {}, {}, {}, {}, import('../../../node_modules/vue').ComponentOptionsMixin, import('../../../node_modules/vue').ComponentOptionsMixin, {} & {
56
60
  "update:visible": (value: boolean) => any;
57
61
  show: () => any;
@@ -92,6 +96,10 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
92
96
  type: NumberConstructor;
93
97
  default: number;
94
98
  };
99
+ teleported: {
100
+ type: BooleanConstructor;
101
+ default: boolean;
102
+ };
95
103
  }>> & Readonly<{
96
104
  "onUpdate:visible"?: ((value: boolean) => any) | undefined;
97
105
  onShow?: (() => any) | undefined;
@@ -105,6 +113,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
105
113
  customButton: string;
106
114
  visible: boolean;
107
115
  hoverHideDelay: number;
116
+ teleported: boolean;
108
117
  }, {}, {}, {}, string, import('../../../node_modules/vue').ComponentProvideOptions, true, {
109
118
  popperWrapper: HTMLDivElement;
110
119
  popperButton: HTMLDivElement;
@@ -15,24 +15,30 @@
15
15
  >
16
16
  <slot name="referenceButton" :open="isOpen"/>
17
17
  </div>
18
- <div
19
- ref="tooltip"
20
- :id="tooltipId"
21
- role="tooltip"
22
- :class="['poppertooltip h-auto text-sm font-normal select-none z-50', className]"
23
- :data-show="isOpen ? '' : null"
24
- @click.stop
25
- @mouseenter="handleTooltipMouseEnter"
26
- @mouseleave="handleTooltipMouseLeave"
27
- >
28
- <div ref="arrowElement" class="arrow" data-popper-arrow />
18
+ <!-- When `teleported`, the tooltip is rendered at <body> (Popper uses a
19
+ `fixed` strategy) so it escapes any ancestor `overflow`/stacking
20
+ context — e.g. a scrollable table or a sticky column. Disabled by
21
+ default, so existing usages keep rendering the tooltip in place. -->
22
+ <Teleport to="body" :disabled="!teleported">
29
23
  <div
30
- v-if="title"
31
- class="text-base font-semibold text-current leading-[normal] px-4 py-2"
32
- v-text="title"
33
- />
34
- <slot />
35
- </div>
24
+ ref="tooltip"
25
+ :id="tooltipId"
26
+ role="tooltip"
27
+ :class="['poppertooltip h-auto text-sm font-normal select-none z-50', className]"
28
+ :data-show="isOpen ? '' : null"
29
+ @click.stop
30
+ @mouseenter="handleTooltipMouseEnter"
31
+ @mouseleave="handleTooltipMouseLeave"
32
+ >
33
+ <div ref="arrowElement" class="arrow" data-popper-arrow />
34
+ <div
35
+ v-if="title"
36
+ class="text-base font-semibold text-current leading-[normal] px-4 py-2"
37
+ v-text="title"
38
+ />
39
+ <slot />
40
+ </div>
41
+ </Teleport>
36
42
  </div>
37
43
  </template>
38
44
 
@@ -77,6 +83,12 @@ const props = defineProps({
77
83
  type: Number,
78
84
  default: 100,
79
85
  },
86
+ // Render the tooltip at <body> using a fixed Popper strategy so it can break
87
+ // out of ancestor overflow/stacking contexts. Off by default for back-compat.
88
+ teleported: {
89
+ type: Boolean,
90
+ default: false,
91
+ },
80
92
  });
81
93
 
82
94
  const popperWrapper = ref<HTMLElement | null>(null);
@@ -122,6 +134,9 @@ const initializePopper = () => {
122
134
  if (popperButton.value && tooltip.value && arrowElement.value) {
123
135
  popperInstance.value = createPopper(popperButton.value, tooltip.value, {
124
136
  placement: props.placement,
137
+ // `fixed` keeps the teleported tooltip glued to the trigger without an
138
+ // offset parent; `absolute` (Popper's default) is unchanged otherwise.
139
+ strategy: props.teleported ? 'fixed' : 'absolute',
125
140
  modifiers: [
126
141
  { name: 'offset', options: { offset: [0, 10] } },
127
142
  { name: 'arrow', options: { element: arrowElement.value } },
@@ -229,11 +244,13 @@ onMounted(() => {
229
244
  }
230
245
 
231
246
  if (props.trigger === 'click') {
247
+ // `tooltip` is ignored too: once teleported it lives outside popperWrapper,
248
+ // so clicks inside it would otherwise register as "outside" and close it.
232
249
  onClickOutside(popperWrapper.value, () => {
233
250
  if (isOpen.value) {
234
251
  hide(true);
235
252
  }
236
- }, { ignore: [popperButton] });
253
+ }, { ignore: [popperButton, tooltip] });
237
254
  }
238
255
  });
239
256
 
@@ -620,7 +620,7 @@ const offsetValue = computed(() => props.customOffset);
620
620
 
621
621
  const withPopper = (
622
622
  dropdownList: HTMLElement,
623
- component: { $refs: { toggle: Element | VirtualElement } },
623
+ component: { $refs: { toggle: Element | VirtualElement }; open: boolean },
624
624
  { width, maxHeight }: any,
625
625
  ) => {
626
626
  const newwidth = selectWidth.value || width; //setcustom width '400px'
@@ -645,7 +645,23 @@ const withPopper = (
645
645
  ],
646
646
  });
647
647
  dropdownList.classList.add("toggle-dropdown");
648
- return () => popper.destroy();
648
+
649
+ // The dropdown is appended to <body>, so it only tracks its trigger via
650
+ // Popper's rAF-scheduled scroll listener, which visibly lags the trigger
651
+ // during a fast/continuous scroll of an ancestor container until scrolling
652
+ // stops. Closing immediately on any outside scroll (capture phase catches
653
+ // non-bubbling scroll events from nested containers) avoids that detached,
654
+ // floating state entirely.
655
+ const closeOnScroll = (event: Event) => {
656
+ if (dropdownList.contains(event.target as Node)) return;
657
+ component.open = false;
658
+ };
659
+ document.addEventListener("scroll", closeOnScroll, true);
660
+
661
+ return () => {
662
+ document.removeEventListener("scroll", closeOnScroll, true);
663
+ popper.destroy();
664
+ };
649
665
  };
650
666
 
651
667
  const fuseSearch = (