feat: copper accent theme, always-expanded group filter, app icon; rename MyPass to KeeVault
- Custom copper AccentColor and warm VaultBackground color assets (light/dark), applied to both the main app and the AutoFill extension (which needed its own copy of the asset catalog plus ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME and an explicit .tint() modifier, since extensions don't pick up the app-wide accent color the same way a full SwiftUI App/Scene does). - GroupFilterView no longer uses DisclosureGroup for subgroups -- the whole tree renders always-expanded (indented per depth) so active filters are visible at a glance instead of requiring tap-to-expand. - Added a placeholder app icon (padlock glyph, light/dark/tinted variants plus macOS sizes) -- previously the icon slot existed but had no actual images, which blocks App Store/TestFlight archive validation. - Added ITSAppUsesNonExemptEncryption = NO (standard encryption only, via KeePassKit) to skip the export-compliance prompt on each upload. - Renamed the app from MyPass to KeeVault throughout: Xcode project/targets/ schemes, the MyPassCore package (now KeeVaultCore) and every import site, folder and file names, bundle identifiers (org.antiloop222.keevault) and their App Group/Keychain-group entitlements, and remaining UI/string references -- MyPass was already taken as an App Store app name.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import SwiftUI
|
||||
import KeeVaultCore
|
||||
|
||||
struct GroupFilterView: View {
|
||||
@ObservedObject var vm: GroupFilterViewModel
|
||||
let rootGroup: KeeVaultCore.Group
|
||||
|
||||
var body: some View {
|
||||
List {
|
||||
if !vm.selectedGroupIds.isEmpty {
|
||||
Button("Clear Filter", action: vm.clear)
|
||||
}
|
||||
GroupFilterNode(group: rootGroup, vm: vm)
|
||||
}
|
||||
.scrollContentBackground(.hidden)
|
||||
.background(Color("VaultBackground"))
|
||||
.navigationTitle("Groups")
|
||||
}
|
||||
}
|
||||
|
||||
private struct GroupFilterNode: View {
|
||||
let group: KeeVaultCore.Group
|
||||
@ObservedObject var vm: GroupFilterViewModel
|
||||
var depth: Int = 0
|
||||
|
||||
var body: some View {
|
||||
// A plain SwiftUI.Group (not a container view) flattens its children into
|
||||
// separate List rows, so the whole subtree renders always-expanded --
|
||||
// no DisclosureGroup, no tap-to-reveal -- active filters are visible at a glance.
|
||||
SwiftUI.Group {
|
||||
row
|
||||
ForEach(group.subgroups) { sub in
|
||||
GroupFilterNode(group: sub, vm: vm, depth: depth + 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var row: some View {
|
||||
Button {
|
||||
vm.toggle(group)
|
||||
} label: {
|
||||
HStack {
|
||||
Image(systemName: vm.isSelected(group) ? "checkmark.circle.fill" : "circle")
|
||||
.foregroundStyle(vm.isSelected(group) ? Color.accentColor : Color.secondary)
|
||||
Label(group.name, systemImage: "folder")
|
||||
}
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.padding(.leading, CGFloat(depth) * 16)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user