Confirmed by hands-on testing: NavigationSplitView's compact-width
collapse only pushes into the detail column when the sidebar drives
navigation via row selection. GroupFilterView is a multi-select filter,
not a picker, so on iPhone it showed only the sidebar with no way to
reach the entry list at all -- exactly the risk the final whole-branch
review flagged as unverified.
iOS now uses a plain NavigationStack with EntryListView as the root and
GroupFilterView presented as a sheet via the hamburger button. macOS
keeps the persistent NavigationSplitView sidebar, which does work
correctly at regular width.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
- GroupFilterViewModel now tracks lastToggledGroupId (the single group
most recently toggled to a non-empty selection), since toggling a
group with subgroups expands selectedGroupIds to include the whole
subtree, breaking the previous count==1 check used to infer the
active filter group.
- VaultViewModel exposes lastToggledGroupId, forwarded from
GroupFilterViewModel by VaultRootView (ContentView.swift), and
EntryListView.defaultGroupId now reads it instead of the broken
selectedGroupIds.count == 1 check, so the add-entry sheet defaults
new entries into the group actually being filtered by, not silently
back to root.
- EntryListView's search toggle button now clears vm.searchQuery when
hiding the search bar, so a hidden bar can no longer keep filtering
the list invisibly.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
Completes Phase 4 (Task 17) -- ContentView now routes between UnlockView
and the vault UI (NavigationStack on iOS, 3-column NavigationSplitView on
macOS) instead of the leftover SwiftData template, finally resolving the
long-standing "cannot find type Item" build break. Vault locks on
scene-background (iOS) / resign-active (macOS).
Fixes two more real bugs surfaced now that everything actually links
together: EntryEditViewModel.save's dismiss closure needed @escaping
(used inside Task {}), and UnlockView's UTType(filenameExtension:)
needed `import UniformTypeIdentifiers`.
Also restores MyPass.entitlements, which had regressed to an empty
App Group array with Keychain Sharing missing entirely since the
"wire up AutoFill extension target" commit -- likely clobbered by
Xcode reconciling capabilities at some point without a rebuild in
between to catch it. Verified clean `xcodebuild` on both iOS Simulator
and macOS destinations, and `swift test` still passes all 18 tests.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf