Skip to content

Fix iOS chat Dynamic Type text#97552

Merged
vincentkoc merged 1 commit into
openclaw:mainfrom
jmcte:jmcte/ios-chat-dynamic-type
Jun 28, 2026
Merged

Fix iOS chat Dynamic Type text#97552
vincentkoc merged 1 commit into
openclaw:mainfrom
jmcte:jmcte/ios-chat-dynamic-type

Conversation

@jmcte

@jmcte jmcte commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes #97534. The native iOS Chat surface used fixed point fonts for scoped chat text paths, so users who increase iOS text size could still see small message, intro, and composer text in OpenClaw Chat.

Why This Change Was Made

The scoped chat text call sites now use Dynamic Type-aware SwiftUI text styles:

  • User message markdown: .body
  • Assistant message markdown: .body
  • Assistant thinking segments: .callout.italic()
  • Empty chat intro text: .body
  • iOS composer text and placeholder: .body

The iOS clean composer row also now uses Dynamic Type-scaled text min/max heights and a minimum row height instead of forcing the editor capsule into a fixed 40-point row, avoiding clipping at accessibility text sizes.

User Impact

Users who rely on iOS Larger Text should see Chat message text and composer text scale with their system setting. This is intentionally limited to chat transcript/intro/composer text and does not change Control, Settings, app tabs, gateway setup, or other app shell surfaces.

Evidence

  • swiftformat --lint --config config/swiftformat apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMessageViews.swift apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift apps/shared/OpenClawKit/Tests/OpenClawKitTests/ChatDynamicTypeSourceGuardTests.swift passed.
  • swift test --package-path apps/shared/OpenClawKit --filter ChatDynamicTypeSourceGuardTests passed.
  • pnpm ios:gen passed.
  • XcodeBuildMCP simulator run succeeded for screenshot fixture mode after bypassing only the local generated SwiftLint phase; the normal generated-project build remains blocked on this host by /usr/local/bin/swiftlint failing to load sourcekitdInProc.framework.
  • Autoreview initially found composer clipping risk; fixed by scaling composer text heights and removing the fixed clean-row height clamp.
  • Autoreview rerun passed: autoreview clean: no accepted/actionable findings reported.

Screenshot proof from the current branch build, captured with the existing iOS --openclaw-screenshot-mode fixture:

Normal text size:

OpenClaw iOS Chat normal text size

Max accessibility text size:

OpenClaw iOS Chat max accessibility text size

Screenshot asset host: https://github.com/jmcte/openclaw/releases/tag/proof-ios-chat-dynamic-type-97552

Full app screenshots are intentionally not used as acceptance proof because iOS Dynamic Type is a global setting and existing non-chat surfaces may already respond independently of this patch.

Known unrelated validation failures:

  • Full swift test --package-path apps/shared/OpenClawKit still fails in existing TalkConfigContractTests.selectionFixtures and several async ChatViewModelTests timeout/dedupe expectations.
  • xcodebuild/XcodeBuildMCP generated-project build still fails before compilation in the SwiftLint phase with SourceKittenFramework/library_wrapper.swift:58: Fatal error: Loading sourcekitdInProc.framework/Versions/A/sourcekitdInProc failed.

@clawsweeper

clawsweeper Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 28, 2026, 5:22 PM ET / 21:22 UTC.

Summary
The branch replaces fixed SwiftUI font sizes in shared/iOS Chat transcript, intro, and composer text with Dynamic Type-aware styles, scales clean composer heights, and adds a focused Swift source guard test.

PR surface: Other +52. Total +52 across 4 files.

Reproducibility: yes. for source-level reproduction: current main and v2026.6.10 still use fixed SwiftUI font calls in the scoped Chat message, intro, and iOS composer paths. I did not run a failing live device or simulator capture in this read-only review.

Review metrics: none identified.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #97534
Summary: This PR is the explicit candidate fix for the open iOS Chat Dynamic Type bug report it closes.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Next step before merge

  • No automated repair is needed; the next action is maintainer merge review against the exact head and linked issue.

Security
Cleared: The diff only changes SwiftUI chat rendering code and one Swift test file; it does not touch dependencies, lockfiles, CI, secrets, permissions, install scripts, or package execution surfaces.

Review details

Best possible solution:

Land the scoped Dynamic Type fix after normal exact-head maintainer and CI gates; keep broader iOS app typography changes out of this PR.

Do we have a high-confidence way to reproduce the issue?

Yes for source-level reproduction: current main and v2026.6.10 still use fixed SwiftUI font calls in the scoped Chat message, intro, and iOS composer paths. I did not run a failing live device or simulator capture in this read-only review.

Is this the best way to solve the issue?

Yes: this is the narrow maintainable fix because it changes the exact shared Chat text call sites, uses Dynamic Type-aware SwiftUI styles, and only adjusts composer sizing needed to avoid clipping.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 9bb004359ee5.

Label changes

Label justifications:

  • P2: This is a normal-priority native iOS Chat accessibility/usability bug fix with limited file scope and no crash, data-loss, or security signal.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): The PR includes inspectable normal and max-accessibility iOS Chat screenshots from the current branch build, and the downloaded images visibly show the after-fix Dynamic Type behavior.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR includes inspectable normal and max-accessibility iOS Chat screenshots from the current branch build, and the downloaded images visibly show the after-fix Dynamic Type behavior.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR includes inspectable normal and max-accessibility iOS Chat screenshots from the current branch build, and the downloaded images visibly show the after-fix Dynamic Type behavior.
Evidence reviewed

PR surface:

Other +52. Total +52 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 0 0 0 0
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 4 63 11 +52
Total 4 63 11 +52

What I checked:

Likely related people:

  • Solvely-Colin: Live commit history shows the iOS pro UI refresh added ChatProTab and substantially rewrote the shared Chat UI files used by this bug path. (role: introduced current iOS Chat surface; confidence: high; commits: f6e51ff99af4, bf89552e6783; files: apps/ios/Sources/Design/ChatProTab.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMessageViews.swift)
  • joshavant: Recent commit history shows multiple iOS Chat, screenshot fixture, and composer/message-list changes near the affected surface. (role: recent area contributor; confidence: medium; commits: 9942428df001, dc5c24fbe6c0, 377f6181a91b; files: apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift, apps/ios/Sources/Design/ChatProTab.swift)
  • zats: Recent live history shows iOS UI token and safe-area work touching the shared Chat UI styling files and ChatProTab-adjacent layout behavior. (role: recent adjacent iOS UI contributor; confidence: medium; commits: 5d9daea2b052, a3070e3ddf36; files: apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMessageViews.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 28, 2026
@jmcte

jmcte commented Jun 28, 2026

Copy link
Copy Markdown
Contributor Author

Screenshot evidence from the current branch build, captured with the existing iOS --openclaw-screenshot-mode fixture.

These are intentionally chat-only screenshots. Full app screenshots were not used as acceptance proof because iOS Dynamic Type is a global setting and existing non-chat surfaces may already respond independently of this patch.

Normal text size

OpenClaw iOS Chat normal text size

Max accessibility text size

OpenClaw iOS Chat max accessibility text size

Asset host: https://github.com/jmcte/openclaw/releases/tag/proof-ios-chat-dynamic-type-97552

@jmcte

jmcte commented Jun 28, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 28, 2026
@vincentkoc
vincentkoc merged commit a54206f into openclaw:main Jun 28, 2026
111 of 126 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 29, 2026
QiuYuang pushed a commit to QiuYuang/openclaw that referenced this pull request Jul 1, 2026
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 1, 2026
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal backlog priority with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: iOS chat text does not follow Dynamic Type larger text settings

2 participants