Match contact flyover behavior

This commit is contained in:
2026-03-25 17:10:46 +01:00
parent 6677d04738
commit 19b66f7754
2 changed files with 41 additions and 11 deletions

View File

@@ -3,10 +3,12 @@ const flyoverPanel = document.querySelector(".contact-flyover__panel");
const openButtons = document.querySelectorAll("[data-open-contact]"); const openButtons = document.querySelectorAll("[data-open-contact]");
const closeButtons = document.querySelectorAll("[data-close-contact]"); const closeButtons = document.querySelectorAll("[data-close-contact]");
const privacyFlyover = document.querySelector("[data-privacy-flyover]"); const privacyFlyover = document.querySelector("[data-privacy-flyover]");
const privacyFlyoverPanel = document.querySelector(".privacy-flyover__panel");
const openPrivacyButtons = document.querySelectorAll("[data-open-privacy]"); const openPrivacyButtons = document.querySelectorAll("[data-open-privacy]");
const closePrivacyButtons = document.querySelectorAll("[data-close-privacy]"); const closePrivacyButtons = document.querySelectorAll("[data-close-privacy]");
const copyButtons = document.querySelectorAll("[data-copy-value]"); const copyButtons = document.querySelectorAll("[data-copy-value]");
let lastTrigger = null; let lastTrigger = null;
let lastPrivacyTrigger = null;
const positionFlyover = (trigger) => { const positionFlyover = (trigger) => {
if (!flyover || !flyoverPanel || !trigger) return; if (!flyover || !flyoverPanel || !trigger) return;
@@ -41,6 +43,31 @@ const openFlyover = (trigger) => {
document.body.classList.add("is-scroll-locked"); document.body.classList.add("is-scroll-locked");
}; };
const positionPrivacyFlyover = (trigger) => {
if (!privacyFlyover || !privacyFlyoverPanel || !trigger) return;
const isMobile = window.innerWidth <= 768;
const rect = trigger.getBoundingClientRect();
const gap = 16;
const panelHeight = privacyFlyoverPanel.offsetHeight;
if (isMobile) {
privacyFlyover.style.removeProperty("--privacy-flyover-top");
privacyFlyover.style.removeProperty("--privacy-flyover-left");
return;
}
const panelWidth = Math.min(680, window.innerWidth - 32);
const preferredLeft = rect.right + gap;
const maxLeft = window.innerWidth - panelWidth - gap;
const left = Math.min(preferredLeft, maxLeft);
const maxTop = Math.max(gap, window.innerHeight - panelHeight - gap);
const top = Math.min(Math.max(gap, rect.top - 10), maxTop);
privacyFlyover.style.setProperty("--privacy-flyover-left", `${left}px`);
privacyFlyover.style.setProperty("--privacy-flyover-top", `${top}px`);
};
const closeFlyover = () => { const closeFlyover = () => {
if (!flyover) return; if (!flyover) return;
flyover.hidden = true; flyover.hidden = true;
@@ -49,9 +76,11 @@ const closeFlyover = () => {
} }
}; };
const openPrivacyFlyover = () => { const openPrivacyFlyover = (trigger) => {
if (!privacyFlyover) return; if (!privacyFlyover) return;
lastPrivacyTrigger = trigger ?? null;
privacyFlyover.hidden = false; privacyFlyover.hidden = false;
positionPrivacyFlyover(trigger);
document.body.classList.add("is-scroll-locked"); document.body.classList.add("is-scroll-locked");
}; };
@@ -72,7 +101,7 @@ closeButtons.forEach((button) => {
}); });
openPrivacyButtons.forEach((button) => { openPrivacyButtons.forEach((button) => {
button.addEventListener("click", openPrivacyFlyover); button.addEventListener("click", () => openPrivacyFlyover(button));
}); });
closePrivacyButtons.forEach((button) => { closePrivacyButtons.forEach((button) => {
@@ -93,6 +122,10 @@ window.addEventListener("resize", () => {
if (flyover && !flyover.hidden && lastTrigger) { if (flyover && !flyover.hidden && lastTrigger) {
positionFlyover(lastTrigger); positionFlyover(lastTrigger);
} }
if (privacyFlyover && !privacyFlyover.hidden && lastPrivacyTrigger) {
positionPrivacyFlyover(lastPrivacyTrigger);
}
}); });
copyButtons.forEach((button) => { copyButtons.forEach((button) => {

View File

@@ -728,10 +728,6 @@ button {
position: fixed; position: fixed;
inset: 0; inset: 0;
z-index: 21; z-index: 21;
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
overflow-y: auto; overflow-y: auto;
overscroll-behavior: contain; overscroll-behavior: contain;
} }
@@ -744,7 +740,9 @@ button {
} }
.privacy-flyover__panel { .privacy-flyover__panel {
position: relative; position: absolute;
top: var(--privacy-flyover-top, 2rem);
left: var(--privacy-flyover-left, auto);
width: min(680px, calc(100vw - 2rem)); width: min(680px, calc(100vw - 2rem));
max-height: calc(100vh - 2rem); max-height: calc(100vh - 2rem);
overflow-x: hidden; overflow-x: hidden;
@@ -1095,17 +1093,16 @@ button {
} }
.privacy-flyover { .privacy-flyover {
display: block;
padding: 0; padding: 0;
} }
.privacy-flyover__panel { .privacy-flyover__panel {
position: absolute; top: auto;
right: 1.25rem; right: 1.25rem;
bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px)); bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px));
left: 1.25rem; left: 1.25rem;
width: auto; width: calc(100vw - 2.5rem);
max-width: none; max-width: calc(100vw - 2.5rem);
max-height: calc(100dvh - 2.5rem - env(safe-area-inset-bottom, 0px)); max-height: calc(100dvh - 2.5rem - env(safe-area-inset-bottom, 0px));
margin: 0; margin: 0;
padding: 1.2rem; padding: 1.2rem;