{"version":3,"file":"controllable-ui-ngx-tooltip.mjs","sources":["../../../projects/ngx-tooltip/src/lib/ngx-tooltip-arrow/ngx-tooltip-arrow.component.ts","../../../projects/ngx-tooltip/src/lib/ngx-tooltip-arrow/ngx-tooltip-arrow.component.html","../../../projects/ngx-tooltip/src/lib/utils/utils.ts","../../../projects/ngx-tooltip/src/lib/utils/availablePosition.utils.ts","../../../projects/ngx-tooltip/src/lib/utils/positionStyle.utils.ts","../../../projects/ngx-tooltip/src/lib/ngx-tooltip.component.ts","../../../projects/ngx-tooltip/src/lib/ngx-tooltip.component.html","../../../projects/ngx-tooltip/src/public-api.ts","../../../projects/ngx-tooltip/src/controllable-ui-ngx-tooltip.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  input,\n  ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n    selector: 'ngx-tooltip-arrow',\n    imports: [CommonModule],\n    templateUrl: './ngx-tooltip-arrow.component.html',\n    styleUrl: './ngx-tooltip-arrow.component.scss',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None\n})\nexport class NgxTooltipArrowComponent {\n  arrowSize = input<number>();\n}\n","<div\n  class=\"ngxTooltip-arrow\"\n  [ngStyle]=\"{ 'width.px': arrowSize(), 'height.px': arrowSize() }\"\n>\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -16 32 32\">\n    <path d=\"M16 0l16 16H0z\"></path>\n  </svg>\n</div>\n","import { Signal } from '@angular/core';\r\n\r\nexport const generateRandomNumber = () => {\r\n  const seed = new Date().getTime(); // Get current timestamp\r\n  const random = Math.abs(Math.sin(seed) * 1000000); // Use sine function for randomness and scale it\r\n  return Math.floor(random); // Return a positive integer\r\n};\r\n\r\nexport const getDocumentWidth = () => document.documentElement.clientWidth;\r\nexport const getDocumentHeight = () => document.documentElement.clientHeight;\r\nexport const nextTickRender = () =>\r\n  new Promise((resolve) => setTimeout(resolve));\r\n\r\nexport const delay = (milliseconds: number, timeoutIDSignal: Signal<number>) =>\r\n  new Promise((resolve) => setTimeout(resolve, milliseconds));\r\n\r\nexport function getScrollableContainer(scrollableContainer?: HTMLElement) {\r\n  return scrollableContainer ?? document.documentElement;\r\n}\r\n","import { Placement } from '../types';\r\nimport { getDocumentHeight, getDocumentWidth } from './utils';\r\n\r\n/**\r\n * In order to avoid the annoying flickering from top to bottom or from left to right\r\n * in case one side size has mare space than other, after we already have dialog placed on a side,\r\n * we should try to keep dialog on current placement until min size is hit.\r\n *\r\n * When it is first opened it should be positioned were is the most space and\r\n * it should remain there, decreasing height as much as we can\r\n * (until we hit min-height / min-width) and after trying to position it\r\n * on opposed side if there is more space (even if it needs a small decrease of height\r\n * on the opposed side, than the default height)\r\n * * (basically trying all placements in the order defined in placementsToBeTried)\r\n *\r\n */\r\nexport function getDialogAvailablePositionConsideringKeepingCurrentPlacement({\r\n  placementsToBeTried,\r\n  currentPlacement,\r\n  dialogElement,\r\n  relativeElement,\r\n  dialogMaxHeight = Infinity,\r\n  dialogMinHeight = 0,\r\n  dialogMaxWidth = Infinity,\r\n  dialogMinWidth = 0,\r\n}: {\r\n  placementsToBeTried: [\r\n    preferredPlacement: Placement,\r\n    ...restOfPlacements: Placement[]\r\n  ];\r\n  currentPlacement: Placement | undefined;\r\n  dialogElement: HTMLElement;\r\n  relativeElement: HTMLElement;\r\n  dialogMaxHeight?: number;\r\n  dialogMinHeight?: number;\r\n  dialogMaxWidth?: number;\r\n  dialogMinWidth?: number;\r\n}) {\r\n  switch (currentPlacement) {\r\n    case 'top-start':\r\n    case 'top':\r\n    case 'top-end': {\r\n      // decrease height to fit on top; if min-height was hit try to place again on placementsToBeTried\r\n      const maxAvailableSpaceOnTop = getMaxAvailableSpaceOnTop(relativeElement);\r\n      return maxAvailableSpaceOnTop < dialogMinHeight\r\n        ? getAvailablePlacementFromTheOnesToBeTried(\r\n            placementsToBeTried,\r\n            dialogElement,\r\n            relativeElement\r\n          )\r\n        : maxAvailableSpaceOnTop > dialogMaxHeight\r\n        ? {\r\n            type: 'full-size-available' as const,\r\n            placement: currentPlacement,\r\n          }\r\n        : {\r\n            type: 'partial-size-available' as const,\r\n            placement: currentPlacement,\r\n            availableSize: maxAvailableSpaceOnTop,\r\n          };\r\n    }\r\n    case 'bottom-start':\r\n    case 'bottom':\r\n    case 'bottom-end': {\r\n      // decrease height to fit on bottom; if min-height was hit try to place again on placementsToBeTried\r\n      const maxAvailableSpaceOnBottom =\r\n        getMaxAvailableSpaceOnBottom(relativeElement);\r\n      return maxAvailableSpaceOnBottom < dialogMinHeight\r\n        ? getAvailablePlacementFromTheOnesToBeTried(\r\n            placementsToBeTried,\r\n            dialogElement,\r\n            relativeElement\r\n          )\r\n        : maxAvailableSpaceOnBottom > dialogMaxHeight\r\n        ? {\r\n            type: 'full-size-available' as const,\r\n            placement: currentPlacement,\r\n          }\r\n        : {\r\n            type: 'partial-size-available' as const,\r\n            placement: currentPlacement,\r\n            availableSize: maxAvailableSpaceOnBottom,\r\n          };\r\n    }\r\n    case 'left-start':\r\n    case 'left':\r\n    case 'left-end': {\r\n      // decrease height to fit on left; if min-width was hit try to place again on placementsToBeTried\r\n      const maxAvailableSpaceOnLeft =\r\n        getMaxAvailableSpaceOnLeft(relativeElement);\r\n      return maxAvailableSpaceOnLeft < dialogMinWidth\r\n        ? getAvailablePlacementFromTheOnesToBeTried(\r\n            placementsToBeTried,\r\n            dialogElement,\r\n            relativeElement\r\n          )\r\n        : maxAvailableSpaceOnLeft > dialogMaxWidth\r\n        ? {\r\n            type: 'full-size-available' as const,\r\n            placement: currentPlacement,\r\n          }\r\n        : {\r\n            type: 'partial-size-available' as const,\r\n            placement: currentPlacement,\r\n            availableSize: maxAvailableSpaceOnLeft,\r\n          };\r\n    }\r\n    case 'right-start':\r\n    case 'right':\r\n    case 'right-end': {\r\n      // decrease height to fit on right; if min-width was hit try to place again on placementsToBeTried\r\n      const maxAvailableSpaceOnRight =\r\n        getMaxAvailableSpaceOnRight(relativeElement);\r\n      return maxAvailableSpaceOnRight < dialogMinWidth\r\n        ? getAvailablePlacementFromTheOnesToBeTried(\r\n            placementsToBeTried,\r\n            dialogElement,\r\n            relativeElement\r\n          )\r\n        : maxAvailableSpaceOnRight > dialogMaxWidth\r\n        ? {\r\n            type: 'full-size-available' as const,\r\n            placement: currentPlacement,\r\n          }\r\n        : {\r\n            type: 'partial-size-available' as const,\r\n            placement: currentPlacement,\r\n            availableSize: maxAvailableSpaceOnRight,\r\n          };\r\n    }\r\n    default: {\r\n      return getAvailablePlacementFromTheOnesToBeTried(\r\n        placementsToBeTried,\r\n        dialogElement,\r\n        relativeElement\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\nexport function getAvailablePlacementFromTheOnesToBeTried(\r\n  placementsToBeTried: [\r\n    preferredPlacement: Placement,\r\n    ...restOfPlacements: Placement[]\r\n  ],\r\n  dialogElement: HTMLElement,\r\n  relativeElement: HTMLElement\r\n) {\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n  const relativeElementRect = relativeElement.getBoundingClientRect();\r\n\r\n  const placementWithFullAvailableSpace = placementsToBeTried.find(\r\n    (placementToBeTried) => {\r\n      switch (placementToBeTried) {\r\n        case 'top-start':\r\n        case 'top':\r\n        case 'top-end': {\r\n          return relativeElementRect.top - dialogElementRect.height >= 0;\r\n        }\r\n        case 'bottom-start':\r\n        case 'bottom':\r\n        case 'bottom-end': {\r\n          return (\r\n            relativeElementRect.bottom + dialogElementRect.height <=\r\n            getDocumentHeight()\r\n          );\r\n        }\r\n        case 'left-start':\r\n        case 'left':\r\n        case 'left-end': {\r\n          return relativeElementRect.left - dialogElementRect.width >= 0;\r\n        }\r\n        case 'right-start':\r\n        case 'right':\r\n        case 'right-end': {\r\n          return (\r\n            relativeElementRect.right + dialogElementRect.width <=\r\n            getDocumentWidth()\r\n          );\r\n        }\r\n      }\r\n    }\r\n  );\r\n\r\n  if (placementWithFullAvailableSpace) {\r\n    return {\r\n      type: 'full-size-available' as const,\r\n      placement: placementWithFullAvailableSpace,\r\n    };\r\n  } else {\r\n    return {\r\n      type: 'partial-size-available' as const,\r\n      ...getMaxPartialAvailableSpace(placementsToBeTried, relativeElement),\r\n    };\r\n  }\r\n}\r\n\r\nfunction getMaxPartialAvailableSpace(\r\n  placementsToBeTried: [\r\n    preferredPlacement: Placement,\r\n    ...restOfPlacements: Placement[]\r\n  ],\r\n  relativeElement: HTMLElement\r\n) {\r\n  const availableSizeOfPlacementsToBeTried = placementsToBeTried.map(\r\n    (currentPlacementToBeTried) => ({\r\n      placement: currentPlacementToBeTried,\r\n      availableSize: computeMaxAvailableSizeOfDialogForPlacement(\r\n        currentPlacementToBeTried,\r\n        relativeElement\r\n      ),\r\n    })\r\n  );\r\n\r\n  const placementWithMaxAvailableSpace =\r\n    availableSizeOfPlacementsToBeTried.reduce<{\r\n      placement: Placement;\r\n      availableSize: number;\r\n    }>((acc, value) => {\r\n      return acc.availableSize >= value.availableSize ? acc : value;\r\n    }, availableSizeOfPlacementsToBeTried[0]);\r\n\r\n  return placementWithMaxAvailableSpace;\r\n}\r\n\r\nfunction getMaxAvailableSpaceOnTop(relativeElement: HTMLElement) {\r\n  const relativeElementRect = relativeElement.getBoundingClientRect();\r\n\r\n  return relativeElementRect.top;\r\n}\r\n\r\nfunction getMaxAvailableSpaceOnBottom(relativeElement: HTMLElement) {\r\n  const relativeElementRect = relativeElement.getBoundingClientRect();\r\n\r\n  return getDocumentHeight() - relativeElementRect.bottom;\r\n}\r\n\r\nfunction getMaxAvailableSpaceOnLeft(relativeElement: HTMLElement) {\r\n  const relativeElementRect = relativeElement.getBoundingClientRect();\r\n\r\n  return relativeElementRect.left;\r\n}\r\n\r\nfunction getMaxAvailableSpaceOnRight(relativeElement: HTMLElement) {\r\n  const relativeElementRect = relativeElement.getBoundingClientRect();\r\n\r\n  return getDocumentWidth() - relativeElementRect.right;\r\n}\r\n\r\nfunction computeMaxAvailableSizeOfDialogForPlacement(\r\n  placement: Placement,\r\n  relativeElement: HTMLElement\r\n) {\r\n  switch (placement) {\r\n    case 'top-start':\r\n    case 'top':\r\n    case 'top-end': {\r\n      return getMaxAvailableSpaceOnTop(relativeElement);\r\n    }\r\n    case 'bottom-start':\r\n    case 'bottom':\r\n    case 'bottom-end': {\r\n      return getMaxAvailableSpaceOnBottom(relativeElement);\r\n    }\r\n    case 'left-start':\r\n    case 'left':\r\n    case 'left-end': {\r\n      return getMaxAvailableSpaceOnLeft(relativeElement);\r\n    }\r\n    case 'right-start':\r\n    case 'right':\r\n    case 'right-end': {\r\n      return getMaxAvailableSpaceOnRight(relativeElement);\r\n    }\r\n  }\r\n}\r\n","import { Placement } from '../types';\r\nimport {\r\n  getDocumentHeight,\r\n  getDocumentWidth,\r\n} from './utils';\r\n\r\nexport function getBottomEndPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { right, bottom } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustBottomToBeAtMostAtTheBottomEdgeOfScrollableContainer(\r\n      bottom,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      right - dialogElementRect.width,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getBottomPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, bottom, width } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustBottomToBeAtMostAtTheBottomEdgeOfScrollableContainer(\r\n      bottom,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      x + width / 2 - dialogElementRect.width / 2,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getBottomStartPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, bottom } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustBottomToBeAtMostAtTheBottomEdgeOfScrollableContainer(\r\n      bottom,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      x,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getRightEndPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { right, bottom } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      bottom - dialogElementRect.height,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustRightToBeAtMostAtTheRightEdgeOfScrollableContainer(\r\n      right,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getRightPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { right, y, height } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      y + height / 2 - dialogElementRect.height / 2,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustRightToBeAtMostAtTheRightEdgeOfScrollableContainer(\r\n      right,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getRightStartPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { right, y } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      y,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${ensureAdjustRightToBeAtMostAtTheRightEdgeOfScrollableContainer(\r\n      right,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getLeftEndPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, bottom } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      bottom - dialogElementRect.height,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${\r\n      ensureAdjustXToBeAtMostAtTheLeftEdgeOfScrollableContainer(\r\n        x,\r\n        scrollableContainer\r\n      ) - dialogElementRect.width\r\n    }px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getLeftPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, y, height } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      y + height / 2 - dialogElementRect.height / 2,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${\r\n      ensureAdjustXToBeAtMostAtTheLeftEdgeOfScrollableContainer(\r\n        x,\r\n        scrollableContainer\r\n      ) - dialogElementRect.width\r\n    }px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getLeftStartPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, y } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${ensureAdjustYToHaveHeightInsideView(\r\n      y,\r\n      dialogElementRect.height,\r\n      scrollableContainer\r\n    )}px`,\r\n    left: `${\r\n      ensureAdjustXToBeAtMostAtTheLeftEdgeOfScrollableContainer(\r\n        x,\r\n        scrollableContainer\r\n      ) - dialogElementRect.width\r\n    }px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getTopEndPositionStyle({\r\n  relativeElement,\r\n  dialogElement,\r\n  scrollableContainer,\r\n}: {\r\n  relativeElement: HTMLElement;\r\n  dialogElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { y, right } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${\r\n      ensureAdjustYToBeAtMostAtTheTopEdgeOfScrollableContainer(\r\n        y,\r\n        scrollableContainer\r\n      ) - dialogElementRect.height\r\n    }px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      right - dialogElementRect.width,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function ensureAdjustXToHaveWidthInsideView(\r\n  x: number,\r\n  dialogWidth: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  const rightEdgeOfView = scrollableContainer\r\n    ? Math.min(\r\n        getDocumentWidth(),\r\n        scrollableContainer.getBoundingClientRect().right\r\n      )\r\n    : getDocumentWidth();\r\n\r\n  const getLeftEdgeOfView = () =>\r\n    scrollableContainer\r\n      ? Math.max(0, scrollableContainer.getBoundingClientRect().left)\r\n      : 0;\r\n\r\n  const sizeOutsideRightSide = x + dialogWidth - rightEdgeOfView;\r\n  const adjustedX =\r\n    sizeOutsideRightSide > 0\r\n      ? Math.max(x - sizeOutsideRightSide, 0)\r\n      : Math.max(x, getLeftEdgeOfView());\r\n\r\n  return Math.round(adjustedX);\r\n}\r\n\r\nexport function ensureAdjustYToBeAtMostAtTheTopEdgeOfScrollableContainer(\r\n  y: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  return scrollableContainer\r\n    ? Math.max(y, scrollableContainer?.getBoundingClientRect().y)\r\n    : y;\r\n}\r\n\r\nexport function ensureAdjustBottomToBeAtMostAtTheBottomEdgeOfScrollableContainer(\r\n  bottom: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  return scrollableContainer\r\n    ? Math.min(bottom, scrollableContainer.getBoundingClientRect().bottom)\r\n    : bottom;\r\n}\r\n\r\nexport function ensureAdjustXToBeAtMostAtTheLeftEdgeOfScrollableContainer(\r\n  x: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  return scrollableContainer\r\n    ? Math.max(x, scrollableContainer.getBoundingClientRect().x)\r\n    : x;\r\n}\r\n\r\nexport function ensureAdjustRightToBeAtMostAtTheRightEdgeOfScrollableContainer(\r\n  right: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  return scrollableContainer\r\n    ? Math.min(right, scrollableContainer.getBoundingClientRect().right)\r\n    : right;\r\n}\r\n\r\nexport function ensureAdjustYToHaveHeightInsideView(\r\n  y: number,\r\n  dialogHeight: number,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  const bottomEdgeOfView = scrollableContainer\r\n    ? Math.min(\r\n        getDocumentHeight(),\r\n        scrollableContainer.getBoundingClientRect().bottom\r\n      )\r\n    : getDocumentHeight();\r\n\r\n  const getTopEdgeOfView = () =>\r\n    scrollableContainer\r\n      ? Math.max(0, scrollableContainer.getBoundingClientRect().top)\r\n      : 0;\r\n\r\n  const sizeOutside = y + dialogHeight - bottomEdgeOfView;\r\n  const adjustedY =\r\n    sizeOutside > 0\r\n      ? Math.max(y - sizeOutside, 0)\r\n      : Math.max(y, getTopEdgeOfView());\r\n\r\n  return adjustedY;\r\n}\r\n\r\nexport function getTopStartPositionStyle({\r\n  dialogElement,\r\n  relativeElement,\r\n  scrollableContainer,\r\n}: {\r\n  dialogElement: HTMLElement;\r\n  relativeElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, y } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${\r\n      ensureAdjustYToBeAtMostAtTheTopEdgeOfScrollableContainer(\r\n        y,\r\n        scrollableContainer\r\n      ) - dialogElementRect.height\r\n    }px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      x,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getTopPositionStyle({\r\n  dialogElement,\r\n  relativeElement,\r\n  scrollableContainer,\r\n}: {\r\n  dialogElement: HTMLElement;\r\n  relativeElement: HTMLElement;\r\n  scrollableContainer?: HTMLElement;\r\n}) {\r\n  const { x, y, width } = relativeElement.getBoundingClientRect();\r\n  const dialogElementRect = dialogElement.getBoundingClientRect();\r\n\r\n  return {\r\n    top: `${\r\n      ensureAdjustYToBeAtMostAtTheTopEdgeOfScrollableContainer(\r\n        y,\r\n        scrollableContainer\r\n      ) - dialogElementRect.height\r\n    }px`,\r\n    left: `${ensureAdjustXToHaveWidthInsideView(\r\n      x + width / 2 - dialogElementRect.width / 2,\r\n      dialogElementRect.width,\r\n      scrollableContainer\r\n    )}px`,\r\n    right: 'auto',\r\n    bottom: 'auto',\r\n  } as const;\r\n}\r\n\r\nexport function getDialogPositionStyle(\r\n  availablePosition:\r\n    | {\r\n        type: 'full-size-available';\r\n        placement: Placement;\r\n      }\r\n    | {\r\n        placement: Placement;\r\n        availableSize: number;\r\n        type: 'partial-size-available';\r\n      },\r\n  dialogElement: HTMLElement,\r\n  relativeElement: HTMLElement,\r\n  scrollableContainer?: HTMLElement\r\n) {\r\n  switch (availablePosition.placement) {\r\n    case 'top-start':\r\n      return getTopStartPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'top':\r\n      return getTopPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'top-end':\r\n      return getTopEndPositionStyle({\r\n        relativeElement,\r\n        dialogElement,\r\n        scrollableContainer,\r\n      });\r\n    case 'bottom-start':\r\n      return getBottomStartPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'bottom':\r\n      return getBottomPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'bottom-end':\r\n      return getBottomEndPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n    case 'left-start':\r\n      return getLeftStartPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'left':\r\n      return getLeftPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'left-end':\r\n      return getLeftEndPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n    case 'right-start':\r\n      return getRightStartPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'right':\r\n      return getRightPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n\r\n    case 'right-end':\r\n      return getRightEndPositionStyle({\r\n        dialogElement,\r\n        relativeElement,\r\n        scrollableContainer,\r\n      });\r\n  }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  computed,\r\n  effect,\r\n  ElementRef,\r\n  input,\r\n  OnChanges,\r\n  output,\r\n  signal,\r\n  Signal,\r\n  SimpleChanges,\r\n  viewChild,\r\n  ViewEncapsulation,\r\n} from '@angular/core';\r\n\r\nimport { NgxTooltipArrowComponent } from './ngx-tooltip-arrow/ngx-tooltip-arrow.component';\r\nimport { Placement } from './types';\r\nimport {\r\n  getAvailablePlacementFromTheOnesToBeTried,\r\n  getDialogAvailablePositionConsideringKeepingCurrentPlacement,\r\n} from './utils/availablePosition.utils';\r\nimport { getDialogPositionStyle } from './utils/positionStyle.utils';\r\nimport {\r\n  generateRandomNumber,\r\n  getScrollableContainer,\r\n  nextTickRender,\r\n} from './utils/utils';\r\n\r\nexport const defaultOrderOfPlacementsToBeTried: {\r\n  [key in Placement]: [\r\n    preferredPlacement: Placement,\r\n    ...restOfPlacements: Placement[]\r\n  ];\r\n} = {\r\n  'top-start': ['top-start', 'bottom-start', 'left', 'right'],\r\n  top: ['top', 'bottom', 'left', 'right'],\r\n  'top-end': ['top-end', 'bottom-end', 'left', 'right'],\r\n\r\n  'left-start': ['left-start', 'right-start', 'top', 'bottom'],\r\n  left: ['left', 'right', 'top', 'bottom'],\r\n  'left-end': ['left-end', 'right-end', 'top', 'bottom'],\r\n\r\n  'right-start': ['right-start', 'left-start', 'top', 'bottom'],\r\n  right: ['right', 'left', 'top', 'bottom'],\r\n  'right-end': ['right-end', 'left-end', 'top', 'bottom'],\r\n\r\n  'bottom-start': ['bottom-start', 'top-start', 'left', 'right'],\r\n  bottom: ['bottom', 'top', 'left', 'right'],\r\n  'bottom-end': ['bottom-end', 'top-end', 'left', 'right'],\r\n};\r\n\r\ntype BaseProps = {\r\n  open: Signal<boolean>;\r\n  onOpen$?: () => void;\r\n  onClose$?: () => void;\r\n  preferredPlacement?: Placement;\r\n  orderOfPlacementsToBeTried?: [\r\n    preferredPlacement: Placement,\r\n    ...restOfPlacements: Placement[]\r\n  ];\r\n  triggerActions?: ('hover' | 'focus' | 'click')[];\r\n  /**\r\n   * Distance between relative element and tooltip dialog\r\n   */\r\n  dialogOffset?: number;\r\n  /**\r\n   * Open timeout in ms\r\n   */\r\n  enterDelay?: number;\r\n  /**\r\n   * Close timeout in ms\r\n   */\r\n  leaveDelay?: number;\r\n  arrow?: boolean;\r\n  /**\r\n   * Scrollable container is the one use\r\n   * to track scroll event and position dialog while scrolling inside it.\r\n   */\r\n  scrollableContainer?: HTMLElement;\r\n  tooltipClass?: string;\r\n  tooltipRootClass?: string;\r\n};\r\n\r\nexport type KeepCurrentPlacementStrategyProps = BaseProps & {\r\n  /**\r\n   * Keep current placement of dialog as time as it remains in\r\n   * min & max sizes boundaries.\r\n   */\r\n  placementStrategy: 'considerKeepingCurrentPlacement';\r\n  /**\r\n   * `dialogMinMaxSizes`:\r\n   *   > In case we need to keep current position, we will use maximum & minimum sizes\r\n   *   > of dialog to check if it fits in current placement, without going over its minimum sizes.\r\n   *   > In case we don't have minimum size available for current placement,\r\n   *   > than will be tried next place from `orderOfPlacementsToBeTried`.\r\n   *\r\n   *   > Maximum size is used to make sure to not have a bigger maximum size on dialog popover.\r\n   *   > (we make sure to override the maximum size in case the available space is smaller than the dialog size)\r\n   */\r\n  dialogMinMaxSizes?: {\r\n    dialogMaxHeight?: number;\r\n    dialogMinHeight?: number;\r\n    dialogMaxWidth?: number;\r\n    dialogMinWidth?: number;\r\n  };\r\n};\r\n\r\n/**\r\n * Dialog placement will be recomputed immediately after we remain\r\n * without necessary space for dialog on current placement.\r\n */\r\nexport type DefaultStrategyProps = BaseProps & {\r\n  placementStrategy: 'default';\r\n};\r\n\r\nexport type Props = DefaultStrategyProps | KeepCurrentPlacementStrategyProps;\r\n\r\n@Component({\r\n  selector: 'ngx-tooltip',\r\n  imports: [CommonModule, NgxTooltipArrowComponent],\r\n  templateUrl: './ngx-tooltip.component.html',\r\n  styleUrl: './ngx-tooltip.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgxTooltipComponent implements OnChanges {\r\n  open = input<boolean>();\r\n\r\n  preferredPlacement = input<Placement>('bottom-start');\r\n  orderOfPlacementsToBeTried =\r\n    input<[preferredPlacement: Placement, ...restOfPlacements: Placement[]]>();\r\n  orderOfPlacementsToBeTriedComputed = computed(\r\n    () =>\r\n      this.orderOfPlacementsToBeTried() ||\r\n      defaultOrderOfPlacementsToBeTried[this.preferredPlacement()]\r\n  );\r\n\r\n  enterDelay = input<number>(100);\r\n  leaveDelay = input<number>(150);\r\n  triggerActions = input<('hover' | 'focus' | 'click')[]>(['hover', 'focus']);\r\n  arrow = input<boolean>(false);\r\n  arrowSize = computed<number>(() => (this.arrow() ? 12 : 0));\r\n  dialogOffset = input<number>(5);\r\n  computedDialogOffset = computed(() =>\r\n    this.arrow()\r\n      ? this.dialogOffset() - this.arrowSize() / 2\r\n      : this.dialogOffset()\r\n  );\r\n  bridgeSize = computed<number>(\r\n    () => this.computedDialogOffset() + this.arrowSize()\r\n  );\r\n\r\n  scrollableContainer = input<ElementRef>();\r\n  tooltipRootClass = input<string>();\r\n  tooltipClass = input<string>();\r\n\r\n  /**\r\n   * default - Dialog placement will be recomputed immediately after we remain\r\n   * without necessary space for dialog on current placement.\r\n   *\r\n   * considerKeepingCurrentPlacement - Keep current placement of dialog as time as it remains in\r\n   * min & max sizes boundaries.\r\n   */\r\n  placementStrategy = input<\r\n    'default' | 'considerKeepingCurrentPlacement' | undefined\r\n  >('default');\r\n\r\n  /**\r\n   *\r\n   * `dialogMinMaxSizes`:\r\n   *   > is used when placementStrategy has value considerKeepingCurrentPlacement\r\n   *   > In case we need to keep current position, we will use maximum & minimum sizes\r\n   *   > of dialog to check if it fits in current placement, without going over its minimum sizes.\r\n   *   > In case we don't have minimum size available for current placement,\r\n   *   > than will be tried next place from `orderOfPlacementsToBeTried`.\r\n   *      *   > Maximum size is used to make sure to not have a bigger maximum size on dialog popover.\r\n   *   > (we make sure to override the maximum size in case the available space is smaller than the dialog size)\r\n   */\r\n  dialogMinMaxSizes = input<{\r\n    dialogMaxHeight?: number;\r\n    dialogMinHeight?: number;\r\n    dialogMaxWidth?: number;\r\n    dialogMinWidth?: number;\r\n  }>();\r\n\r\n  onOpen$ = output();\r\n  onClose$ = output();\r\n\r\n  tooltipId = generateRandomNumber();\r\n\r\n  relativeElementRef = viewChild<ElementRef>('relativeElementRef');\r\n  dialogWithBridgeRef = viewChild<ElementRef>('dialogWithBridgeRef');\r\n  dialogRef = viewChild<ElementRef>('dialogRef');\r\n\r\n  dialogIsOpenLocalState = signal(this.open());\r\n  dialogPositionStyle = signal<{\r\n    currentPlacement?: Placement;\r\n    value: {\r\n      visibility?: string;\r\n      bottom?: string;\r\n      top?: string;\r\n      left?: string;\r\n      right?: string;\r\n      '--scrollbar-height'?: string;\r\n      '--relative-x'?: string;\r\n      '--relative-y'?: string;\r\n      '--relative-width'?: string;\r\n      '--relative-height'?: string;\r\n      '--dialog-x'?: string;\r\n      '--dialog-y'?: string;\r\n      '--dialog-width'?: string;\r\n      '--dialog-height'?: string;\r\n    };\r\n    maxHeight: string;\r\n    maxWidth: string;\r\n    '--scrollbar-height'?: string;\r\n  }>({\r\n    currentPlacement: undefined,\r\n    value: {},\r\n    maxHeight: '',\r\n    maxWidth: '',\r\n  });\r\n  closeDialogTimeoutID = signal<NodeJS.Timeout | undefined>(undefined);\r\n  openDialogTimeoutID = signal<NodeJS.Timeout | undefined>(undefined);\r\n  dialogAnimationState = signal<'show' | 'hide' | 'initial'>('initial');\r\n\r\n  constructor() {\r\n    effect((onCleanup) => {\r\n      if (\r\n        this.dialogIsOpenLocalState() &&\r\n        this.triggerActions()?.includes('click')\r\n      ) {\r\n        window.addEventListener('click', this.handleClickOutsideClose);\r\n\r\n        onCleanup(() => {\r\n          window.removeEventListener('click', this.handleClickOutsideClose);\r\n        });\r\n      }\r\n    });\r\n\r\n    effect((onCleanup) => {\r\n      if (this.dialogIsOpenLocalState()) {\r\n        const scrollableContainer = getScrollableContainer(\r\n          this.scrollableContainer()?.nativeElement\r\n        );\r\n\r\n        scrollableContainer.addEventListener('scroll', this.positionDialog);\r\n\r\n        onCleanup(() => {\r\n          scrollableContainer.removeEventListener(\r\n            'scroll',\r\n            this.positionDialog\r\n          );\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  positionDialog = async () => {\r\n    if (\r\n      this.dialogWithBridgeRef() &&\r\n      this.dialogRef() &&\r\n      this.relativeElementRef()\r\n    ) {\r\n      // compute placement of dialog using the dialogRef which doesn't include bridge,\r\n      // which is unknown before knowing the next dialog placement.\r\n      // We use dialogOffset to properly take the bridge into account when computing the available space & placement\r\n      const availablePosition =\r\n        this.placementStrategy() === 'considerKeepingCurrentPlacement'\r\n          ? getDialogAvailablePositionConsideringKeepingCurrentPlacement({\r\n              placementsToBeTried: this.orderOfPlacementsToBeTriedComputed(),\r\n              dialogElement: this.dialogRef()!.nativeElement,\r\n              relativeElement: this.relativeElementRef()!.nativeElement,\r\n              currentPlacement: this.dialogPositionStyle().currentPlacement,\r\n              ...this.dialogMinMaxSizes?.(),\r\n            })\r\n          : getAvailablePlacementFromTheOnesToBeTried(\r\n              this.orderOfPlacementsToBeTriedComputed(),\r\n              this.dialogRef()!.nativeElement,\r\n              this.relativeElementRef()!.nativeElement\r\n            );\r\n\r\n      if (availablePosition.type === 'partial-size-available') {\r\n        // in case of partial size available to be displayed,\r\n        // apply the new height or width on element before computing\r\n        // its position for available placement location\r\n        // (for ex. if placement is left this will make sure to always\r\n        // place on left center based on new dialog height obtained\r\n        // after reducing the width of it)\r\n        switch (availablePosition.placement) {\r\n          case 'top-start':\r\n          case 'top':\r\n          case 'top-end':\r\n          case 'bottom-start':\r\n          case 'bottom':\r\n          case 'bottom-end':\r\n            // Note: maxHeight will be set on .ngxTooltip-tooltip\r\n            this.dialogPositionStyle.set({\r\n              ...this.dialogPositionStyle(),\r\n              maxHeight: `${\r\n                availablePosition.availableSize - this.bridgeSize()\r\n              }px`,\r\n            });\r\n            break;\r\n          case 'left-start':\r\n          case 'left':\r\n          case 'left-end':\r\n          case 'right-start':\r\n          case 'right':\r\n          case 'right-end':\r\n            // Note: maxWidth will be set on .ngxTooltip-dialog-with-bridge\r\n            this.dialogPositionStyle.set({\r\n              ...this.dialogPositionStyle(),\r\n              maxWidth: `${availablePosition.availableSize}px`,\r\n            });\r\n            break;\r\n        }\r\n\r\n        await nextTickRender(); // wait for new width/height to be rendered,\r\n        // to be able to compute properly, the position of dialog for\r\n        // available placement location\r\n      }\r\n\r\n      this.dialogPositionStyle.set({\r\n        ...this.dialogPositionStyle(),\r\n        currentPlacement: availablePosition.placement,\r\n      });\r\n\r\n      await nextTickRender(); // wait for the placement class to be rendered,\r\n      // in order to have the bridge (padding) applied\r\n\r\n      const dialogPositionStyleProps = getDialogPositionStyle(\r\n        availablePosition,\r\n        this.dialogWithBridgeRef()!.nativeElement, // dialogWithBridgeRef have the bridge in place in this point\r\n        // so we can properly compute the position, taking into account the bridge\r\n        this.relativeElementRef()!.nativeElement,\r\n        this.scrollableContainer()?.nativeElement\r\n      );\r\n\r\n      this.dialogPositionStyle.set({\r\n        ...this.dialogPositionStyle(),\r\n        value: {\r\n          ...this.dialogPositionStyle().value,\r\n          ...dialogPositionStyleProps,\r\n          '--scrollbar-height': `${\r\n            window.innerHeight - document.documentElement.clientHeight\r\n          }px`,\r\n          // visibility: \"visible\",\r\n        },\r\n      });\r\n\r\n      await nextTickRender(); // wait for the dialog to be rendered on the computed placement\r\n\r\n      this.dialogPositionStyle.set({\r\n        ...this.dialogPositionStyle(),\r\n        value: {\r\n          ...this.dialogPositionStyle().value,\r\n          ...(this.arrow()\r\n            ? {\r\n                ...(() => {\r\n                  const { x, y, width, height, right, bottom } =\r\n                    this.relativeElementRef()?.nativeElement.getBoundingClientRect() ??\r\n                    {};\r\n\r\n                  const scrollableContainerRect = getScrollableContainer(\r\n                    this.scrollableContainer()?.nativeElement\r\n                  ).getBoundingClientRect();\r\n\r\n                  return {\r\n                    '--relative-x': `${Math.max(\r\n                      x,\r\n                      scrollableContainerRect.x\r\n                    )}px`,\r\n                    '--relative-y': `${Math.max(\r\n                      y,\r\n                      scrollableContainerRect.y\r\n                    )}px`,\r\n                    '--relative-width': `${Math.min(\r\n                      width,\r\n                      Math.max(\r\n                        0,\r\n                        width -\r\n                          Math.max(0, right - scrollableContainerRect.right) -\r\n                          Math.max(0, scrollableContainerRect.x - x)\r\n                      )\r\n                    )}px`,\r\n                    '--relative-height': `${Math.min(\r\n                      height,\r\n                      Math.max(\r\n                        0,\r\n                        height -\r\n                          Math.max(0, bottom - scrollableContainerRect.bottom) -\r\n                          Math.max(0, scrollableContainerRect.y - y)\r\n                      )\r\n                    )}px`,\r\n                  };\r\n                })(),\r\n                ...(() => {\r\n                  const { x, y, width, height } =\r\n                    this.dialogRef()?.nativeElement.getBoundingClientRect() ??\r\n                    {};\r\n\r\n                  return {\r\n                    '--dialog-x': `${x}px`,\r\n                    '--dialog-y': `${y}px`,\r\n                    '--dialog-width': `${width}px`,\r\n                    '--dialog-height': `${height}px`,\r\n                  };\r\n                })(),\r\n              }\r\n            : {}),\r\n        },\r\n      });\r\n    }\r\n  };\r\n\r\n  scheduleDialogOpen = async () => {\r\n    // ! check again to make sure we open dialog just if external\r\n    // ! state specify now that the dialog should be opened\r\n    // This check is needed because due to asynchronously downloading\r\n    // the function, it might be downloaded later than scheduleDialogClose\r\n    // an in that case close would take place before scheduleDialogOpen,\r\n    // and this will end up, having dialog open, even if external state\r\n    // specify that it should be closed\r\n    if (this.open()) {\r\n      this.dialogPositionStyle.set({\r\n        ...this.dialogPositionStyle(),\r\n        value: {\r\n          ...this.dialogPositionStyle().value,\r\n          visibility: 'hidden',\r\n        },\r\n      });\r\n\r\n      this.openDialogTimeoutID.set(\r\n        setTimeout(async () => {\r\n          // ! check again to make sure we open dialog just if external\r\n          // ! state specify now that the dialog should be opened\r\n\r\n          if (this.open()) {\r\n            await nextTickRender(); // wait for dialog to have `visibility: hidden` set\r\n            // before showing it\r\n            // This is important in order to avoid the display of it on a position\r\n            // inappropriate with requested/available placement\r\n            // * (at this moment we don't have the dialog sizes,\r\n            // * and it is not positioned on requested/available placement)\r\n\r\n            const positionDialogAndMakeItVisible = new ResizeObserver(\r\n              async () => {\r\n                await this.positionDialog();\r\n                await this.positionDialog(); // call a second time to make sure that the size of dialog is computed properly\r\n                // (the first time when we call positionDialog the browser doesn't compute the height/width of dialog properly)\r\n\r\n                this.dialogPositionStyle.set({\r\n                  ...this.dialogPositionStyle(),\r\n                  value: {\r\n                    ...this.dialogPositionStyle().value,\r\n                    visibility: 'visible',\r\n                  },\r\n                });\r\n\r\n                this.dialogAnimationState.set('show');\r\n\r\n                positionDialogAndMakeItVisible.disconnect();\r\n              }\r\n            );\r\n\r\n            if (this.dialogRef()) {\r\n              positionDialogAndMakeItVisible.observe(\r\n                this.dialogRef()!.nativeElement\r\n              );\r\n              this.dialogWithBridgeRef()?.nativeElement.showPopover();\r\n              this.dialogIsOpenLocalState.set(true);\r\n            }\r\n          }\r\n        }, this.enterDelay())\r\n      );\r\n    }\r\n  };\r\n\r\n  closeDialog = () => {\r\n    // ! check again to make sure we close dialog just if external\r\n    // ! state specify now that the dialog should be closed\r\n    if (!this.open()) {\r\n      this.dialogWithBridgeRef()?.nativeElement.hidePopover();\r\n      this.dialogIsOpenLocalState.set(false);\r\n\r\n      this.dialogPositionStyle.set({\r\n        ...this.dialogPositionStyle(),\r\n        currentPlacement: undefined,\r\n        value: {},\r\n        maxHeight: '',\r\n        maxWidth: '',\r\n      });\r\n\r\n      const scrollableContainer = getScrollableContainer(\r\n        this.scrollableContainer()?.nativeElement\r\n      );\r\n      scrollableContainer.removeEventListener('scroll', this.positionDialog);\r\n    }\r\n  };\r\n\r\n  scheduleDialogClose = () => {\r\n    // check again to make sure we close dialog just if external\r\n    // state specify now that the dialog should be closed\r\n    if (!this.open()) {\r\n      this.dialogAnimationState.set('hide');\r\n\r\n      this.closeDialogTimeoutID.set(\r\n        setTimeout(() => {\r\n          this.closeDialog();\r\n        }, this.leaveDelay())\r\n      );\r\n    }\r\n  };\r\n\r\n  cancelDialogOpen = () => {\r\n    clearTimeout(this.openDialogTimeoutID());\r\n    this.openDialogTimeoutID.set(undefined);\r\n    this.dialogAnimationState.set('hide');\r\n  };\r\n\r\n  cancelDialogClose = () => {\r\n    clearTimeout(this.closeDialogTimeoutID());\r\n    this.closeDialogTimeoutID.set(undefined);\r\n    this.dialogAnimationState.set('show');\r\n  };\r\n\r\n  handleClickOutsideClose = async (event: Event) => {\r\n    if (\r\n      this.dialogWithBridgeRef()?.nativeElement !== event.target &&\r\n      !this.dialogWithBridgeRef()?.nativeElement.contains(\r\n        event.target as Node\r\n      ) &&\r\n      this.relativeElementRef()?.nativeElement !== event.target &&\r\n      !this.relativeElementRef()?.nativeElement.contains(event.target as Node)\r\n    ) {\r\n      this.onClose$?.emit();\r\n    }\r\n  };\r\n\r\n  handleOpenAction = () => {\r\n    this.onOpen$?.emit();\r\n  };\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if ('open' in changes) {\r\n      await this.toggleVisibility();\r\n    }\r\n  }\r\n\r\n  private toggleVisibility = async () => {\r\n    const shouldDialogOpen = this.open();\r\n\r\n    if (shouldDialogOpen) {\r\n      this.cancelDialogClose();\r\n      await this.scheduleDialogOpen();\r\n    } else {\r\n      this.cancelDialogOpen();\r\n      if (this.dialogIsOpenLocalState()) {\r\n        this.scheduleDialogClose();\r\n      }\r\n    }\r\n  };\r\n\r\n  handleRelativeElementMouseOrFocusLeave = (event: MouseEvent | FocusEvent) => {\r\n    if (\r\n      this.dialogWithBridgeRef()?.nativeElement !== event.relatedTarget &&\r\n      (!(event.relatedTarget instanceof Node) ||\r\n        !this.dialogWithBridgeRef()?.nativeElement.contains(\r\n          event.relatedTarget\r\n        ))\r\n    ) {\r\n      this.onClose$.emit();\r\n    }\r\n  };\r\n\r\n  handleMouseOrFocusLeaveDialog = async (event: MouseEvent | FocusEvent) => {\r\n    if (\r\n      this.relativeElementRef()?.nativeElement !== event.relatedTarget &&\r\n      (!(event.relatedTarget instanceof Node) ||\r\n        !this.relativeElementRef()?.nativeElement.contains(event.relatedTarget))\r\n    ) {\r\n      this.onClose$.emit();\r\n    }\r\n  };\r\n\r\n  handleMouseEnter = async () => {\r\n    this.onOpen$?.emit(); // emit open to parent to make sure it will have open state also\r\n    await this.cancelDialogClose();\r\n  };\r\n}\r\n","<div class=\"ngxTooltip-root-container\">\n  <div\n    #relativeElementRef\n    class=\"ngxTooltip-relative-element\"\n    [attr.popovertarget]=\"tooltipId\"\n    (mouseenter)=\"\n      triggerActions().includes('hover') ? handleOpenAction() : undefined\n    \"\n    (mouseleave)=\"\n      triggerActions().includes('hover')\n        ? handleRelativeElementMouseOrFocusLeave($event)\n        : undefined\n    \"\n    (focusin)=\"\n      triggerActions().includes('focus') ? handleOpenAction() : undefined\n    \"\n    (focusout)=\"\n      triggerActions().includes('focus')\n        ? handleRelativeElementMouseOrFocusLeave($event)\n        : undefined\n    \"\n    (click)=\"\n      triggerActions().includes('click') ? handleOpenAction() : undefined\n    \"\n  >\n    <ng-content select=\".relative-element\"></ng-content>\n  </div>\n\n  <div\n    class=\"ngxTooltip-dialog-with-bridge {{ tooltipRootClass() }}\"\n    [ngClass]=\"[\n      dialogPositionStyle().currentPlacement\n        ? 'ngxTooltip-placement-' + dialogPositionStyle().currentPlacement\n        : '',\n      dialogAnimationState() === 'initial' ? 'ngxTooltip-initial' : '',\n      dialogAnimationState() === 'show' ? 'ngxTooltip-show' : '',\n      dialogAnimationState() === 'hide' ? 'ngxTooltip-hide' : ''\n    ]\"\n    #dialogWithBridgeRef\n    popover=\"manual\"\n    [attr.id]=\"tooltipId\"\n    role=\"tooltip\"\n    [attr.data-dialog-placement]=\"preferredPlacement()\"\n    [ngStyle]=\"{\n      'visibility': dialogPositionStyle().value['visibility'] ?? '',\n      'bottom': dialogPositionStyle().value['bottom'] ?? '',\n      'top': dialogPositionStyle().value['top'] ?? '',\n      'left': dialogPositionStyle().value['left'] ?? '',\n      'right': dialogPositionStyle().value['right'] ?? '',\n      '--scrollbar-height': dialogPositionStyle().value['--scrollbar-height'] ?? '',\n      '--relative-x': dialogPositionStyle().value['--relative-x'] ?? '',\n      '--relative-y': dialogPositionStyle().value['--relative-y'] ?? '',\n      '--relative-width': dialogPositionStyle().value['--relative-width'] ?? '',\n      '--relative-height': dialogPositionStyle().value['--relative-height'] ?? '',\n      '--dialog-x': dialogPositionStyle().value['--dialog-x'] ?? '',\n      '--dialog-y': dialogPositionStyle().value['--dialog-y'] ?? '',\n      '--dialog-width': dialogPositionStyle().value['--dialog-width'] ?? '',\n      '--dialog-height': dialogPositionStyle().value['--dialog-height'] ?? '',\n      'max-width': dialogPositionStyle().maxWidth,\n      '--dialog-offset.px': (computedDialogOffset()),\n      '--close-timeout.ms': leaveDelay(),\n      '--arrow-size.px': arrow() ? arrowSize() : 0,\n    }\"\n    (mouseenter)=\"\n      triggerActions().includes('hover') ? handleMouseEnter() : undefined\n    \"\n    (mouseleave)=\"\n      triggerActions().includes('hover')\n        ? handleMouseOrFocusLeaveDialog($event)\n        : undefined\n    \"\n  >\n    <div\n      class=\"ngxTooltip-inner-dialog-with-bridge\"\n      #dialogRef\n      (focusout)=\"\n        triggerActions().includes('focus')\n          ? handleMouseOrFocusLeaveDialog($event)\n          : undefined\n      \"\n    >\n      <div class=\"ngxTooltip-animated-inner-dialog-with-bridge\">\n        <div\n          class=\"ngxTooltip-tooltip tooltipClass\"\n          [ngStyle]=\"{\n            'max-height':\n              dialogPositionStyle().maxHeight !== ''\n                ? dialogPositionStyle().maxHeight\n                : dialogMinMaxSizes()?.dialogMaxHeight !== undefined\n                ? dialogMinMaxSizes()?.dialogMaxHeight + 'px'\n                : ''\n          }\"\n        >\n          <ng-content select=\".message\"></ng-content>\n        </div>\n\n        @if (arrow()) {\n        <ngx-tooltip-arrow [arrowSize]=\"arrowSize()\" />\n        }\n      </div>\n    </div>\n  </div>\n</div>\n","/*\r\n * Public API Surface of ngx-tooltip\r\n */\r\n\r\nexport * from './lib/ngx-tooltip.component';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}