aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Layout.mjs
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-09-22 00:40:06 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-09-22 11:27:09 +0800
commitf6b2421937b37173b3c732ca7834fc14053e895f (patch)
tree95a854443b5fe64f32e346af4c59c5f47c8134a3 /src/Layout.mjs
parentb47a2f81a21a034073716c4c086d5fee0a1d9433 (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.mjs43
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
14export class OverlayLayout extends Layout { 14export 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
55export class Overlay extends Layout {
15 name = "overlay" 56 name = "overlay"
16 57
17 enterHandler = (dumbymap) => { 58 enterHandler = (dumbymap) => {