File size: 3,996 Bytes
b8874fd 9d9dd89 8480986 9d9dd89 8480986 9d9dd89 d6b7277 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 d6b7277 9d9dd89 68ab4bd 8480986 68ab4bd 9d9dd89 b8874fd d6b7277 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd d6b7277 9d9dd89 b8874fd 9d9dd89 d6b7277 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
import { bringInView } from "./utils";
export type Side = "top" | "right" | "bottom" | "left";
export type Alignment = "start" | "center" | "end";
export type Popover = {
title?: string;
description: string;
side?: Side;
align?: Alignment;
};
type PopoverDOM = {
wrapper: HTMLElement;
arrow: HTMLElement;
title: HTMLElement;
description: HTMLElement;
footer: HTMLElement;
previousButton: HTMLElement;
nextButton: HTMLElement;
closeButton: HTMLElement;
footerButtons: HTMLElement;
};
let popover: PopoverDOM | undefined;
export function renderPopover(element: Element) {
if (!popover) {
popover = createPopover();
document.body.appendChild(popover.wrapper);
}
const popoverWrapper = popover.wrapper;
popoverWrapper.style.display = "block";
popoverWrapper.style.left = "0";
popoverWrapper.style.top = "0";
popoverWrapper.style.bottom = "";
popoverWrapper.style.right = "";
refreshPopover(element);
bringInView(popoverWrapper);
}
export function refreshPopover(element: Element) {
if (!popover) {
return;
}
const popoverArrow = popover.arrow;
// const position = calculatePopoverPosition(element);
popoverArrow?.classList.add("driver-popover-arrow-side-bottom", "driver-popover-arrow-align-center");
}
function calculatePopoverPosition(element: Element) {
if (!popover) {
return;
}
const popoverPadding = 10;
const popoverDimensions = popover.wrapper.getBoundingClientRect();
const popoverArrowDimensions = popover.arrow.getBoundingClientRect();
const elementDimensions = element.getBoundingClientRect();
const popoverWidth = popoverDimensions.width + popoverPadding;
const popoverHeight = popoverDimensions.height + popoverPadding;
const topValue = elementDimensions.top - popoverHeight;
const isTopOptimal = topValue >= 0;
const bottomValue = window.innerHeight - (elementDimensions.bottom + popoverHeight);
const isBottomOptimal = bottomValue >= 0;
const leftValue = elementDimensions.left - popoverWidth;
const isLeftOptimal = leftValue >= 0;
const rightValue = window.innerWidth - (elementDimensions.right + popoverWidth);
const isRightOptimal = rightValue >= 0;
}
function createPopover(): PopoverDOM {
const wrapper = document.createElement("div");
wrapper.classList.add("driver-popover");
const arrow = document.createElement("div");
arrow.classList.add("driver-popover-arrow");
const title = document.createElement("div");
title.classList.add("driver-popover-title");
title.innerText = "Popover Title";
const description = document.createElement("div");
description.classList.add("driver-popover-description");
description.innerText = "Popover Description";
const footer = document.createElement("div");
footer.classList.add("driver-popover-footer");
const closeButton = document.createElement("button");
closeButton.classList.add("driver-popover-close-btn");
closeButton.innerText = "Close";
const footerButtons = document.createElement("span");
footerButtons.classList.add("driver-popover-footer-btns");
const previousButton = document.createElement("button");
previousButton.classList.add("driver-popover-prev-btn");
previousButton.innerHTML = "← Previous";
const nextButton = document.createElement("button");
nextButton.classList.add("driver-popover-next-btn");
nextButton.innerHTML = "Next →";
footerButtons.appendChild(previousButton);
footerButtons.appendChild(nextButton);
footer.appendChild(closeButton);
footer.appendChild(footerButtons);
wrapper.appendChild(arrow);
wrapper.appendChild(title);
wrapper.appendChild(description);
wrapper.appendChild(footer);
return {
wrapper,
arrow,
title,
description,
footer,
previousButton,
nextButton,
closeButton,
footerButtons,
};
}
export function destroyPopover() {
if (!popover) {
return;
}
popover.wrapper.parentElement?.removeChild(popover.wrapper);
popover = undefined;
}
|