You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.3 KiB
64 lines
2.3 KiB
(function (Drupal, once) { |
|
'use strict'; |
|
|
|
Drupal.behaviors.audioLinkTooltip = { |
|
attach: function (context) { |
|
once('audio-tooltip', '.js-play-audio-from-node', context).forEach((link) => { |
|
const href = link.getAttribute('href'); |
|
if (!href) return; |
|
|
|
// Create minimal tooltip with just the link |
|
const tooltip = document.createElement('div'); |
|
tooltip.className = 'audio-tooltip'; |
|
tooltip.innerHTML = `<a href="${href}" class="audio-tooltip-link">Go to page →</a>`; |
|
document.body.appendChild(tooltip); |
|
|
|
let cleanup = null; |
|
|
|
const showTooltip = () => { |
|
tooltip.style.display = 'block'; |
|
|
|
// Dynamically import Floating UI (works if in core or via build/CDN) |
|
import('@floating-ui/dom').then(({ computePosition, autoUpdate, offset, flip, shift }) => { |
|
cleanup = autoUpdate(link, tooltip, () => { |
|
computePosition(link, tooltip, { |
|
placement: 'top', |
|
middleware: [ |
|
offset(10), // distance from link |
|
flip(), |
|
shift({ padding: 8 }) |
|
] |
|
}).then(({ x, y }) => { |
|
Object.assign(tooltip.style, { |
|
left: `${x}px`, |
|
top: `${y}px` |
|
}); |
|
}); |
|
}); |
|
}).catch(() => { |
|
// Fallback positioning if Floating UI import fails |
|
const rect = link.getBoundingClientRect(); |
|
tooltip.style.left = `${rect.left + window.scrollX + rect.width / 2}px`; |
|
tooltip.style.top = `${rect.top + window.scrollY - tooltip.offsetHeight - 10}px`; |
|
tooltip.style.transform = 'translateX(-50%)'; |
|
}); |
|
}; |
|
|
|
const hideTooltip = () => { |
|
tooltip.style.display = 'none'; |
|
if (cleanup) { |
|
cleanup(); |
|
cleanup = null; |
|
} |
|
}; |
|
|
|
link.addEventListener('mouseenter', showTooltip); |
|
link.addEventListener('mouseleave', hideTooltip); |
|
|
|
// Optional: keep visible on hover of tooltip itself (so user can click) |
|
tooltip.addEventListener('mouseenter', showTooltip); |
|
tooltip.addEventListener('mouseleave', hideTooltip); |
|
}); |
|
} |
|
}; |
|
})(Drupal, once);
|
|
|