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:
Rocky
2026-07-11 19:10:20 +08:00
parent cdf833935a
commit cc8dd1070a
116 changed files with 6659 additions and 2634 deletions
+20 -4
View File
@@ -162,10 +162,13 @@ public enum Radius {
// MARK: - Typography
public enum SettingsListMetrics {
/// Single-line list rows (provider, footer link, picker).
public static let singleLineMinHeight: CGFloat = 52
/// Two-line rows (engine option, labeled API field).
public static let doubleLineMinHeight: CGFloat = 72
/// Floor for settings list rows (slightly above HIG 44pt).
/// Row height grows with content; this only enforces a touch-target minimum.
public static let singleLineMinHeight: CGFloat = 48
/// Horizontal inset inside a settings list row.
public static let rowHorizontalPadding: CGFloat = Spacing.md
/// Vertical inset inside a settings list row (`Spacing.sm`).
public static let rowVerticalPadding: CGFloat = 12
/// Space between a section label and its card.
public static let sectionLabelSpacing: CGFloat = Spacing.sm
}
@@ -263,6 +266,19 @@ private struct SecondaryButtonModifier: ViewModifier {
}
public extension View {
/// Standard settings list row insets: horizontal + vertical padding and a
/// touch-target floor. Height grows with content do not hand-roll
/// per-section padding/`minHeight` for ordinary settings rows.
func settingsListRow(
minHeight: CGFloat = SettingsListMetrics.singleLineMinHeight,
alignment: Alignment = .center
) -> some View {
self
.padding(.horizontal, SettingsListMetrics.rowHorizontalPadding)
.padding(.vertical, SettingsListMetrics.rowVerticalPadding)
.frame(minHeight: minHeight, alignment: alignment)
}
/// Standard card surface used in the main app.
func cardSurface(padding: CGFloat = Spacing.md) -> some View {
modifier(CardSurfaceModifier(padding: padding))