Skip to content

feat(ui): new layout#2926

Merged
tlgimenes merged 7 commits intomainfrom
rafavalls/new-ui-layout
Mar 27, 2026
Merged

feat(ui): new layout#2926
tlgimenes merged 7 commits intomainfrom
rafavalls/new-ui-layout

Conversation

@rafavalls
Copy link
Copy Markdown
Collaborator

@rafavalls rafavalls commented Mar 27, 2026

What is this contribution about?

Describe your changes and why they're needed.

Screenshots/Demonstration

Add screenshots or a Loom video if your changes affect the UI.

How to Test

Provide step-by-step instructions for reviewers to test your changes:

  1. Step one
  2. Step two
  3. Expected outcome

Migration Notes

If this PR requires database migrations, configuration changes, or other setup steps, document them here. Remove this section if not applicable.

Review Checklist

  • PR title is clear and descriptive
  • Changes are tested and working
  • Documentation is updated (if needed)
  • No breaking changes

Summary by cubic

Rebuilt Settings, Connections, Members, Monitoring, Automations, and Virtual MCP with a consistent Page layout. Added a Profile & Preferences page, shared @deco/ui SearchInput, and polished buttons and tables.

  • New Features

    • Profile & Preferences: theme (light/dark/system), notifications, global and per-event sound toggles with test sounds, and tool approval level.
    • New Page.Title and Page.Body building blocks; shared @deco/ui SearchInput across org and settings pages.
    • UI polish in @deco/ui: smaller default buttons with new icon-sm; Table now rounded and bordered.
  • Bug Fixes

    • Prevent blank profile name saves by deferring editable state until the session loads.
    • Org slug edits now validate and set touched state on change.
    • Status sounds: SOUND_MAP intentionally omits in_progress (no sound); map is Partial and previews guard missing sounds.
    • Chat input always renders a border to avoid layout shift when toggling plan mode.

Written for commit 9dea632. Summary will update on new commits.

@github-actions
Copy link
Copy Markdown
Contributor

🧪 Benchmark

Should we run the Virtual MCP strategy benchmark for this PR?

React with 👍 to run the benchmark.

Reaction Action
👍 Run quick benchmark (10 & 128 tools)

Benchmark will run on the next push after you react.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 27, 2026

Release Options

Suggested: Patch (2.214.2) — default (no conventional commit prefix detected)

React with an emoji to override the release type:

Reaction Type Next Version
👍 Prerelease 2.214.2-alpha.1
🎉 Patch 2.214.2
❤️ Minor 2.215.0
🚀 Major 3.0.0

Current version: 2.214.1

Note: If multiple reactions exist, the smallest bump wins. If no reactions, the suggested bump is used (default: patch).

@rafavalls rafavalls force-pushed the rafavalls/new-ui-layout branch from 405234a to 91ef127 Compare March 27, 2026 19:23
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

2 issues found across 23 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/mesh/src/web/views/settings/profile-preferences.tsx">

<violation number="1" location="apps/mesh/src/web/views/settings/profile-preferences.tsx:85">
P2: `name` is initialized before the session resolves, so once the user data arrives the input stays empty and `isDirty` becomes true, allowing an accidental save of a blank name. Defer the editable state until the user data is available (e.g., track an "uninitialized" state and derive the displayed value from `user?.name` until the user edits).</violation>
</file>

<file name="apps/mesh/src/web/components/settings/organization-form.tsx">

<violation number="1" location="apps/mesh/src/web/components/settings/organization-form.tsx:174">
P2: The custom `onChange` replaces React Hook Form’s registered handler, so field re-validation/touched updates won’t run. Use `setValue` with `shouldValidate`/`shouldTouch` (or call the registered onChange) so errors clear as the user edits the slug.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

rafavalls and others added 3 commits March 27, 2026 16:27
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SoundEventKey gained an "in_progress" variant but SOUND_MAP was not
updated, causing a typecheck failure. Make the map Partial and add a
null-check in the preview button handler.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
in_progress should not play a sound. Removed the entry and added a
comment explaining the intentional omission.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/mesh/src/web/hooks/use-status-sounds.ts">

<violation number="1" location="apps/mesh/src/web/hooks/use-status-sounds.ts:10">
P2: Avoid `Partial<Record<SoundEventKey, ...>>` here; it removes exhaustiveness checks and can silently drop sounds for valid event keys.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

import { usePreferences, type SoundEventKey } from "./use-preferences";

const SOUND_MAP: Record<string, { dataUri: string }> = {
export const SOUND_MAP: Partial<Record<SoundEventKey, { dataUri: string }>> = {
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 27, 2026

Choose a reason for hiding this comment

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

P2: Avoid Partial<Record<SoundEventKey, ...>> here; it removes exhaustiveness checks and can silently drop sounds for valid event keys.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/mesh/src/web/hooks/use-status-sounds.ts, line 10:

<comment>Avoid `Partial<Record<SoundEventKey, ...>>` here; it removes exhaustiveness checks and can silently drop sounds for valid event keys.</comment>

<file context>
@@ -7,7 +7,7 @@ import { clickSoftSound } from "@deco/ui/lib/click-soft.ts";
 import { usePreferences, type SoundEventKey } from "./use-preferences";
 
-export const SOUND_MAP: Record<SoundEventKey, { dataUri: string }> = {
+export const SOUND_MAP: Partial<Record<SoundEventKey, { dataUri: string }>> = {
   completed: successChimeSound,
   failed: error005Sound,
</file context>
Fix with Cubic

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Partial is intentional here. in_progress is a valid SoundEventKey (users can toggle it in preferences) but it deliberately has no associated sound — the comment on line 9 documents this. Removing Partial would force a dummy/null entry for in_progress, which is less clean than the current approach where if (sound) on line 23 (and line 269 in profile-preferences) handles missing entries gracefully.

Exhaustiveness is not needed: if a new key is added to SoundEventKey, the default behavior of "no sound" is the safe default until a sound asset is explicitly assigned.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for the feedback! I've saved this as a new learning to improve future reviews.

tlgimenes and others added 3 commits March 27, 2026 16:35
…n plan mode toggle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Knip flagged the unused `Header` export. Since only `ViewLayout` and
`ViewActions` are imported, remove `Header` and the now-unreferenced
`HeaderLeft` component.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Defer editable name state until session resolves to prevent blank
  name saves (profile-preferences.tsx)
- Add shouldTouch and shouldValidate to slug setValue so validation
  and touched state update on edit (organization-form.tsx)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@tlgimenes tlgimenes changed the title New updated layout feat(ui): new layout Mar 27, 2026
@tlgimenes tlgimenes merged commit 28a2258 into main Mar 27, 2026
15 checks passed
@tlgimenes tlgimenes deleted the rafavalls/new-ui-layout branch March 27, 2026 19:46
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