Skip to content

🎨 ui: refine desktop app to flat zinc aesthetic#87

Merged
iotserver24 merged 1 commit into
mainfrom
ui/modern-zinc-desktop-theme-15216472138602963596
May 13, 2026
Merged

🎨 ui: refine desktop app to flat zinc aesthetic#87
iotserver24 merged 1 commit into
mainfrom
ui/modern-zinc-desktop-theme-15216472138602963596

Conversation

@iotserver24
Copy link
Copy Markdown
Owner

@iotserver24 iotserver24 commented May 13, 2026

I have updated the XibeCode desktop React UI (packages/desktop) to feature a darker, flatter, "Zinc"-based grayscale palette, matching modern minimal aesthetics like Claude Code or Cursor.

Summary of Changes:

  1. Global CSS Update (packages/desktop/src/renderer/styles/global.css):
    • Shifted --color-xibe-bg to #09090b and adjusted surface colors for a cleaner zinc look.
    • Left core semantic colors (warning, error, info, success) strictly unmodified as per project guidelines.
  2. Flattened Components:
    • Removed all instances of heavy Tailwind shadows (e.g., shadow-lg, shadow-inner, shadow-sm) from floating elements like SettingsPanel, SetupWizard, CommandPalette, ChatPanel buttons, and ToolCallCard to give it a modern border-based pop-up design.
  3. Cleaned up Markdown bubbles (MessageBubble.tsx):
    • Adjusted the prose rendering to rely on flatter code blocks using the newly defined xibe-surface-raised background variable.
    • Set the user bubble explicitly to a subtle Zinc 800 (#27272a).

Verification:

  • I started the Vite dev server and ran Playwright scripts to visually confirm the interface looks clean, flat, and shadow-free.
  • I ran pnpm test and pnpm lint across the workspace to ensure the UI modifications didn't break any underlying React functionality or Vitest assertions. All passed.

PR created automatically by Jules for task 15216472138602963596 started by @iotserver24

Summary by CodeRabbit

  • Style
    • Refined UI styling across chat and settings panels with updated shadow effects and color theme adjustments
    • Enhanced code block appearance with improved visual styling for better readability
    • Updated dark mode color palette for better visual consistency

Review Change Stack

- Updated `global.css` with a darker `#09090b` zinc background palette.
- Removed drop shadows (`shadow-sm`, `shadow-lg`, `shadow-inner`) across components:
  - `ChatPanel.tsx`
  - `CommandPalette.tsx`
  - `SettingsPanel.tsx`
  - `SetupWizard.tsx`
  - `ToolCallCard.tsx`
- Refined `MessageBubble.tsx` to use the updated variables (`#27272a` and `xibe-surface-raised`) instead of border effects.
- Maintained exact semantic status colors (`success`, `warning`, `error`, `info`) as requested.
- Visually verified via Playwright screenshot recording.
@google-labs-jules
Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 13, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3edccd6e-b9f6-4d70-a988-1905f7c43f04

📥 Commits

Reviewing files that changed from the base of the PR and between 1968ed8 and f558d6e.

⛔ Files ignored due to path filters (1)
  • screenshot.png is excluded by !**/*.png
📒 Files selected for processing (8)
  • packages/desktop/src/renderer/components/ChatPanel.tsx
  • packages/desktop/src/renderer/components/CommandPalette.tsx
  • packages/desktop/src/renderer/components/MessageBubble.tsx
  • packages/desktop/src/renderer/components/SettingsPanel.tsx
  • packages/desktop/src/renderer/components/SetupWizard.tsx
  • packages/desktop/src/renderer/components/ToolCallCard.tsx
  • packages/desktop/src/renderer/styles/global.css
  • screenshot.py

📝 Walkthrough

Walkthrough

This PR removes Tailwind shadow classes from multiple desktop UI components, updates the global color theme tokens for a flatter aesthetic, adjusts MessageBubble prose and code rendering styling, and adds a new Playwright automation script to capture screenshots of the chat and settings UI.

Changes

UI Styling & Theme Updates

Layer / File(s) Summary
Shadow class removal across dialog and container elements
packages/desktop/src/renderer/components/ChatPanel.tsx, CommandPalette.tsx, SettingsPanel.tsx, SetupWizard.tsx, ToolCallCard.tsx
Error messages, command palette, settings dialog, setup modal, and tool card displays remove Tailwind shadow-sm, shadow-lg, and shadow-inner classes from containers and elements.
Message bubble styling and global color theme
packages/desktop/src/renderer/components/MessageBubble.tsx, packages/desktop/src/renderer/styles/global.css
User-role message background changes to bg-[#27272a]; assistant-role prose updates blockquote/code emphasis and switches code block and inline code renderers to raised surface styling. Global CSS @theme color tokens updated: background, surface, border, text-dim, and accent hex values and alphas adjusted.

Screenshot Automation

Layer / File(s) Summary
Playwright chat interaction and screenshot automation
screenshot.py
New Python script launches Chromium browser, navigates to local dev server, sends "Hello" chat message, captures chat screenshot, opens settings, captures settings screenshot, and closes browser.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • iotserver24/Xibecode#84: Direct overlap in shadow/token-related styling updates across ChatPanel, MessageBubble, and global.css for minimalist aesthetic.
  • iotserver24/Xibecode#80: Shared modifications to MessageBubble and global.css as part of grayscale theme refactoring.
  • iotserver24/Xibecode#72: Related shadow removal and minimalist theme updates across ChatPanel, MessageBubble, ToolCallCard, and global.css.

Poem

A rabbit hops through shadows, snip-snip—gone! ✨
Flat colors bloom where depth once shone.
The palette grows simpler, the theme shines clean,
And Playwright captures what we've seen. 📸
One less drop-shadow, a lighter dawn!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ui/modern-zinc-desktop-theme-15216472138602963596

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@iotserver24 iotserver24 marked this pull request as ready for review May 13, 2026 14:08
Copilot AI review requested due to automatic review settings May 13, 2026 14:08
@iotserver24 iotserver24 merged commit d3f0226 into main May 13, 2026
4 of 5 checks passed
@iotserver24 iotserver24 deleted the ui/modern-zinc-desktop-theme-15216472138602963596 branch May 13, 2026 14:08
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the desktop renderer theme and component styling to a darker, flatter “zinc” grayscale aesthetic by adjusting global theme tokens and removing prominent shadow treatments across several overlay/floating UI elements.

Changes:

  • Updated @theme CSS variables for background/surface/border/accent to a zinc-like palette.
  • Removed shadow classes from key desktop UI overlays and cards to emphasize border-based separation.
  • Refined message markdown/code styling and introduced a user-bubble background tweak; added a Playwright-based screenshot verification script.

Reviewed changes

Copilot reviewed 8 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
screenshot.py Adds a Playwright script intended to generate UI screenshots for verification.
packages/desktop/src/renderer/styles/global.css Updates theme color tokens (bg/surface/border/accent) to the new zinc palette.
packages/desktop/src/renderer/components/ToolCallCard.tsx Removes inner shadows from tool input/output blocks for a flatter look.
packages/desktop/src/renderer/components/SetupWizard.tsx Removes heavy modal shadow to match the new flat overlay style.
packages/desktop/src/renderer/components/SettingsPanel.tsx Removes heavy modal shadow for a flatter settings panel.
packages/desktop/src/renderer/components/MessageBubble.tsx Adjusts markdown/code surfaces and changes user bubble background styling.
packages/desktop/src/renderer/components/CommandPalette.tsx Removes heavy modal shadow for a flatter command palette.
packages/desktop/src/renderer/components/ChatPanel.tsx Removes minor shadows from error bubble, primary CTA, and command dropdown.
Comments suppressed due to low confidence (2)

screenshot.py:24

  • This script writes screenshots to an absolute, user-specific path (/home/jules/...), which will fail on other machines/CI. Consider writing to a repo-relative path (e.g. under ./artifacts/), and ensure the directory exists (create it if needed) so the script is runnable anywhere.

    page.screenshot(path="/home/jules/verification/screenshots/screenshot_chat.png")

    # Also open the settings to see it
    page.goto("http://localhost:5173/")
    page.wait_for_timeout(2000)
    page.click('text=Settings')
    page.wait_for_timeout(2000)
    page.screenshot(path="/home/jules/verification/screenshots/screenshot_settings.png")

screenshot.py:15

  • The flow relies on fixed wait_for_timeout(2000) sleeps, which makes the script flaky (timing-dependent) and slower than necessary. Prefer waiting on specific page signals (e.g. wait_for_load_state, wait_for_selector, or locator expectations) before interacting and before taking screenshots.
    page = browser.new_page()
    page.goto("http://localhost:5173/")
    page.wait_for_timeout(2000)

    # Click on the textarea, type some text, and send it
    page.fill('textarea', 'Hello')
    page.press('textarea', 'Enter')
    page.wait_for_timeout(2000)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

return (
<div className="flex justify-end animate-fade-in w-full group">
<div className="max-w-[85%] sm:max-w-[75%] rounded-2xl bg-xibe-surface px-4 py-3 text-[15px] leading-relaxed text-xibe-text whitespace-pre-wrap">
<div className="max-w-[85%] sm:max-w-[75%] rounded-2xl bg-[#27272a] px-4 py-3 text-[15px] leading-relaxed text-xibe-text whitespace-pre-wrap">
Comment thread screenshot.py
Comment on lines +1 to +5
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
browser = p.chromium.launch()
# open a chat with user and assistant message and tool calls
Comment thread screenshot.py
Comment on lines +5 to +25
# open a chat with user and assistant message and tool calls

# for simplicity, let's just use the current page
page = browser.new_page()
page.goto("http://localhost:5173/")
page.wait_for_timeout(2000)

# Click on the textarea, type some text, and send it
page.fill('textarea', 'Hello')
page.press('textarea', 'Enter')
page.wait_for_timeout(2000)

page.screenshot(path="/home/jules/verification/screenshots/screenshot_chat.png")

# Also open the settings to see it
page.goto("http://localhost:5173/")
page.wait_for_timeout(2000)
page.click('text=Settings')
page.wait_for_timeout(2000)
page.screenshot(path="/home/jules/verification/screenshots/screenshot_settings.png")
browser.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants