From 353e2094b6868b057903726c3f5edd0e0b2ff814 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Tue, 14 Feb 2023 15:07:13 +0600 Subject: [PATCH] graph enhancements --- src/site/_includes/components/graphScript.njk | 30 +++- src/site/_includes/components/sidebar.njk | 5 +- src/site/styles/digital-garden-base.scss | 149 ++++++++++-------- 3 files changed, 112 insertions(+), 72 deletions(-) diff --git a/src/site/_includes/components/graphScript.njk b/src/site/_includes/components/graphScript.njk index b3b189b..055e732 100644 --- a/src/site/_includes/components/graphScript.njk +++ b/src/site/_includes/components/graphScript.njk @@ -50,15 +50,17 @@ var Graph; - function renderGraph(graphData, id, width, height, delay) { - + function renderGraph(graphData, id, delay) { + const el = document.getElementById(id); + width = el.offsetWidth; + height = el.offsetHeight; const highlightNodes = new Set(); let hoverNode = null; const color = getCssVar("--text-accent"); const mutedColor = getCssVar("--text-faint"); let Graph = ForceGraph() - (document.getElementById(id)) + (el) .graphData(graphData) .nodeId('id') .nodeLabel('title') @@ -138,7 +140,7 @@ function fetchGraphData() { fetch('/graph.json').then(res => res.json()).then(data => { window.graphData = data; - Graph = renderGraph(filterToDepth(JSON.parse(JSON.stringify(data))), "link-graph", 320, 320, 1); + Graph = renderGraph(filterToDepth(JSON.parse(JSON.stringify(data))), "link-graph", 1); }); } @@ -153,7 +155,7 @@ Graph._destructor(); Graph = null; } - renderGraph(filterToDepth(JSON.parse(JSON.stringify(window.graphData))), "link-graph", 320, 320, 1); + renderGraph(filterToDepth(JSON.parse(JSON.stringify(window.graphData))), "link-graph", 1); }) window.fullGraph = null; @@ -169,7 +171,7 @@ g.classList.add('show'); document.body.appendChild(g); g.innerHTML = '
'; - window.fullGraph = renderGraph(graphData, "full-graph-container", g.offsetWidth, g.offsetHeight, 200); + window.fullGraph = renderGraph(graphData, "full-graph-container", 200); document.getElementById('full-graph-close').addEventListener('click', (evt) => { g.classList.remove('show'); window.fullGraph._destructor(); @@ -180,8 +182,20 @@ } - document.getElementById('graph-full-btn').addEventListener('click', (evt) => { - if (!fullGraph) { + document.getElementById('graph-fs-btn').addEventListener('click', (evt) => { + const el = document.querySelector('.graph'); + if (el.classList.contains('graph-fs')) { + el.classList.remove('graph-fs'); + Graph.width(el.offsetWidth).height(el.offsetHeight); + } else { + el.classList.add('graph-fs'); + Graph.width(el.offsetWidth).height(el.offsetHeight); + } + + }); + + document.getElementById('global-graph-btn').addEventListener('click', (evt) => { + if (!window.fullGraph) { renderFullGraph(); } }); diff --git a/src/site/_includes/components/sidebar.njk b/src/site/_includes/components/sidebar.njk index 9946350..c51cece 100644 --- a/src/site/_includes/components/sidebar.njk +++ b/src/site/_includes/components/sidebar.njk @@ -19,7 +19,10 @@ - +
+ + +
diff --git a/src/site/styles/digital-garden-base.scss b/src/site/styles/digital-garden-base.scss index ce9d506..7146b10 100644 --- a/src/site/styles/digital-garden-base.scss +++ b/src/site/styles/digital-garden-base.scss @@ -15,16 +15,15 @@ body { margin-top: 90px; position: relative; - @media(max-width: 800px) { + @media (max-width: 800px) { margin-top: 75px; } - } .external-link { background-position: center right; background-repeat: no-repeat; - background-image: linear-gradient(transparent, transparent), url('/img/outgoing.svg'); + background-image: linear-gradient(transparent, transparent), url("/img/outgoing.svg"); background-size: 13px; padding-right: 16px; background-position-y: 4px; @@ -62,6 +61,33 @@ ul.task-list { display: flex; z-index: 3; max-width: 350px; + + .graph { + width: 320px; + height: 320px; + + #link-graph { + width: 100%; + height: 100%; + } + } + .graph-fs { + position: fixed; + top: 50%; + left: 50%; + height: calc(100vmin - 100px); + width: calc(100vmin - 100px); + min-height: 350px; + min-width: 350px; + transform: translate(-50%, -50%); + z-index: 9999; + display: none; + background-color: var(--background-secondary); + + .graph-title { + display: none; + } + } } .expand-line { @@ -88,10 +114,10 @@ ul.task-list { } .toc-container { - font-size: 1rem; - max-height: 220px; + font-size: 1rem; + max-height: 220px; overflow-y: auto; - margin-bottom:10px; + margin-bottom: 10px; border-left: 1px solid var(--text-accent); ul { list-style-type: none; @@ -100,19 +126,19 @@ ul.task-list { margin-bottom: 0; } ul:not(:first-child) { - margin-bottom:3px; + margin-bottom: 3px; } - li{ + li { padding-top: 4px; - &::before{ - content: '# ' !important; + &::before { + content: "# " !important; color: var(--text-accent); font-size: 0.8rem; } - a{ + a { text-decoration: none; - &:hover{ + &:hover { text-decoration: underline; } } @@ -149,7 +175,7 @@ ul.task-list { border-left: 1px solid var(--text-accent); max-height: 200px; overflow-y: auto; - overflow-x:hidden; + overflow-x: hidden; } .backlink-card { @@ -164,15 +190,14 @@ ul.task-list { } } -.no-backlinks-message{ +.no-backlinks-message { font-size: 0.8rem; color: var(--text-normal); } .graph { - .graph-title-container { - display: flex; + display: flex; justify-content: flex-end; width: 320px; } @@ -195,9 +220,7 @@ ul.task-list { width: fit-content; } - - -@media(max-width: 1400px) { +@media (max-width: 1400px) { #link-graph { border-radius: 0 10px 10px 10px; } @@ -209,11 +232,11 @@ ul.task-list { max-width: 700px; margin: auto; border-radius: 0; - border-top: 2px solid var(--background-secondary); + border-top: 2px solid var(--background-secondary); justify-content: space-between; } - .sidebar-container{ + .sidebar-container { display: flex; flex-direction: row; justify-content: space-between; @@ -221,7 +244,7 @@ ul.task-list { .graph { flex: 1; - .graph-title-container{ + .graph-title-container { justify-content: flex-start; } } @@ -230,8 +253,8 @@ ul.task-list { display: none; } } -@media(max-width: 800px) { - .sidebar-container{ +@media (max-width: 800px) { + .sidebar-container { display: flex; flex-direction: column-reverse; } @@ -252,7 +275,7 @@ ul.task-list { h1 { font-size: 32px !important; } - @media(max-width: 800px) { + @media (max-width: 800px) { h1 { display: none; } @@ -269,7 +292,7 @@ ul.task-list { justify-content: flex-end; margin-bottom: -60px; - @media(max-width: 800px) { + @media (max-width: 800px) { justify-content: center; } @@ -290,11 +313,11 @@ ul.task-list { display: flex; justify-content: space-between; align-items: center; - @media(max-width: 1400px) { + @media (max-width: 1400px) { position: fixed; } - @media(max-width: 800px) { + @media (max-width: 800px) { h1 { font-size: 18px !important; } @@ -307,8 +330,7 @@ ul.task-list { } .search-button { - - @media(max-width: 800px) { + @media (max-width: 800px) { min-width: 36px; margin: 10px 25px 10px 25px; } @@ -317,7 +339,7 @@ ul.task-list { .search-text { display: flex; justify-content: center; - @media(max-width: 800px){ + @media (max-width: 800px) { display: none; } } @@ -325,7 +347,7 @@ ul.task-list { .notelink { padding: 5px 0 5px 25px; - a{ + a { &:hover { text-decoration: underline !important; } @@ -361,10 +383,9 @@ ul.task-list { right: 0; left: 0; bottom: 0; - z-index: 5 + z-index: 5; } - .search-container { background-color: rgba(0, 0, 0, 0.5); position: fixed; @@ -400,7 +421,6 @@ ul.task-list { font-size: 2rem; background-color: var(--background-primary); color: var(--text-primary); - } .search-box input:focus { @@ -425,7 +445,7 @@ ul.task-list { font-size: 1.2rem; cursor: pointer; - &.active{ + &.active { border: 2px solid var(--text-accent); } } @@ -459,25 +479,21 @@ ul.task-list { border: 1px solid var(--text-normal); cursor: pointer; - >span { + > span { padding: 3px 3px 3px 10px; } - >i { + > i { margin-left: 10px; } &:hover { border: 1px solid var(--text-accent); } - - } - - .search-keys { - @media(max-width: 800px) { + @media (max-width: 800px) { display: none; } } @@ -487,12 +503,12 @@ ul.task-list { .callout-icon, .callout-fold, .callout-content { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } -.callout-fold{ - cursor: pointer; +.callout-fold { + cursor: pointer; } .callout-title { @@ -501,10 +517,10 @@ ul.task-list { } .callout { - font-family: "Roboto", sans-serif; - word-wrap: break-word; - display: block; - font-size: 1rem; + font-family: "Roboto", sans-serif; + word-wrap: break-word; + display: block; + font-size: 1rem; } .callout.is-collapsed { @@ -524,13 +540,11 @@ ul.task-list { .referred { border: 1px dashed; border-color: var(--text-accent); - padding: 10px; + padding: 10px; margin-left: -10px; - margin-right: -10px; + margin-right: -10px; } - - // Graph Controls .graph-title-container { position: relative; @@ -540,15 +554,20 @@ ul.task-list { position: fixed; top: 50%; left: 50%; - height: 60vh; - width: 60vw; - min-height: 400px; - min-width: 400px; + height: calc(100vmin - 100px); + width: calc(100vmin - 100px); + min-height: 350px; + min-width: 350px; transform: translate(-50%, -50%); z-index: 9999; display: none; background-color: var(--background-secondary); + #full-graph-container { + width: 100%; + height: 100%; + } + #full-graph-close { position: absolute; top: 10px; @@ -580,12 +599,16 @@ ul.task-list { color: var(--text-accent); z-index: 9; + i { + cursor: pointer; + } + .depth-control { display: flex; flex-direction: row; align-items: flex-start; gap: 7px; - + .slider { datalist { display: flex; @@ -616,7 +639,7 @@ ul.task-list { } } -input[type=range]::-webkit-slider-thumb { - -webkit-appearance: none; - margin-top: -10px; +input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + margin-top: -10px; }