{"version":3,"file":"tooltip.directive-a5042569.mjs","sources":["../src/directives/tooltip.directive.ts"],"sourcesContent":["import { createId } from \"../utils/id\";\nimport type { ObjectDirective } from \"vue\";\n\n/**\n * @package admin\n */\ntype Placements = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nconst availableTooltipPlacements: Placements[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\nconst tooltipRegistry = new Map<string, Tooltip>();\n\n/**\n * @private\n */\nclass Tooltip {\n  private _id?: string;\n\n  private _placement?: Placements;\n\n  private _message: string;\n\n  private _width: number | string;\n\n  private _parentDOMElement: HTMLElement;\n\n  private _showDelay: number;\n\n  private _hideDelay: number;\n\n  private _disabled: boolean;\n\n  private _appearance: string;\n\n  private _showOnDisabledElements: boolean;\n\n  private _zIndex: number | null;\n\n  private _isShown: boolean;\n\n  private _state: boolean;\n\n  private _DOMElement: HTMLElement | null;\n\n  private _parentDOMElementWrapper: HTMLElement | null;\n\n  private _actualTooltipPlacement: Placements | null;\n\n  private _timeout?: ReturnType<typeof setTimeout>;\n\n  constructor({\n    id = createId(),\n    placement = \"top\",\n    message,\n    width = 200,\n    element,\n    showDelay = 100,\n    hideDelay = showDelay,\n    disabled = false,\n    appearance = \"dark\",\n    showOnDisabledElements = false,\n    zIndex = null,\n  }: {\n    id?: string;\n    placement?: Placements;\n    message?: string;\n    width?: number | string;\n    element: HTMLElement;\n    showDelay?: number;\n    hideDelay?: number;\n    disabled: boolean;\n    appearance?: string;\n    showOnDisabledElements?: boolean;\n    zIndex?: number | null;\n  }) {\n    this._id = id;\n    this._placement = Tooltip.validatePlacement(placement);\n    this._message = Tooltip.validateMessage(message);\n    this._width = Tooltip.validateWidth(width);\n    this._parentDOMElement = element;\n    this._showDelay = showDelay ?? 100;\n    this._hideDelay = hideDelay ?? 100;\n    this._disabled = disabled;\n    this._appearance = appearance;\n    this._showOnDisabledElements = showOnDisabledElements;\n    this._zIndex = zIndex;\n\n    // initialize tooltip variables\n    this._isShown = false;\n    this._state = false;\n    this._DOMElement = null;\n    this._parentDOMElementWrapper = null;\n    this._actualTooltipPlacement = null;\n  }\n\n  get id() {\n    return this._id;\n  }\n\n  /**\n   * Initializes the tooltip.\n   * Needs to be called after the parent DOM Element is inserted to the DOM.\n   */\n  init() {\n    this._DOMElement = this.createDOMElement();\n\n    if (this._showOnDisabledElements) {\n      this._parentDOMElementWrapper = this.createParentDOMElementWrapper();\n    }\n\n    this.registerEvents();\n  }\n\n  /**\n   * Updates the styles and/or text of the tooltip\n   */\n  update({\n    message,\n    placement,\n    width,\n    showDelay,\n    hideDelay,\n    disabled,\n    appearance,\n    showOnDisabledElements,\n    zIndex,\n  }: {\n    message?: string;\n    placement?: Placements;\n    width?: number | string;\n    showDelay?: number;\n    hideDelay?: number;\n    disabled?: boolean;\n    appearance?: string;\n    showOnDisabledElements?: boolean;\n    zIndex?: number | null;\n  }) {\n    if (message && this._message !== message) {\n      this._message = Tooltip.validateMessage(message);\n\n      if (this._DOMElement) {\n        this._DOMElement.innerHTML = this._message;\n      }\n\n      this.registerEvents();\n    }\n\n    if (width && this._width !== width) {\n      this._width = Tooltip.validateWidth(width);\n      this._DOMElement!.style.width = `${this._width}px`;\n    }\n\n    if (placement && this._placement !== placement) {\n      this._placement = Tooltip.validatePlacement(placement);\n      this._placeTooltip();\n    }\n\n    if (showDelay && this._showDelay !== showDelay) {\n      this._showDelay = showDelay;\n    }\n\n    if (hideDelay && this._hideDelay !== hideDelay) {\n      this._hideDelay = hideDelay;\n    }\n\n    if (disabled !== undefined && this._disabled !== disabled) {\n      this._disabled = disabled;\n    }\n\n    if (appearance && this._appearance !== appearance) {\n      this._DOMElement!.classList.remove(`mt-tooltip--${this._appearance}`);\n      this._appearance = appearance;\n      this._DOMElement!.classList.add(`mt-tooltip--${this._appearance}`);\n    }\n\n    if (\n      showOnDisabledElements !== undefined &&\n      this._showOnDisabledElements !== showOnDisabledElements\n    ) {\n      this._showOnDisabledElements = showOnDisabledElements;\n    }\n\n    if (zIndex !== this._zIndex && zIndex !== undefined) {\n      this._zIndex = zIndex;\n    }\n  }\n\n  /**\n   * Creates a wrapper around the original DOMElement.\n   * This is needed because a disabled input field does not fire any mouse events and prevents the tooltip\n   * therefore from working.\n   * @returns {HTMLElement}\n   */\n  createParentDOMElementWrapper() {\n    const element = document.createElement(\"div\");\n    element.classList.add(\"mt-tooltip--wrapper\");\n\n    this._parentDOMElement.parentNode!.insertBefore(element, this._parentDOMElement);\n    element.appendChild(this._parentDOMElement);\n\n    return element;\n  }\n\n  createDOMElement(): HTMLElement {\n    const element = document.createElement(\"div\");\n    element.innerHTML = this._message;\n    element.style.width = `${this._width}px`;\n    element.setAttribute(\"aria-hidden\", \"false\");\n    element.setAttribute(\"aria-role\", \"tooltip\");\n    element.setAttribute(\"aria-label\", \"currently-opened-tooltip\");\n    element.classList.add(\"mt-tooltip\");\n    element.classList.add(`mt-tooltip--${this._appearance}`);\n\n    if (this._zIndex !== null) {\n      element.style.zIndex = this._zIndex.toFixed(0);\n    }\n\n    return element;\n  }\n\n  registerEvents() {\n    if (this._parentDOMElementWrapper) {\n      this._parentDOMElementWrapper.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n      this._parentDOMElementWrapper.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n    } else {\n      this._parentDOMElement.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n      this._parentDOMElement.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n    }\n    this._DOMElement!.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n    this._DOMElement!.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n  }\n\n  /**\n   * Sets the state and triggers the toggle.\n   */\n  onMouseToggle(event: MouseEvent) {\n    this._state = event.type === \"mouseenter\";\n\n    if (this._timeout) {\n      clearTimeout(this._timeout);\n    }\n\n    this._timeout = setTimeout(\n      this._toggle.bind(this),\n      this._state ? this._showDelay : this._hideDelay,\n    );\n  }\n\n  _toggle() {\n    if (this._state && !this._isShown && this._doesParentExist()) {\n      this.showTooltip();\n      return;\n    }\n\n    if (!this._state && this._isShown) {\n      this.hideTooltip();\n    }\n  }\n\n  /**\n   * Gets the parent element by tag name and tooltip id and returns true or false whether the element exists.\n   * @returns {boolean}\n   * @private\n   */\n  _doesParentExist() {\n    const tooltipIdOfParentElement = this._parentDOMElement.getAttribute(\"tooltip-id\") ?? \"\";\n    const htmlTagOfParentElement = this._parentDOMElement.tagName.toLowerCase();\n\n    return !!document.querySelector(\n      `${htmlTagOfParentElement}[tooltip-id=\"${tooltipIdOfParentElement}\"]`,\n    );\n  }\n\n  /**\n   * Appends the tooltip to the DOM and sets a suitable position\n   */\n  showTooltip() {\n    if (this._disabled) {\n      return;\n    }\n    document.body.appendChild(this._DOMElement!);\n\n    this._placeTooltip();\n    this._isShown = true;\n  }\n\n  /**\n   * Removes the tooltip from the DOM\n   */\n  hideTooltip() {\n    if (this._disabled) {\n      return;\n    }\n\n    this._DOMElement!.remove();\n    this._isShown = false;\n  }\n\n  _placeTooltip() {\n    let possiblePlacements = availableTooltipPlacements;\n    let placement = this._placement;\n    possiblePlacements = possiblePlacements.filter((pos) => pos !== placement);\n\n    // Remove previous placement class if it exists\n    this._DOMElement!.classList.remove(`mt-tooltip--${this._actualTooltipPlacement!}`);\n\n    // Set the tooltip to the desired place\n    this._setDOMElementPosition(this._calculateTooltipPosition(placement ?? \"top\"));\n    this._actualTooltipPlacement = placement ?? null;\n\n    // Check if the tooltip is fully visible in viewport and change position if not\n    while (!this._isElementInViewport(this._DOMElement!)) {\n      // The tooltip wont fit in any position\n      if (possiblePlacements.length < 1) {\n        this._actualTooltipPlacement = this._placement ?? null;\n        this._setDOMElementPosition(this._calculateTooltipPosition(this._placement ?? \"top\"));\n        break;\n      }\n      // try the next position in the possiblePositions array\n      placement = possiblePlacements.shift();\n      this._setDOMElementPosition(this._calculateTooltipPosition(placement ?? \"top\"));\n      this._actualTooltipPlacement = placement ?? null;\n    }\n\n    this._DOMElement!.classList.add(`mt-tooltip--${this._actualTooltipPlacement ?? \"\"}`);\n  }\n\n  _setDOMElementPosition({ top, left }: { top: string; left: string }) {\n    this._DOMElement!.style.position = \"fixed\";\n    this._DOMElement!.style.top = top;\n    this._DOMElement!.style.left = left;\n  }\n\n  _calculateTooltipPosition(placement: Placements) {\n    const boundingBox = this._parentDOMElement.getBoundingClientRect();\n    const secureOffset = 10;\n\n    let top;\n    let left;\n\n    switch (placement) {\n      case \"bottom\":\n        top = `${boundingBox.top + boundingBox.height + secureOffset}px`;\n        left = `${boundingBox.left + boundingBox.width / 2 - this._DOMElement!.offsetWidth / 2}px`;\n        break;\n      case \"left\":\n        top = `${boundingBox.top + boundingBox.height / 2 - this._DOMElement!.offsetHeight / 2}px`;\n        left = `${boundingBox.left - secureOffset - this._DOMElement!.offsetWidth}px`;\n        break;\n      case \"right\":\n        top = `${boundingBox.top + boundingBox.height / 2 - this._DOMElement!.offsetHeight / 2}px`;\n        left = `${boundingBox.right + secureOffset}px`;\n        break;\n      case \"top\":\n      default:\n        top = `${boundingBox.top - this._DOMElement!.offsetHeight - secureOffset}px`;\n        left = `${boundingBox.left + boundingBox.width / 2 - this._DOMElement!.offsetWidth / 2}px`;\n    }\n    return { top: top, left: left };\n  }\n\n  _isElementInViewport(element: HTMLElement) {\n    // get position\n    const boundingClientRect = element.getBoundingClientRect();\n    const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n    const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n    // calculate which borders are in viewport\n    const visibleBorders = {\n      top: boundingClientRect.top > 0,\n      right: boundingClientRect.right < windowWidth,\n      bottom: boundingClientRect.bottom < windowHeight,\n      left: boundingClientRect.left > 0,\n    };\n\n    return (\n      visibleBorders.top && visibleBorders.right && visibleBorders.bottom && visibleBorders.left\n    );\n  }\n\n  static validatePlacement<P extends Placements>(placement: P): Placements {\n    if (!availableTooltipPlacements.includes(placement)) {\n      console.warn(\n        \"Tooltip Directive\",\n        `The modifier has to be one of these \"${availableTooltipPlacements.join(\",\")}\"`,\n      );\n\n      return \"top\";\n    }\n    return placement;\n  }\n\n  static validateMessage(message?: string): string {\n    if (typeof message !== \"string\") {\n      console.warn(\"Tooltip Directive\", \"The tooltip needs a message with type string\");\n    }\n\n    return message ?? \"\";\n  }\n\n  static validateWidth(width: number | string): number | string {\n    if (width === \"auto\") {\n      return width;\n    }\n\n    if (typeof width !== \"number\" || width < 1) {\n      console.warn(\"Tooltip Directive\", \"The tooltip width has to be a number greater 0\");\n      return 200;\n    }\n\n    return width;\n  }\n\n  static validateDelay(delay: number): number {\n    if (typeof delay !== \"number\" || delay < 1) {\n      console.warn(\"Tooltip Directive\", \"The tooltip delay has to be a number greater 0\");\n      return 100;\n    }\n\n    return delay;\n  }\n}\n\n/**\n * Helper function for creating or updating a tooltip instance\n */\nfunction createOrUpdateTooltip(\n  el: HTMLElement,\n  {\n    value,\n    modifiers,\n  }: {\n    value: {\n      message: string;\n      position: Placements;\n      showDelay: number;\n      hideDelay: number;\n      disabled: boolean;\n      appearance: string;\n      width: number | string;\n      showOnDisabledElements: boolean;\n      zIndex: number;\n    };\n    modifiers: {\n      [key: string]: unknown;\n    };\n  },\n) {\n  let message: string = typeof value === \"string\" ? value : value.message;\n  message = message ? message.trim() : \"\";\n\n  const placement = value.position || Object.keys(modifiers)[0];\n  const showDelay = value.showDelay;\n  const hideDelay = value.hideDelay;\n  const disabled = value.disabled;\n  const appearance = value.appearance;\n  const width = value.width;\n  const showOnDisabledElements = value.showOnDisabledElements;\n  const zIndex = value.zIndex;\n\n  const configuration = {\n    element: el,\n    message: message,\n    placement: placement,\n    width: width,\n    showDelay: showDelay,\n    hideDelay: hideDelay,\n    disabled: disabled,\n    appearance: appearance,\n    showOnDisabledElements: showOnDisabledElements,\n    zIndex: zIndex,\n  };\n\n  if (el.hasAttribute(\"tooltip-id\")) {\n    const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n    tooltip!.update(configuration);\n\n    return;\n  }\n\n  const tooltip = new Tooltip(configuration);\n\n  tooltipRegistry.set(tooltip.id ?? \"\", tooltip);\n  el.setAttribute(\"tooltip-id\", tooltip.id!);\n}\n\n/**\n * Directive for tooltips\n * Usage:\n * v-tooltip=\"{configuration}\"\n * // configuration options:\n *  message: The text to be displayed.\n *  position: Position of the tooltip relative to the original element(top, bottom etc.).\n *  width: The width of the tooltip.\n *  showDelay: The delay before the tooltip is shown when the original element is hovered.\n *  hideDelay: The delay before the tooltip is removed when the original element is not hovered.\n *  disabled: Disables the tooltip and it wont be shown.\n *  appearance: Sets a additional css class \"mt-tooltip--$appearance\" for styling\n *  showOnDisabledElements: Shows the tooltip also if the original element is disabled. To achieve\n *      this a wrapper div element is created around the original element because the original element\n *      prevents mouse events when disabled.\n *\n * Examples:\n * // tooltip with default width of 200px and default position top:\n * v-tooltip=\"'Some text'\"\n * // tooltip with position bottom by modifier:\n * v-tooltip.bottom=\"'Some text'\"\n * // tooltip with position bottom and width 300px:\n * v-tooltip=\"{ message: 'Some Text', width: 200, position: 'bottom' }\"\n * // Alternative tooltip with position bottom and width 300px:\n * v-tooltip.bottom=\"{ message: 'Some Text', width: 200 }\"\n * // adjusting the delay:\n * v-tooltip.bottom=\"{ message: 'Some Text', width: 200, showDelay: 200, hideDelay: 300 }\"\n *\n * *Note that the position variable has a higher priority as the modifier\n */\nexport default {\n  beforeMount: (el: HTMLElement, binding) => {\n    createOrUpdateTooltip(el, binding);\n  },\n\n  unmounted: (el: HTMLElement) => {\n    if (el.hasAttribute(\"tooltip-id\")) {\n      const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n      tooltip!.hideTooltip();\n    }\n  },\n\n  updated: (el: HTMLElement, binding) => {\n    createOrUpdateTooltip(el, binding);\n  },\n\n  /**\n   * Initialize the tooltip once it has been inserted to the DOM.\n   */\n  mounted: (el: HTMLElement) => {\n    if (el.hasAttribute(\"tooltip-id\")) {\n      const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n\n      tooltip!.init();\n    }\n  },\n} as ObjectDirective;\n"],"names":["tooltip"],"mappings":"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"}