feat: cursor navigation, key sounds, dictionary tooling, key security

Batch of in-progress app work from the working tree.

- feat(keyboard): CursorNavigation + CursorDragPad for caret movement;
  KeyboardSoundFeedback for system key click sounds
- feat(dictionary): DictionaryAliasGenerator + PersonalDictionaryEntrySheet;
  TranscriptPostProcessor quality gate; retire DictionaryLearner
- feat(ui): TabBarVisibility handling; drop PageHeaderRow /
  PageHeaderConfirmButton; refresh views and localizable strings
- fix(security): move the hardcoded DeepSeek key out of
  PreconfiguredKeys.swift into a gitignored PreconfiguredKeys.local.swift
  (seeded from .example by generate-xcodeproj.sh)
- docs(agents): add Conventional Commits versioning + bilingual changelog rules
- chore(gitignore): ignore PreconfiguredKeys.local.swift, .cache/, pycache

Custom language model / lexicon work stays on
feature/custom-language-model-asr. Changelog bullets added under
[Unreleased]; no version bump.
This commit is contained in:
Rocky
2026-07-05 18:27:23 +08:00
parent 074e24d87f
commit 05e005e9ce
60 changed files with 3247 additions and 1388 deletions
@@ -0,0 +1,41 @@
// KeyboardSoundFeedback.swift
// OSGKeyboard · Keyboard Extension
//
// Plays the built-in iOS keyboard click sounds so the custom bottom-row
// keys (space / return / delete) sound identical to the stock keyboard.
import UIKit
import AudioToolbox
/// `UIDevice.playInputClick()`
/// true
/// `UIInputView`
extension UIInputView: @retroactive UIInputViewAudioFeedback {
public var enableInputClicksWhenVisible: Bool { true }
}
/// / /
///
/// / `playInputClick()`
/// / `playInputClick()`
/// `1155`
/// 访
enum KeyboardSoundFeedback {
///
private static let deleteSoundID: SystemSoundID = 1155
///
@MainActor
static func keyClick() {
UIDevice.current.playInputClick()
}
///
static func deleteClick() {
// 访
// 线
DispatchQueue.global(qos: .userInteractive).async {
AudioServicesPlaySystemSound(deleteSoundID)
}
}
}