diff --git a/packages/ui-vue/components/popover/src/popover.component.tsx b/packages/ui-vue/components/popover/src/popover.component.tsx index df71c9162246d000c57435d7b2e0ca8b5601b28e..f47ea7e9aa853c76bd82aae69210f7a81143545a 100644 --- a/packages/ui-vue/components/popover/src/popover.component.tsx +++ b/packages/ui-vue/components/popover/src/popover.component.tsx @@ -1,4 +1,4 @@ -import { computed, defineComponent, ref, SetupContext } from 'vue'; +import { computed, defineComponent, ref, SetupContext, Teleport } from 'vue'; import { PopoverProps, popoverProps } from './popover.props'; import './popover.scss'; @@ -28,11 +28,13 @@ export default defineComponent({ return () => { return ( -
-
- {shouldShowTitle.value &&

{props.title}

} -
{context.slots.default && context.slots?.default()}
-
+ +
+
+ {shouldShowTitle.value &&

{props.title}

} +
{context.slots.default && context.slots?.default()}
+
+
); }; } diff --git a/packages/ui-vue/components/tooltip/src/composition/use-adjust-position.ts b/packages/ui-vue/components/tooltip/src/composition/use-adjust-position.ts index c353feb1ae840d86eb6a2746cecd87bb0886decd..87c0cb5b7e4342431adef73866ca062427ef9606 100644 --- a/packages/ui-vue/components/tooltip/src/composition/use-adjust-position.ts +++ b/packages/ui-vue/components/tooltip/src/composition/use-adjust-position.ts @@ -1,3 +1,4 @@ +import { DomEvent } from "@vue/test-utils/dist/constants/dom-events"; import { SetupContext } from "vue"; import { TooltipPlacement, TooltipProps } from "../tooltip.props"; import { RectPosition, TooltipPosition } from "./types"; @@ -28,10 +29,15 @@ export function useAdjustPosition(props: TooltipProps, context: SetupContext) { placementAndAlignment: TooltipPlacement, originalPosition: TooltipPosition, relativeElementRect: DOMRect, - tooltipRect: DOMRect + hostRect: DOMRect, + tooltipRect: DOMRect, + tooltipContentRect: DOMRect, + arrowRect: DOMRect ): TooltipPosition { let fixedLeft = originalPosition.tooltip.left; let fixedTop = originalPosition.tooltip.top; + let fixedArrowLeft = originalPosition.arrow.left; + let fixedArrowTop = originalPosition.arrow.top; const placementAndAlignmentArray = placementAndAlignment.split('-'); const placement = placementAndAlignmentArray[0]; if (['top', 'bottom'].includes(placement)) { @@ -40,14 +46,24 @@ export function useAdjustPosition(props: TooltipProps, context: SetupContext) { fixedLeft = overLeftBound.overBound ? overLeftBound.fixedValue : (overRightBound.overBound ? overRightBound.fixedValue - tooltipRect.width : originalPosition.tooltip.left); + fixedArrowLeft = overLeftBound.overBound ? + tooltipRect.width - ((fixedLeft + tooltipRect.width) - hostRect.right) - arrowRect.width : + (overRightBound.overBound ? hostRect.left - fixedLeft : originalPosition.arrow.left); } const overTopBound = isOverstepBoundary(relativeElementRect, 'top', originalPosition.tooltip.top); const overBottomBound = isOverstepBoundary(relativeElementRect, 'bottom', originalPosition.tooltip.top + tooltipRect.height); fixedTop = overTopBound.overBound ? overTopBound.fixedValue : (overBottomBound.overBound ? overBottomBound.fixedValue - tooltipRect.height : originalPosition.tooltip.top); + fixedArrowTop = overTopBound.overBound ? + (originalPosition.arrow.top) : + (overBottomBound.overBound ? + ( + tooltipRect.height - ((fixedTop + tooltipRect.height) - hostRect.top) + ) : + originalPosition.arrow.top); const tooltip = { left: fixedLeft, top: fixedTop }; - const arrow = { left: originalPosition.arrow.left, top: originalPosition.arrow.top }; + const arrow = { left: fixedArrowLeft, top: fixedArrowTop }; return { arrow, tooltip }; } diff --git a/packages/ui-vue/components/tooltip/src/composition/use-tooltip-position.ts b/packages/ui-vue/components/tooltip/src/composition/use-tooltip-position.ts index dcefbb7435bc2736b80d3816659742d7c2644350..6425f0638efc0eec38b2c890b9dead98e6c83cd2 100644 --- a/packages/ui-vue/components/tooltip/src/composition/use-tooltip-position.ts +++ b/packages/ui-vue/components/tooltip/src/composition/use-tooltip-position.ts @@ -14,8 +14,6 @@ export function useTooltipPosition( tooltipContentRect: DOMRect, arrowRect: DOMRect) { - const { scrollLeft, scrollTop } = document.documentElement; - const placementAndAlignment = ref(props.placement); const { getRelativeElementBound } = useRelative(props, context); @@ -34,7 +32,9 @@ export function useTooltipPosition( const relativeRect = getRelativeElementBound(); placementAndAlignment.value = adjustPlacement(placementAndAlignment.value, relativeRect, hostRect, tooltipRect, arrowRect); const originalPosition = calculate(placementAndAlignment.value, hostRect, tooltipRect, tooltipContentRect, arrowRect); - const position = adjustPosition(placementAndAlignment.value, originalPosition, relativeRect, tooltipRect); + const position = adjustPosition( + placementAndAlignment.value, originalPosition, relativeRect, hostRect, tooltipRect, tooltipContentRect, arrowRect + ); return position; }); diff --git a/packages/ui-vue/components/tooltip/src/tooltip.component.tsx b/packages/ui-vue/components/tooltip/src/tooltip.component.tsx index 1f410bc2c81081809d6eee5624edf2400bdd1750..b0a56622938e7613731e94c1d4589551f0bec1dd 100644 --- a/packages/ui-vue/components/tooltip/src/tooltip.component.tsx +++ b/packages/ui-vue/components/tooltip/src/tooltip.component.tsx @@ -24,6 +24,8 @@ export default defineComponent({ return classObject; }); + const { scrollLeft, scrollTop } = document.documentElement; + const shouldShowTooltipText = computed(() => isTextContext.value); const tooltipText = computed(() => props.content); @@ -64,9 +66,8 @@ export default defineComponent({ tooltipInnerRef.value.getBoundingClientRect(), arrowRef.value.getBoundingClientRect() ); - tooltipLeftPosition.value = `${tooltipPosition.value.tooltip.left}px`; - tooltipRightPosition.value = `${tooltipPosition.value.tooltip.right}px`; - tooltipTopPosition.value = `${tooltipPosition.value.tooltip.top}px`; + tooltipLeftPosition.value = `${tooltipPosition.value.tooltip.left + scrollLeft}px`; + tooltipTopPosition.value = `${tooltipPosition.value.tooltip.top + scrollTop}px`; arrowLeftPosition.value = `${tooltipPosition.value.arrow.left}px`; arrowTopPosition.value = `${tooltipPosition.value.arrow.top}px`; placement.value = tooltipPlacement.value; diff --git a/packages/ui-vue/components/tooltip/src/tooltip.directive.tsx b/packages/ui-vue/components/tooltip/src/tooltip.directive.tsx index 817eba7e166196df01dcd8aba6d4d2c180fdee77..fb309f0ea30b8448e770ee49e11ec78d50069a3e 100644 --- a/packages/ui-vue/components/tooltip/src/tooltip.directive.tsx +++ b/packages/ui-vue/components/tooltip/src/tooltip.directive.tsx @@ -43,7 +43,7 @@ const tooltipDirective = { element.addEventListener('mouseleave', ($event: MouseEvent) => { $event.stopPropagation(); if (app) { - // app.unmount(); + app.unmount(); app = null; } }); diff --git a/packages/ui-vue/src/app.vue b/packages/ui-vue/src/app.vue index c2919daf8c1fa3086bc2f08bdb4a25ca2d2c13e8..0ae14c621d5f4b330fc88dfedbeef70ca6020079 100644 --- a/packages/ui-vue/src/app.vue +++ b/packages/ui-vue/src/app.vue @@ -16,6 +16,7 @@ import Accordion from './components/accordion.vue'; import ComboList from './components/combo-list.vue'; import CheckboxGroup from './components/checkbox.vue'; import Tooltip from './components/tooltip.vue'; +import Popover from './components/popover.vue'; const canEdit = ref(true); const disable = ref(false); @@ -32,11 +33,7 @@ const canAutoComplete = ref(false); - - + @@ -50,7 +47,6 @@ const canAutoComplete = ref(false); -