website: redesign part 8

This commit is contained in:
nym21
2026-06-05 18:12:46 +02:00
parent ff2c04a100
commit b00692249c
17 changed files with 241 additions and 201 deletions
+16
View File
@@ -0,0 +1,16 @@
/**
* @param {Event} event
* @param {string} selector
*/
export function getEventTarget(event, selector) {
return /** @type {HTMLElement | null} */ (
/** @type {HTMLElement} */ (event.target).closest(selector)
);
}
/** @param {Event} event */
export function getEventAnchor(event) {
return /** @type {HTMLAnchorElement | null} */ (
getEventTarget(event, "a[href]")
);
}
+4
View File
@@ -0,0 +1,4 @@
/** @param {string} value */
export function createId(value) {
return value.toLowerCase().replaceAll(" ", "-");
}
-15
View File
@@ -1,15 +0,0 @@
/** @param {number} ms */
export function wait(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
/** @param {string} name */
export function readCssDuration(name) {
const value = getComputedStyle(document.documentElement)
.getPropertyValue(name)
.trim();
return Number.parseFloat(value) * (value.endsWith("ms") ? 1 : 1000);
}
+47
View File
@@ -0,0 +1,47 @@
let transitionId = 0;
/** @param {number} ms */
function wait(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
/** @param {string} name */
function readCssDuration(name) {
const value = getComputedStyle(document.documentElement)
.getPropertyValue(name)
.trim();
return Number.parseFloat(value) * (value.endsWith("ms") ? 1 : 1000);
}
function waitForTransition() {
return wait(readCssDuration("--transition-duration"));
}
function waitForReveal() {
return wait(readCssDuration("--reveal-duration"));
}
/** @param {() => void} render */
export async function transitionPage(render) {
const id = ++transitionId;
document.documentElement.dataset.transition = "";
await waitForTransition();
if (id !== transitionId) return;
render();
requestAnimationFrame(() => {
if (id === transitionId) delete document.documentElement.dataset.transition;
});
}
export async function revealPage() {
await waitForTransition();
delete document.documentElement.dataset.loading;
document.documentElement.dataset.revealing = "";
await waitForReveal();
delete document.documentElement.dataset.revealing;
}