diff --git a/internal/notesium/web/app/pane.js b/internal/notesium/web/app/pane.js index 6d47984..fe5e61e 100644 --- a/internal/notesium/web/app/pane.js +++ b/internal/notesium/web/app/pane.js @@ -4,9 +4,10 @@ var t = `
-
+ class="z-50 absolute group inset-y-0 cursor-ew-resize flex items-center" + style="touch-action: none;">
@@ -26,29 +27,49 @@ export default { startResizeClientX: null, startResizePaneWidth: null, resizing: false, + activePointerId: null, } }, methods: { startResize(event) { + // Only respond to primary button / single touch / pen. + // event.button is 0 for primary mouse and is also 0 for + // touch / pen via PointerEvent. + if (event.button !== undefined && event.button !== 0) return; this.startResizeClientX = event.clientX; this.startResizePaneWidth = this.paneWidth; this.maxWidth = this.$el.parentElement.offsetWidth - 50; this.resizing = true; + this.activePointerId = event.pointerId; event.preventDefault(); - document.addEventListener('mousemove', this.doResize); - document.addEventListener('mouseup', this.stopResize); + // Capture the pointer so we keep getting move/up events even + // when the pointer leaves the handle. This replaces the + // window-level mousemove/mouseup listeners and handles touch + // and pen identically. + try { event.target.setPointerCapture(event.pointerId); } catch (_) {} + event.target.addEventListener('pointermove', this.doResize); + event.target.addEventListener('pointerup', this.stopResize); + event.target.addEventListener('pointercancel', this.stopResize); }, doResize(event) { + if (event.pointerId !== this.activePointerId) return; let draggedDistance = event.clientX - this.startResizeClientX; if (this.direction === 'left') draggedDistance = -draggedDistance; const newWidth = this.startResizePaneWidth + draggedDistance; if (newWidth <= this.maxWidth && newWidth >= this.minWidth ) this.paneWidth = newWidth; }, - stopResize() { + stopResize(event) { + if (event && event.pointerId !== this.activePointerId) return; this.resizing = false; this.savePreferredWidth(); - document.removeEventListener('mousemove', this.doResize); - document.removeEventListener('mouseup', this.stopResize); + const target = event && event.target; + if (target) { + try { target.releasePointerCapture(this.activePointerId); } catch (_) {} + target.removeEventListener('pointermove', this.doResize); + target.removeEventListener('pointerup', this.stopResize); + target.removeEventListener('pointercancel', this.stopResize); + } + this.activePointerId = null; }, setDefaultWidth() { this.paneWidth = this.defaultWidth;