From 6c08f9ddd5f072a05e39bd5b9f6b99ea3d73573c Mon Sep 17 00:00:00 2001 From: iotserver24 <147928812+iotserver24@users.noreply.github.com> Date: Fri, 19 Jun 2026 05:50:21 +0000 Subject: [PATCH 1/2] feat(desktop): implement minimalist layout for ChatPanel, MessageBubble and ToolCallCard This updates the desktop app UI to a cleaner, minimalist aesthetic (similar to Codex/Claude desktop). - MessageBubble now uses full-width, left-aligned messages with text avatars ('U' and 'X') instead of right-aligned chat bubbles. - ToolCallCard uses a flattened, indented log style without thick rounded borders and relies on grayscale icons instead of vibrant colors. - ChatPanel's floating pill input has been redesigned to a borderless, neutral-styled rounded-lg box. - `
` blocks inside messages and tools now have transparent backgrounds.
---
 .../desktop/src/renderer/components/ChatPanel.tsx    |  4 ++--
 .../src/renderer/components/MessageBubble.tsx        | 12 +++++++-----
 .../desktop/src/renderer/components/ToolCallCard.tsx | 12 ++++++------
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/packages/desktop/src/renderer/components/ChatPanel.tsx b/packages/desktop/src/renderer/components/ChatPanel.tsx
index 82974f1..8d1b2d9 100644
--- a/packages/desktop/src/renderer/components/ChatPanel.tsx
+++ b/packages/desktop/src/renderer/components/ChatPanel.tsx
@@ -180,7 +180,7 @@ export default function ChatPanel({
           )}
 
           {/* Floating Pill input */}
-          
+
{MODES.map((m) => ( @@ -213,7 +213,7 @@ export default function ChatPanel({ placeholder={isRunning ? 'Thinking...' : 'Ask anything or type / for commands'} disabled={isRunning} rows={1} - className="flex-1 resize-none bg-transparent pl-4 pr-12 pb-3.5 pt-1 text-[15px] leading-relaxed text-xibe-text placeholder-xibe-text-dim/50 focus:outline-none disabled:opacity-40" + className="flex-1 resize-none bg-transparent pl-4 pr-12 pb-3.5 pt-1 text-[15px] leading-relaxed text-xibe-text placeholder-xibe-text-dim focus:outline-none disabled:opacity-40" style={{ minHeight: '36px', maxHeight: '400px' }} onInput={(e) => { const t = e.target as HTMLTextAreaElement; t.style.height = 'auto'; t.style.height = Math.min(t.scrollHeight, 400) + 'px'; }} /> diff --git a/packages/desktop/src/renderer/components/MessageBubble.tsx b/packages/desktop/src/renderer/components/MessageBubble.tsx index da57468..6381eee 100644 --- a/packages/desktop/src/renderer/components/MessageBubble.tsx +++ b/packages/desktop/src/renderer/components/MessageBubble.tsx @@ -14,8 +14,9 @@ const MessageBubble = memo(function MessageBubble({ role, content, isStreaming } if (isUser) { return ( -
-
+
+
U
+
{content}
@@ -23,8 +24,9 @@ const MessageBubble = memo(function MessageBubble({ role, content, isStreaming } } return ( -
-
+
X
+
{children}
+
{children}
), code: ({ className, children }) => { const isInline = !className; diff --git a/packages/desktop/src/renderer/components/ToolCallCard.tsx b/packages/desktop/src/renderer/components/ToolCallCard.tsx index efaa667..260a1a6 100644 --- a/packages/desktop/src/renderer/components/ToolCallCard.tsx +++ b/packages/desktop/src/renderer/components/ToolCallCard.tsx @@ -16,7 +16,7 @@ const ToolCallCard = memo(function ToolCallCard({ toolName, toolInput, toolOutpu const outputStr = toolOutput ? (typeof toolOutput === 'string' ? toolOutput : JSON.stringify(toolOutput, null, 2)) : ''; return ( -
+