fix(mobile): disabled send button is readable in Material You dark#23161

merged3
main
GitHub fork: fix/mobile-disabled-send-contrast
opened10d agobyRRVZO6
View on GitHubTwo-way sync enabledPR last imported 9h ago

Problem

In Material You dark, the composer's send button is nearly invisible while it is disabled (empty prompt). ComposerActionButton draws the onPrimary icon on primary at 15% opacity. onPrimary is meant for solid primary, and in dark schemes it is a dark tone (about tone 20). The result is a dark arrow on a faint tint over a dark surface.

Change

The disabled state now uses the Material 3 disabled colors: onSurface at 12% for the container and at 38% for the icon (bg-foreground/12, accent-foreground/38). The enabled and danger states are unchanged.

Every composer that uses ComposerActionButton gets this, on all themes. The old style fails the same way in any theme whose primary foreground is dark against the surface.

Scope and approval

This is a small, focused fix for an obvious bug, so it qualifies without a prior issue. The disabled send button was unreadable in Material You dark, and the change affects only that button's disabled colors.

Verification

  • Before: seen on a phone in Material You dark (screenshot below, new-thread composer with an empty prompt).

  • Contrast, computed with @material/material-color-utilities over the composer surface (surfaceContainerHigh at 90% over surfaceContainerLow), using dark tonal-spot schemes from three seeds:

    SeedBefore (onPrimary on 15% primary)After (38% onSurface on 12% onSurface)
    #B3261E1.28:12.56:1
    #6750A41.26:12.56:1
    #386A201.26:12.57:1

    The disabled state is intentionally below 3:1 per Material 3. The fix restores the spec's level instead of near-invisibility.

  • vp lint on the changed file passes.

  • Not checked: no "after" screenshot from a device build yet.

BeforeAfter (rendered)
beforeafter

🤖 Generated with Claude Code (Claude Opus 5.5)

Checks

20 successful · 14 skipped
All checks passed
8c4c2fc

Added 1 commit

  • fix(mobile): disabled send button is readable in Material You dark67d773c
Synced from GitHub

Approvability

Verdict: Approved at 766870d

Macroscope's review found this PR approvable — This is a focused mobile UI bug fix that changes only the colors of an existing disabled composer action, leaving enabled and danger states and interaction behavior unchanged. It has no schema, security, deployment, default-configuration, or static-analysis implications.

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

Synced from GitHub

Review in Change Stack →

Warning

Review limit reached

Only developers with an assigned seat can use this organization's usage-based review budget, and seats here are assigned manually. Ask an admin to assign a seat, or change the review continuation mode in Billing.

Next included review available in 38 seconds.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

External image Run configuration
External image Commits

Reviewing files that changed from the base of the PR and between 67d773c2d89f610368766c2797ea8c4b380cea7d and 8c4c2fc2c7696334c94260d9cc0bf82a354327a7.

External image Files selected for processing: 1
  • apps/mobile/src/components/ComposerToolbar.tsx

No actionable comments were generated in the recent review.

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 22d4a602-c423-4b40-8e27-273d26b9841e
📥 Commits

Reviewing files that changed from the base of the PR and between b5a226e49c52ecab4ddc2d678a7012d97e651a6a and 766870d9494e861b396d73240d61d4caaf812227.

📒 Files selected for processing: 1
  • apps/mobile/src/components/ComposerToolbar.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Walkthrough

Disabled non-danger composer action buttons now use a foreground-based background and icon tint. Danger button styling and enabled button icon tint remain unchanged.

Changes: Composer action styling

Layer / File(s)Summary
Disabled action colors
apps/mobile/src/components/ComposerToolbar.tsx
Disabled non-danger buttons use bg-foreground/12 and accent-foreground/38. Danger styling and enabled icon tint remain unchanged. Comments document the disabled colors.

Priority: External image Low

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Bug fix

Suggested reviewers: juliusmarminge

Merge Risk: External image Minimal · up to 76687

The disabled-button styling change is mergeable; no current-head issue was found.

Pre-merge checks: Passed 4
Check nameStatusExplanation
Title checkPassedThe title is concise, conventional, and accurately identifies the disabled send button readability fix in Material You dark mode.
Linked Issues checkPassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes checkPassedCheck skipped because no linked issues were found for this pull request.
Description checkPassedThe pull request description includes all required sections. It explains the problem, change, scope exemption, verification results, contrast measurements, lint status, and limitations. It also includ…
Full details: Description check

Explanation

The pull request description includes all required sections. It explains the problem, change, scope exemption, verification results, contrast measurements, lint status, and limitations. It also includes before and after visual evidence and identifies the agent used.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

Added 2 commits

  • Merge remote-tracking branch 'github/main' into takeover-231557ff8acf
  • refactor(mobile): keep disabled composer color fix minimal8c4c2fc

Note

Written by gpt-6.1-sol on behalf of Maria

thanks @RVZO6. your Material 3 disabled colors address the right bug: the icon now uses onSurface at 38% over an onSurface container at 12%.

i preserved your commit, merged current main without rebasing, and removed the explanatory code comment. the final diff is one file, six added lines and two removed lines. enabled/danger colors, sizes, disabled handling, and actions are unchanged. no overlapping focused fix was found.

verification at 8c4c2fc2c7696334c94260d9cc0bf82a354327a7:

  • blacksmith vp run check:changed passed formatting, lint, both unused-code passes, and affected typechecks.
  • blacksmith vp test run apps/mobile/src/lib/nativeTheme.test.ts: 12 tests passed.
  • two independent source reviews found no code issues.
  • current main still has the original disabled colors; actual native reproduction and matching before/after captures remain unverified. the device tool returned "Agent device access is turned off for this environment." web screenshots would not exercise this native component. @RVZO6, native Android Material You dark captures with an empty prompt, then enabled send and danger controls, are still needed before this is review-ready.

all ci checks completed with no failures on this head. there are no inline review findings. native evidence remains the blocker to readiness. no replacement pr was created.

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

no changed runtime behavior could be verified on this linux boat vm. inspected the description, discussion, commit authors, and diff at 8c4c2fc2c7696334c94260d9cc0bf82a354327a7. the pr is open and its pr commits have no authorship by @juliusmarminge or @t3dotgg. git.cafe mirror: https://git.cafe/pingdotgg/t3code/pulls/23161.

the diff changes only native mobile ComposerActionButton disabled colors. web captures would not exercise this native component. git.cafe reports 27 successful checks, zero failing and zero pending. these do not establish native behavior.

Not verified

native main reproduction, matching before/after captures, Material You dark contrast, empty-prompt disabled behavior, enabled send, danger/stop behavior, and a real Codex gpt-6.1-sol turn through the native client remain unverified.

attempted device_list. it returned exactly: Agent device access is turned off for this environment. the mobile verification skill requires stopping when device tools are unavailable and prohibits switching automation systems. no dev server, worktree, install, provider turn, or screenshot was started because this native-only path was blocked before runtime setup. no code changed.

verification needs device access enabled, then main and this exact head on Android with Material You dark, matching empty-prompt captures, and enabled-send plus stop checks through a real provider turn. iOS remains unverified as well.

Note

Written by gpt-6.1-sol on behalf of Maria

Verified on Android emulator (API 35) against a real dev server

verified head 8c4c2fc2c7696334c94260d9cc0bf82a354327a7 on the t3 android emulator (1080x2400, api 35), using the cached native development client, metro on port 8081, and an isolated dev server on port 13773. paired the native app and created a real git project and threads through the app. used real codex gpt-6.1-sol turns through this vm's local proxy. no mocks or demo data.

  • material you dark: the empty-prompt send arrow is readable with the new gray disabled colors. tapping it sends nothing.
  • entering a prompt enables the primary-colored send button. sending completes a real provider turn, displays its response, and restores disabled send when the composer is empty.
  • the red stop control remains visible during a real turn. tapping it interrupts the running command and restores disabled send. repeated these checks after restoring the exact pr source.
  • reproduced the original dark arrow by temporarily restoring only this pr's original button colors in the same checkout, clearing metro's cache, and restarting the native app. the before/after images use matching project, theme, viewport, and empty-prompt state. this is a controlled comparison on the pr checkout, not a full github/main run.

no fix was needed. the checkout is clean and no commits were pushed. the current head has 27 successful ci checks, zero failing and zero pending; those are separate from the native verification above.

before: original disabled colors in material you dark

after: readable disabled send on the exact pr head

android: enabled send, real gpt-6.1-sol response, and return to disabled send

Not verified

ios cannot run on this linux vm. a full github/main checkout, other themes, other android devices, and other providers were not exercised. no new static checks were run because no code changed. the recording is embedded as an animated image for github compatibility; its source mp4 playback and seeking were checked in the browser.