feat: macOS architecture, cloud ASR/LLM providers, and 6-step iOS onboarding
- Add macOS menu-bar dictation app with local ASR models (SenseVoice/Qwen3),
global Option hotkey, and bottom overlay
- Add cloud ASR/LLM providers (Anthropic, Volcengine, Bailian, and more) with
provider logos, model listing, and connection checks
- Add shared 7-day usage stats UI (UsageStatsCluster / SevenDayUsageChart)
- Add iOS onboarding step 6 for polish LLM setup; hide custom-language-model
diagnostic toggle behind DEBUG
- Unify iOS onboarding tagline with the macOS brand line ("开口即文字。")
- Rewrite README (Chinese-first, product-oriented) and refresh GitHub Pages
This commit is contained in:
@@ -11,8 +11,6 @@ struct EnginePickerSection: View {
|
||||
@Environment(\.themePalette) private var palette: ThemePalette
|
||||
|
||||
@ObservedObject var config: ProviderConfig
|
||||
@State private var showCloudAcknowledgment = false
|
||||
@State private var pendingEngineSelection: String?
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: SettingsListMetrics.sectionLabelSpacing) {
|
||||
@@ -37,17 +35,7 @@ struct EnginePickerSection: View {
|
||||
RoundedRectangle(cornerRadius: Radius.large, style: .continuous)
|
||||
.stroke(palette.divider, lineWidth: 0.5)
|
||||
)
|
||||
|
||||
if config.engineMode == "cloud" {
|
||||
CloudPolishDisclosureBanner()
|
||||
}
|
||||
}
|
||||
.cloudSharingAcknowledgment(
|
||||
config: config,
|
||||
isPresented: $showCloudAcknowledgment,
|
||||
onConfirm: { applyPendingEngineSelection() },
|
||||
onCancel: { pendingEngineSelection = nil }
|
||||
)
|
||||
}
|
||||
|
||||
private var localSubtitle: String {
|
||||
@@ -64,11 +52,6 @@ struct EnginePickerSection: View {
|
||||
let isSelected = config.engineMode == id
|
||||
return Button {
|
||||
guard config.engineMode != id else { return }
|
||||
if id == "cloud", !config.hasAcknowledgedCloudSharing {
|
||||
pendingEngineSelection = id
|
||||
showCloudAcknowledgment = true
|
||||
return
|
||||
}
|
||||
selectEngine(id)
|
||||
} label: {
|
||||
HStack(spacing: Spacing.sm) {
|
||||
@@ -92,8 +75,7 @@ struct EnginePickerSection: View {
|
||||
.foregroundStyle(palette.accent)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal, Spacing.md)
|
||||
.frame(minHeight: SettingsListMetrics.doubleLineMinHeight)
|
||||
.settingsListRow()
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
@@ -104,19 +86,10 @@ struct EnginePickerSection: View {
|
||||
config.engineMode = id
|
||||
if id == "cloud" {
|
||||
config.modeId = "polish"
|
||||
if config.providerId == "deepseek" {
|
||||
config.apply(preset: LLMProvider.provider(id: "openai"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func applyPendingEngineSelection() {
|
||||
guard let id = pendingEngineSelection else { return }
|
||||
pendingEngineSelection = nil
|
||||
selectEngine(id)
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
private func engineMark(assetName: String?, systemIcon: String?, isSelected: Bool) -> some View {
|
||||
ZStack {
|
||||
|
||||
Reference in New Issue
Block a user