diff --git a/apps/tauri/src/lib/screens/TasksScreen.svelte b/apps/tauri/src/lib/screens/TasksScreen.svelte index f05d2b1..127c4c6 100644 --- a/apps/tauri/src/lib/screens/TasksScreen.svelte +++ b/apps/tauri/src/lib/screens/TasksScreen.svelte @@ -210,12 +210,59 @@ let workspaceIds = $derived(app.config ? Object.keys(app.config.workspaces).sort((a, b) => (app.config!.workspaces[a].name).localeCompare(app.config!.workspaces[b].name)) : []); let translateX = $derived(showDrawer ? '0' : '-80cqi'); + + let _edgeSwipeStartX = 0; + let _edgeSwipeStartY = 0; + let _edgeSwipeActive = false; + + function handleEdgeTouchStart(e: TouchEvent) { + const t = e.touches[0]; + if (t.clientX > 20) return; + _edgeSwipeStartX = t.clientX; + _edgeSwipeStartY = t.clientY; + _edgeSwipeActive = true; + } + + function handleEdgeTouchMove(e: TouchEvent) { + if (!_edgeSwipeActive) return; + const dx = e.touches[0].clientX - _edgeSwipeStartX; + const dy = e.touches[0].clientY - _edgeSwipeStartY; + // Cancel if gesture is more vertical than horizontal + if (Math.abs(dy) > Math.abs(dx)) { _edgeSwipeActive = false; return; } + // Prevent scroll interference while swiping right from edge + e.preventDefault(); + } + + function handleEdgeTouchEnd(e: TouchEvent) { + if (!_edgeSwipeActive) return; + _edgeSwipeActive = false; + const dx = e.changedTouches[0].clientX - _edgeSwipeStartX; + if (dx < 60) return; + if (taskStack.length > 0) closeDetail(); + else if (!showDrawer) showDrawer = true; + } + + let _viewportEl = $state(null); + + // Register touchmove as non-passive so preventDefault() works + $effect(() => { + if (!_viewportEl) return; + _viewportEl.addEventListener('touchmove', handleEdgeTouchMove, { passive: false }); + return () => _viewportEl!.removeEventListener('touchmove', handleEdgeTouchMove); + }); -
+ +
+ {#if app.config?.current_workspace} + + {/if} +