Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@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

Add colorblind mode setting - #1535

Closed
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors
Closed

Add colorblind mode setting#1535
TimCrooker wants to merge 5 commits into
pingdotgg:mainfrom
TimCrooker:feat/colorblind-diff-colors

Conversation

@TimCrooker

@TimCrookerTimCrooker commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

What Changed

Added an opt-in Colorblind mode toggle in Settings > General. When enabled, every place in the UI that uses red/green to distinguish additions from deletions switches to blue/orange instead.

Covers three areas:

  • Diff panel — line backgrounds, emphasis highlights, and the -N/+N header stats
  • DiffStatLabel — the +additions / -deletions text shown inline in chat messages
  • GitActionsControl — per-file and total +insertions / -deletions in the commit dialog

Color palette

The colors come from GitHub's Primer design system (@primer/primitives diffBlob tokens), which is the most widely deployed colorblind-friendly diff palette in production. GitHub ships six colorblind-aware themes built on these values.

Addition (blue)Deletion (orange)
Light#0969da#bc4c00
Dark#388bfd#db6d28

Blue/orange was chosen because both hues maintain their identity under the most common forms of color vision deficiency (deuteranopia and protanopia, which affect ~8% of males). This is the same pair GitHub, Primer, and several other tools converged on after extensive accessibility research.

References:

Why

I'm colorblind. Red and green look the same to me, which makes diffs and stats hard to read. Blue and orange are distinguishable across all common forms of color vision deficiency.

Closes#1537

UI Changes

Settings toggle (off by default):

Screenshot 2026-03-29 at 12 49 17 PMScreenshot 2026-03-29 at 12 49 21 PM

Diff panel — default (red/green) vs colorblind mode (blue/orange):

Screenshot 2026-03-29 at 12 50 06 PMScreenshot 2026-03-29 at 12 50 15 PM

Diff stats in chat — default vs colorblind mode:

Screenshot 2026-03-29 at 12 50 26 PMScreenshot 2026-03-29 at 12 50 38 PM

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Add colorblind mode setting that replaces red/green diff colors with blue/orange

  • Adds a colorblindMode boolean to ClientSettingsSchema (default false) and a toggle in the General settings panel
  • Introduces COLORBLIND_DIFF_STYLES in diffRendering.ts with light/dark palettes for addition/deletion colors
  • DiffPanel dynamically rebuilds its CSS via a new buildDiffPanelCss function when colorblind mode or theme changes, replacing success/destructive CSS variables with blue/orange
  • DiffStatLabel, ChangedFilesTree, MessagesTimeline, and GitActionsControl all accept and apply the colorblind style prop for consistent rendering across the UI

Macroscope summarized 6045239.


Note

Low Risk
Low risk: primarily UI/theming changes plus a new ClientSettingsSchema boolean with a default, affecting diff/stats coloring but not core data flows.

Overview
Adds an opt-in Colorblind mode setting (colorblindMode, default false) to client settings and exposes it in the General settings panel (including dirty-state tracking).

When enabled, diff-related UI swaps red/green addition/deletion colors to a GitHub Primer blue/orange palette across the diff panel (via generated unsafeCSS overrides), chat diff stat labels/changed-files tree, and git commit dialog file/total stats; the active style is derived from the current theme and updates at runtime.

Written by Cursor Bugbot for commit 6045239. This will update automatically on new commits. Configure here.

Add an opt-in toggle in Settings > General that swaps the diff panel's
red/green palette to blue/orange for users with color vision deficiency.
Closespingdotgg#1533
CopilotAI review requested due to automatic review settings March 29, 2026 15:38
@coderabbitai

coderabbitaiBot commented Mar 29, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16d2467b-b3cc-40ae-aa6e-9d1f83357858

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 29, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds an opt-in client setting to make the diff panel more colorblind-accessible by switching the addition/deletion palette from red/green to orange/blue, and wires it through settings UI + legacy migration.

Changes:

  • Added colorblindDiffColors (default false) to the client settings schema.
  • Updated DiffPanel styling to generate diff CSS dynamically based on the setting (blue/orange when enabled).
  • Added a General settings toggle with restore-defaults tracking and legacy localStorage migration support.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

FileDescription
packages/contracts/src/settings.tsAdds the new client setting to the schema with a decoding default.
apps/web/src/components/DiffPanel.tsxBuilds diff CSS based on the setting and passes it to the diff renderer.
apps/web/src/components/settings/SettingsPanels.tsxAdds the Settings UI toggle and includes it in restore-defaults dirty tracking.
apps/web/src/hooks/useSettings.tsMigrates the setting from legacy localStorage into the new client settings storage.

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

Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadpackages/contracts/src/settings.ts Outdated
@TimCrooker
TimCrooker marked this pull request as draft March 29, 2026 15:47
Switch from invented oklch values to GitHub Primer's production-tested
diffBlob tokens (blue/orange) with proper light/dark variants. Add
--diffs-addition-color-override and --diffs-deletion-color-override to
also recolor the -N/+N header text, not just line backgrounds.
Rename colorblindDiffColors to colorblindMode. Apply the Primer
blue/orange palette to DiffStatLabel and GitActionsControl insertion/
deletion counts so all red/green stat indicators respect the setting.
@TimCrookerTimCrooker changed the title Add colorblind-friendly diff colors settingAdd colorblind mode settingMar 29, 2026
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Mar 29, 2026

@juliusmarmingejuliusmarminge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please add some screenshots!

Comment threadapps/web/src/hooks/useSettings.ts Outdated
@juliusmarminge

Copy link
Copy Markdown
Member

We should also consider making this in an extendable way since we'll have high contrast mode as well (#1284), and probably custom themes in the future and don't wanna remove this all when that happens

Remove colorblindMode from legacy migration since the setting never
existed in old localStorage. Add test coverage for the schema default
and a regression test confirming migration correctly ignores it.
@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

Good point on extensibility. The way this is structured should play nicely with a future theme system or high-contrast mode (#1284):

  • The diff panel colors are isolated in a single buildDiffPanelCss() function that takes a flag and a theme. If you move to a general theme/preset system later, that function just needs to accept a theme key instead of a boolean, and the CSS variable overrides stay the same.
  • The DiffStatLabel and GitActionsControl stat colors use a CB_STYLES object keyed by light/dark. Extending that to additional palettes (high contrast, custom themes) is a straightforward object lookup change.
  • Nothing here touches the base --success/--destructive CSS variables. It's all override-layer, so ripping it out or replacing it with a broader theme system later shouldn't require undoing anything.

Happy to restructure if you have a specific pattern in mind for how the theme/preset system should look.

@TimCrooker

Copy link
Copy Markdown
ContributorAuthor

All feedback addressed — removed the dead migration, added tests, and added screenshots. Ready for another look when you get a chance.

@TimCrooker
TimCrooker marked this pull request as ready for review March 29, 2026 16:57
Move COLORBLIND_DIFF_STYLES to diffRendering.ts so the palette is
defined once instead of duplicated across three files. Convert
DiffStatLabel to accept colorblindStyle as a prop instead of calling
useSettings/useTheme internally, preserving its memo() contract.
Thread the prop from ChatView through MessagesTimeline and
ChangedFilesTree.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Add colorblind-friendly diff colors setting

3 participants

@TimCrooker@juliusmarminge