| | |
| | | import { router, navigate } from "https://unpkg.com/million@1.8.9-0/dist/router.mjs" |
| | | import { |
| | | apply, |
| | | navigate, |
| | | prefetch, |
| | | router, |
| | | } from "https://unpkg.com/million@1.11.5/dist/router.mjs" |
| | | |
| | | export const init = (loader) => { |
| | | // SPA navigation for access later |
| | | window.navigate = navigate |
| | | // We only mutate document.title and content within .singlePage element |
| | | router(".singlePage") |
| | | // We need on initial load, then subsequent redirs |
| | | window.addEventListener("million:navigate", () => callback(loader)) |
| | | window.addEventListener("DOMContentLoaded", () => callback(loader)) |
| | | } |
| | | |
| | | export const callback = (loader) => { |
| | | // requestAnimationFrame() delays graph draw until SPA routing is finished |
| | | const draw = () => { |
| | | const container = document.getElementById("graph-container") |
| | | // retry if the graph is not ready |
| | | if (!container) return requestAnimationFrame(draw) |
| | | // clear the graph in case there is anything within it |
| | | container.textContent = "" |
| | | |
| | | loader() |
| | | export const attachSPARouting = (init, rerender) => { |
| | | // Attach SPA functions to the global Million namespace |
| | | window.Million = { |
| | | apply, |
| | | navigate, |
| | | prefetch, |
| | | router, |
| | | } |
| | | requestAnimationFrame(draw) |
| | | |
| | | const render = () => requestAnimationFrame(rerender) |
| | | |
| | | window.addEventListener("DOMContentLoaded", () => { |
| | | apply((doc) => init(doc)) |
| | | init() |
| | | router(".singlePage") |
| | | render() |
| | | }) |
| | | window.addEventListener("million:navigate", render) |
| | | } |