# Compose UI Conventions ## Screen Structure - Screen composables receive `NavController` + a `Controller` interface (not impl) - Controller interfaces define callbacks and state flows for the screen - **Do not use ViewModel** — this project uses Controller pattern instead - Controllers use callback lambdas passed to composables, not StateFlow for events ## Material 3 - Use Material 3 components (`androidx.compose.material3.*`) - Support dynamic color (Monet) on Android 12+ — avoid hardcoded colors - Use `MaterialTheme.colorScheme` and `MaterialTheme.typography` tokens ## State Management - Collect Flows as Compose state via `collectAsState()` or `collectAsStateWithLifecycle()` - Keep UI state in the Controller, not in the composable (except transient UI state like scroll position) - Composable functions should be stateless where possible — receive data and callbacks as parameters