diff options
author | Hsieh Chin Fan <pham@topo.tw> | 2024-09-22 00:40:06 +0800 |
---|---|---|
committer | Hsieh Chin Fan <pham@topo.tw> | 2024-09-22 11:27:09 +0800 |
commit | f6b2421937b37173b3c732ca7834fc14053e895f (patch) | |
tree | 95a854443b5fe64f32e346af4c59c5f47c8134a3 /src/Layout.mjs | |
parent | b47a2f81a21a034073716c4c086d5fee0a1d9433 (diff) |
feat: add resize bar for side-by-side layout
* SVG comes from maplibre-gl-compare
* plain-draggable is awesome!
Diffstat (limited to 'src/Layout.mjs')
-rw-r--r-- | src/Layout.mjs | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/Layout.mjs b/src/Layout.mjs index 861f56b..5673722 100644 --- a/src/Layout.mjs +++ b/src/Layout.mjs | |||
@@ -11,7 +11,48 @@ export class Layout { | |||
11 | valueOf = () => this.name | 11 | valueOf = () => this.name |
12 | } | 12 | } |
13 | 13 | ||
14 | export class OverlayLayout extends Layout { | 14 | export class SideBySide extends Layout { |
15 | name = "side-by-side" | ||
16 | |||
17 | enterHandler = ({ container, htmlHolder, showcase }) => { | ||
18 | const bar = document.createElement('div') | ||
19 | bar.className = 'bar' | ||
20 | bar.innerHTML = '<div class="bar-handle"></div>' | ||
21 | const handle = bar.querySelector('.bar-handle') | ||
22 | container.appendChild(bar) | ||
23 | |||
24 | const resizeByLeft = (left) => { | ||
25 | htmlHolder.style.width = (left) + "px" | ||
26 | showcase.style.width = (parseFloat(getComputedStyle(container).width) - left) + "px" | ||
27 | } | ||
28 | |||
29 | const draggable = new PlainDraggable(bar, { | ||
30 | handle: handle, | ||
31 | containment: { left: '25%', top: 0, right: '75%', height: 0 }, | ||
32 | }) | ||
33 | draggable.draggableCursor = "grab" | ||
34 | draggable.onDrag = (pos) => { | ||
35 | handle.style.transform = 'unset' | ||
36 | resizeByLeft(pos.left) | ||
37 | } | ||
38 | draggable.onDragEnd = (_) => { | ||
39 | handle.removeAttribute('style') | ||
40 | } | ||
41 | |||
42 | new ResizeObserver(() => { | ||
43 | if (draggable) resizeByLeft(draggable.left) | ||
44 | }).observe(container); | ||
45 | } | ||
46 | |||
47 | leaveHandler = ({ container, htmlHolder, showcase }) => { | ||
48 | container.removeAttribute('style') | ||
49 | htmlHolder.removeAttribute('style') | ||
50 | showcase.removeAttribute('style') | ||
51 | container.querySelector('.bar')?.remove() | ||
52 | } | ||
53 | } | ||
54 | |||
55 | export class Overlay extends Layout { | ||
15 | name = "overlay" | 56 | name = "overlay" |
16 | 57 | ||
17 | enterHandler = (dumbymap) => { | 58 | enterHandler = (dumbymap) => { |