feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid
, '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

feat(swift-ios): add reliable text and code sizing - #7612

Open
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes
Open

feat(swift-ios): add reliable text and code sizing#7612
saphid wants to merge 1 commit into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:agent/swiftui-text-code-sizes

Conversation

@saphid

@saphidsaphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

1. Observed problem and reproduction

In the native SwiftUI app, open Settings and look for a way to make prose or code easier to read. The app follows iOS Dynamic Type but has no independent in-app Text and Code controls. Earlier versions of this PR also allowed overlapping saves or a later connection republish to restore settings older than the most recently persisted slider choice.

2. Cause

FeatureSettings had no text/code size preferences, and a root SwiftUI dynamicTypeSize value does not reliably cross sheet hosts or the transcript's UIKit hosting cells. Settings persistence writes full snapshots asynchronously, so rollback must distinguish the last successful snapshot from newer optimistic snapshots. The native client also persisted settings to UserDefaults without refreshing the cached snapshot used during connection republish.

3. What changed and why this boundary

Settings gains one Text & Code section with two stepped sliders and a live preview. Text size shifts the reader's system Dynamic Type category through the window trait used by sheets and UIKit-hosted cells. Code size adds a relative shift only at monospaced leaves: Markdown code blocks, work-log output, command approvals, files, review diffs, and pull-request diffs.

The existing settings owner now serializes full-snapshot writes. Only a successful write advances the rollback point. Settings also serializes slider requests, ignores a stale failed response when a newer choice is visible, and waits for the latest slider save before the Save action completes. NativeFeatureClient now updates its cached snapshot after persistence so a connection republish cannot revive stale settings.

The branch was rebased onto target b67837984e5650888b1eed0e1cd7fff83625f696. Conflict resolution retained upstream's FeatureWorkLogView and thread-settlement invalidation behavior exactly, then applied code sizing within the new work-log component and carried settlement revision updates through this branch's optimistic save and rollback path.

4. Intentionally unchanged and deferred

  • Terminal font sizing remains independent.
  • Web, desktop, and React Native mobile do not change.
  • Providers, server behavior, projections, and wire contracts do not change.
  • Sizes remain relative to iOS Dynamic Type; this does not introduce absolute point-size settings.
  • Other Settings cleanup is out of scope.

5. Affected surfaces

  • Entry point: native SwiftUI Settings → Text & Code.
  • Client/platform: SwiftUI mobile on iOS only.
  • Providers: provider-neutral; Codex, Claude, Cursor, Grok, and OpenCode are unchanged.
  • Contracts/server/projections: unchanged; preferences use existing local settings persistence.
  • Connections: local, remote, relay, and tunnel use the same local preference; reconnect republish now keeps the latest persisted settings.
  • Reverse/failure states: sliders can return to Default; failed current saves roll back to the last durable snapshot; stale failures and stale republished snapshots cannot overwrite newer choices; retry remains available.

6. Validation

Current head: 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346.

  • Rebase result: 0 commits behind and 1 commit ahead of upstream/t3code/rebuild-mobile-app-swift at b67837984e5650888b1eed0e1cd7fff83625f696.
  • Swift frontend parse of all changed Swift files: passed.
  • git diff --check upstream/t3code/rebuild-mobile-app-swift...HEAD: passed.
  • git range-diff verified that upstream's new work-log component and settlement invalidation were retained while this feature was adapted around them.
  • The local focused simulator command for FeatureRootModelTests, TextSizePreferenceTests, and NativeRetryIdentityTests correctly deferred with exit 75 because another active XcodeBuildMCP lease owned the native build lane. No competing lane was disturbed.
  • Exact-head GitHub SwiftUI CI passed 414 tests in 36 suites with 0 failures, including testSavedSettingsSurviveAConnectionRepublish, settlementSettingsInvalidateHomePresentationOnSaveAndRollback, and all text/code-size preference tests.
  • Cross-provider review was skipped because this turn explicitly required the work to be performed without re-delegation. No other provider or model participated.

7. Risks, limitations, and untested paths

  • The window trait affects every native SwiftUI screen, so both light and dark integrated UI proof remain relevant.
  • Remote, relay, and tunnel transport are unchanged and were not separately exercised for this local preference.
  • Exact-head native tests ran in GitHub CI; only a duplicate local simulator run remains unavailable because the active native build lease prevented it.
  • Exact-head UI capture is pending for the same protected native lane; prior-head proof below demonstrates the unchanged interaction but is not relabeled as proof for this rebased head.

8. UI evidence

Historical proof for prior head 019c8b219d6fac4845f76ac06348bdc57446b7f3:

Before — Settings without Text & Code controls, light

Settings before, light

Before — Settings without Text & Code controls, dark

Settings before, dark

Before interaction video

After — Text & Code controls and live preview, light

Settings after, light

After — Text & Code controls and live preview, dark

Settings after, dark

Interaction — change both sliders and verify persistence

Independent slider changes and relaunch persistence video

Known-gaps: exact-head light/dark screenshots and interaction video for 0eede8d14d22aec0f77f1cf08a90d8bb8aba7346 could not be captured because another active XcodeBuildMCP hygiene lease owned the native build/proof lane; that lease was not broken or bypassed.

9. Owning issue and relationship

Feature behavior and phone acceptance: saphid/t3code-personal#129. Failed-predecessor rollback repair: #152. Prior-head proof batch: #150.

This PR targets the live SwiftUI parent branch and remains the same review-history-preserving PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change
  • I included a video for the interaction change

Implemented by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8005f269-1ef4-45a9-b292-7f7a0f0cde32

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 19, 2026
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new Text & Code settings workflow and propagates its effects across global text rendering, multiple code surfaces, and UIKit-hosted transcript cells. It also substantially changes settings persistence and rollback behavior, making the overall change broader than a small isolated UI adjustment.

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

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from e136164 to f3634dcCompareAugust 26, 2026 23:05
Comment threadapps/swift-ios/Features/Settings/SettingsView.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from f3634dc to 019c8b2CompareAugust 27, 2026 04:07
@saphidsaphid changed the title feat(swift-ios): add text and code size controls to Settingsfeat(swift-ios): add reliable text and code sizingAug 27, 2026
@saphid

Copy link
Copy Markdown
ContributorAuthor

Ready for human review on rebuilt current-target head 019c8b219d6fac4845f76ac06348bdc57446b7f3. The vouched 12-item handoff checklist passes: focused native tests are 66/66, exact-base/head simulator proof covers light, dark, independent changes, and relaunch persistence, the in-scope rollback/stale-failure defects are fixed, maintainer edits remain enabled, and the nine-part description/evidence now matches this head. CI triggered by the force-with-lease update is still settling; local affected checks and the exact-head build are green.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 019c8b2. Configure here.

Comment threadapps/swift-ios/Features/Root/FeatureRootModel.swift
@saphid
saphidforce-pushed the agent/swiftui-text-code-sizes branch from 019c8b2 to 0eede8dCompareAugust 28, 2026 12:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 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

@saphid