DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

DO NOT MERGE VSCode theme support in T3 Code - #2550

Closed
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan
Closed

DO NOT MERGE VSCode theme support in T3 Code#2550
bmdavis419 wants to merge 7 commits into
mainfrom
t3code/vscode-theme-plan

Conversation

@bmdavis419

@bmdavis419bmdavis419 commented May 6, 2026

Copy link
Copy Markdown
Contributor

auto-detects vscode/cursor themes installed on ur machine. u pick one, it just works in t3 code

imageimage

enjoy the 5.5 xHigh slop pr, do with it what u will I just want this to exist at some point in some way

Summary

  • Add desktop-side discovery and loading for VS Code and Cursor color themes, including safe path resolution and JSONC settings parsing.
  • Extend the desktop bridge and contracts so the web app can refresh, select, and apply external themes.
  • Update web theme handling so syntax highlighting, diffs, terminal colors, and app CSS can respond to resolved editor themes.
  • Add tests for theme discovery, theme resolution, shared theme mapping, and client settings persistence.

Testing

  • bun fmt
  • bun lint
  • bun typecheck
  • Not run: bun run test

Note

Add VSCode/Cursor editor theme discovery and application to T3 Code

  • Adds a full theme discovery pipeline: the desktop main process exposes IPC handlers to scan VS Code, VS Code Insiders, and Cursor extension directories for installed color themes, load a selected theme by ID, and read editor theme preferences.
  • Introduces a structured ThemePreference type (system, builtin, external, follow-editor) stored in client settings; the theme runtime loads and caches external themes asynchronously with deduplication and localStorage bootstrapping.
  • Maps VS Code workbench colors to app CSS variables (sidebar, terminal, diff, chat-request tokens) via a new mapVscodeColorsToAppVariables utility in packages/shared/src/themeMapping.ts; desktop window chrome colors (background, title bar) update to match the active theme.
  • Replaces Suspense-based code block highlighting with an async, idle-scheduled ShikiCodeBlock that caches results per code+language+theme and falls back gracefully for unsupported languages.
  • The General Settings theme selector now lists discovered external themes and supports refresh; resolveSyntaxThemeName registers content-addressed custom Shiki themes derived from the resolved color theme.
  • Risk: This PR is marked DO NOT MERGE and introduces many new IPC channels and a significantly reworked theme runtime that changes how dark mode, CSS variables, and desktop window colors are derived.

Macroscope summarized bb538d7.

- Document discovery, mapping, and persistence strategy
- Outline desktop bridge, settings UI, and rollout phases
- Discover editor themes from desktop installs
- Map theme colors into shared app and syntax tokens
- Wire theme state through desktop, web, and settings
@coderabbitai

coderabbitaiBot commented May 6, 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

Run ID: 76407cd2-f15a-487d-a6b3-544e59fc748c

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/vscode-theme-plan

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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels May 6, 2026
@bmdavis419bmdavis419 changed the title Add VS Code theme discovery and app themingVSCode theme support in T3 CodeMay 6, 2026
Comment threadpackages/shared/src/themeMapping.ts Outdated
Comment threadapps/web/src/hooks/useTheme.ts
@macroscopeapp

macroscopeappBot commented May 6, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

2 blocking correctness issues found. The PR title explicitly indicates 'DO NOT MERGE'. Additionally, this introduces a significant new feature (VSCode/Cursor theme discovery and sync) with complex async state management, and there are unresolved review comments identifying potential race conditions and error handling issues.

You can customize Macroscope's approvability policy. Learn more.

- Reset stored theme preference when the requested VS Code theme cannot be loaded
- Reuse the resolved destructive color for both destructive and destructive-foreground mapping
Comment threadapps/web/src/hooks/useTheme.ts
- Add preference equality guard in theme hook
- Prevent outdated async theme loads from overriding newer selections
Comment threadapps/web/src/hooks/useTheme.ts
Comment on lines +315 to +320
localStorage.setItem(
BOOTSTRAP_THEME_CACHE_KEY,
JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),
);
recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });
applyResolvedTheme(theme, suppressTransitions);

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.

🟡 Mediumhooks/useTheme.ts:315

If localStorage.setItem on line 315 throws (e.g., QuotaExceededError or SecurityError in private browsing), the exception propagates unhandled. This prevents recomputeSnapshot and applyResolvedTheme on lines 319-320 from executing, leaving the state stuck at status: "loading" while the successfully loaded theme is never applied.

- localStorage.setItem(- BOOTSTRAP_THEME_CACHE_KEY,- JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),- );- recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });- applyResolvedTheme(theme, suppressTransitions);+ try {+ localStorage.setItem(+ BOOTSTRAP_THEME_CACHE_KEY,+ JSON.stringify({ id: theme.id, kind: theme.kind, appVariables: theme.appVariables }),+ );+ } catch {+ // Cache failure should not block theme application+ }+ recomputeSnapshot({ preference, resolvedColorTheme: theme, status: "ready", message: null });+ applyResolvedTheme(theme, suppressTransitions);
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 315-320:
If `localStorage.setItem` on line 315 throws (e.g., `QuotaExceededError` or `SecurityError` in private browsing), the exception propagates unhandled. This prevents `recomputeSnapshot` and `applyResolvedTheme` on lines 319-320 from executing, leaving the state stuck at `status: "loading"` while the successfully loaded `theme` is never applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 275-322 (REVIEWED_COMMIT): `loadPreference` function. Line 290 sets status to 'loading'. try/catch on lines 291-301 only wraps `bridge.loadColorTheme`. Line 315-318 `localStorage.setItem(BOOTSTRAP_THEME_CACHE_KEY, ...)` is outside try/catch. Lines 319-320 set 'ready' status and apply theme. Callers at lines 392, 409, 421 all use `void loadPreference(...)` (fire-and-forget).

@bmdavis419bmdavis419 changed the title VSCode theme support in T3 CodeDO NOT MERGE VSCode theme support in T3 CodeMay 6, 2026
Comment on lines +345 to 357
function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
if (existing) return existing;

const promise = loadPreference(preference, suppressTransitions).finally(() => {
if (preferenceLoadPromises.get(key) === promise) {
preferenceLoadPromises.delete(key);
}
});
preferenceLoadPromises.set(key, promise);
return promise;
}

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.

🟡 Mediumhooks/useTheme.ts:345

When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating state.preference to A. Meanwhile the B call already set state.preference = B. When the original A promise completes, isSamePreference(state.preference, preference) compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.

 function loadThemePreference(preference: ThemePreference, suppressTransitions = true) {
const key = themePreferenceKey(preference);
const existing = preferenceLoadPromises.get(key);
- if (existing) return existing;+ if (existing) {+ state.preference = preference;+ return existing;+ }
const promise = loadPreference(preference, suppressTransitions).finally(() => {
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file apps/web/src/hooks/useTheme.ts around lines 345-357:
When a user rapidly switches themes A→B→A, the third call returns the cached promise from the first call without updating `state.preference` to A. Meanwhile the B call already set `state.preference = B`. When the original A promise completes, `isSamePreference(state.preference, preference)` compares B to A, returns false, and bails. Result: the user's final selection A is ignored and theme B remains applied.
Evidence trail:
apps/web/src/hooks/useTheme.ts lines 346-358 (loadThemePreference with preferenceLoadPromises cache), lines 292-343 (loadPreference with recomputeSnapshot and isSamePreference staleness check at lines 308, 317), line 349 (early return of cached promise without calling loadPreference).

@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

The PR is explicitly marked “DO NOT MERGE” and remains an experimental theme-runtime rewrite with unresolved async state races. VS Code theme support can return as a scoped, current-architecture proposal.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

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

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@bmdavis419@juliusmarminge