|
1 | 1 | <script lang="ts"> |
2 | 2 | import * as d3 from "d3"; |
3 | | - import { onMount } from "svelte"; |
| 3 | + import { onMount, onDestroy } from "svelte"; |
4 | 4 | import Two from "two.js"; |
5 | 5 | import type { Path } from "two.js/src/path"; |
6 | 6 | import type { Line as PathLine } from "two.js/src/shapes/line"; |
|
23 | 23 |
|
24 | 24 | let two: Two; |
25 | 25 | let twoElement: HTMLDivElement; |
| 26 | + let resizeTrigger = 0; // Used to trigger reactive updates on window resize |
26 | 27 |
|
27 | 28 | let pointRadius = 1.15; |
28 | 29 | let lineWidth = 0.57; |
|
48 | 49 |
|
49 | 50 | /** |
50 | 51 | * Converter for X axis from inches to pixels. |
| 52 | + * Updates when twoElement dimensions or resizeTrigger changes. |
51 | 53 | */ |
52 | | - $: x = d3 |
53 | | - .scaleLinear() |
54 | | - .domain([0, 144]) |
55 | | - .range([0, twoElement?.clientWidth ?? 144]); |
| 54 | + $: { |
| 55 | + void resizeTrigger; // Force reactive update when resizeTrigger changes |
| 56 | + x = d3 |
| 57 | + .scaleLinear() |
| 58 | + .domain([0, 144]) |
| 59 | + .range([0, twoElement?.clientWidth ?? 144]); |
| 60 | + } |
56 | 61 |
|
57 | 62 | /** |
58 | 63 | * Converter for Y axis from inches to pixels. |
| 64 | + * Updates when twoElement dimensions or resizeTrigger changes. |
59 | 65 | */ |
60 | | - $: y = d3 |
61 | | - .scaleLinear() |
62 | | - .domain([0, 144]) |
63 | | - .range([twoElement?.clientHeight ?? 144, 0]); |
| 66 | + $: { |
| 67 | + void resizeTrigger; // Force reactive update when resizeTrigger changes |
| 68 | + y = d3 |
| 69 | + .scaleLinear() |
| 70 | + .domain([0, 144]) |
| 71 | + .range([twoElement?.clientHeight ?? 144, 0]); |
| 72 | + } |
64 | 73 |
|
65 | 74 | let lineGroup = new Two.Group(); |
66 | 75 | lineGroup.id = "line-group"; |
|
605 | 614 | return result; |
606 | 615 | } |
607 | 616 |
|
| 617 | + // Handle window resize to update canvas dimensions |
| 618 | + const handleResize = () => { |
| 619 | + if (two) { |
| 620 | + two.fit(); |
| 621 | + resizeTrigger++; // Trigger reactive updates |
| 622 | + } |
| 623 | + }; |
| 624 | +
|
608 | 625 | onMount(() => { |
609 | 626 | two = new Two({ |
610 | 627 | fitted: true, |
|
663 | 680 | two.renderer.domElement.addEventListener("mouseup", () => { |
664 | 681 | isDown = false; |
665 | 682 | }); |
| 683 | +
|
| 684 | + window.addEventListener("resize", handleResize); |
| 685 | + }); |
| 686 | +
|
| 687 | + onDestroy(() => { |
| 688 | + window.removeEventListener("resize", handleResize); |
666 | 689 | }); |
667 | 690 |
|
668 | 691 | document.addEventListener("keydown", function (evt) { |
|
0 commit comments