feat: initial release v0.1.0
- Custom Keyboard Extension with push-to-talk UI - iOS 26 SpeechAnalyzer + DictationTranscriber (iOS 18 SF fallback) - OpenAI-compatible LLM client (4 built-in providers + custom) - 3-page onboarding flow + provider config UI - App Group shared storage for cross-process config - 8s LLM timeout with raw-transcript fallback - App Store privacy manifests for both targets - SwiftLint + XcodeGen + GitHub Actions CI - Unit tests (4/4 passing)
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
// ProviderPickerSection.swift
|
||||
// OSGKeyboard · Main App
|
||||
//
|
||||
// A picker that swaps in the right BaseURL/Model defaults for a chosen
|
||||
// provider, while letting the user override each field.
|
||||
|
||||
import SwiftUI
|
||||
import OSGKeyboardShared
|
||||
|
||||
struct ProviderPickerSection: View {
|
||||
@ObservedObject var config: ProviderConfig
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
HStack {
|
||||
Text("Provider")
|
||||
.font(.subheadline.weight(.semibold))
|
||||
.foregroundStyle(Theme.textSecondary)
|
||||
Spacer()
|
||||
}
|
||||
|
||||
Picker("Provider", selection: $config.providerId) {
|
||||
ForEach(LLMProvider.presets) { p in
|
||||
Text(p.name).tag(p.id)
|
||||
}
|
||||
}
|
||||
.pickerStyle(.menu)
|
||||
.tint(Theme.accent)
|
||||
.onChange(of: config.providerId) { _, newId in
|
||||
let preset = LLMProvider.provider(id: newId)
|
||||
config.apply(preset: preset)
|
||||
}
|
||||
}
|
||||
.cardStyle()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user