diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 284d4bc49..83e3b967f 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -78,6 +78,7 @@ let loaded = false; const eventTarget = new EventTarget(); let controlPane; + let controlPaneComponent; let stopResponseFlag = false; let autoScroll = true; @@ -290,14 +291,9 @@ if (controlPane && !$mobile) { try { if (value) { - const currentSize = controlPane.getSize(); - - if (currentSize === 0) { - const size = parseInt(localStorage?.chatControlsSize ?? '30'); - controlPane.resize(size ? size : 30); - } + controlPaneComponent.openPane(); } else { - controlPane.resize(0); + controlPane.collapse(); } } catch (e) { // ignore @@ -307,6 +303,7 @@ if (!value) { showCallOverlay.set(false); showOverview.set(false); + showArtifacts.set(false); } }); @@ -2222,6 +2219,7 @@ import { SvelteFlowProvider } from '@xyflow/svelte'; import { slide } from 'svelte/transition'; + import { Pane, PaneResizer } from 'paneforge'; import { onDestroy, onMount, tick } from 'svelte'; import { mobile, showControls, showCallOverlay, showOverview, showArtifacts } from '$lib/stores'; @@ -10,9 +11,9 @@ import CallOverlay from './MessageInput/CallOverlay.svelte'; import Drawer from '../common/Drawer.svelte'; import Overview from './Overview.svelte'; - import { Pane, PaneResizer } from 'paneforge'; import EllipsisVertical from '../icons/EllipsisVertical.svelte'; import Artifacts from './Artifacts.svelte'; + import { min } from '@floating-ui/utils'; export let history; export let models = []; @@ -35,6 +36,16 @@ let largeScreen = false; let dragged = false; + let minSize = 0; + + export const openPane = () => { + if (parseInt(localStorage?.chatControlsSize)) { + pane.resize(parseInt(localStorage?.chatControlsSize)); + } else { + pane.resize(minSize); + } + }; + const handleMediaQuery = async (e) => { if (e.matches) { largeScreen = true; @@ -71,6 +82,32 @@ mediaQuery.addEventListener('change', handleMediaQuery); handleMediaQuery(mediaQuery); + // Select the container element you want to observe + const container = document.getElementById('chat-container'); + + // initialize the minSize based on the container width + minSize = Math.floor((350 / container.clientWidth) * 100); + + // Create a new ResizeObserver instance + const resizeObserver = new ResizeObserver((entries) => { + for (let entry of entries) { + const width = entry.contentRect.width; + // calculate the percentage of 200px + const percentage = (350 / width) * 100; + // set the minSize to the percentage, must be an integer + minSize = Math.floor(percentage); + + if ($showControls) { + if (pane && pane.isExpanded() && pane.getSize() < minSize) { + pane.resize(minSize); + } + } + } + }); + + // Start observing the container's size changes + resizeObserver.observe(container); + document.addEventListener('mousedown', onMouseDown); document.addEventListener('mouseup', onMouseUp); }); @@ -163,23 +200,29 @@ {/if} + { - if (size === 0) { - showControls.set(false); - } else { - if (!$showControls) { - showControls.set(true); + console.log('size', size, minSize); + + if ($showControls && pane.isExpanded()) { + if (size < minSize) { + pane.resize(minSize); + } + + if (size < minSize) { + localStorage.chatControlsSize = 0; + } else { + localStorage.chatControlsSize = size; } - localStorage.chatControlsSize = size; } }} + onCollapse={() => { + showControls.set(false); + }} + collapsible={true} class="pt-8" > {#if $showControls}