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);
							 |