fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

fix(web): unify control sizing across settings pages - #9281

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing
Sep 2, 2026
Merged

fix(web): unify control sizing across settings pages#9281
juliusmarminge merged 1 commit into
mainfrom
t3code/unify-settings-form-sizing

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

Problem

Settings rows mixed control heights freely: selects at 32px, inputs at 30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, model pickers fixed at 28px, and the Keybindings page on its own compact scale. Integrations had three selects at one height and two at another; Project settings had five different heights in one column. Nothing in SettingsRow constrained the control slot, so every call site picked its own size.

Fix

Every settings surface now follows three tiers, documented above SettingsRow in settingsLayout.tsx:

  • Row controlssize="sm" (Button, Select, Input, NumberField) or icon-sm. Every primitive's sm lands on the same 28px desktop / 32px mobile box, which is also where the model/traits pickers already sit.
  • Section header actions and buttons inside list items, cards, toolbarsxs / icon-xs.
  • Inline affordances (reset arrows, info tooltips, table-cell buttons, list reorder arrows) stay icon-micro.
  • Dialog footers keep the app-wide default button size; the two settings dialogs that deviated were brought in line.

Small primitive changes: Switch gains a size="sm" variant that replaces the ad-hoc --thumb-size overrides (models list, branch toolbar), ServerUpdateAction gains a size prop, and FontFamilyPicker reuses selectTriggerVariants instead of a hand-copied trigger. The Keybindings when-clause expression builder stays on compact since it is a dense mono editor that was already internally consistent.

Before / after

General
general

Project settings
project

Integrations (three selects at one height, two at another → one)
integrations

Providers (instance card config fields)
providers

Source control
source-control

Appearance
appearance

Keybindings, Connections, Archive, mobile

keybindings
connections
archived
general-mobile

Verification

  • Lint and typecheck on apps/web; ServerUpdateAction.test.tsx passes.
  • Browser pass over every settings route and project settings at 1440px and 390px against a snapshot of real data (screenshots above).

Built with Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Visual and sizing-only changes across settings and shared UI primitives; no auth, data, or business-logic behavior changes.

Overview
Standardizes settings UI control heights by applying a documented three-tier sizing scheme (sm in row controls, xs/icon-xs in headers and list actions, icon-micro for tiny inline affordances) across settings routes and related surfaces.

Primitive and shared helpers:Switch adds size="sm" (replacing ad-hoc --thumb-size classes). ServerUpdateAction accepts a size prop (default xs; Connections passes sm for the primary server row). settingsLayout exports SETTINGS_PICKER_TRIGGER_CLASSNAME so model/traits pickers align with sm row controls. FontFamilyPicker uses selectTriggerVariants({ size: "sm" }) instead of duplicated trigger styles.

Call-site cleanup: Widespread migration from compact inputs/buttons/selects to sm, icon-micro toolbar buttons to icon-xs, and removal of manual h-5/h-7/h-8 overrides where size covers it. Keybindings moves most controls to sm/icon-xs while keeping dense editor behavior. Dialog footers in add-provider flow drop forced size="sm" to use default button sizing.

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

Note

Unify control sizing to small across web settings pages

  • Standardizes inputs, selects, switches, and buttons across all settings panels to use shared small sizing variants, replacing a mix of compact, micro, and custom per-component classes
  • Adds a size prop (default default, sm) to the Switch component in switch.tsx with responsive thumb-size CSS variables and a data-size attribute
  • Adds a shared SETTINGS_PICKER_TRIGGER_CLASSNAME constant in settingsLayout.tsx and replaces duplicated picker trigger class strings in ProjectSettingsPanel, GeneralSettingsPanel, and SourceControlWritingSettings
  • Adds an optional button size prop to ServerUpdateAction (defaulting to xs) so settings callers can request small
  • Risk: Switch default size is unchanged, but any out-of-tree or un-updated consumers passing thumb-size class overrides directly may no longer match the new responsive CSS variables; the ServerUpdateAction default remains xs so existing callers are unaffected
📊 Macroscope summarized e71a6a0. 20 files reviewed, 1 issue evaluated, 0 issues filtered, 1 comment posted

🗂️ Filtered Issues

Settings rows mixed control heights freely: selects at 32px, inputs at
30px, buttons at 24/28/32px plus hand-pinned h-5/h-7/h-8 overrides, and
the Keybindings page on its own compact scale. Integrations alone had
three selects at one height and two at another.
Every settings surface now follows three tiers: row controls use
size="sm" (Button, Select, Input, NumberField) or icon-sm; section header
actions and buttons inside list items, cards and toolbars use xs/icon-xs;
inline affordances like reset arrows stay icon-micro. Dialog footers keep
the app-wide default. The tiers are documented above SettingsRow.
Switch gains a size="sm" variant replacing the ad-hoc --thumb-size
overrides, ServerUpdateAction gains a size prop, and FontFamilyPicker
reuses selectTriggerVariants instead of a hand-copied trigger.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.2 KiB−203 B (−1.5%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+3 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.6 KiB6.4 KiB−206 B (−3.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB55.5 KiB−1.5 KiB (−2.6%)66.4 KiB
CodexLive turn messages108−2 (−20.0%)21
ClaudeTotal thread wire13.2 KiB13.3 KiB+170 B (+1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+6 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.4 KiB+164 B (+2.6%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB56.4 KiB+928 B (+1.6%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: 535557b · PR result: e71a6a0 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at e71a6a0

Macroscope's review found this PR approvable — This is a presentation-only pass that standardizes control dimensions across existing settings screens without changing settings behavior, persistence, navigation, or backend actions. The shared component additions preserve existing defaults and introduce no new capability or sensitive configuration.

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

@juliusmarminge
juliusmarminge merged commit b59b7d0 into mainSep 2, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/unify-settings-form-sizing branch September 2, 2026 22:56
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 3, 2026
## What's Changed
* feat(desktop): browser profiles for the preview browser by @juliusmarminge in pingdotgg/t3code#7254
* refactor(shared): move the node:sqlite Effect SQL client into shared by @juliusmarminge in pingdotgg/t3code#7272
* feat(web): add opt-in panel animations by @maria-rcks in pingdotgg/t3code#8830
* feat(projects): automatically pull clean default branches by @maria-rcks in pingdotgg/t3code#9277
* fix(web): show pull request state icons in tabs by @flamboh in pingdotgg/t3code#9112
* feat(providers): add context compaction across harnesses by @maria-rcks in pingdotgg/t3code#8808
* feat(web): add proactive panels by @maria-rcks in pingdotgg/t3code#9276
* fix(web): unify control sizing across settings pages by @juliusmarminge in pingdotgg/t3code#9281
* fix(web): offer browser profiles from the empty-panel launcher by @juliusmarminge in pingdotgg/t3code#9279
* Revert "feat(providers): add context compaction across harnesses" by @maria-rcks in pingdotgg/t3code#9284
* fix(web): show scroll-to-end as soon as the last message slips under the composer by @juliusmarminge in pingdotgg/t3code#9280
* fix(cursor): honor auto and full access modes by @maria-rcks in pingdotgg/t3code#9283
* fix(desktop): detect installed Spectre libs for Windows builds by @juliusmarminge in pingdotgg/t3code#9285
* fix(pull-requests): missing features & better behaviour by @maria-rcks in pingdotgg/t3code#9188
* fix(providers): discover workspace skills everywhere by @maria-rcks in pingdotgg/t3code#9180
* fix(server): preserve automatic settlement timestamps by @eimexdev in pingdotgg/t3code#9254
* fix(opencode): show Reasoning selector for OpenCode models by @maria-rcks in pingdotgg/t3code#9287
* feat(web): preview document attachments in the file viewer by @juliusmarminge in pingdotgg/t3code#9292
* chore(ci): narrow the UI consistency check-run agent by @juliusmarminge in pingdotgg/t3code#9297
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1261...v0.0.39-nightly.20260903.1262
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1262
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge