File size: 3,152 Bytes
b8874fd 9d9dd89 8480986 9d9dd89 8480986 9d9dd89 d6b7277 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 b8874fd 9d9dd89 d6b7277 9d9dd89 d6b7277 8480986 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 |
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) {}
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;
}
|