feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg
, '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

feat(web): chat text contrast slider with live preview in Typography - #7395

Closed
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream
Closed

feat(web): chat text contrast slider with live preview in Typography#7395
dascapytal1559 wants to merge 2 commits into
pingdotgg:mainfrom
dascapytal1559:feat/chat-text-contrast-upstream

Conversation

@dascapytal1559

@dascapytal1559dascapytal1559 commented Aug 18, 2026

Copy link
Copy Markdown

What Changed

A Chat text contrast slider in Settings → Appearance → Typography, controlling the tone of agent reply text in the web client.

  • The scale reads as the text's strength: 80% (default) reproduces the current foreground/80 exactly — no visual change for any existing install.
  • 100% renders full foreground in light mode and pure white in dark mode; between is a color-mix interpolation.
  • A sample line under the slider is styled by the same CSS variable the slider drives, so the tone previews live while dragging.

Mechanically: one chatTextContrast client setting in contracts (int 80–100, default 80), synced to a --chat-text-contrast CSS variable from the root route, consumed via a derived --chat-markdown-foreground color by the chat markdown root and collapsed details bodies. The slider row follows the existing glass-opacity pattern (reset, settings search, restore-defaults sweep). User message bubbles keep their own message-foreground. 7 files, +153/−2; no dependency changes. Mobile has its own native markdown theming and is deliberately untouched.

Why

Chat body text renders at foreground/80, which composites to ~#c6c6c6 over dark backgrounds. Over long reading sessions that tone gets genuinely tiring — but bumping it for everyone would repaint every install, and taste differs. A bounded slider whose default is pixel-identical to today's rendering lets people who feel this pick their tone without changing anything for anyone else.

I understand new features are usually unwelcome here — this one is deliberately tiny and default-preserving, but if it's not something you want, feel free to close, or I'm happy to convert it into a discussion instead.

UI Changes

The setting with its live sample (dark mode). Dragging previews the tone immediately:

Slider drag with live preview

Agent reply before/after, captured through the real slider → settings → CSS variable path. Computed colors verified: 80% → srgb(.96 .96 .96 / 0.8) (identical to current foreground/80 rendering, so this is the "before"), 90% → srgb(.98 .98 .98 / 0.9), 100% → srgb(1 1 1).

80% — before / default:

Reply at 80%

100% — pure white:

Reply at 100%

The settings row in place:

Chat text contrast setting

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

Built by Claude Fable 5 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Appearance-only client setting with default 80 matching current rendering; no auth, data, or API changes.

Overview
Adds a Chat text contrast control (80–100%, default 80) so users can brighten agent reply markdown without changing the look for existing installs at the default.

The setting is persisted in contracts as chatTextContrast, synced from the root route to --chat-text-contrast (mapped to a 0–100% mix progress), and applied via a new --chat-markdown-foregroundcolor-mix in global CSS. ChatMarkdown and collapsible details bodies switch from fixed text-foreground/80 to that variable.

Settings → Appearance → Typography gets a slider row (reset, restore-defaults, search) with a live preview sample. Contract tests cover validation and defaults.

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

Note

Add chat text contrast slider with live preview to Typography settings

  • Adds a chatTextContrast integer setting (range 80–100, default 80) to ClientSettingsSchema and ClientSettingsPatch in settings.ts.
  • Introduces --chat-text-contrast and --chat-markdown-foreground CSS variables in index.css; chat markdown text color now blends between 80% and 100% foreground opacity based on the setting.
  • Adds ChatTextContrastSync to the root tree in __root.tsx to keep the CSS variable in sync with the stored setting without a page reload.
  • Renders a slider with numeric output, reset button, and live preview paragraph in the Typography section of SettingsPanels.tsx; restoring defaults also resets this value.
  • Makes the setting discoverable via settings search under "Chat text contrast" navigating to /settings/appearance.

Macroscope summarized a50dc7e.

Chat body text renders at foreground/80, which composites to roughly
#c6c6c6 over dark backgrounds and reads muddy over long sessions. Add a
"Chat text contrast" slider to Settings → Appearance → Typography: 80%
(the default) reproduces the classic foreground/80 tone exactly, 100%
renders full foreground in light mode and pure white in dark mode, with
color-mix interpolating between. A sample line under the slider is
driven by the same CSS variable, so the tone previews live while
dragging. Default preserves current behavior for every existing install.
Built with Claude Fable 5 in Claude Code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cb232cb4-07e8-4cb0-8cb5-f3fd2b4fc35f

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

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 18, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@macroscopeappmacroscopeappBot 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.

UI consistency review: one behavioral regression in the settings restore flow, plus one minor durable-contract note on the CSS variable mapping. The --chat-markdown-foreground token, its @variant dark override, and the text-(--chat-markdown-foreground) call sites otherwise look consistent with the existing theme/token ownership (custom themes keep working because --foreground is redefined on the same html element the variable is declared on).

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/routes/__root.tsx Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit 7eda866. Configure here.

Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@macroscopeapp

macroscopeappBot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces a new user-facing feature (chat text contrast slider with live preview), adding new settings, CSS variables, and UI components. New features that introduce user-facing behavior warrant human review regardless of implementation quality.

You can add or adjust custom eligibility rules. Learn more.

…rom shared bounds
The changedSettingLabels memo read settings.chatTextContrast without
listing it as a dependency, so Restore defaults could stay disabled or
show stale copy when contrast was the only dirty setting. The CSS
variable sync also re-derived the 80–100 range by hand; it now maps from
the shared MIN/MAX contract constants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@macroscopeappmacroscopeappBot 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.

UI consistency review of the chat text contrast setting. The two findings from the previous run (missing settings.chatTextContrast memo dependency, and the re-derived contrast range in __root.tsx) are resolved. One remaining consistency note on the duplicated slider control.

Posted via Macroscope — UI Consistency

Comment on lines +1455 to +1464
<div className="flex w-full items-center gap-3 sm:w-52">
<output
className="min-w-12 rounded-md bg-muted px-2 py-1 text-center font-mono text-xs font-medium tabular-nums text-foreground"
htmlFor="chat-text-contrast"
>
{settings.chatTextContrast}%
</output>
<input
aria-label="Chat text contrast"
className="settings-slider min-w-0 flex-1"

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.

This reproduces the glass-opacity slider control verbatim (AppearanceSettingsPanel, lines ~989-1057): same value-chip classes, same settings-slider min-w-0 flex-1 input, same --settings-slider-progress / --settings-slider-fill-offset math, and the same clamp-on-change guard. With two call sites the geometry can now drift — a chip padding or fill-offset fix has to be applied in both places, and only one of them owns the .settings-slider contract in index.css.

Consider extracting a small shared control (e.g. SettingsPercentSlider({ id, label, min, max, step, value, onChange }) in settingsLayout.tsx) that owns the chip, the slider element, and the progress/offset variables, and have both rows render it with only their labels and bounds at the call site.

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Declining for this PR, deliberately: the row mirrors the glass-opacity control precisely because that inline pattern is the existing precedent in AppearanceSettingsPanel, and extracting a shared SettingsPercentSlider would mean refactoring the existing glass-opacity row inside a feature PR — widening a change that upstream guidelines want small, focused, and additive. The drift risk is real but bounded (two call sites, both owned by the same file's conventions). Happy to do the extraction as a tiny follow-up PR, or fold it into this one if a maintainer prefers that trade.

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.

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The appearance contrast control already shipped in #7906.

@t3dotggt3dotgg closed this Aug 23, 2026
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.

2 participants

@dascapytal1559@t3dotgg