const _emptyNodeList = [] as unknown as NodeListOf; export function isTouchable(): boolean { return window?.matchMedia("(pointer: coarse)").matches; } export function isDark(): boolean { return window?.matchMedia("(prefers-color-scheme: dark)").matches; } export async function wait(milliseconds: number) { await new Promise((resolve) => setTimeout(resolve, milliseconds)); } export function guid(): string { return "fxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c: string) => { const r = (Math.random() * 16) | 0; const v = c === "x" ? r : (r & 0x3) | 0x8; return v.toString(16); }); } export function query(selector: string | Element | null, element?: Element | null): Element | null { try { return (typeof selector === "string") ? (element ?? document).querySelector(selector) : selector; } catch { return null; } } export function queryAll(selector: string | NodeListOf | null, element?: Element | null): NodeListOf { try { return (typeof selector === "string") ? (element ?? document).querySelectorAll(selector) : selector ?? _emptyNodeList; } catch { return _emptyNodeList; } } export function hasClass(element: Element | null, name: string): boolean { return element?.classList.contains(name) ?? false; } export function hasTag(element: Element | null, name: string): boolean { return element?.tagName?.toLowerCase() === name; } export function hasType(element: HTMLInputElement | null, name: string): boolean { return element?.type?.toLowerCase() === name; } export function addClass(element: Element | null | NodeListOf, name: string) { if (element instanceof NodeList) for(let i=0; i, name: string) { if (element instanceof NodeList) for(let i=0; i { return queryAll("[data-ui=\"#"+id+"\"]"); } export function queryDataUi(id: string): Element | null { return query("[data-ui=\"#"+id+"\"]"); } export function updateAllClickable(element: Element) { if (element.id && hasClass(element, "page")) element = queryDataUi(element.id) ?? element; const container = parent(element); if (!hasClass(container, "tabs") && !hasClass(container, "tabbed") && !hasTag(container, "nav")) return; const as = queryAll("a", container); for(let i=0; i