From 2d6cdd0a3c9cf3778bf1bca592f8b29b6b671290 Mon Sep 17 00:00:00 2001
From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com>
Date: Wed, 4 Mar 2026 04:27:26 +0100
Subject: [PATCH] fix: relocate typing indicator into the input bubble
Move TypingIndicator from document flow (between MessageList and
MessageInput) into MessageInput's outer wrapper using absolute
bottom-full positioning. Fixes indicator being hidden behind the
floating glass input bubble on desktop.
---
packages/web/src/components/chat/MessageInput.tsx | 4 +++-
packages/web/src/components/chat/TypingIndicator.tsx | 2 +-
packages/web/src/components/layout/MainContent.tsx | 3 ---
packages/web/src/components/voice/VoiceChatPanel.tsx | 4 ----
packages/web/src/styles/globals.css | 8 ++++++++
5 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/packages/web/src/components/chat/MessageInput.tsx b/packages/web/src/components/chat/MessageInput.tsx
index e15dc7cb..7934ab95 100644
--- a/packages/web/src/components/chat/MessageInput.tsx
+++ b/packages/web/src/components/chat/MessageInput.tsx
@@ -3,6 +3,7 @@ import { useChatStore } from '../../stores/chatStore';
import { isDmChannel, getChannelOrigin, getApiForOrigin, useServerStore } from '../../stores/serverStore';
import { wsSend } from '../../hooks/useWebSocket';
import { MentionPopover } from './MentionPopover';
+import { TypingIndicator } from './TypingIndicator';
import type { MemberWithUser } from '@backspace/shared';
interface MessageInputProps {
@@ -228,7 +229,8 @@ export function MessageInput({ channelId, channelName }: MessageInputProps) {
};
return (
-
+
+
{replyTo && (
diff --git a/packages/web/src/components/chat/TypingIndicator.tsx b/packages/web/src/components/chat/TypingIndicator.tsx
index 6d1b1514..6cb343fd 100644
--- a/packages/web/src/components/chat/TypingIndicator.tsx
+++ b/packages/web/src/components/chat/TypingIndicator.tsx
@@ -30,7 +30,7 @@ export function TypingIndicator({ channelId }: TypingIndicatorProps) {
}
return (
-
+
diff --git a/packages/web/src/components/layout/MainContent.tsx b/packages/web/src/components/layout/MainContent.tsx
index 205fa28b..a88aedf8 100644
--- a/packages/web/src/components/layout/MainContent.tsx
+++ b/packages/web/src/components/layout/MainContent.tsx
@@ -5,7 +5,6 @@ import { useUIStore } from '../../stores/uiStore';
import { useAuthStore } from '../../stores/authStore';
import { MessageList } from '../chat/MessageList';
import { MessageInput } from '../chat/MessageInput';
-import { TypingIndicator } from '../chat/TypingIndicator';
import { VoiceGrid } from '../voice/VoiceGrid';
import { VoiceControlBar } from '../voice/VoiceControlBar';
import { VoiceChatPanel } from '../voice/VoiceChatPanel';
@@ -210,7 +209,6 @@ export function MainContent() {
-
);
@@ -357,7 +355,6 @@ export function MainContent() {
-
);
diff --git a/packages/web/src/components/voice/VoiceChatPanel.tsx b/packages/web/src/components/voice/VoiceChatPanel.tsx
index 243b63f0..caf5d01d 100644
--- a/packages/web/src/components/voice/VoiceChatPanel.tsx
+++ b/packages/web/src/components/voice/VoiceChatPanel.tsx
@@ -1,7 +1,6 @@
import React from 'react';
import { MessageList } from '../chat/MessageList';
import { MessageInput } from '../chat/MessageInput';
-import { TypingIndicator } from '../chat/TypingIndicator';
import { useUIStore } from '../../stores/uiStore';
interface VoiceChatPanelProps {
@@ -31,9 +30,6 @@ export function VoiceChatPanel({ channelId, channelName }: VoiceChatPanelProps)
{/* Messages */}
- {/* Typing indicator */}
-
-
{/* Input */}
diff --git a/packages/web/src/styles/globals.css b/packages/web/src/styles/globals.css
index b3909678..67e865a0 100644
--- a/packages/web/src/styles/globals.css
+++ b/packages/web/src/styles/globals.css
@@ -238,6 +238,14 @@
animation: slideUp 0.15s ease-out;
}
+@keyframes typingFadeIn {
+ from { transform: translateY(4px); opacity: 0; }
+ to { transform: translateY(0); opacity: 1; }
+}
+.animate-typing-in {
+ animation: typingFadeIn 0.15s ease-out;
+}
+
@keyframes gradientPulse {
0%, 100% { opacity: 0.7; }
50% { opacity: 1; }