Skip to content

feat(mobile): native compose bar for the chat composer - #2355

Merged
DoodleBears merged 36 commits into
mainfrom
claude/project-thread-07shzq-composer
Oct 20, 2026
Merged

DoodleBears merged 36 commits into
mainfrom
claude/project-thread-07shzq-composer

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Vain · project thread

Why the change

Before: the chat composer is one opaque pill with +, the field and the mic inside it.

After: the composer follows each platform's own compose bar.

  • iOS: a round + sits beside a separate field capsule, with the mic or Send inside the capsule, like iOS 26 Messages. On iOS 26 both float on Liquid Glass over the messages, and so does the @ mention panel.
  • Android: + is a Material 3 icon button next to a filled rounded field.

Vain asked for this: "就差底下这个输入框也应该用原生的,看原生怎么设计". This lifts the earlier "don't change the composer" rule.

Special things to note

  • Depends on feat(mobile): native chat header with a top-to-bottom message list #2344. This branch contains feat(mobile): native chat header with a top-to-bottom message list #2344's native chat header so that the screenshots show both together. Merge feat(mobile): native chat header with a top-to-bottom message list #2344 first, then this diff shrinks to the composer only.
  • Needs a native rebuild. The new local Expo module modules/scroll-edge-element gives the bottom soft edge. A build without it falls back to the drawn fade, so an OTA update alone is safe but shows the old edge.
  • Matched to Grok's compose bar (Vain's reference):
    • + and the capsule are 40pt.
    • The mic or Send is a 32pt black circle.
    • The glass is tinted with the opaque surface, so it reads near-white.
    • The jump button is a 36pt glass circle on the right, about 12pt above the capsule.
  • Verification (iOS 26 Simulator, not a physical device):
    • pnpm lint, mobile tsc and oxfmt pass, and vitest apps/mobile/test reports 877 passed, 9 skipped.
    • The native build passes.
    • On c17b5b1 the bottom soft edge is present in four states: empty, one line, 4 lines with the keyboard open, and empty with the keyboard open.
    • +, Send and scrolling work.
    • The keyboard follows the app's light or dark choice.
    • Reduce Transparency dark passes on d2563e0.
    • On 1783638 the @ mention panel is legible over bubbles in light and dark, and tapping a name inserts the mention.
    • Known gap (UIKit): with a 4-line draft and the keyboard down, the strip below the capsule (the home-indicator area) stays sharp. This happens even when the keyboard never opened. Re-adding the interaction after the keyboard settles made no difference, so that change was reverted.
    • Android is unverified. It is on the deferred Android list.
  • Not changed here: at AX5 the dictation permission notice is very large and can overlap the jump button. Removing the last photo animates the capsule back down. Both behave the same on main.
  • CI test plan: affected (mobile).

Change outline

  1. New composer-chrome.ios.tsx: ComposerCircleButton and ComposerFieldMaterial.
    • On iOS 26 with Reduce Transparency off: a glass circle and a glass rounded rectangle. It is a capsule on one line and a rounded rect as it grows.
    • Otherwise: an opaque surface fill with a borderStrong hairline.
  2. New composer-chrome.tsx (Android and web):
    • + is a Material 3 icon button with a borderless ripple.
    • The field uses the raised fill.
  3. composer.tsx
    • The bar is [+ | cancel | hold dot] then the capsule, bottom-aligned. The capsule inset makes one line match the + circle.
    • Attachments, the expanded editor, dictation, mentions, accessibility labels and the composer-* testIDs are kept.
  4. modules/scroll-edge-element: a UIScrollEdgeElementContainerInteraction on the composer's container for the message list. It is re-added whenever the composer's height or the keyboard changes.
  5. @ mention panel: a Liquid Glass panel with an xl corner on iOS 26.
  6. Jump button: a glass circle on the right on iOS 26.
  7. Text fields: the keyboard follows the app's appearance.
  8. Docs:
    • The DESIGN.md composer bullets are rewritten per platform.
    • A changes fragment is added.

iOS 26 Simulator screenshots

Screen Shot
Empty, keyboard down (light)
Empty, keyboard open
One line, keyboard open
4 lines, keyboard open
4 lines, keyboard down (light)
4 lines, keyboard down (dark)
@ mention panel, light (1783638)
@ mention panel, dark (1783638)

Composer states (82808b8, before the merge with main, old header)

Screen Light Dark
Attachments
Largest text
Dictation

🤖 Generated with Claude Code

https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1

claude and others added 9 commits October 19, 2026 20:51
Convert the chat FlatList from inverted to oldest-first on iOS and Android.
useFollowLatest now measures the distance from the end, pins streaming
growth with one non-animated scroll per frame, keeps
maintainVisibleContentPosition on for prepends, and reveals the list only
after it has settled at the end. Older history loads from onStartReached,
the markdown viewport measures a non-inverted content view, and the
working status and history footer swap ends.

The chat uses the system stack header: transparent with the automatic
scroll edge effect on iOS (no header background colour, no glass on bar
items), an opaque Material top app bar on Android.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Update DESIGN.md's Chat header, list and code-rule bullets and the ios-hig
skill's chat edge-effect note, and add the change fragment (placeholder
PR number 0000).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…yboard gap

- Header: on iOS the title chip (avatar + name, no state dot) is a native
  leading bar item beside Back, separated by a zero-width spacing item so
  UIKit draws a round Back and its own glass capsule; the computer button
  is a native trailing item and headerTitle is empty. Android keeps a
  Material top app bar with the chip at the start.
- Follow latest: only a drag, the status-bar scroll to top or an explicit
  hold leave the newest message. Layout-driven scroll events (the automatic
  inset adjustment, MVCP corrections, batch growth) no longer release
  following, which left the chat opened at the oldest message.
- iOS keyboard frame: the keyboard already covers the home indicator, so
  take the composer's safe-area padding back out of the keyboard offset.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… drag to dismiss

- The default and colour chat backgrounds are the frame's backgroundColor
  instead of a view in front of the list, so the message list is in the
  screen's first-subview chain, where UIKit and React Native Screens look
  for the content scroll view of the header's soft scroll edge.
- Cancel UIKit's automatic home-indicator bottom inset on the list while
  the keyboard is closed; the composer height already carries it.
- Dismiss the keyboard by dragging the list: interactive on iOS, on-drag
  on Android.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
… to dismiss

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
iOS follows iOS 26 Messages: a separate round + button and a field
capsule with the mic or Send inside, both on Liquid Glass on iOS 26 and
on opaque surface fills on older iOS or Reduce Transparency. Android
follows Material 3: + as a ripple icon button beside a filled rounded
field.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 22 minutes.

Check out review usage here.

View limit details

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

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e67e5217-bb24-47c9-a8d9-4631931636a7
📥 Commits

Reviewing files that changed from the base of the PR and between b39972c and 2d7988f.

⛔ Files ignored due to path filters: 64
  • .github/pr-screenshots/2355-native-composer/1-dm-rest-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/1-dm-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/1-rest-behind-glass-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/1-rest-behind-glass-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/1-rest-group-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/1-rest-group-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-1-dm-mid-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-1-dm-mid-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-1-dm-rest-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-1-dm-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-2-multiline-keyboard-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-2-multiline-keyboard-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-3-group-rest-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-3-group-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/15e7-4-group-reduce-transparency-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2-one-line-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2-one-line-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-2-draft4-mid-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-3-draft4-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-5-jump-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-6-typed-send-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-a-oneline-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/2c48-b-draft4-nokbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/3-multiline-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/3-multiline-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/4-attachments-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/4-attachments-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/5-dictation-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/6-mention-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/6-mention-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/7-multiline-ax5-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/7-multiline-ax5-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/7-rest-ax5-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/7-rest-ax5-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-1-dm-mid-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-1-dm-mid-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-2-keyboard-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-3-reduce-transparency-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-5-jump-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/779b-6-typed-send-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/8-rest-reduce-transparency-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/8-rest-reduce-transparency-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-1-draft4-dismissed-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-2-draft4-reopened-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-3-draft4-dismissed-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-4-draft4-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-5-mention-panel-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/a82b-5-mention-panel-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-2-draft4-nokbd-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-3-draft4-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-5-empty-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-a-oneline-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-b-draft4-nokbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/c17b-c-empty-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-2-draft4-nokbd-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-3-draft4-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-4-reduce-transparency-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-5-empty-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-a-oneline-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-b-draft4-nokbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/d256-c-empty-kbd-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/eae7-5-jump-rest-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/eae7-6-typed-send-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2355-native-composer/eae7-draft4-mid-dark.png is excluded by !**/*.png
📒 Files selected for processing: 17
  • apps/mobile/DESIGN.md
  • apps/mobile/modules/scroll-edge-element/README.md
  • apps/mobile/modules/scroll-edge-element/expo-module.config.json
  • apps/mobile/modules/scroll-edge-element/ios/ScrollEdgeElement.podspec
  • apps/mobile/modules/scroll-edge-element/ios/ScrollEdgeElementModule.swift
  • apps/mobile/src/ui/chat/composer-chrome.ios.tsx
  • apps/mobile/src/ui/chat/composer-chrome.tsx
  • apps/mobile/src/ui/chat/composer.tsx
  • apps/mobile/src/ui/chat/conversation-screen.tsx
  • apps/mobile/src/ui/chat/jump-to-latest.tsx
  • apps/mobile/src/ui/chat/mention-suggestions.tsx
  • apps/mobile/src/ui/primitives/scroll-edge-element.ios.tsx
  • apps/mobile/src/ui/primitives/scroll-edge-element.tsx
  • apps/mobile/src/ui/primitives/system-text.tsx
  • apps/mobile/test/composer-chrome-ios.test.tsx
  • apps/mobile/test/composer-dictation.test.tsx
  • changes/2355-native-composer.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

❤️ Share

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

claude and others added 20 commits October 19, 2026 21:31
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…DM rest

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…at header

The computer button and the first-screen back control are native bar
buttons with SF Symbols, and the title chip uses the system label colour,
so dark mode with Reduce Transparency keeps them legible.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A local Expo module gives the composer container a
UIScrollEdgeElementContainerInteraction for the message list, so UIKit
softens messages under the composer like under a system toolbar. Builds
without the module keep the drawn fade.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
On iOS the composer's Send and recording stop are a filled fg circle, and
the jump-to-latest button is a Liquid Glass circle at the trailing edge.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Messages under the field showed through the clear glass and competed
with the draft; the + and the field now tint their glass with surface at
glass.tint.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…eyboard

The iOS + circle and field capsule are 40pt like Grok's compose bar, with a 44pt hit area. The glass jump button is 36pt and sits closer to the composer. Text fields open the keyboard in the app's appearance instead of the system's.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The scroll edge element container gets a near-invisible fill over its bounds, so UIKit shapes the bottom edge to the whole composer instead of only the placeholder label, which disappears once there is text. The + and capsule glass are tinted with the opaque surface colour.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…state

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
UIKit shapes the bottom edge when the interaction is added, so a taller draft or an open keyboard left it stale. The container now re-adds it whenever its height or the keyboard state changes. The fill marker, which made no difference, is removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
DoodleBears and others added 6 commits October 20, 2026 08:14
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ttles

Dismissing the keyboard with a tall draft left the bottom edge shaped for the raised composer, so the strip below the capsule stayed sharp. The view now also re-adds the interaction once the keyboard has finished showing or hiding.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
The mention suggestion list above the composer floats on the same glass as the composer capsule, with an xl corner like an iOS 26 menu. Older iOS, Reduce Transparency and Android keep the sheet layer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The simulator showed it made no difference: the strip below a tall capsule stays sharp even when the keyboard never opened, so the extra observers are removed. This restores the c17b5b1 behaviour.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
@DoodleBears
DoodleBears marked this pull request as ready for review October 20, 2026 00:01
@DoodleBears
DoodleBears merged commit da64324 into main Oct 20, 2026
11 checks passed
DoodleBears added a commit that referenced this pull request Oct 20, 2026
Captured on the Xiaomi phone (Android 16, HyperOS 3, zh-CN) running a Release build of
main d220792, light and dark: the Material chat composer with the keyboard open, the
chat header, the Unpair confirmation dialog (cancelled, nothing unpaired) and the
message actions menu. The same set is filed under each PR. Status bar, computer
names and the keyboard suggestion strip are redacted.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Copy link
Copy Markdown
Contributor Author

Android phone result: PASS (Xiaomi, Android 16 / HyperOS 3, isolated QA Host, deepseek-v4.1-flash), release build of main d220792

Screenshots: 2355-android-hig/phone (commit 73da8de): composer-*, chat-header-*, dialog-*, menu-*, light and dark. Material composer, top app bar, dialogs and menus render as expected on Android.


Generated by Claude Code

@DoodleBears
DoodleBears deleted the claude/project-thread-07shzq-composer branch October 28, 2026 04:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants