From 36d3f62159f9ef5df65434921051b91e8bc54195 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:02:28 +0100 Subject: [PATCH] feat: add tooltip partial Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- assets/js/src/tooltip.js | 66 +++++++++++++++++++++++++++++++++++ layouts/partials/tooltip.html | 11 ++++++ package-lock.json | 23 ++++++++++++ package.json | 1 + 4 files changed, 101 insertions(+) create mode 100644 assets/js/src/tooltip.js create mode 100644 layouts/partials/tooltip.html diff --git a/assets/js/src/tooltip.js b/assets/js/src/tooltip.js new file mode 100644 index 0000000000..79db56cf43 --- /dev/null +++ b/assets/js/src/tooltip.js @@ -0,0 +1,66 @@ +import { computePosition, flip, shift, offset, arrow } from "@floating-ui/dom"; + +/* Regular tooltips (partial) */ + +const tooltipWrappers = Array.from( + document.querySelectorAll("[data-tooltip-wrapper]"), +); + +for (const tooltipWrapper of tooltipWrappers) { + const button = tooltipWrapper.firstElementChild; + const tooltip = button.nextElementSibling; + const arrowElement = tooltip.firstElementChild; + + function update() { + computePosition(button, tooltip, { + placement: "top", + middleware: [ + offset(6), + flip(), + shift({ padding: 5 }), + arrow({ element: arrowElement }), + ], + }).then(({ x, y, placement, middlewareData }) => { + Object.assign(tooltip.style, { + left: `${x}px`, + top: `${y}px`, + }); + + // Accessing the data + const { x: arrowX, y: arrowY } = middlewareData.arrow; + + const staticSide = { + top: "bottom", + right: "left", + bottom: "top", + left: "right", + }[placement.split("-")[0]]; + + Object.assign(arrowElement.style, { + left: arrowX != null ? `${arrowX}px` : "", + top: arrowY != null ? `${arrowY}px` : "", + right: "", + bottom: "", + [staticSide]: "-4px", + }); + }); + } + + function showTooltip() { + tooltip.classList.toggle("hidden"); + update(); + } + + function hideTooltip() { + tooltip.classList.toggle("hidden"); + } + + [ + ["mouseenter", showTooltip], + ["mouseleave", hideTooltip], + ["focus", showTooltip], + ["blur", hideTooltip], + ].forEach(([event, listener]) => { + button.addEventListener(event, listener); + }); +} diff --git a/layouts/partials/tooltip.html b/layouts/partials/tooltip.html new file mode 100644 index 0000000000..06fa905ffb --- /dev/null +++ b/layouts/partials/tooltip.html @@ -0,0 +1,11 @@ +