import "@fontsource-variable/geist"; import "@fontsource-variable/geist-mono"; import "./style.css"; import { components } from "./components"; import { REPO } from "./data"; import { home } from "./home"; import { icon } from "./icons"; import { onSound, setSound, soundOn } from "./iso/marimba"; import { menu } from "./menu"; import { search } from "./search"; import { mode, setMode } from "./theme"; const bar = document.getElementById("bar")!; const main = document.getElementById("main")!; let leave = () => {}; function render(): void { leave(); const path = location.pathname.split("/").filter(Boolean); const onDocs = path[0] === "components"; const nav = bar.querySelector('[data-nav="components"]')!; if (onDocs) nav.setAttribute("aria-current", "page"); else nav.removeAttribute("aria-current"); if (onDocs) leave = components(main, path.slice(1)); else if (path.length === 0) leave = home(main); else { console.error(`site: no page at ${location.pathname}`); leave = components(main, path); } scrollTo(0, 0); } export function go(path: string): void { if (path === location.pathname) return; history.pushState(null, "", path); render(); } bar.innerHTML = ` Ely
${icon("GitHub")}
`; document.getElementById("foot")!.innerHTML = ` MIT or Apache-2.0 Source Built on GPUI Fonts: Geist and Geist Mono (OFL) Icons: Reicon (MIT), based on Solar Icons by 480 Design (CC BY 4.0)`; const modeButton = bar.querySelector("[data-mode]")!; const drawMode = () => { const dark = mode() === "dark"; modeButton.innerHTML = icon(dark ? "Sun" : "Moon"); modeButton.setAttribute("aria-label", dark ? "Light mode" : "Dark mode"); }; modeButton.addEventListener("click", () => { setMode(mode() === "dark" ? "light" : "dark"); drawMode(); }); drawMode(); const soundButton = bar.querySelector("[data-sound]")!; const drawSound = (on: boolean) => { soundButton.innerHTML = icon(on ? "Sound" : "VolumeCross"); soundButton.setAttribute("aria-label", on ? "Sound off" : "Sound on"); soundButton.setAttribute("aria-pressed", String(on)); }; soundButton.addEventListener("click", () => setSound(!soundOn())); onSound(drawSound); drawSound(false); bar.querySelector("[data-find]")!.addEventListener("click", search(go)); menu(bar.querySelector("[data-menu]")!, go); // Same-origin links route in place, except the gallery. document.addEventListener("click", (event) => { const link = (event.target as HTMLElement).closest("a"); if (!link || event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || link.target) return; const url = new URL(link.href, location.href); if (url.origin !== location.origin || url.pathname.startsWith("/gallery/") || url.hash) return; event.preventDefault(); go(url.pathname); }); addEventListener("popstate", render); render();