diff --git a/packages/shared-splitscreen/src/components/PanelControls.svelte b/packages/shared-splitscreen/src/components/PanelControls.svelte index 0dfd2c012..925b4c237 100644 --- a/packages/shared-splitscreen/src/components/PanelControls.svelte +++ b/packages/shared-splitscreen/src/components/PanelControls.svelte @@ -69,12 +69,7 @@ border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.1); z-index: 20; - opacity: 0; - transition: opacity 0.2s ease; - } - - .app-panel:hover .panel-controls, - .panel-controls:focus-within { + /* Always visible - important for closing the panel */ opacity: 1; } diff --git a/packages/shared-splitscreen/src/components/ResizeHandle.svelte b/packages/shared-splitscreen/src/components/ResizeHandle.svelte index bfec10b6f..843573e7b 100644 --- a/packages/shared-splitscreen/src/components/ResizeHandle.svelte +++ b/packages/shared-splitscreen/src/components/ResizeHandle.svelte @@ -10,16 +10,22 @@ position: number; onResize: (position: number) => void; onReset: () => void; + onDragStateChange?: (isDragging: boolean) => void; } - let { position, onResize, onReset }: Props = $props(); + let { position, onResize, onReset, onDragStateChange }: Props = $props(); let isDragging = $state(false); + + function setDragging(value: boolean) { + isDragging = value; + onDragStateChange?.(value); + } let containerRef: HTMLElement | null = null; function handleMouseDown(event: MouseEvent) { event.preventDefault(); - isDragging = true; + setDragging(true); const handleMouseMove = (e: MouseEvent) => { if (!containerRef) return; @@ -39,7 +45,7 @@ }; const handleMouseUp = () => { - isDragging = false; + setDragging(false); document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; @@ -50,7 +56,7 @@ function handleTouchStart(event: TouchEvent) { event.preventDefault(); - isDragging = true; + setDragging(true); const handleTouchMove = (e: TouchEvent) => { if (!containerRef || !e.touches[0]) return; @@ -70,7 +76,7 @@ }; const handleTouchEnd = () => { - isDragging = false; + setDragging(false); document.removeEventListener('touchmove', handleTouchMove); document.removeEventListener('touchend', handleTouchEnd); }; diff --git a/packages/shared-splitscreen/src/components/SplitPaneContainer.svelte b/packages/shared-splitscreen/src/components/SplitPaneContainer.svelte index ebb34febf..f0ddaf89d 100644 --- a/packages/shared-splitscreen/src/components/SplitPaneContainer.svelte +++ b/packages/shared-splitscreen/src/components/SplitPaneContainer.svelte @@ -5,7 +5,6 @@ */ import type { Snippet } from 'svelte'; - import { onMount } from 'svelte'; import { getSplitPanelContext } from '../stores/split-panel.svelte.js'; import AppPanel from './AppPanel.svelte'; import PanelControls from './PanelControls.svelte'; @@ -20,6 +19,9 @@ const splitPanel = getSplitPanelContext(); + // Track if resize handle is being dragged - used to disable iframe pointer events + let isResizing = $state(false); + // Grid template based on divider position let gridTemplate = $derived( splitPanel.isActive && splitPanel.rightPanel ? `${splitPanel.dividerPosition}% 6px 1fr` : '1fr' @@ -32,13 +34,23 @@ function handleReset() { splitPanel.resetDividerPosition(); } + + function handleDragStateChange(isDragging: boolean) { + isResizing = isDragging; + }
+ + {#if isResizing} +
+ {/if} +
{@render children()}
@@ -48,9 +60,10 @@ position={splitPanel.dividerPosition} onResize={handleResize} onReset={handleReset} + onDragStateChange={handleDragStateChange} /> -
+
(null); - let dividerPosition = $state(DIVIDER_CONSTRAINTS.DEFAULT); + let dividerPosition = $state(DIVIDER_CONSTRAINTS.DEFAULT); let isMobile = $state(false); // Storage config for persistence