From c2538e3792a283962ccaeff3d145ce75b793bdc3 Mon Sep 17 00:00:00 2001 From: han <475166676@qq.com> Date: Sat, 14 Mar 2026 10:07:04 +0800 Subject: [PATCH] refactor(chat): use css padding for input toolbar --- src/components/chat/message-input.tsx | 74 ++++----------------------- 1 file changed, 10 insertions(+), 64 deletions(-) diff --git a/src/components/chat/message-input.tsx b/src/components/chat/message-input.tsx index 8d2edc8..1399622 100644 --- a/src/components/chat/message-input.tsx +++ b/src/components/chat/message-input.tsx @@ -1,13 +1,6 @@ "use client" -import { - useCallback, - useEffect, - useLayoutEffect, - useMemo, - useRef, - useState, -} from "react" +import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { TauriEvent } from "@tauri-apps/api/event" import { getCurrentWebview } from "@tauri-apps/api/webview" import { open } from "@tauri-apps/plugin-dialog" @@ -1086,9 +1079,6 @@ export function MessageInput({ const hasImageAttachments = imageAttachments.length > 0 const hasResourceAttachments = resourceAttachments.length > 0 - const bottomBarRef = useRef(null) - const actionAreaRef = useRef(null) - const actionButtonRef = useRef(null) const topPaddingClass = hasImageAttachments && hasResourceAttachments ? "pt-[6.25rem]" @@ -1097,45 +1087,9 @@ export function MessageInput({ : hasResourceAttachments ? "pt-10" : "pt-3" - const [bottomPaddingPx, setBottomPaddingPx] = useState(40) + const bottomPaddingClass = "pb-14" const showDragActive = isDragActive && !disabled - useLayoutEffect(() => { - const bottomOffsetPx = 8 // Tailwind `bottom-2` - const bufferPx = 6 - - const bottomBar = bottomBarRef.current - const actionArea = actionAreaRef.current - const actionButton = actionButtonRef.current - if (!bottomBar && !actionArea && !actionButton) return - - const measure = () => { - const bottomBarHeight = bottomBar?.getBoundingClientRect().height ?? 0 - const actionAreaHeight = actionArea?.getBoundingClientRect().height ?? 0 - const actionButtonHeight = - actionButton?.getBoundingClientRect().height ?? 0 - const next = Math.ceil( - Math.max(bottomBarHeight, actionAreaHeight, actionButtonHeight) + - bottomOffsetPx + - bufferPx - ) - setBottomPaddingPx((prev) => (Math.abs(prev - next) < 1 ? prev : next)) - } - - measure() - - const observer = new ResizeObserver(() => { - measure() - }) - if (bottomBar) observer.observe(bottomBar) - if (actionArea) observer.observe(actionArea) - if (actionButton) observer.observe(actionButton) - - return () => { - observer.disconnect() - } - }, [hasAnySelector, isEditingQueueItem, isPrompting]) - const selectorItems = ( <> {showConfigLoading && ( @@ -1187,11 +1141,11 @@ export function MessageInput({ onPaste={handlePaste} onFocus={onFocus} placeholder={resolvedPlaceholder} - style={{ paddingBottom: bottomPaddingPx }} className={cn( "text-sm pr-12 resize-none bg-transparent", showDragActive && "ring-1 ring-primary/40", topPaddingClass, + bottomPaddingClass, className )} autoFocus={autoFocus} @@ -1258,14 +1212,13 @@ export function MessageInput({ )}