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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user