84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* cspell:ignore uidom */
 | 
						|
/**
 | 
						|
 * @file
 | 
						|
 *
 | 
						|
 * Simple tooltip component.
 | 
						|
 *
 | 
						|
 * To use it just add:
 | 
						|
 *
 | 
						|
 * data-drupal-tooltip="title" - Text displayed in tooltip.
 | 
						|
 *
 | 
						|
 * data-drupal-tooltip-class="extra-class" - Optional class for css.
 | 
						|
 *
 | 
						|
 * data-drupal-tooltip-position="top" - Tooltip position (default right).
 | 
						|
 *
 | 
						|
 * @see https://floating-ui.com/ for available placement options.
 | 
						|
 */
 | 
						|
 | 
						|
((Drupal, once, { computePosition, offset, shift, flip }) => {
 | 
						|
  /**
 | 
						|
   * Theme function for a tooltip.
 | 
						|
   *
 | 
						|
   * @param {object} dataset
 | 
						|
   *   The dataset object.
 | 
						|
   * @param {string} dataset.drupalTooltipClass
 | 
						|
   *   Extra class for theming.
 | 
						|
   * @param {string} dataset.drupalTooltip
 | 
						|
   *   The text for tooltip.
 | 
						|
   *
 | 
						|
   * @return {HTMLElement}
 | 
						|
   *   A DOM Node.
 | 
						|
   */
 | 
						|
  Drupal.theme.tooltipWrapper = (dataset) =>
 | 
						|
    `<div class="toolbar-tooltip ${dataset.drupalTooltipClass || ''}">
 | 
						|
      ${dataset.drupalTooltip}
 | 
						|
    </div>`;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attaches the tooltip behavior to all required triggers.
 | 
						|
   *
 | 
						|
   * @type {Drupal~behavior}
 | 
						|
   *
 | 
						|
   * @prop {Drupal~behaviorAttach} attach
 | 
						|
   *   Attaches the tooltip behavior.
 | 
						|
   */
 | 
						|
  Drupal.behaviors.tooltipInit = {
 | 
						|
    attach: (context) => {
 | 
						|
      once('tooltip-trigger', '[data-drupal-tooltip]', context).forEach(
 | 
						|
        (trigger) => {
 | 
						|
          trigger.insertAdjacentHTML(
 | 
						|
            'afterend',
 | 
						|
            Drupal.theme.tooltipWrapper(trigger.dataset),
 | 
						|
          );
 | 
						|
          const tooltip = trigger.nextElementSibling;
 | 
						|
 | 
						|
          const updatePosition = () => {
 | 
						|
            computePosition(trigger, tooltip, {
 | 
						|
              strategy: 'fixed',
 | 
						|
              placement: trigger.dataset.drupalTooltipPosition || 'right',
 | 
						|
              middleware: [
 | 
						|
                flip({ padding: 16 }),
 | 
						|
                offset(6),
 | 
						|
                shift({ padding: 16 }),
 | 
						|
              ],
 | 
						|
            }).then(({ x, y }) => {
 | 
						|
              Object.assign(tooltip.style, {
 | 
						|
                left: `${x}px`,
 | 
						|
                top: `${y}px`,
 | 
						|
              });
 | 
						|
            });
 | 
						|
          };
 | 
						|
 | 
						|
          // Small trick to avoid tooltip stays on same place when button size changed.
 | 
						|
          const ro = new ResizeObserver(updatePosition);
 | 
						|
 | 
						|
          ro.observe(trigger);
 | 
						|
 | 
						|
          trigger.addEventListener('mouseover', updatePosition);
 | 
						|
          trigger.addEventListener('focus', updatePosition);
 | 
						|
        },
 | 
						|
      );
 | 
						|
    },
 | 
						|
  };
 | 
						|
})(Drupal, once, FloatingUIDOM);
 |