Skip to content

UI/UX overhaul, enhanced theming, chat features, and config organization#25234

Closed
BunsDev wants to merge 3 commits intomainfrom
ui/dashboard-v2
Closed

UI/UX overhaul, enhanced theming, chat features, and config organization#25234
BunsDev wants to merge 3 commits intomainfrom
ui/dashboard-v2

Conversation

@BunsDev
Copy link
Copy Markdown
Member

@BunsDev BunsDev commented Feb 24, 2026

Overview

Complete redesign and enhancement of the Control UI dashboard with improved theming, chat capabilities, configuration organization, and user experience.

Theming & Design System

  • System theme support: Automatically follows OS dark/light mode preference
  • Refined light mode: Warm parchment palette with improved contrast
  • Enhanced CSS variables: Comprehensive theming system with consistent color tokens
  • Updated branding: Refreshed favicon and apple-touch-icon
  • Improved typography: Adjusted font sizes for better readability

Chat Experience

  • Speech capabilities: TTS support for chat messages
  • Slash command executor: Enhanced command handling and execution
  • Collapsible tool messages: Cleaner tool output presentation
  • Grouped message improvements: Better visual hierarchy and spacing
  • Enhanced markdown rendering: Improved code blocks and formatting

Configuration & Settings

  • AI & Agents section: Dedicated panel for agent configuration
  • Infrastructure section: Centralized infrastructure management
  • Communications, Appearance, Automation sections: Better categorization
  • Context notices: Helpful in-UI guidance and tips
  • Improved config organization: Clearer structure and discoverability

Authentication

  • Enhanced login gate: Password and token visibility toggles
  • Better credential management: Improved UX for auth flows

Internationalization

  • Multi-language support enhancements: Across new sections (en, pt-BR, zh-CN, zh-TW)

Mobile & Responsive

  • Layout improvements: Better mobile experience
  • Responsive grid adjustments

Developer Experience

  • New GatewaySidePanel component
  • Modular chat features: Speech, slash commands
  • Cleaner component structure
  • Updated @mariozechner packages to 0.54.1

Stats

  • 51 files changed: 5,430 insertions(+), 729 deletions(-)
  • All new features maintain backward compatibility

Testing

  • Tested across light/dark/system themes
  • Validated multi-language support
  • Confirmed chat features: Speech, commands, tool messages
  • Verified config organization and navigation

Notes

  • This is a significant UX upgrade that modernizes the dashboard while maintaining existing functionality
  • No breaking changes to core gateway functionality
  • Ready for review and testing

Greptile Summary

This PR delivers a comprehensive UI/UX modernization of the Control Dashboard with enhanced theming, chat capabilities, and improved configuration organization.

Major Changes:

  • Theming system: Expanded from 2 to 6 theme variants (claw, knot, dash with light/dark modes), system theme support, and comprehensive CSS variable updates across 8+ style files
  • Chat enhancements: New TTS/STT support via browser Speech APIs, slash command executor with 15+ commands (/help, /status, /model, /think, etc.), collapsible tool messages, and improved grouped message rendering
  • Configuration reorganization: Split settings into 6 logical categories (Core, AI & Agents, Communication, Automation, Infrastructure, Appearance) with dedicated panels and improved field organization
  • New UI components: Login gate with token/password visibility toggles, command palette, context usage notices, gateway side panel, and dashboard header
  • Internationalization: Enhanced translations across 4 locales (en, pt-BR, zh-CN, zh-TW) for new sections and features
  • Backend changes: Restored usage and cost fields in chat history (line 153-161 in chat.ts), improved error handling in config update controller

Code Quality:

  • Proper HTML escaping in markdown renderer for data-code attributes and lang class (already flagged and fixed in previous thread)
  • Speech synthesis safely strips markdown before TTS to avoid reading syntax
  • DOMPurify sanitization applied to all rendered markdown
  • Theme migration handles legacy theme names via LEGACY_MAP lookup
  • Previous issues with navWidth validation range, unconditional history reload, and unescaped lang attributes have all been addressed

Architectural Notes:

  • Large file changes are primarily CSS reorganization (2706 insertions in components.css) and new style files (agent-chat.css, glass.css)
  • Module-level state in chat.ts for STT/slash menu is intentional for ephemeral UI state
  • Persistent storage uses Maps keyed by session for input history, pinned messages, and deleted messages

Confidence Score: 4/5

  • Safe to merge with high confidence — comprehensive UI modernization with proper security practices.
  • Score reflects the large scope (88 files, 15k+ insertions) and UI/UX focus, which carries lower risk than backend logic changes. Previous review threads identified and resolved the critical issues (navWidth validation, history reload performance, HTML escaping). The changes maintain backward compatibility, include extensive testing across themes/locales, and follow the repository's coding conventions. No breaking changes to core gateway functionality.
  • No files require special attention — previous review threads have already addressed potential issues in ui/src/ui/storage.ts, ui/src/ui/app-gateway.ts, and ui/src/ui/markdown.ts.

Last reviewed commit: 2922a6e

@BunsDev BunsDev self-assigned this Feb 24, 2026
@openclaw-barnacle openclaw-barnacle Bot added app: android App: android app: web-ui App: web-ui gateway Gateway runtime size: XL maintainer Maintainer-authored PR labels Feb 24, 2026
@BunsDev BunsDev changed the title feat(ui): dashboard v2 - comprehensive UI/UX overhaul with enhanced theming, chat features, and config organization UI/UX overhaul, enhanced theming, chat features, and config organization Feb 24, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the app: android App: android label Feb 24, 2026
@BunsDev BunsDev marked this pull request as ready for review February 24, 2026 10:40
Copy link
Copy Markdown
Contributor

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

84 files reviewed, 4 comments

Edit Code Review Agent Settings | Greptile

Comment thread ui/src/ui/storage.ts
Comment thread ui/src/ui/app-gateway.ts Outdated
Comment thread ui/src/ui/markdown.ts Outdated
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Feb 24, 2026

Additional Comments (1)

ui/src/ui/app-render.ts
Update banner shows even when already up-to-date

The original code filtered updateAvailable by checking latestVersion !== currentVersion before rendering the banner. That guard was removed in this refactor, so the banner will now render whenever state.updateAvailable is truthy, even if the user is already on the latest version.

          state.updateAvailable && state.updateAvailable.latestVersion !== state.updateAvailable.currentVersion
            ? html`<div class="update-banner callout danger" role="alert">
              <strong>Update available:</strong> v${state.updateAvailable.latestVersion}
              (running v${state.updateAvailable.currentVersion}).
              <button
                class="btn btn--sm update-banner__btn"
                ?disabled=${state.updateRunning || !state.connected}
Prompt To Fix With AI
This is a comment left during a code review.
Path: ui/src/ui/app-render.ts
Line: 357-365

Comment:
**Update banner shows even when already up-to-date**

The original code filtered `updateAvailable` by checking `latestVersion !== currentVersion` before rendering the banner. That guard was removed in this refactor, so the banner will now render whenever `state.updateAvailable` is truthy, even if the user is already on the latest version.

```suggestion
          state.updateAvailable && state.updateAvailable.latestVersion !== state.updateAvailable.currentVersion
            ? html`<div class="update-banner callout danger" role="alert">
              <strong>Update available:</strong> v${state.updateAvailable.latestVersion}
              (running v${state.updateAvailable.currentVersion}).
              <button
                class="btn btn--sm update-banner__btn"
                ?disabled=${state.updateRunning || !state.connected}
```

How can I resolve this? If you propose a fix, please make it concise.

@BunsDev
Copy link
Copy Markdown
Member Author

BunsDev commented Feb 24, 2026

Solid UI overhaul. Reviewed the full diff (78 files, ~15k+/7k-). Notes:

Architecture — clean decomposition. Overview split into 5 focused components (cards, attention, events, actions, log-tail) instead of one monolith. Config split into 5 logical sub-tabs (communications, appearance, automation, infrastructure, AI & agents). Sessions view gains search/sort/pagination — big usability win.

SecurityunsafeHTML in overview-cards.ts is safe: values are HTML-escaped before wrapping in <span> tags. The src/gateway/server-methods/chat.ts change (stop stripping usage/cost from chat history) is intentional for the new per-message cost display. No innerHTML usage found.

Theme system — 3 themes (claw/knot/dash) × light/dark with system detection and legacy migration map. Glass morphism CSS is well-structured with enter/modal/dropdown animations.

i18n — all 4 locales (en, pt-BR, zh-CN, zh-TW) have the new keys for the 5 settings sub-tabs. Structure is clean (tabs.X for labels, subtitles.X for descriptions).

Tests — 11 test files updated. Good coverage for a UI PR.

One note: tokenEstimate() in chat.ts uses Math.ceil(draft.length / 4) — fine as a quick visual hint, though char/token ratio varies a lot by language (CJK is closer to 1:1). Might want a tooltip disclaimer or just label it "~estimate".

Overall: well-organized, no security concerns, good test coverage. 🦞

Summary of Changes

  1. ui/src/ui/navigation.test.ts: Updated the subtitle assertion from toContain("chat session") to toContain("chat") to match the current i18n text.
  2. ui/src/ui/navigation.browser.test.ts: Added await nextFrame() after every await app.updateComplete across all 12 tests. This gives Lit reactive properties time to propagate before assertions, fixing the timing issue where app.tab and app.basePath were undefined on Windows headless Chromium.
  3. ui/src/ui/views/chat.test.ts: Fixed the stop button test:
  • Added sending: true to createProps so isBusy is true (required for the stop button to render)
  • Changed button lookup: from textContent === "Stop" to querySelector('button[title="Stop"]') since the button now uses an SVG icon with a title attribute
  1. ui/src/i18n/test/translate.test.ts: Replaced the 5-microtask polling loop with a setTimeout-based retry (up to 1s), plus a fallback that explicitly calls setLocale("zh-CN") if vi.resetModules() doesn't cause full module re-evaluation (which happens in Vitest browser mode).
  2. config-form.browser.test.ts: No changes needed; the "mixed unions" test failure was already resolved by the earlier analyzer changes in config-form.analyze.ts.

tysm @arosstale for your thorough feedback and focus on enhancements tied to UX.

@BunsDev
Copy link
Copy Markdown
Member Author

BunsDev commented Feb 24, 2026

Additional Comments (1)
ui/src/ui/app-render.ts Update banner shows even when already up-to-date

The original code filtered updateAvailable by checking latestVersion !== currentVersion before rendering the banner. That guard was removed in this refactor, so the banner will now render whenever state.updateAvailable is truthy, even if the user is already on the latest version.

          state.updateAvailable && state.updateAvailable.latestVersion !== state.updateAvailable.currentVersion
            ? html`<div class="update-banner callout danger" role="alert">
              <strong>Update available:</strong> v${state.updateAvailable.latestVersion}
              (running v${state.updateAvailable.currentVersion}).
              <button
                class="btn btn--sm update-banner__btn"
                ?disabled=${state.updateRunning || !state.connected}

Prompt To Fix With AI

This is a comment left during a code review.
Path: ui/src/ui/app-render.ts
Line: 357-365

Comment:
**Update banner shows even when already up-to-date**

The original code filtered `updateAvailable` by checking `latestVersion !== currentVersion` before rendering the banner. That guard was removed in this refactor, so the banner will now render whenever `state.updateAvailable` is truthy, even if the user is already on the latest version.

```suggestion
          state.updateAvailable && state.updateAvailable.latestVersion !== state.updateAvailable.currentVersion
            ? html`<div class="update-banner callout danger" role="alert">
              <strong>Update available:</strong> v${state.updateAvailable.latestVersion}
              (running v${state.updateAvailable.currentVersion}).
              <button
                class="btn btn--sm update-banner__btn"
                ?disabled=${state.updateRunning || !state.connected}

How can I resolve this? If you propose a fix, please make it concise.

Done. Restored the version comparison guard so the update banner only renders when latestVersion !== currentVersion.

@BunsDev
Copy link
Copy Markdown
Member Author

BunsDev commented Feb 24, 2026

@greptileai can you produce an updated review?

@BunsDev BunsDev force-pushed the ui/dashboard-v2 branch 2 times, most recently from b85b2f9 to 8b63e36 Compare February 25, 2026 05:41
@BunsDev
Copy link
Copy Markdown
Member Author

BunsDev commented Mar 5, 2026

This branch has now been split into a stacked reviewable series to keep each PR comfortably below the file-count cap.

Superseding stack:

Recommended review order: #36853 -> #36856 -> #36857.

I’m leaving this PR open for now as the original umbrella/reference, but the stacked PRs are the intended review path.

@BunsDev BunsDev closed this Mar 9, 2026
@BunsDev BunsDev deleted the ui/dashboard-v2 branch April 7, 2026 00:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant