Skip to content

fix(native): dialogs that fit, a sidebar that never covers the page, and asset logos - #451

Merged
EraPartner merged 2 commits into
mainfrom
claude/project-thread-d250o8
Nov 15, 2026
Merged

EraPartner merged 2 commits into
mainfrom
claude/project-thread-d250o8

Conversation

@EraPartner

@EraPartner EraPartner commented Nov 15, 2026 •

Copy link
Copy Markdown
Owner

Requested by EraPartner · project thread

Summary

Swift app polish items from Tor's list (all performance profiles).

  • Sidebar covering the page (root cause). A page's dialog layer ignored every safe area, so it was laid out across the detail column's leading inset under the floating sidebar: the planned-payment history and quick look content sat behind the sidebar, clipped and off-centre. VisionModalPresenter now covers safe areas with the scrim only and places the panel in the page's own width, up to the window top; the topbar steps aside while a page panel is up (PageModalTopbarHiding) and the collapsed rail takes the scrim too. This also fixes the add-transaction sheet drawn under the topbar.
  • Dialogs that don't fit (general guard). maxWidth: nil dialogs used frame(maxHeight:), which always took 90 % of the window and centred the content in empty glass; flexible content also spread across the window. They now take the content's ideal size capped by the window (VisionDialogFit / VisionDialogContentFit). Fixed-height bodies (chart builder, watchlist chart and add, shortcuts) use visionDialogFrame(width:height:) so a short window shrinks their scroll area instead of clipping. Chart builder preferred height 680 → 740 so the form shows its Tags field.
  • Sidebar grey box. The page canvas was clipped to the page frame, leaving empty window background under the sliding sidebar. DetailGlassBackground now runs under the sidebar (no freeze/clip).
  • Quick look. Space closes it wherever focus is (hidden Space shortcut); width fixed at 384.
  • Payee details. Double-click opens Transactions filtered by recipient_id (InsightsRoutes.drill(recipientId:)). Swift-only: the web table has no row action.
  • Export filters. Slide in inside a clipped slot below the heading, never over it.
  • Data source health / Database maintenance. TableHead h-10 and TableCell py-3 padding; the hidden "Actions" header was a 1 pt-wide text wrapping one letter per line, which made the header row tall.
  • Metals. Gold-bar glyph (VisionSymbol.goldBar) on asset pages, tiles and the watchlist; the generated sidebar symbol is unchanged.
  • Logos (opt-in, Tor's choice). Settings › Appearance › Company and coin logos (app_settings.assetLogos, default off, Swift only). When on, AssetLogoSource + AssetLogo load FMP image-stock/{TICKER}.png for stocks/ETFs and cryptocurrency-icons@0.18.1 on jsDelivr for crypto; fetched once per session, any failure keeps the glyph. Only the ticker leaves the Mac. Off: no requests.
  • validate-locales counts .swift sources as key consumers, so the two Swift-only keys (settings.appearance.assetLogos, …Hint, en + nl) pass the unused-key check.

Demo exclusions (item 4): not a bug. packaging/electron/demo-db/generate.mts seeds every category active and no exclusion settings, so filtered and unfiltered data are identical; Statistics shows the toggle whenever the scope applies, as the web does.

Type of change

  • fix — bug fix
  • feat — new feature (logos setting, payee drill)

Checklist

  • Conventional Commit title
  • Affected docs/ pages updated (docs/architecture/native-app.md, docs/i18n/translations.md)
  • i18n: 2 keys in i18n/source/ (en + nl); bun run validate-locales passes
  • Tests pass — Swift compiles and runs only in the macOS CI job (no Swift toolchain in the cloud container)

Architecture & data

  • No architectural change
  • No API change (app_settings is a loose JSON object; new key is additive)
  • No schema change

Verification

  • bun scripts/native-lint.ts: native-lint ok.
  • bun test scripts/native-tests: 74 pass, 0 fail.
  • bun run validate-locales: passed. bun run typecheck:scripts: clean.
  • New tests: AssetLogoSourceTests, NativeAppSettingsTests.assetLogosStayOffUntilTheUserTurnsThemOn, InsightsTests.payeeDrillOpensTransactionsFilteredToThePayee, NativeOverlayMetricsTests.contentSizedDialogsTakeTheContentSizeUpToTheWindowAllowance and contentSizedPanelsHugTheirContent (NSHostingView layout).
  • Not checked on screen: none of the visual changes have been looked at in the running app yet. The FMP logo endpoint could not be reached from the container (proxy 403); the cryptocurrency-icons package layout was checked from the npm tarball (128/color/btc.png etc.).

Residual risk & follow-ups

  • The sidebar now shows the page canvas through its glass instead of empty window background; its tint may look slightly different.
  • Sidebar open/close smoothness beyond the grey box is unverified without a screen check.

🤖 Generated with Claude Code

https://claude.ai/code/session_018QJtaK46HActmbWwGtQsu1

…and asset logos

- Dialog host: a page's panel is placed in the page's own width (not under the
  floating sidebar) and up to the window top; the topbar steps aside and the
  collapsed rail takes the scrim. Fixes the planned-payment history and quick
  look content hidden behind the sidebar and the add-transaction sheet under
  the topbar.
- Content-sized dialogs (maxWidth: nil) hug their content, capped by the
  window (VisionDialogFit); fixed-height bodies use visionDialogFrame so a short
  window shrinks their scroll area instead of clipping them.
- Sidebar: the page canvas runs under the floating sidebar, so no grey strip
  shows while it slides in or out.
- Quick look: Space closes it wherever focus is.
- Statistics payee details: a double click opens the payee's transactions.
- Import/Export: export filters slide in inside a clipped slot, never over the
  heading.
- Data source health and Database maintenance: web row padding, and the hidden
  actions header no longer wraps into a tall row.
- Metals: a gold-bar glyph on asset pages and tiles.
- Asset pages: company and coin logos by ticker, falling back to the glyph.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QJtaK46HActmbWwGtQsu1
Tor chose an opt-in: Settings > Appearance > Company and coin logos
(app_settings.assetLogos, Swift app only). With it off, no logo host is
contacted and the asset-class glyph shows.

validate-locales now counts Swift sources as key consumers, so keys only the
Swift app reads pass the unused-key check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018QJtaK46HActmbWwGtQsu1
@github-actions

Copy link
Copy Markdown

Coverage Report for backend

Status Category Percentage Covered / Total
🟢 Lines 90.94% (🎯 80%) 25961 / 28547
🟢 Statements 88.97% (🎯 78%) 28161 / 31651
🟢 Functions 91.33% (🎯 76%) 5573 / 6102
🟢 Branches 81.17% (🎯 68%) 19787 / 24377
File CoverageNo changed files found.
Generated in workflow #2159 for commit d508b1e by the Vitest Coverage Report Action

@EraPartner
EraPartner marked this pull request as ready for review November 15, 2026 09:24
@EraPartner
EraPartner merged commit e44e2a1 into main Nov 15, 2026
12 checks passed
@EraPartner
EraPartner deleted the claude/project-thread-d250o8 branch November 15, 2026 09:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants