|
|
|
@ -8,7 +8,7 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
opacityScale,
|
|
|
|
|
scale,
|
|
|
|
|
repelForce,
|
|
|
|
|
fontSize} = graphConfig;
|
|
|
|
|
fontSize } = graphConfig;
|
|
|
|
|
|
|
|
|
|
const container = document.getElementById("graph-container")
|
|
|
|
|
const { index, links, content } = await fetchData
|
|
|
|
@ -85,7 +85,7 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
d.fy = null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const noop = () => {}
|
|
|
|
|
const noop = () => { }
|
|
|
|
|
return d3
|
|
|
|
|
.drag()
|
|
|
|
|
.on("start", enableDrag ? dragstarted : noop)
|
|
|
|
@ -168,9 +168,18 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
.style("cursor", "pointer")
|
|
|
|
|
.on("click", (_, d) => {
|
|
|
|
|
// SPA navigation
|
|
|
|
|
window.Million.navigate(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`), ".singlePage")
|
|
|
|
|
const targ = `${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`
|
|
|
|
|
window.Million.navigate(new URL(targ), ".singlePage")
|
|
|
|
|
plausible("Link Click", {
|
|
|
|
|
props: {
|
|
|
|
|
href: targ,
|
|
|
|
|
broken: false,
|
|
|
|
|
internal: true,
|
|
|
|
|
graph: true,
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
.on("mouseover", function (_, d) {
|
|
|
|
|
.on("mouseover", function(_, d) {
|
|
|
|
|
d3.selectAll(".node").transition().duration(100).attr("fill", "var(--g-node-inactive)")
|
|
|
|
|
|
|
|
|
|
const neighbours = parseIdsFromLinks([
|
|
|
|
@ -190,7 +199,7 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
// highlight links
|
|
|
|
|
linkNodes.transition().duration(200).attr("stroke", "var(--g-link-active)")
|
|
|
|
|
|
|
|
|
|
const bigFont = fontSize*1.5
|
|
|
|
|
const bigFont = fontSize * 1.5
|
|
|
|
|
|
|
|
|
|
// show text for self
|
|
|
|
|
d3.select(this.parentNode)
|
|
|
|
@ -200,10 +209,10 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
.duration(200)
|
|
|
|
|
.attr('opacityOld', d3.select(this.parentNode).select('text').style("opacity"))
|
|
|
|
|
.style('opacity', 1)
|
|
|
|
|
.style('font-size', bigFont+'em')
|
|
|
|
|
.style('font-size', bigFont + 'em')
|
|
|
|
|
.attr('dy', d => nodeRadius(d) + 20 + 'px') // radius is in px
|
|
|
|
|
})
|
|
|
|
|
.on("mouseleave", function (_, d) {
|
|
|
|
|
.on("mouseleave", function(_, d) {
|
|
|
|
|
d3.selectAll(".node").transition().duration(200).attr("fill", color)
|
|
|
|
|
|
|
|
|
|
const currentId = d.id
|
|
|
|
@ -218,7 +227,7 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
.transition()
|
|
|
|
|
.duration(200)
|
|
|
|
|
.style('opacity', d3.select(this.parentNode).select('text').attr("opacityOld"))
|
|
|
|
|
.style('font-size', fontSize+'em')
|
|
|
|
|
.style('font-size', fontSize + 'em')
|
|
|
|
|
.attr('dy', d => nodeRadius(d) + 8 + 'px') // radius is in px
|
|
|
|
|
})
|
|
|
|
|
.call(drag(simulation))
|
|
|
|
@ -232,7 +241,7 @@ async function drawGraph(baseUrl, isHome, pathColors, graphConfig) {
|
|
|
|
|
.text((d) => content[d.id]?.title || (d.id.charAt(1).toUpperCase() + d.id.slice(2)).replace("-", " "))
|
|
|
|
|
.style('opacity', (opacityScale - 1) / 3.75)
|
|
|
|
|
.style("pointer-events", "none")
|
|
|
|
|
.style('font-size', fontSize+'em')
|
|
|
|
|
.style('font-size', fontSize + 'em')
|
|
|
|
|
.raise()
|
|
|
|
|
.call(drag(simulation))
|
|
|
|
|
|
|
|
|
|