Skip to content

fix(native): make the broken Swift controls from the UI audit work - #441

Merged
EraPartner merged 1 commit into
mainfrom
claude/project-thread-kxqntc
Nov 14, 2026
Merged

EraPartner merged 1 commit into
mainfrom
claude/project-thread-kxqntc

Conversation

@EraPartner

Copy link
Copy Markdown
Owner

Requested by EraPartner · project thread

Summary

Batch 1 of the 2026-11-14 Swift vs TypeScript UI audit: the Swift controls that were broken. The TS app is the reference.

Audit row Cause found in code Change
S-97 Compare add symbol The results popup is an overlay of the search box, but zIndex was set inside an inner VStack, so the empty-state card (a later sibling of that stack) drew over the popup and took its clicks ResearchCompareView: raise the whole search block while the popup is open; rows get the web's leading Plus icon (leadingSymbol on ResearchSymbolSearchView)
S-29 Payees stop at 50 of 53 The next page was only requested from a row's onAppear, which fires once per row; a missed request was never repeated (exact trigger not reproduced: inference) LocalDataTable: an end marker with a new identity per page asks again via onRowAppear(last) while hasMore
S-99 Analysis workspace tabs The Refine card (which holds the analysis-prepare / analysis-calculate sections) was only built with a result; the web always renders it. Present was .disabled without a result; the web link is always enabled AnalysisWorkspaceView: Refine card always present; Present enabled
K8 / S-22 Forecast diagnostics 7 per-method chart sections, one green ProgressView per weight Took HomeForecastDiagnostics.swift and the new Components/VisionTable.swift from draft PR #440 unchanged (accuracy table with method colour dots, rank badges, MAE sparkline column; multicolour weight bars). Checked against CashFlowForecastDiagnostics.tsx (METHOD_COLORS, column order, w-44, h-1.5)
S-73 Planned header "…" Not determined from code. The menu differs from the working ones only in modifier order Tooltip anchor NSView is now transparent to the mouse (hitTest → nil); Planned modifier order matches Payees/Owes. Unverified
S-78 Insights Categories tab Not determined from code. The tab only changed after the route change restarted the page task StatisticsModel.selectTab sets the tab at once on click. Unverified
S-64 Disclosure rows toggle only on the chevron macOS DisclosureGroup toggles only on its chevron; web <details> toggles on the whole summary New VisionDisclosureGroupStyle (whole title row is the button, tertiary chevron that rotates), set once at the shell root

Other rows checked and left alone: S-102 (monitor picker disabled) and S-106 (Restore disabled) follow the same enable rules as TS (eligible.length === 0, !restoreFile). The difference is the Demo state, not code.

PR #440: this branch is based on main, not on #440. Only #440's forecast-diagnostics file and its VisionTable component were taken over, byte for byte, so #440 should rebase cleanly over them. No other #440 file was touched.

Type of change

  • fix — bug fix

Checklist

  • Conventional Commit title
  • bun scripts/native-lint.ts: native-lint ok (string-literal-compare 701, baseline 716)
  • Swift compile and tests: macOS CI swift job (no Swift toolchain in the cloud container)
  • No new strings, API, schema or architecture change

Verification

  • Compiled only in CI. Nothing was run on a Mac. Every fix above is unverified in the running app until someone checks it on the Mac.

Residual risk & follow-ups

  • The disclosure style replaces the AppKit disclosure control in every DisclosureGroup on screen (print paths that use their own renderer are unchanged). VoiceOver no longer hears the native expanded/collapsed state.
  • Planned "…" and the Insights Categories tab: if the Mac check still fails, the cause is somewhere else.

Generated by Claude Code

- Compare: the symbol search popup now sits above the empty-state card,
  so its rows take clicks; results carry the web's leading plus icon.
- Payees and other paged LocalDataTables: an end marker asks for the next
  page again after each page, so the table no longer stops at 50 of 53.
- Analysis workspace: the Refine card renders without a result, as on the
  web, so Prepare and Calculate have sections to open; Present is enabled.
- Forecast diagnostics: take the web layout from draft PR #440 (accuracy
  table with method colours, rank badges and MAE sparklines; multicolour
  ensemble weight bars).
- Tooltips: the anchor view is transparent to the mouse, so it cannot take
  a click meant for the control (Planned header menu).
- Insights: a tab click selects the tab at once, before the route change.
- Disclosures: a click anywhere on the title row toggles, like <details>.

Claude-Session: https://claude.ai/code/session_018QJtaJarBqP17meJGcCBkv
@EraPartner
EraPartner marked this pull request as ready for review November 14, 2026 08:29
@EraPartner
EraPartner merged commit 6ab5605 into main Nov 14, 2026
11 checks passed
@EraPartner
EraPartner deleted the claude/project-thread-kxqntc branch November 14, 2026 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants