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();
|
|
|
|
});
|