Skip to content

Commit

Permalink
Merge pull request #944 from gavin-ts/fix-watch-mode-zoom
Browse files Browse the repository at this point in the history
fix zoom in watch mode
  • Loading branch information
gavin-ts authored Mar 1, 2023
2 parents 2ddea93 + c75a2ea commit 7655c1b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
1 change: 1 addition & 0 deletions ci/release/changelogs/next.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
#### Bugfixes ⛑️

- Fixes a regression where PNG backgrounds could be cut off in the appendix. [#941](https://github.com/terrastruct/d2/pull/941)
- Fixes zooming not working in watch mode. [#944](https://github.com/terrastruct/d2/pull/944)
10 changes: 0 additions & 10 deletions d2cli/static/watch.css
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
body {
margin: 0;
}

#d2-svg-container > svg {
position: absolute;
width: 100%;
height: 100%;
}

#d2-err {
/* This style was copied from Chrome's svg parser error style. */
white-space: pre-wrap;
Expand Down
25 changes: 25 additions & 0 deletions d2cli/static/watch.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ function init(reconnectDelay) {
const ws = new WebSocket(
`ws://${window.location.host}${window.location.pathname}watch`
);
let isInit = true;
let ratio;
ws.onopen = () => {
reconnectDelay = 1000;
console.info("watch websocket opened");
Expand All @@ -31,6 +33,29 @@ function init(reconnectDelay) {
// setting innerHTML to only the actual svg innards. However then you also need to parse
// out the width, height and viewbox out of the top level SVG tag and update those manually.
d2SVG.innerHTML = msg.svg;

const svgEl = d2SVG.querySelector("#d2-svg");
// just use inner SVG in watch mode
svgEl.parentElement.replaceWith(svgEl);
let width = parseInt(svgEl.getAttribute("width"), 10);
let height = parseInt(svgEl.getAttribute("height"), 10);
if (isInit) {
if (width > height) {
if (width > window.innerWidth) {
ratio = window.innerWidth / width;
}
} else if (height > window.innerHeight) {
ratio = window.innerHeight / height;
}
// Scale svg fit to zoom
isInit = false;
}
if (ratio) {
// body padding is 8px
svgEl.setAttribute("width", width * ratio - 16);
svgEl.setAttribute("height", height * ratio - 16);
}

d2ErrDiv.style.display = "none";
}
if (msg.err) {
Expand Down

0 comments on commit 7655c1b

Please sign in to comment.