feat(ui): add OperationStatus feedback primitive and OperationIndicator control

Foundation for long-running-operation feedback (P0-1). OperationStatus tracks
IsRunning/ShowIndicator(300ms grace)/Elapsed/IsStalled(60s since last Report)
via an injectable TimeProvider, no static timer. OperationIndicator binds a
status to the shared spinner style. Pre-provisions ops.* locale keys for
groups A and C; no ViewModel wired up yet.
This commit is contained in:
Mika Kuns
2026-08-12 08:31:38 +02:00
parent eca16a3506
commit ca65849280
6 changed files with 445 additions and 0 deletions
+50
View File
@@ -692,6 +692,56 @@
"lists": { "localSuffix": "{0} / lokal", "smartMyDay": "Mein Tag", "smartImportant": "Wichtig", "smartPlanned": "Geplant", "virtualQueue": "Warteschlange", "virtualRunning": "Läuft", "virtualReview": "Prüfung", "newList": "Neue Liste" },
"repoImport": { "loadFailed": "Gespeicherte Ordner konnten nicht geladen werden: {0}", "saveFailed": "Ordner konnten nicht gespeichert werden: {0}" }
},
"ops": {
"stalledHint": "Läuft weiter — Worker antwortet noch",
"merge": {
"merging": "Wird zusammengeführt…",
"verifying": "Verify-Kommando der Liste läuft… ({0})"
},
"review": {
"submitting": "Wird zur Prüfung eingereicht…",
"rejecting": "Wird abgelehnt…",
"parking": "Wird geparkt…",
"previewing": "Vorschau wird geladen…"
},
"worktrees": {
"refreshing": "Wird aktualisiert…",
"cleaningUp": "Abgeschlossene Worktrees werden aufgeräumt…",
"resetting": "Worktree wird zurückgesetzt…",
"forceRemoving": "Worktree wird zwangsweise entfernt…",
"batchMerging": "Merge {0}/{1}…"
},
"skills": {
"installing": "Skill wird geklont…",
"updating": "Skill wird aktualisiert…",
"restoringDefaults": "Standard-Agenten werden wiederhergestellt…"
},
"onlineInbox": {
"signingIn": "Wird angemeldet…"
},
"repoImport": {
"scanning": "Repositories werden gescannt…"
},
"updateCheck": {
"checking": "Wird nach Updates gesucht…"
},
"reports": {
"generatingWeekly": "Bericht wird erstellt…",
"runningDailyPrep": "Tagesvorbereitung läuft…"
},
"planning": {
"buildingIntegrationBranch": "Integrations-Branch wird erstellt…",
"loadingAggregate": "Kombinierte Vorschau wird geladen…",
"finalizing": "Plan wird finalisiert…",
"queuingSubtasks": "Teilaufgaben werden eingereiht…"
},
"worker": {
"startupRecovery": "Wiederherstellung läuft…",
"creatingWorktree": "Worktree wird erstellt…",
"rebasingAfterMerge": "Andere Worktrees werden rebased…",
"maintainingWorktrees": "Worktree-Wartung läuft…"
}
},
"usage": {
"pill": {
"empty": "Nutzung ",