From 98dc4fc22550d07558b9677f4cc86f31d582e541 Mon Sep 17 00:00:00 2001
From: characharm <123120856+characharm@users.noreply.github.com>
Date: Mon, 7 Apr 2025 03:35:19 +0500
Subject: [PATCH 1/6] Update ChatScreen.tsx
---
.../webui/src/components/ChatScreen.tsx | 108 ++++++------------
1 file changed, 36 insertions(+), 72 deletions(-)
diff --git a/examples/server/webui/src/components/ChatScreen.tsx b/examples/server/webui/src/components/ChatScreen.tsx
index d12b06e125e5a..5c5d08f6167a1 100644
--- a/examples/server/webui/src/components/ChatScreen.tsx
+++ b/examples/server/webui/src/components/ChatScreen.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useMemo, useRef, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { CallbackGeneratedChunk, useAppContext } from '../utils/app.context';
import ChatMessage from './ChatMessage';
import { CanvasType, Message, PendingMessage } from '../utils/types';
@@ -6,6 +6,8 @@ import { classNames, cleanCurrentUrl, throttle } from '../utils/misc';
import CanvasPyInterpreter from './CanvasPyInterpreter';
import StorageUtils from '../utils/storage';
import { useVSCodeContext } from '../utils/llama-vscode';
+import { useAutosizeTextarea, AutosizeTextareaApi } from './useAutosizeTextarea.ts';
+
/**
* A message display is a message node with additional information for rendering.
@@ -90,6 +92,7 @@ const scrollToBottom = throttle(
);
export default function ChatScreen() {
+
const {
viewingChat,
sendMessage,
@@ -99,7 +102,7 @@ export default function ChatScreen() {
canvasData,
replaceMessageAndGenerate,
} = useAppContext();
- const textarea = useOptimizedTextarea(prefilledMsg.content());
+ const textarea: AutosizeTextareaApi = useAutosizeTextarea(prefilledMsg.content());
const { extraContext, clearExtraContext } = useVSCodeContext(textarea);
// TODO: improve this when we have "upload file" feature
@@ -248,36 +251,37 @@ export default function ChatScreen() {
{/* chat input */}
-
-
- {isGenerating(currConvId ?? '') ? (
-
- ) : (
-
- )}
-
-
+
+
+ {isGenerating(currConvId ?? '') ? (
+
+ ) : (
+
+ )}
+
+
{canvasData?.type === CanvasType.PY_INTERPRETER && (
@@ -286,43 +290,3 @@ export default function ChatScreen() {
);
}
-
-export interface OptimizedTextareaValue {
- value: () => string;
- setValue: (value: string) => void;
- focus: () => void;
- ref: React.RefObject;
-}
-
-// This is a workaround to prevent the textarea from re-rendering when the inner content changes
-// See https://github.com/ggml-org/llama.cpp/pull/12299
-function useOptimizedTextarea(initValue: string): OptimizedTextareaValue {
- const [savedInitValue, setSavedInitValue] = useState(initValue);
- const textareaRef = useRef(null);
-
- useEffect(() => {
- if (textareaRef.current && savedInitValue) {
- textareaRef.current.value = savedInitValue;
- setSavedInitValue('');
- }
- }, [textareaRef, savedInitValue, setSavedInitValue]);
-
- return {
- value: () => {
- return textareaRef.current?.value ?? savedInitValue;
- },
- setValue: (value: string) => {
- if (textareaRef.current) {
- textareaRef.current.value = value;
- }
- },
- focus: () => {
- if (textareaRef.current) {
- // focus and move the cursor to the end
- textareaRef.current.focus();
- textareaRef.current.selectionStart = textareaRef.current.value.length;
- }
- },
- ref: textareaRef,
- };
-}
From b1ebaf53a418483a3dc407360dd7d9658fa02b89 Mon Sep 17 00:00:00 2001
From: characharm <123120856+characharm@users.noreply.github.com>
Date: Mon, 7 Apr 2025 03:39:52 +0500
Subject: [PATCH 2/6] useAutosizeTextarea.ts
useAutosizeTextarea to encapsulate the logic.
---
.../src/components/useAutosizeTextarea.ts | 68 +++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 examples/server/webui/src/components/useAutosizeTextarea.ts
diff --git a/examples/server/webui/src/components/useAutosizeTextarea.ts b/examples/server/webui/src/components/useAutosizeTextarea.ts
new file mode 100644
index 0000000000000..f8d7763f1947f
--- /dev/null
+++ b/examples/server/webui/src/components/useAutosizeTextarea.ts
@@ -0,0 +1,68 @@
+import { useEffect, useRef, useState, useCallback } from 'react';
+
+const adjustTextareaHeight = (textarea: HTMLTextAreaElement | null) => {
+ if (!textarea) {
+ return;
+ }
+
+ const computedStyle = window.getComputedStyle(textarea);
+ const currentMaxHeight = computedStyle.maxHeight;
+
+ textarea.style.maxHeight = 'none';
+ textarea.style.height = 'auto';
+
+ const scrollH = textarea.scrollHeight;
+
+ textarea.style.height = `${scrollH}px`;
+ textarea.style.maxHeight = currentMaxHeight;
+};
+
+export interface AutosizeTextareaApi {
+ value: () => string;
+ setValue: (value: string) => void;
+ focus: () => void;
+ ref: React.RefObject;
+ onInput: (event: React.FormEvent) => void;
+}
+
+export function useAutosizeTextarea(initValue: string): AutosizeTextareaApi {
+ const [savedInitValue, setSavedInitValue] = useState(initValue);
+ const textareaRef = useRef(null);
+
+ useEffect(() => {
+ const textarea = textareaRef.current;
+ if (textarea) {
+ if (typeof savedInitValue === 'string' && savedInitValue.length > 0) {
+ textarea.value = savedInitValue;
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ setSavedInitValue('');
+ } else {
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ }
+ }
+ }, [textareaRef, savedInitValue]);
+
+ const handleInput = useCallback((event: React.FormEvent) => {
+ adjustTextareaHeight(event.currentTarget);
+ }, []);
+
+ return {
+ value: () => {
+ return textareaRef.current?.value ?? '';
+ },
+ setValue: (value: string) => {
+ const textarea = textareaRef.current;
+ if (textarea) {
+ textarea.value = value;
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ }
+ },
+ focus: () => {
+ if (textareaRef.current) {
+ textareaRef.current.focus();
+ }
+ },
+ ref: textareaRef,
+ onInput: handleInput,
+ };
+}
\ No newline at end of file
From fa9efefae9a35c9cc2e447be5868fd28e629c0db Mon Sep 17 00:00:00 2001
From: characharm
Date: Mon, 7 Apr 2025 23:42:52 +0500
Subject: [PATCH 3/6] Implement responsive auto-sizing chat textarea
Replaces the manual textarea resizing with an automatic height adjustment based on content.
- `useChatTextarea` hook to manage textarea state and auto-sizing logic via refs, preserving the optimization
- Textarea now grows vertically up to a maximum height (`lg:max-h-48`) on large screens (lg breakpoint and up).
- Disables auto-sizing and enables manual vertical resizing (`resize-vertical`) on smaller screens for better mobile usability.
- Aligns the "Send" button to the bottom of the textarea (`items-end`) for consistent positioning during resize.
---
.../webui/src/components/ChatScreen.tsx | 77 ++++++++-------
.../src/components/useAutosizeTextarea.ts | 68 --------------
.../webui/src/components/useChatTextarea.ts | 93 +++++++++++++++++++
3 files changed, 137 insertions(+), 101 deletions(-)
delete mode 100644 examples/server/webui/src/components/useAutosizeTextarea.ts
create mode 100644 examples/server/webui/src/components/useChatTextarea.ts
diff --git a/examples/server/webui/src/components/ChatScreen.tsx b/examples/server/webui/src/components/ChatScreen.tsx
index 5c5d08f6167a1..3b541bd01dbd7 100644
--- a/examples/server/webui/src/components/ChatScreen.tsx
+++ b/examples/server/webui/src/components/ChatScreen.tsx
@@ -6,7 +6,10 @@ import { classNames, cleanCurrentUrl, throttle } from '../utils/misc';
import CanvasPyInterpreter from './CanvasPyInterpreter';
import StorageUtils from '../utils/storage';
import { useVSCodeContext } from '../utils/llama-vscode';
-import { useAutosizeTextarea, AutosizeTextareaApi } from './useAutosizeTextarea.ts';
+import {
+ useChatTextarea,
+ AutosizeTextareaApi,
+} from './useChatTextarea.ts';
/**
@@ -102,7 +105,10 @@ export default function ChatScreen() {
canvasData,
replaceMessageAndGenerate,
} = useAppContext();
- const textarea: AutosizeTextareaApi = useAutosizeTextarea(prefilledMsg.content());
+
+ const textarea: AutosizeTextareaApi = useChatTextarea(
+ prefilledMsg.content()
+ );
const { extraContext, clearExtraContext } = useVSCodeContext(textarea);
// TODO: improve this when we have "upload file" feature
@@ -251,37 +257,42 @@ export default function ChatScreen() {
{/* chat input */}
-
-
- {isGenerating(currConvId ?? '') ? (
-
- ) : (
-
- )}
-
-
+
+
+
+ {isGenerating(currConvId ?? '') ? (
+
+ ) : (
+
+ )}
+
+
{canvasData?.type === CanvasType.PY_INTERPRETER && (
diff --git a/examples/server/webui/src/components/useAutosizeTextarea.ts b/examples/server/webui/src/components/useAutosizeTextarea.ts
deleted file mode 100644
index f8d7763f1947f..0000000000000
--- a/examples/server/webui/src/components/useAutosizeTextarea.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { useEffect, useRef, useState, useCallback } from 'react';
-
-const adjustTextareaHeight = (textarea: HTMLTextAreaElement | null) => {
- if (!textarea) {
- return;
- }
-
- const computedStyle = window.getComputedStyle(textarea);
- const currentMaxHeight = computedStyle.maxHeight;
-
- textarea.style.maxHeight = 'none';
- textarea.style.height = 'auto';
-
- const scrollH = textarea.scrollHeight;
-
- textarea.style.height = `${scrollH}px`;
- textarea.style.maxHeight = currentMaxHeight;
-};
-
-export interface AutosizeTextareaApi {
- value: () => string;
- setValue: (value: string) => void;
- focus: () => void;
- ref: React.RefObject
;
- onInput: (event: React.FormEvent) => void;
-}
-
-export function useAutosizeTextarea(initValue: string): AutosizeTextareaApi {
- const [savedInitValue, setSavedInitValue] = useState(initValue);
- const textareaRef = useRef(null);
-
- useEffect(() => {
- const textarea = textareaRef.current;
- if (textarea) {
- if (typeof savedInitValue === 'string' && savedInitValue.length > 0) {
- textarea.value = savedInitValue;
- setTimeout(() => adjustTextareaHeight(textarea), 0);
- setSavedInitValue('');
- } else {
- setTimeout(() => adjustTextareaHeight(textarea), 0);
- }
- }
- }, [textareaRef, savedInitValue]);
-
- const handleInput = useCallback((event: React.FormEvent) => {
- adjustTextareaHeight(event.currentTarget);
- }, []);
-
- return {
- value: () => {
- return textareaRef.current?.value ?? '';
- },
- setValue: (value: string) => {
- const textarea = textareaRef.current;
- if (textarea) {
- textarea.value = value;
- setTimeout(() => adjustTextareaHeight(textarea), 0);
- }
- },
- focus: () => {
- if (textareaRef.current) {
- textareaRef.current.focus();
- }
- },
- ref: textareaRef,
- onInput: handleInput,
- };
-}
\ No newline at end of file
diff --git a/examples/server/webui/src/components/useChatTextarea.ts b/examples/server/webui/src/components/useChatTextarea.ts
new file mode 100644
index 0000000000000..69d857e809199
--- /dev/null
+++ b/examples/server/webui/src/components/useChatTextarea.ts
@@ -0,0 +1,93 @@
+import { useEffect, useRef, useState, useCallback } from 'react';
+
+// Media Query for detecting "large" screens (matching Tailwind's lg: breakpoint)
+const LARGE_SCREEN_MQ = '(min-width: 1024px)';
+
+// Calculates and sets the textarea height based on its scrollHeight
+const adjustTextareaHeight = (textarea: HTMLTextAreaElement | null) => {
+ if (!textarea) return;
+
+ // Only perform auto-sizing on large screens
+ if (!window.matchMedia(LARGE_SCREEN_MQ).matches) {
+ // On small screens, reset inline height and max-height styles.
+ // This allows CSS (e.g., `rows` attribute or classes) to control the height,
+ // and enables manual resizing if `resize-vertical` is set.
+ textarea.style.height = ''; // Use 'auto' or '' to reset
+ textarea.style.maxHeight = '';
+ return; // Do not adjust height programmatically on small screens
+ }
+
+ const computedStyle = window.getComputedStyle(textarea);
+ // Get the max-height specified by CSS (e.g., from `lg:max-h-48`)
+ const currentMaxHeight = computedStyle.maxHeight;
+
+ // Temporarily remove max-height to allow scrollHeight to be calculated correctly
+ textarea.style.maxHeight = 'none';
+ // Reset height to 'auto' to measure the actual scrollHeight needed
+ textarea.style.height = 'auto';
+ // Set the height to the calculated scrollHeight
+ textarea.style.height = `${textarea.scrollHeight}px`;
+ // Re-apply the original max-height from CSS to enforce the limit
+ textarea.style.maxHeight = currentMaxHeight;
+};
+
+// Interface describing the API returned by the hook
+export interface AutosizeTextareaApi {
+ value: () => string;
+ setValue: (value: string) => void;
+ focus: () => void;
+ ref: React.RefObject;
+ onInput: (event: React.FormEvent) => void; // Input handler
+}
+
+// This is a workaround to prevent the textarea from re-rendering when the inner content changes
+// See https://github.com/ggml-org/llama.cpp/pull/12299
+// combined now with auto-sizing logic.
+export function useChatTextarea(initValue: string): AutosizeTextareaApi {
+ const [savedInitValue, setSavedInitValue] = useState(initValue);
+ const textareaRef = useRef(null);
+
+ // Effect to set initial value and height on mount or when initValue changes
+ useEffect(() => {
+ const textarea = textareaRef.current;
+ if (textarea) {
+ if (typeof savedInitValue === 'string' && savedInitValue.length > 0) {
+ textarea.value = savedInitValue;
+ // Call adjustTextareaHeight - it will check screen size internally
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ setSavedInitValue(''); // Reset after applying
+ } else {
+ // Adjust height even if there's no initial value (for initial render)
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ }
+ }
+ }, [textareaRef, savedInitValue]); // Depend on ref and savedInitValue
+
+ const handleInput = useCallback((event: React.FormEvent) => {
+ // Call adjustTextareaHeight on every input - it will decide whether to act
+ adjustTextareaHeight(event.currentTarget);
+ }, []);
+
+ return {
+ // Method to get the current value directly from the textarea
+ value: () => {
+ return textareaRef.current?.value ?? '';
+ },
+ // Method to programmatically set the value and trigger height adjustment
+ setValue: (value: string) => {
+ const textarea = textareaRef.current;
+ if (textarea) {
+ textarea.value = value;
+ // Call adjustTextareaHeight - it will check screen size internally
+ setTimeout(() => adjustTextareaHeight(textarea), 0);
+ }
+ },
+ focus: () => {
+ if (textareaRef.current) {
+ textareaRef.current.focus();
+ }
+ },
+ ref: textareaRef,
+ onInput: handleInput,
+ };
+}
\ No newline at end of file
From 0ebbb6ac4105b2effd8c57934dc339d2d8b91c4e Mon Sep 17 00:00:00 2001
From: characharm
Date: Mon, 7 Apr 2025 23:55:40 +0500
Subject: [PATCH 4/6] -update compressed index.html.gz after npm run build
-refactor: replace OptimizedTextareaValue with AutosizeTextareaApi in VSCode
context hook
---
examples/server/public/index.html.gz | Bin 1263128 -> 1263389 bytes
.../server/webui/src/utils/llama-vscode.ts | 4 ++--
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/examples/server/public/index.html.gz b/examples/server/public/index.html.gz
index 941815c22efb0b6dcbbe50f0bd2d7d193dad1c7d..bf718fe5c06d6da16b6b655af66362b09508090f 100644
GIT binary patch
delta 1185275
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∾O)OIVi`}igVJq5;tGpp
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