Добавлена темизация: circular reveal анимация, адаптивные цвета light/dark, обои по теме

This commit is contained in:
2026-04-03 23:12:35 +05:00
parent 078e2d4feb
commit a72a1bd6c9
35 changed files with 545 additions and 211 deletions

View File

@@ -47,7 +47,7 @@ struct ChatListView: View {
.padding(.bottom, 8)
.background(
(hasPinnedChats && !isSearchActive
? RosettaColors.Dark.pinnedSectionBackground
? RosettaColors.Adaptive.pinnedSectionBackground
: Color.clear
).ignoresSafeArea(.all, edges: .top)
)
@@ -121,7 +121,6 @@ struct ChatListView: View {
}
}
.presentationDetents([.large])
.preferredColorScheme(.dark)
}
.sheet(isPresented: $showJoinGroupSheet) {
NavigationStack {
@@ -133,7 +132,6 @@ struct ChatListView: View {
}
}
.presentationDetents([.large])
.preferredColorScheme(.dark)
}
.onReceive(NotificationCenter.default.publisher(for: .openChatFromNotification)) { notification in
guard let route = notification.object as? ChatRoute else { return }
@@ -238,14 +236,14 @@ private extension ChatListView {
.background {
if isSearchActive {
RoundedRectangle(cornerRadius: 24, style: .continuous)
.fill(Color.white.opacity(0.08))
.fill(RosettaColors.Adaptive.searchBarFill)
.overlay {
RoundedRectangle(cornerRadius: 24, style: .continuous)
.strokeBorder(Color.white.opacity(0.06), lineWidth: 0.5)
.strokeBorder(RosettaColors.Adaptive.searchBarBorder, lineWidth: 0.5)
}
} else {
RoundedRectangle(cornerRadius: 24, style: .continuous)
.fill(RosettaColors.Adaptive.backgroundSecondary)
.fill(RosettaColors.Adaptive.searchBarFill)
}
}
.onChange(of: isSearchFocused) { _, focused in
@@ -266,17 +264,17 @@ private extension ChatListView {
.resizable()
.scaledToFit()
.frame(width: 19, height: 19)
.foregroundStyle(.white)
.foregroundStyle(RosettaColors.Adaptive.text)
.frame(width: 36, height: 36)
.padding(3)
}
.buttonStyle(.plain)
.background {
Circle()
.fill(Color.white.opacity(0.08))
.fill(RosettaColors.Adaptive.searchBarFill)
.overlay {
Circle()
.strokeBorder(Color.white.opacity(0.06), lineWidth: 0.5)
.strokeBorder(RosettaColors.Adaptive.searchBarBorder, lineWidth: 0.5)
}
}
.transition(.opacity.combined(with: .scale(scale: 0.5)))
@@ -507,10 +505,10 @@ private struct SyncAwareEmptyState: View {
VStack(spacing: 16) {
Spacer().frame(height: 120)
ProgressView()
.tint(.white)
.tint(RosettaColors.Adaptive.textSecondary)
Text("Syncing conversations…")
.font(.system(size: 15))
.foregroundStyle(Color.white.opacity(0.5))
.foregroundStyle(RosettaColors.Adaptive.textSecondary)
Spacer()
}
.frame(maxWidth: .infinity)
@@ -680,8 +678,8 @@ private struct ChatListDialogContent: View {
if !pinned.isEmpty {
ForEach(pinned, id: \.id) { dialog in
chatRow(dialog, isFirst: dialog.id == pinned.first?.id && requestsCount == 0)
.environment(\.rowBackgroundColor, RosettaColors.Dark.pinnedSectionBackground)
.listRowBackground(RosettaColors.Dark.pinnedSectionBackground)
.environment(\.rowBackgroundColor, RosettaColors.Adaptive.pinnedSectionBackground)
.listRowBackground(RosettaColors.Adaptive.pinnedSectionBackground)
}
}
ForEach(unpinned, id: \.id) { dialog in

View File

@@ -11,7 +11,7 @@ struct DeviceConfirmView: View {
var body: some View {
ZStack {
// Full black background covering everything
RosettaColors.Dark.background
RosettaColors.Adaptive.background
.ignoresSafeArea()
VStack(spacing: 0) {