iOS: per-setting sync table with sync icons, dropdowns, colour resets

Generalise the two-tier SettingsSync into a server-driven flag map: each
syncable key has an account-wide flag (fetched from the server); pull applies
only on-flagged keys, push (read-modify-write) sends only on-flagged keys plus
the flag map. Per-row link icon toggles a setting's sync; a global switch flips
all. Enabling a flag adopts this device's current value as the shared one.

- AppSettings: fix bg_color mapping (was background_color), add cache_months,
  month_view_paged, sync_flags
- SettingsView: uniform rows (sync icon | name | value), ContrastSelector and
  the button pickers replaced by menu dropdowns, every colour gets a reset to a
  canonical default, global "sync all" toggle; account settings (privacy,
  group calendar, hide profile) kept in their own block; language and text/line
  contrast kept device-local (iOS-specific)
- unify default line colour to #3A3A52 across views

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-14 21:31:16 +02:00
co-authored by Claude Opus 4.8
parent d4fd7beaf7
commit 9a50f25f57
8 changed files with 468 additions and 431 deletions
+14
View File
@@ -81,6 +81,13 @@ private let strings: [String: [String: String]] = [
"settings.sync": "Einstellungen synchronisieren",
"settings.sync.desc": "Darstellung mit dem Server abgleichen",
"settings.sync.footer": "Wenn aktiv, werden Farben, Kontraste und Stundenhöhe mit dem Server abgeglichen (der Server hat Vorrang). Ansicht, erster Wochentag und das Ausgrauen vergangener Termine werden immer synchronisiert – auch wenn der Schalter aus ist.",
"settings.sync_all": "Alle synchronisieren",
"settings.sync_all.desc": "Diese Einstellungen zwischen deinen Geräten teilen",
"settings.sync_this": "Zwischen Geräten synchronisieren",
"settings.reset": "Zurücksetzen",
"settings.appearance": "Ansicht",
"settings.device": "Nur auf diesem Gerät",
"settings.device.footer": "Diese Einstellungen gelten nur auf diesem Gerät und werden nicht synchronisiert.",
"settings.cache.header": "Vorladen",
"settings.cache.title": "Vorladen",
@@ -440,6 +447,13 @@ private let strings: [String: [String: String]] = [
"settings.sync": "Sync settings",
"settings.sync.desc": "Keep appearance in sync with the server",
"settings.sync.footer": "When on, colors, contrasts and hour height sync with the server (the server wins). View, first weekday and dimming past events always sync – even when the switch is off.",
"settings.sync_all": "Sync all",
"settings.sync_all.desc": "Share these settings across your devices",
"settings.sync_this": "Sync across devices",
"settings.reset": "Reset",
"settings.appearance": "View",
"settings.device": "This device only",
"settings.device.footer": "These settings apply to this device only and are not synced.",
"settings.cache.header": "Preloading",
"settings.cache.title": "Preloading",