diff --git a/packages/ui/src/components/chat/ChatContainer.tsx b/packages/ui/src/components/chat/ChatContainer.tsx index 0d769c95..5d370e3e 100644 --- a/packages/ui/src/components/chat/ChatContainer.tsx +++ b/packages/ui/src/components/chat/ChatContainer.tsx @@ -65,8 +65,8 @@ const EMPTY_MESSAGES: Array<{ info: Message; parts: Part[] }> = []; const IDLE_SESSION_STATUS = { type: 'idle' as const }; const CHAT_FORCE_SCROLL_BOTTOM_EVENT = 'openchamber:chat-force-scroll-bottom'; const DEFAULT_RETRY_MESSAGE = 'Quota limit reached. Retrying automatically.'; -const DRAFT_EXIT_DURATION_MS = 100; -const COMPOSER_MOVE_DURATION_MS = 120; +const DRAFT_EXIT_DURATION_MS = 120; +const COMPOSER_MOVE_DURATION_MS = 180; const CHAT_SCROLL_STYLE = { overflowAnchor: 'none', overscrollBehavior: 'contain', @@ -519,7 +519,7 @@ const DraftWelcome: React.FC<{ exiting?: boolean }> = ({ exiting = false }) => { return (

diff --git a/packages/ui/src/components/chat/ChatInput.tsx b/packages/ui/src/components/chat/ChatInput.tsx index 83a3c2e9..27610e32 100644 --- a/packages/ui/src/components/chat/ChatInput.tsx +++ b/packages/ui/src/components/chat/ChatInput.tsx @@ -2387,7 +2387,7 @@ const ChatInputComponent: React.FC = ({ && !isVSCode && !isMiniChatSurface; const draftPresentationClassName = cn( - 'transition-opacity duration-100 ease-out motion-reduce:transition-none', + 'transition-opacity duration-[120ms] ease-out motion-reduce:transition-none', draftPresentationExiting && 'pointer-events-none opacity-0', ); diff --git a/packages/ui/src/components/chat/composer/DOCUMENTATION.md b/packages/ui/src/components/chat/composer/DOCUMENTATION.md index 63136460..6ef1fd31 100644 --- a/packages/ui/src/components/chat/composer/DOCUMENTATION.md +++ b/packages/ui/src/components/chat/composer/DOCUMENTATION.md @@ -8,9 +8,9 @@ own state and wires these modules together; it should not grow logic that belongs to one of them. `ChatContainer.tsx` keeps one `ChatInput` mounted while a new-session draft -becomes its first session. Draft-only UI first fades for 100ms while the editor +becomes its first session. Draft-only UI first fades for 120ms while the editor stays in place. The parent then moves the editor to its final session position -with a 120ms transform-only FLIP animation. Reduced-motion mode skips these +with a 180ms transform-only FLIP animation. Reduced-motion mode skips these transitions. Do not restore separate draft and session composer branches: remounting the editor loses focus and interrupts the transition. Keep the existing mobile fixed-position rules unchanged.