---
name: fn_theme
kind: component
lang: kt
domain: ui
version: "0.1.0"
framework: compose
purity: impure
signature: "@Composable fun FnTheme(darkMode: Boolean = true, content: @Composable () -> Unit)"
description: "Provider raiz del design system Compose del registry (@fn_compose). Envuelve MaterialTheme con un ColorScheme derivado de FnColors (Mantine v9 dark + indigo). Dark por defecto, mirror de FnMantineProvider (web) y fn::run_app ThemeMode::FnDark (C++). Toda app del registry envuelve su contenido en FnTheme."
tags: [compose, android, ui, theme, provider, material3, design-system]
props: []
emits: []
uses_functions: [fn_tokens_kt_ui]
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
output: "Aplica el ColorScheme del registry (dark o light) al arbol Composable hijo via MaterialTheme. No retorna valor; emite UI."
file_path: "kotlin/functions/ui/src/main/kotlin/fn/compose/theme/FnTheme.kt"
---

## Ejemplo

```kotlin
import fn.compose.theme.FnTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            FnTheme {                                   // darkMode = true por defecto
                Surface(modifier = Modifier.fillMaxSize()) {
                    Text("Mi app")
                }
            }
        }
    }
}

// Forzar light, o seguir el sistema:
FnTheme(darkMode = false) { /* ... */ }
FnTheme(darkMode = isSystemInDarkTheme()) { /* ... */ }
```

## Cuando usarla

Una vez por app, en el `setContent {}` de la `MainActivity` (o en cualquier `@Preview`/test de Roborazzi), envolviendo todo el árbol de UI. Es el equivalente Compose de `FnMantineProvider`. Sin `FnTheme`, los componentes caen al Material3 stock (morado) y pierden la identidad del registry.

## Gotchas

- **NUNCA `MaterialTheme {}` directo en una app.** Siempre `FnTheme {}`. `MaterialTheme` stock no aplica los tokens del registry.
- **Dark-first.** El default es `darkMode = true`, igual que el frontend web. Pasar `darkMode = false` solo para capturas light o si la app lo requiere explícitamente.
- **Composite build requerido.** Las apps consumen `FnTheme` via `includeBuild("../../kotlin/functions/ui")` con substitución `fn.compose:ui`. No es un artifact Maven publicado; cambios en el módulo recompilan las apps automáticamente.

## Capability growth log

- v0.1.0 (2026-06-03) — versión inicial. Provider MaterialTheme dark/light con ColorScheme derivado de FnColors (paleta heredada exacta de C++/Mantine). Desbloquea el scaffolder `init_kotlin_app`.
