My personal site hosted @ https://indexx.dev
1export function initializeProjects() {
2 const tooltips = document.querySelectorAll(
3 '[data-bs-toggle="tooltip"]',
4 ) as NodeListOf<Element>;
5 [...tooltips].forEach((element) => {
6 //@ts-ignore
7 new bootstrap.Tooltip(element);
8 element.addEventListener(
9 "click",
10 () => (element as HTMLElement).blur(),
11 );
12 });
13
14 const page = document.getElementById("page")!;
15 const projectsButton = document.getElementById("projects-button")!;
16 projectsButton.addEventListener("click", function () {
17 projectsButton.blur();
18 page.classList.toggle("side");
19 if (!page.classList.contains("side")) {
20 fade("projects-pane", 1, 0, 0.5);
21 } else {
22 fade("projects-pane", 0, 1, 0.5);
23 }
24 });
25}
26
27function fade(
28 id: string,
29 initialOpacity: number,
30 finalOpacity: number,
31 totalTime: number,
32) {
33 const element = document.getElementById(id);
34 if (!element) {
35 throw new Error("why");
36 }
37 if (initialOpacity == 0) {
38 element.style.visibility = "visible";
39 element.style.pointerEvents = "auto";
40 } else {
41 element.style.pointerEvents = "none";
42 setTimeout(() => {
43 element.style.visibility = "hidden";
44 }, totalTime);
45 }
46
47 const currentTick = new Date().getTime();
48 const elapsed = currentTick - totalTime;
49 const newOpacity = initialOpacity +
50 ((finalOpacity - initialOpacity) * elapsed) / totalTime;
51 if (
52 Math.abs(newOpacity - initialOpacity) >
53 Math.abs(finalOpacity - initialOpacity)
54 ) {
55 element.style.opacity = finalOpacity.toString();
56 return;
57 }
58
59 element.style.opacity = newOpacity.toString();
60}