The app always followed the OS dark/light setting with no way for the user to override it. Requesting a third toggle button in the top-right corner stack to force dark, light, or revert to system.
No feature gap — this was a missing enhancement. Theme was controlled solely by
isSystemInDarkTheme() in App.kt, with a headless-only escape via KRILL_THEME
env var / -Dkrill.theme system property.
ThemeStore interface (shared/commonMain/ui/ThemeStore.kt) with
darkThemeOverride(): Boolean? and setDarkThemeOverride(Boolean?).OnboardingStore:
JvmThemeStore (file), AndroidThemeStore (SharedPreferences),
WasmThemeStore (localStorage), IosThemeStore (NSUserDefaults).AppModule.*.kt platform DI module.App.kt: reads initial value from ThemeStore, exposes
current override + toggle callback via LocalThemeOverride composition local.
Headless env-var override still takes priority.ThemeModeToggle composable in ClientScreen.kt as the third button in the
top-right vertical stack. Cycles system (🖥) → dark (🌙) → light (☀) → system.
Active (non-null override) fills with primary color, matching ViewModeToggle
and EditModeToggle styling conventions.ThemeStore /
OnboardingStore platform-per-impl pattern — never ride transient process state.App.kt; expose it to deep children via
CompositionLocal, not prop-drilling or a global singleton.Surface(CircleShape) +
EmojiText pattern — one composable per toggle, added to the existing Column.