Pular para o conteúdo

Customization

foundations specs/foundations/customization.kmd

How users + developers personalize Koder UI without leaving the design system. Material parity (`/foundations/customization`). Covers the axes available (style × scheme × density × motion × i18n × layout density × accessibility prefs), where each persists, who the audience is, and what's NOT customizable per surface.

Quando esta spec se aplica

Triggers primários

Todos os triggers

Corpo da especificação

Spec — Customization

Facet Visual do Koder Design. Material parity: https://m3.material.io/foundations/customization.

Customization axes (canonical 8)

Every Koder app exposes the same 8 axes in Settings (where applicable), with the same default values and the same persistence pattern. Spec per axis lives in linked references; this doc catalogs them.

AxisDefaultSpec
UI style (forma/densidade)material3themes/ui-style.kmd
Color scheme (paleta)defaultthemes/color-schemes.kmd
Theme mode (claro/escuro)systemthemes/light-dark.kmd
Language (i18n)device localei18n/contract.kmd
Voice / wake-wordOFF (except barge-in)voice/wake-word.kmd
Error reportingOFF (opt-in)errors/reporting.kmd
Auto-updateONkoder-app/behaviors.kmd §4
Densitycomfortablethemes/ui-style.kmd

R1 — One Settings page, consistent shape

Every Koder app's Settings page has the SAME section order:

  1. Appearance (UI style, color scheme, theme mode, density)
  2. Language (locale picker, ICU regional prefs)
  3. Notifications (per-app)
  4. Voice (wake-word, barge-in, hot phrases)
  5. Privacy (error reporting, telemetry opt-out, data export)
  6. Account (sign-in, sign-out, tenant switch)
  7. About (version, licenses, what's new)

Order is rigid; sections can be omitted (no Voice → skip), never reordered.

R2 — Persistence

AxisWhere it persists
Appearance + LanguagePer-surface (localStorage / Flutter SharedPreferences) — sticky per device
VoicePer-app (same storage)
PrivacyPer-app + propagated to backend audit log on opt-in
AccountServer-side (Koder ID)

R3 — System hints

When the user has not made a choice, surfaces follow system hints:

  • Theme mode: ThemeMode.system / prefers-color-scheme
  • Language: Platform.localeName / navigator.language
  • High contrast / reduced motion: OS accessibility prefs (Android View.SystemUiHints, iOS UIAccessibility, Windows SystemSettings, GNOME org.gnome.desktop.a11y, etc.)

R4 — Per-tenant vs per-user vs per-surface

ScopeExamples
Per-tenant (workspace-wide)Custom brand color, organization name, allowed login methods
Per-user (synced)Display name, notification prefs, language
Per-surface (device-local)UI style, density, theme mode, voice settings

Per-tenant customization always takes precedence over per-user; per-user always takes precedence over per-surface defaults.

R5 — What's NOT customizable

The following are deliberately fixed to preserve product identity:

  • Product logo / icon
  • Element family taxonomy (foundations/elements.kmd)
  • Canonical layouts (canonical-layouts.kmd)
  • Error message format (errors/user-facing-messages.kmd)
  • Touch target minimums (safe-area.kmd)
  • Keyboard shortcuts that conflict with OS conventions
  • Brand-color accent (varies by tenant, but the role "accent" stays)

User requests for these go through product feedback, not Settings.

R6 — Customization pickers in UI

Each axis has a canonical widget (in koder_kit):

AxisWidgetSpec ref
UI styleKoderUIStylePickerthemes/ui-style.kmd
Color schemeKoderColorSchemePicker (planned)themes/color-schemes.kmd
Theme modeKoderThemeTogglethemes/light-dark.kmd
LanguageKoderL10nSwitcheri18n/contract.kmd §R3
VoiceKodeVoiceSettingsTilevoice/wake-word.kmd
Error reportingKoderReportButton toggleerrors/reporting.kmd

R7 — Reset to defaults

Every Settings page exposes a "Reset to defaults" button in the About section. Behavior:

  • Clears all per-surface preferences (returns to system hints)
  • Per-user prefs preserved (the user owns those)
  • Per-tenant prefs unaffected (admin owns those)
  • Confirmation dialog: "Reset appearance and preferences to defaults?"
  • All axis specs above
  • koder-app/behaviors.kmd — broader app behaviors
  • policies/reuse-first.kmd — pickers come from koder_kit, not per-app

Referências