diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/Contents.json
new file mode 100644
index 0000000..ee8220d
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-chevron-left.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/icon-chevron-left.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/icon-chevron-left.svg
new file mode 100644
index 0000000..83eacc2
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-left.imageset/icon-chevron-left.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/Contents.json
new file mode 100644
index 0000000..f476b9f
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-chevron-right.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/icon-chevron-right.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/icon-chevron-right.svg
new file mode 100644
index 0000000..9179905
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-chevron-right.imageset/icon-chevron-right.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/Contents.json
new file mode 100644
index 0000000..6b6ac4a
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-download.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/icon-download.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/icon-download.svg
new file mode 100644
index 0000000..298b7f7
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-download.imageset/icon-download.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/Contents.json
new file mode 100644
index 0000000..95cfd92
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-pause.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/icon-pause.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/icon-pause.svg
new file mode 100644
index 0000000..4ee1cd2
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-pause.imageset/icon-pause.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/Contents.json
new file mode 100644
index 0000000..b20c33b
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-play.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/icon-play.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/icon-play.svg
new file mode 100644
index 0000000..e2da779
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-play.imageset/icon-play.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/Contents.json b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/Contents.json
new file mode 100644
index 0000000..4be3446
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"filename":"icon-upload.svg","idiom":"universal"}],"info":{"author":"xcode","version":1},"properties":{"template-rendering-intent":"template","preserves-vector-representation":true}}
diff --git a/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/icon-upload.svg b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/icon-upload.svg
new file mode 100644
index 0000000..cce8c27
--- /dev/null
+++ b/AIStudyApp/AIStudyApp/Assets.xcassets/Icons/icon-upload.imageset/icon-upload.svg
@@ -0,0 +1 @@
+
diff --git a/AIStudyApp/AIStudyApp/Features/AI/AIFeedbackPageView.swift b/AIStudyApp/AIStudyApp/Features/AI/AIFeedbackPageView.swift
index 95a22c1..09f96cd 100644
--- a/AIStudyApp/AIStudyApp/Features/AI/AIFeedbackPageView.swift
+++ b/AIStudyApp/AIStudyApp/Features/AI/AIFeedbackPageView.swift
@@ -74,7 +74,7 @@ struct AIFeedbackPageView: View {
NavigationLink(value: Route.aiChat) {
HStack(spacing: 4) {
Text("深入提问").font(.system(size: 13))
- Image(systemName: "chevron.right").font(.system(size: 14))
+ Image("icon-chevron-right").resizable().scaledToFit().frame(width: 14, height: 14)
}
.foregroundColor(Color.zxF05)
.frame(maxWidth: .infinity).frame(height: 44)
@@ -85,7 +85,7 @@ struct AIFeedbackPageView: View {
NavigationLink(value: Route.dailyThinking) {
HStack(spacing: 4) {
Text("再来一题").font(.system(size: 13))
- Image(systemName: "chevron.right").font(.system(size: 14))
+ Image("icon-chevron-right").resizable().scaledToFit().frame(width: 14, height: 14)
}
.foregroundColor(Color.zxF05)
.frame(maxWidth: .infinity).frame(height: 44)
diff --git a/AIStudyApp/AIStudyApp/Features/AI/AIHomeView.swift b/AIStudyApp/AIStudyApp/Features/AI/AIHomeView.swift
index 76ce5ca..e7e6170 100644
--- a/AIStudyApp/AIStudyApp/Features/AI/AIHomeView.swift
+++ b/AIStudyApp/AIStudyApp/Features/AI/AIHomeView.swift
@@ -388,7 +388,7 @@ struct AIHomeView: View {
Spacer()
- Image(systemName: "chevron.right")
+ Image("icon-chevron-right")
.font(.system(size: 10, weight: .semibold))
.foregroundColor(Color.zxInkTertiary)
}
diff --git a/AIStudyApp/AIStudyApp/Features/Library/LibrarySubpages.swift b/AIStudyApp/AIStudyApp/Features/Library/LibrarySubpages.swift
index df40f1f..7c51145 100644
--- a/AIStudyApp/AIStudyApp/Features/Library/LibrarySubpages.swift
+++ b/AIStudyApp/AIStudyApp/Features/Library/LibrarySubpages.swift
@@ -93,7 +93,7 @@ struct CreateLibraryPage: View {
Text("选择一张图片作为封面").font(.system(size: 12)).foregroundColor(Color.zxF04)
}
Spacer()
- Image(systemName: "chevron.right").font(.system(size: 14)).foregroundColor(Color.zxF03)
+ Image("icon-chevron-right").resizable().scaledToFit().frame(width: 14, height: 14).foregroundColor(Color.zxF03)
}
.padding(.horizontal, 16).padding(.vertical, 14)
.background(Color.zxFill004).clipShape(RoundedRectangle(cornerRadius: 14))
@@ -759,7 +759,7 @@ struct ImportPage: View {
struct ZXImportRow: View { let icon: String; let title: String; let desc: String
var body: some View { HStack(spacing: 14) { Image(systemName: icon).font(.system(size: 22)).foregroundColor(Color.zxPurple).frame(width: 48, height: 48)
-; VStack(alignment: .leading, spacing: 2) { Text(title).font(.system(size: 15, weight: .semibold)).foregroundColor(Color.zxF0); Text(desc).font(.system(size: 12)).foregroundColor(Color.zxF04) }; Spacer(); Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03) }.padding(16).background(Color.zxFill003).clipShape(RoundedRectangle(cornerRadius: 16)).overlay(RoundedRectangle(cornerRadius: 16).stroke(Color.zxBorder006, lineWidth: 1)) }
+; VStack(alignment: .leading, spacing: 2) { Text(title).font(.system(size: 15, weight: .semibold)).foregroundColor(Color.zxF0); Text(desc).font(.system(size: 12)).foregroundColor(Color.zxF04) }; Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03) }.padding(16).background(Color.zxFill003).clipShape(RoundedRectangle(cornerRadius: 16)).overlay(RoundedRectangle(cornerRadius: 16).stroke(Color.zxBorder006, lineWidth: 1)) }
}
// MARK: - Import Review
diff --git a/AIStudyApp/AIStudyApp/Features/Profile/ProfileView.swift b/AIStudyApp/AIStudyApp/Features/Profile/ProfileView.swift
index 981a3d4..87fbae4 100644
--- a/AIStudyApp/AIStudyApp/Features/Profile/ProfileView.swift
+++ b/AIStudyApp/AIStudyApp/Features/Profile/ProfileView.swift
@@ -80,7 +80,7 @@ struct ProfileView: View {
Text(profile?.nickname ?? "学习者").font(.system(size: 20, weight: .bold)).foregroundColor(Color.zxF0)
Text(profile?.email ?? "").font(.system(size: 12)).foregroundColor(Color.zxF04)
}
- Spacer(); Image(systemName: "chevron.right").font(.system(size: 14)).foregroundColor(Color.zxF03)
+ Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 14, height: 14).foregroundColor(Color.zxF03)
}
HStack(spacing: 0) { ZXProfileStat(value: "\(viewModel.summary?.activeDays ?? 0)", label: "活跃天", color: Color.zxOrange); ZXProfileStat(value: "\(viewModel.summary?.totalCardsReviewed ?? 0)", label: "复习卡片", color: Color.zxPurple); ZXProfileStat(value: "\(viewModel.summary?.totalMinutes ?? 0)", label: "分钟", color: Color.zxTeal) }
}.padding(20).background(ZXGradient.profileCard).overlay(RoundedRectangle(cornerRadius: 20).stroke(Color(hex: "#7C6EFA", opacity: 0.2), lineWidth: 1)).clipShape(RoundedRectangle(cornerRadius: 20))
@@ -99,7 +99,7 @@ struct ProfileView: View {
Text("学习资产").font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0)
Spacer()
Text("\(viewModel.kbCount)库 \(viewModel.itemCount)项 \(viewModel.cardCount)卡").font(.system(size: 12)).foregroundColor(Color.zxF04)
- Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03)
+ Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03)
}.padding(.horizontal, 16).padding(.vertical, 14)
}.foregroundColor(.primary)
ZXProfileDivider()
@@ -108,7 +108,7 @@ struct ProfileView: View {
Image(systemName: "bell.fill").font(.system(size: 18)).foregroundColor(Color.zxOrange).frame(width: 36, height: 36)
Text("消息中心").font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0)
- Spacer(); Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03)
+ Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03)
}.padding(.horizontal, 16).padding(.vertical, 14)
}.foregroundColor(.primary)
ZXProfileDivider()
@@ -119,7 +119,7 @@ struct ProfileView: View {
Text("存储空间").font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0)
Text(viewModel.formattedStorage).font(.system(size: 11)).foregroundColor(Color.zxF04)
}
- Spacer(); Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03)
+ Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03)
}.padding(.horizontal, 16).padding(.vertical, 14)
}.background(Color.zxFill004).clipShape(RoundedRectangle(cornerRadius: 20)).overlay(RoundedRectangle(cornerRadius: 20).stroke(Color.zxBorder006, lineWidth: 1))
}
@@ -129,7 +129,7 @@ struct ZXProfileStat: View { let v: String; let l: String; let c: Color; var bod
init(value: String, label: String, color: Color) { self.v = value; self.l = label; self.c = color }
}
struct ZXProfileMenuRow: View { let icon: String; let title: String; let desc: String
- var body: some View { HStack(spacing: 12) { Image(systemName: icon).font(.system(size: 18)).foregroundColor(Color.zxF05).frame(width: 36, height: 36).background(Color.zxFill006).clipShape(RoundedRectangle(cornerRadius: 10)); VStack(alignment: .leading, spacing: 2) { Text(title).font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0); Text(desc).font(.system(size: 11)).foregroundColor(Color.zxF03) }; Spacer(); Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03) }.padding(.horizontal, 16).padding(.vertical, 14).accessibilityLabel("\(title):\(desc)") }
+ var body: some View { HStack(spacing: 12) { Image(systemName: icon).font(.system(size: 18)).foregroundColor(Color.zxF05).frame(width: 36, height: 36).background(Color.zxFill006).clipShape(RoundedRectangle(cornerRadius: 10)); VStack(alignment: .leading, spacing: 2) { Text(title).font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0); Text(desc).font(.system(size: 11)).foregroundColor(Color.zxF03) }; Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03) }.padding(.horizontal, 16).padding(.vertical, 14).accessibilityLabel("\(title):\(desc)") }
}
struct ZXProfileDivider: View {
var body: some View { Rectangle().fill(Color.zxBorder008).frame(height: 1).padding(.leading, 64) }
diff --git a/AIStudyApp/AIStudyApp/Features/Profile/SettingsView.swift b/AIStudyApp/AIStudyApp/Features/Profile/SettingsView.swift
index 192d969..f4cc89f 100644
--- a/AIStudyApp/AIStudyApp/Features/Profile/SettingsView.swift
+++ b/AIStudyApp/AIStudyApp/Features/Profile/SettingsView.swift
@@ -165,7 +165,7 @@ struct ZXSettingRow: View {
Text(title).font(.system(size: 14, weight: .semibold)).foregroundColor(Color.zxF0)
Spacer()
if !value.isEmpty { Text(value).font(.system(size: 13)).foregroundColor(Color.zxF03) }
- Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03)
+ Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03)
}.padding(.horizontal, 16).padding(.vertical, 14)
}
}
diff --git a/AIStudyApp/AIStudyApp/Features/Quiz/QuizViews.swift b/AIStudyApp/AIStudyApp/Features/Quiz/QuizViews.swift
index d7a463c..43b0a43 100644
--- a/AIStudyApp/AIStudyApp/Features/Quiz/QuizViews.swift
+++ b/AIStudyApp/AIStudyApp/Features/Quiz/QuizViews.swift
@@ -38,7 +38,7 @@ struct QuizListView: View {
ForEach(quizzes) { q in
NavigationLink(value: Route.quizTake(quizId: q.id)) {
VStack(alignment: .leading, spacing: 8) {
- HStack { Text(q.title ?? "测验").font(.system(size: 15, weight: .semibold)).foregroundColor(Color.zxF0); Spacer(); Image(systemName: "chevron.right").font(.system(size: 12)).foregroundColor(Color.zxF03) }
+ HStack { Text(q.title ?? "测验").font(.system(size: 15, weight: .semibold)).foregroundColor(Color.zxF0); Spacer(); Image("icon-chevron-right").resizable().scaledToFit().frame(width: 12, height: 12).foregroundColor(Color.zxF03) }
HStack(spacing: 12) {
Label("\(q.questionCount ?? 0) 题", systemImage: "list.bullet").font(.system(size: 11)).foregroundColor(Color.zxF04)
Label("选择题/判断/填空", systemImage: "square.grid.3x3").font(.system(size: 11)).foregroundColor(Color.zxF04)
@@ -146,12 +146,12 @@ struct QuizTakerView: View {
// Navigation buttons
HStack {
Button { if currentIndex > 0 { currentIndex -= 1 } } label: {
- HStack { Image(systemName: "chevron.left"); Text("上一题") }.font(.system(size: 14)).foregroundColor(Color.zxF05).padding(.horizontal, 20).padding(.vertical, 12).background(Color.zxFill004).clipShape(RoundedRectangle(cornerRadius: 10))
+ HStack { Image("icon-chevron-left"); Text("上一题") }.font(.system(size: 14)).foregroundColor(Color.zxF05).padding(.horizontal, 20).padding(.vertical, 12).background(Color.zxFill004).clipShape(RoundedRectangle(cornerRadius: 10))
}.disabled(currentIndex == 0)
Spacer()
if currentIndex < questions.count - 1 {
Button { currentIndex += 1 } label: {
- HStack { Text("下一题"); Image(systemName: "chevron.right") }.font(.system(size: 14, weight: .medium)).foregroundColor(.white).padding(.horizontal, 20).padding(.vertical, 12).background(ZXGradient.brand).clipShape(RoundedRectangle(cornerRadius: 10))
+ HStack { Text("下一题"); Image("icon-chevron-right") }.font(.system(size: 14, weight: .medium)).foregroundColor(.white).padding(.horizontal, 20).padding(.vertical, 12).background(ZXGradient.brand).clipShape(RoundedRectangle(cornerRadius: 10))
}
} else {
Button {
diff --git a/AIStudyApp/AIStudyApp/Features/Study/LearningSessionView.swift b/AIStudyApp/AIStudyApp/Features/Study/LearningSessionView.swift
index ed4108d..a17aabe 100644
--- a/AIStudyApp/AIStudyApp/Features/Study/LearningSessionView.swift
+++ b/AIStudyApp/AIStudyApp/Features/Study/LearningSessionView.swift
@@ -97,7 +97,7 @@ struct LearningSessionView: View {
if isRunning { isPaused = true; isRunning = false }
else { isPaused = false; isRunning = true }
} label: {
- Label(isRunning ? "暂停" : "继续", systemImage: isRunning ? "pause.fill" : "play.fill")
+ Label(isRunning ? "暂停" : "继续", systemImage: isRunning ? "pause.fill" : "icon-play")
.font(.system(size: 14, weight: .bold))
.foregroundColor(.white)
.frame(maxWidth: .infinity).frame(height: 48)
diff --git a/AIStudyApp/AIStudyApp/Features/Study/StudyHomeView.swift b/AIStudyApp/AIStudyApp/Features/Study/StudyHomeView.swift
index 1b8742f..a3107ad 100644
--- a/AIStudyApp/AIStudyApp/Features/Study/StudyHomeView.swift
+++ b/AIStudyApp/AIStudyApp/Features/Study/StudyHomeView.swift
@@ -225,7 +225,7 @@ struct ZXSTaskRow: View { @Binding var task: ZXSTask
struct ZXSTaskRowView: View { let task: ZXSTask; var action: () -> Void
var body: some View { HStack(spacing: 12) { Image(systemName: task.d ? "checkmark.circle.fill" : "circle").font(.system(size: 20)).foregroundColor(task.d ? Color.zxGreen : Color.zxF02)
VStack(alignment: .leading, spacing: 4) { Text(task.t).font(.system(size: 13, weight: .semibold)).foregroundColor(task.d ? Color.zxF04 : Color.zxF0).strikethrough(task.d); HStack(spacing: 8) { Text(task.tp).font(.system(size: 10, weight: .semibold)).foregroundColor(task.c).padding(.horizontal, 6).padding(.vertical, 1).background(task.c.opacity(0.12)).clipShape(Capsule()); Text("约 \(task.m) 分钟").font(.system(size: 10)).foregroundColor(Color(hex:"#F0F0FF",opacity:0.35)) } }
- Spacer(); if !task.d { Image(systemName: "play.fill").font(.system(size: 14)).foregroundColor(.white).frame(width: 32, height: 32).background(ZXGradient.brand).clipShape(RoundedRectangle(cornerRadius: 10)) } }
+ Spacer(); if !task.d { Image("icon-play").font(.system(size: 14)).foregroundColor(.white).frame(width: 32, height: 32).background(ZXGradient.brand).clipShape(RoundedRectangle(cornerRadius: 10)) } }
.padding(.horizontal, 16).padding(.vertical, 12).background(task.d ? Color.zxFill003 : Color.zxFill005).overlay(RoundedRectangle(cornerRadius: 14).stroke(task.d ? Color(hex: "#FFFFFF", opacity: 0.05) : Color.zxBorder008, lineWidth: 1)).clipShape(RoundedRectangle(cornerRadius: 14)).opacity(task.d ? 0.6 : 1).contentShape(Rectangle()).onTapGesture { action() }.zxPressable()
.accessibilityLabel("\(task.t), \(task.tp), 约\(task.m)分钟")
.accessibilityAddTraits(task.d ? .isSelected : [])