Skip to content

feat(desktop): add configurable Windows Acrylic backdrop - #8643

Open
mathofdynamic wants to merge 1 commit into
pingdotgg:mainfrom
mathofdynamic:feat/windows-acrylic-backdrop
Open

feat(desktop): add configurable Windows Acrylic backdrop#8643
mathofdynamic wants to merge 1 commit into
pingdotgg:mainfrom
mathofdynamic:feat/windows-acrylic-backdrop

Conversation

@mathofdynamic

@mathofdynamic mathofdynamic commented Aug 29, 2026

Copy link
Copy Markdown

What changed

Windows desktop users currently have no setting for the native desktop blur shown by applications such as Windows Terminal. T3 Code's existing Glass opacity setting only controls renderer surfaces and cannot blur the desktop behind the Electron window.

This PR:

  • adds a persisted Windows desktop-only Desktop background blur setting under Settings → Appearance
  • initializes Windows Electron windows with the native Acrylic material and transparent renderer surfaces
  • applies setting changes immediately through the existing client-settings IPC path
  • keeps a solid readable fallback when Acrylic is unavailable
  • leaves web, macOS, Linux, and mobile clients unchanged
  • documents the setting in the user documentation

Validation

  • Manually verified on Windows 11 with the local desktop build: the backdrop is visible, the setting appears under Appearance, and toggling it applies immediately.
  • 103 focused tests passed.
  • @t3tools/desktop typecheck passed.
  • @t3tools/web typecheck passed.
  • Desktop build passed.
  • Formatting and git diff --check passed.

Scope

This is intentionally limited to the Windows desktop surface. The setting defaults on and uses the existing Glass opacity control to determine how much of the native backdrop is visible through app surfaces.

Generated with Codex (GPT-5.6) in T3 Code.


Note

Medium Risk
Changes Electron window creation and global Windows renderer styling; failures are mitigated with solid-background fallback, but Acrylic/transparent windows can still affect readability or GPU behavior on some systems.

Overview
Adds a persisted desktopBackdropEnabled client setting (default on) and wires it through contracts, settings UI, and IPC so Windows desktop users can toggle native Acrylic blur behind the app.

On win32, Electron windows (main and WSL connecting splash) now use getWindowBackdropOptions / applyWindowsBackdrop—transparent background, acrylic material when enabled, and a solid fallback if material APIs fail. setClientSettings triggers syncAppearance so toggles apply without restart.

The renderer exposes Desktop background blur only on Windows Electron, updates glass-opacity copy, syncs data-desktop-backdrop on the document root, and adjusts index.css so window chrome stays translucent and main/sidebar surfaces respect glass opacity. Settings search gains a windowsOnly filter. User docs describe the feature.

Reviewed by Cursor Bugbot for commit 5378598. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add configurable Windows Acrylic backdrop to desktop client

  • Adds desktopBackdropEnabled to ClientSettings schema, defaulting to true.
  • Implements Acrylic backdrop in DesktopWindow.ts using Windows-specific background materials and transparent colors for both main and splash windows.
  • Updates the web UI to show a "Desktop background blur" toggle on Windows and applies translucent CSS surfaces via data-desktop-backdrop when enabled.
  • Risk: The setClientSettings IPC handler now calls desktopWindow.syncAppearance after saving settings, and applyWindowsBackdrop falls back to a solid background on failure.
📊 Macroscope summarized 5378598. 9 files reviewed, 2 issues evaluated, 0 issues filtered, 2 comments posted

🗂️ Filtered Issues

@coderabbitai

coderabbitai Bot commented Aug 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 09cc86b4-b17e-4a5f-9f75-ae1dcefa344b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 29, 2026
Comment thread apps/web/src/index.css

.electron-windows {
--desktop-window-right-resize-inset: 6px;
--desktop-window-canvas: color-mix(in srgb, var(--background) var(--glass-opacity), transparent);

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.

🟡 Medium src/index.css:2021

When setBackgroundMaterial("acrylic") fails, the renderer keeps data-desktop-backdrop="on", so --desktop-window-canvas remains the glass-opacity color-mix instead of the solid --background fallback. The main surface is therefore blended with the native fallback color, and changing Glass opacity still affects an opaque window; update the backdrop state to off when Acrylic setup fails.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/web/src/index.css around line 2021:

When `setBackgroundMaterial("acrylic")` fails, the renderer keeps `data-desktop-backdrop="on"`, so `--desktop-window-canvas` remains the glass-opacity `color-mix` instead of the solid `--background` fallback. The main surface is therefore blended with the native fallback color, and changing Glass opacity still affects an opaque window; update the backdrop state to `off` when Acrylic setup fails.

Comment thread apps/web/src/index.css
html.electron-windows [data-app-sidebar],
html.electron-windows [data-slot="sidebar-inner"] {
background-color: var(--desktop-window-sidebar) !important;
}

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.

🟡 Medium src/index.css:2051

With Acrylic enabled, [data-app-sidebar] is tinted using the root --sidebar color, so its local light/dark or theme palette is ignored. --desktop-window-sidebar is resolved before the sidebar's --sidebar override is inherited; define the mix on [data-app-sidebar] so it uses the local token.

 }
+ 
+html.electron-windows [data-app-sidebar] {
+  --desktop-window-sidebar: color-mix(in srgb, var(--sidebar) var(--glass-opacity), transparent);
+}
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/web/src/index.css around line 2051:

With Acrylic enabled, `[data-app-sidebar]` is tinted using the root `--sidebar` color, so its local light/dark or theme palette is ignored. `--desktop-window-sidebar` is resolved before the sidebar's `--sidebar` override is inherited; define the mix on `[data-app-sidebar]` so it uses the local token.

@macroscopeapp macroscopeapp Bot left a comment

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.

One finding on the new Windows Acrylic renderer CSS: the global !important overrides target the bg-background / bg-sidebar Tailwind utilities rather than the app-shell surfaces that own the window canvas, so they also repaint every form control and floating surface that happens to use those utilities.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/index.css
Comment on lines +2042 to 2051
html.electron-windows .bg-background,
html.electron-windows [data-slot="sidebar-inset"] {
background-color: var(--desktop-window-canvas) !important;
}

html.electron-windows .bg-sidebar,
html.electron-windows [data-app-sidebar],
html.electron-windows [data-slot="sidebar-inner"] {
background-color: var(--desktop-window-sidebar) !important;
}

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.

These rules key off the bg-background / bg-sidebar utility classes, not the window-canvas surfaces, so on Windows they repaint far more than the app shell:

  • bg-background is a base class on Input, Textarea, Select trigger, InputGroup, Combobox, NumberField, Checkbox, RadioGroup, Toggle, outline Badge, and the Switch / menu-checkbox thumbs. All of them become color-mix(--background var(--glass-opacity), transparent).
  • Because the declaration is !important and unlayered, it also beats the state variants declared on those same elements (dark:bg-input/32, dark:not-data-checked:bg-input/32, dark:data-pressed:bg-input, has-autofill:bg-foreground/4, and call-site hover:bg-accent, e.g. KeybindingsSettings.tsx:852). Dark-mode inputs lose their --input surface, autofill highlighting disappears, and pressed/hover feedback on toggles and shortcut rows stops rendering.
  • --desktop-window-canvas is computed on html, so its var(--background) is substituted with the root value. Controls inside [data-app-sidebar], which deliberately redefines --background/--sidebar locally (index.css:1500, 1836), now resolve the root palette instead of the sidebar palette.
  • .bg-sidebar additionally matches the portaled mobile sidebar Sheet (ui/sidebar.tsx:239), which floats over content rather than over the desktop, so it turns translucent against the app instead of the Acrylic material.

The attribute selectors already listed here ([data-slot="sidebar-inset"], [data-app-sidebar], [data-slot="sidebar-inner"]) are the real canvas owners. Suggest dropping the .bg-background / .bg-sidebar utility branches and giving the remaining full-bleed canvas call sites an explicit opt-in — e.g. an @utility surface-canvas backed by --desktop-window-canvas applied at the shell/route containers — so control primitives keep their own surface ownership. (Multi-file change, so no inline suggestion.)

Posted via Macroscope — UI Consistency

@cursor cursor Bot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5378598. Configure here.

window.setBackgroundColor(getInitialWindowBackgroundColor(shouldUseDarkColors));
} else {
yield* applyWindowsBackdrop(window, platform, shouldUseDarkColors, desktopBackdropEnabled);
}

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.

Acrylic applied to every window

Medium Severity

syncAppearance walks every BrowserWindow from getAllWindows() and, for any window missing from the Acrylic WeakSets, calls applyWindowsBackdrop. That sets acrylic and a fully transparent backgroundColor on auxiliary windows such as undocked DevTools or preview popups whenever the theme changes or any client setting is saved.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5378598. Configure here.

@macroscopeapp

macroscopeapp Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces Windows Acrylic as a new default and wires it through Electron window creation, persisted settings, live synchronization, and broad renderer surface styling. Its cross-cutting production impact and unresolved fallback, theming, UI-scope, and auxiliary-window concerns warrant human review.

Not approved because:

  • 2 blocking correctness issues found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant