hugo-railroad-diagrams/assets/js/railroad.js

64 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

2024-10-07 21:57:29 -07:00
import rr from "./lib/railroad.js"
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
class RailroadDiagramManager {
constructor() {
this.figures = new Map();
this.isCurrentlyNarrow = undefined;
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
this.diagramBreakpoint = window.matchMedia("(max-width: 450px)");
this.diagramBreakpoint.addEventListener("change", () => {
this.updateVisiblity();
});
}
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
add(svg) {
const parent = svg.parentElement;
if (!this.figures.has(parent)) {
this.figures.set(parent, []);
}
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
this.figures.get(parent).push(svg);
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
parent.removeChild(svg);
}
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
updateVisiblity() {
const isNarrow = this.diagramBreakpoint.matches;
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
if (isNarrow === this.isCurrentlyNarrow) {
return;
}
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
this.isCurrentlyNarrow = isNarrow;
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
for (let [figure, svgs] of this.figures.entries()) {
for (let svg of svgs) {
const svgHasNarrowClass = svg.classList.contains("narrow");
if (isNarrow && svgHasNarrowClass)
figure.appendChild(svg);
else if (!isNarrow && !svgHasNarrowClass)
figure.appendChild(svg);
else if (svg.parentElement === figure)
figure.removeChild(svg);
}
}
}
2024-07-24 09:01:48 -07:00
}
2024-10-07 21:57:29 -07:00
let railroadDiagramManager = new RailroadDiagramManager();
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
export function railroadDiagram(builder, elementID, isNarrow) {
const diagram = builder(rr);
const svg = diagram.addTo(document.getElementById(elementID));
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
if (isNarrow) {
svg.classList.add("narrow");
}
2024-07-24 09:01:48 -07:00
2024-10-07 21:57:29 -07:00
railroadDiagramManager.add(svg);
2024-07-24 09:01:48 -07:00
}
2024-10-07 21:57:29 -07:00
window.addEventListener("DOMContentLoaded", () => {
railroadDiagramManager.updateVisiblity();
});