fix(ios): unify Talk and Settings row typography on one branded detail row#100515
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 598eff0428
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| Text(self.label) | ||
| .font(OpenClawType.body) |
There was a problem hiding this comment.
Preserve localized labels in the shared detail row
In non-English locales, rows whose labels were previously SwiftUI string-literal labels now pass through a stored String, so Text(self.label) renders the label verbatim instead of using the LocalizedStringKey lookup that LabeledContent("Agent", value:) used before. For example, the Talk row now calls SettingsDetailRow("Agent", ...) while Agent is translated in Resources/Localizable.xcstrings, so that row falls back to English; keep the helper's label as LocalizedStringKey/LocalizedStringResource or accept a label builder.
Useful? React with 👍 / 👎.
|
Codex review: needs real behavior proof before merge. Reviewed July 5, 2026, 9:52 PM ET / 01:52 UTC. Summary PR surface: Other +7. Total +7 across 7 files. Reproducibility: yes. Source inspection shows localized literal Review metrics: none identified. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Keep the shared row helper, but make its label API preserve SwiftUI localization before merge and leave the value styling/truncation behavior unchanged. Do we have a high-confidence way to reproduce the issue? Yes. Source inspection shows localized literal Is this the best way to solve the issue? No. A shared branded row is the right shape, but the helper should accept a localized key/resource or label builder so the typography fix does not regress localization. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 2db5bd3394f7. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Other +7. Total +7 across 7 files. View PR surface stats
Acceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
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
Review history (1 earlier review cycle)
|
d7d2b9b to
13b64da
Compare
* origin/main: (1287 commits) fix(android): block loopback canvas navigation (openclaw#99874) fix(hooks): suppress unhandled stdout/stderr stream errors in gmail watcher (openclaw#100519) fix(memory-core): guard qmd mcporter JSON.parse against non-JSON stdout (openclaw#98381) fix(build): fall back to tsx for build TypeScript scripts (openclaw#91262) feat(skills): suggest saving detected reusable workflows by default (openclaw#95477) (openclaw#100692) docs(changelog): remove generated release-note entries feat(telegram): offer BotFather web app flow in setup help and docs (openclaw#100540) fix(ios): unify Talk and Settings row typography on one branded detail row (openclaw#100515) feat(gateway): add persisted crash-loop breaker and fatal-config exit contract refactor(macos): lock and unify PortGuardian tunnel record persistence so concurrent app instances cannot lose orphan records (openclaw#100601) fix: stop reconnecting on protocol mismatch (openclaw#98414) fix(maint): reuse recent hosted gates after rebase (openclaw#100663) fix(ui): reopen web terminals without stale content (openclaw#100665) fix(browser): diagnose empty WSL2 Chrome replies (openclaw#100590) fix(ios): chat snaps back to bottom when scrolling to top via status-bar tap (openclaw#100502) Treat already-compacted CLI compaction as no-op (openclaw#99136) docs(changelog): remove direct main fix entry fix(feishu): strip internal tool-trace banners from outbound text (openclaw#98705) fix(message): thread --limit through to CLI formatter and surface provider pagination hints (openclaw#99089) fix(voyage): close response body stream when batch output JSONL parsing throws (openclaw#98840) ... # Conflicts: # extensions/memory-wiki/package.json
…l row (openclaw#100515) * fix(ios): unify Talk and Settings row typography on one branded detail row * chore(i18n): sync native string inventory for iOS detail row refactor
…l row (openclaw#100515) * fix(ios): unify Talk and Settings row typography on one branded detail row * chore(i18n): sync native string inventory for iOS detail row refactor
What Problem This Solves
Fixes an issue where the iOS Talk tab and its Voice & Talk settings screen mixed three different row-title type treatments in one list: the "Voice Wake" / "Talk Mode" / "Background Listening" / "Speakerphone" toggles rendered at 15pt (
OpenClawType.subhead) while the adjacent "Speech Language" picker and other toggles rendered at 17pt (OpenClawType.body), and label/value rows built with string-shorthandLabeledContent("Wake Words", "Speech language", "Voice Mode", the Talk tab's Conversation and Voice Mode sections, and the Settings gateway rows) rendered their titles in the unbranded system font instead of the app's Inter typeface.Why This Change Was Made
The drift came from duplicated per-surface row styling. This lands one canonical
SettingsDetailRow(branded 17pt body label, subhead secondary value with middle truncation) inSettingsProTabSupport.swift, replaces the duplicateddetailRow/simpleSettingsRowhelpers and all raw string-shorthandLabeledContentrows on the Talk and Settings surfaces with it, and moves thesettingsToggletitle fromsubheadtobodyso every row title on these lists uses the same size and typeface. The typography audit test now also flags string-shorthandLabeledContent(calls without a branded font so this class of regression is caught at test time.User Impact
Row titles on the Talk tab and in Voice & Talk, Gateway, Diagnostics, About, and Device settings now share one consistent size and the branded Inter typeface. No behavior changes.
Evidence
OpenClawTypographyTests,RootTabsSourceGuardTests,SwiftUIRenderSmokeTests(xcodebuild, iPhone 17 simulator).iOS app text and control calls keep branded font boundaries) reports zero offenders with the newLabeledContentshorthand rule.settingsToggletitles usedOpenClawType.subhead(15pt) directly above theSpeech Languagepicker atOpenClawType.body(17pt);LabeledContent("…", value:)labels rendered SF system font. After: all these rows go throughSettingsDetailRow/OpenClawType.body.