27 lines (23 loc) · 869 B
 1// Tiny shared helpers used across modules.
 2
 3/** Query one element. */
 4export const $ = (selector, root = document) => root.querySelector(selector);
 5
 6/** Query all elements as an array. */
 7export const $$ = (selector, root = document) => [...root.querySelectorAll(selector)];
 8
 9/**
10 * Storage that no-ops when unavailable (private mode, blocked storage).
11 * Resolves once at load; callers use optional chaining: `storage?.getItem(...)`.
12 */
13const safeStorage = (backing) => {
14  try {
15    const key = "__storage-test";
16    backing.setItem(key, "1");
17    backing.removeItem(key);
18    return backing;
19  } catch (_) {
20    return null;
21  }
22};
23export const storage = safeStorage(localStorage);
24export const sessionStore = safeStorage(sessionStorage);
25
26const _rmq = window.matchMedia("(prefers-reduced-motion: reduce)");
27export const prefersReducedMotion = () => _rmq.matches;