Haze — Visual Effects for Compose Multiplatform
Haze is a Compose Multiplatform library providing visual effects such as blur (glassmorphism). Supports Android, Desktop (JVM), iOS, Wasm, JS/Canvas.
Available Sub-Skills
| Sub-Skill |
Use When |
haze-blur |
Configuring blur radius, tint/color effects, noise, materials (HazeMaterials/Cupertino/Fluent), progressive blur, masking, input scale |
haze-patterns |
Implementing common recipes: Scaffold blur, sticky headers, overlapping effects, dialog blur, deep hierarchies |
haze-performance |
Platform-specific backends (Android API levels, Skia/Skiko), benchmarks, optimization strategies, input scaling |
haze-custom-effects |
Building custom VisualEffect implementations, lifecycle methods, builder extensions, platform-specific rendering |
haze-faq |
Haze vs Modifier.blur, cross-platform consistency, Android version support, emulator limitations |
haze-migration |
Migrating from Haze v1.x to v2.0: dependency updates, import changes, API mapping, rename table |
Architecture
Haze v2 uses a modular architecture:
haze (core: VisualEffect, HazeState, modifiers)
├── haze-blur (blur effect)
│ └── haze-materials (pre-built styles: Material, Cupertino, Fluent)
└── haze-utils (platform utilities)
Each effect lives in its own module. Future effects (e.g., haze-liquidglass) follow the same pattern. Effects register via builder extensions on HazeEffectScope:
// Effects are set via HazeEffectScope.visualEffect property
Modifier.hazeEffect(state) {
blurEffect { style = HazeMaterials.thin() } // sets visualEffect = BlurVisualEffect
// liquidglassEffect { ... } // future: sets visualEffect = LiquidGlassEffect
}
Quick Start
// Dependencies
implementation("dev.chrisbanes.haze:haze:<version>")
implementation("dev.chrisbanes.haze:haze-blur:<version>")
implementation("dev.chrisbanes.haze:haze-materials:<version>")
// Basic background blur
val hazeState = rememberHazeState()
Box {
LazyColumn(modifier = Modifier.fillMaxSize().hazeSource(state = hazeState)) { /* content */ }
TopAppBar(
colors = TopAppBarDefaults.largeTopAppBarColors(Color.Transparent),
modifier = Modifier.hazeEffect(state = hazeState) {
blurEffect { style = HazeMaterials.thin() }
}
)
}
Core Concepts Summary
| Concept |
Description |
hazeSource |
Marks content to be blurred |
hazeEffect |
Applies visual effect to destination (omit state for foreground blur) |
HazeState |
Shared state connecting source and effect via rememberHazeState() |
zIndex |
Determines draw order for overlapping effects |
key |
Optional identifier for canDrawArea filtering |
positionStrategy |
Controls coordinate calculation (Auto/Local/Screen) |
For detailed guidance, load the appropriate sub-skill above.
1---2name: haze3description: Expert guidance on the Haze library for Compose Multiplatform visual effects (blur, glassmorphism). Use when asked about background blur, glass effects, haze setup, or any Haze-related question. This is the routing skill — load specific sub-skills for detailed guidance.4---56# Haze — Visual Effects for Compose Multiplatform78Haze is a Compose Multiplatform library providing visual effects such as blur (glassmorphism). Supports Android, Desktop (JVM), iOS, Wasm, JS/Canvas.910## Available Sub-Skills1112| Sub-Skill | Use When |13|---|---|14| `haze-blur` | Configuring blur radius, tint/color effects, noise, materials (HazeMaterials/Cupertino/Fluent), progressive blur, masking, input scale |15| `haze-patterns` | Implementing common recipes: Scaffold blur, sticky headers, overlapping effects, dialog blur, deep hierarchies |16| `haze-performance` | Platform-specific backends (Android API levels, Skia/Skiko), benchmarks, optimization strategies, input scaling |17| `haze-custom-effects` | Building custom `VisualEffect` implementations, lifecycle methods, builder extensions, platform-specific rendering |18| `haze-faq` | Haze vs Modifier.blur, cross-platform consistency, Android version support, emulator limitations |19| `haze-migration` | Migrating from Haze v1.x to v2.0: dependency updates, import changes, API mapping, rename table |2021## Architecture2223Haze v2 uses a modular architecture:2425```26haze (core: VisualEffect, HazeState, modifiers)27├── haze-blur (blur effect)28│ └── haze-materials (pre-built styles: Material, Cupertino, Fluent)29└── haze-utils (platform utilities)30```3132Each effect lives in its own module. Future effects (e.g., `haze-liquidglass`) follow the same pattern. Effects register via builder extensions on `HazeEffectScope`:3334```kotlin35// Effects are set via HazeEffectScope.visualEffect property36Modifier.hazeEffect(state) {37 blurEffect { style = HazeMaterials.thin() } // sets visualEffect = BlurVisualEffect38 // liquidglassEffect { ... } // future: sets visualEffect = LiquidGlassEffect39}40```4142## Quick Start4344```kotlin45// Dependencies46implementation("dev.chrisbanes.haze:haze:<version>")47implementation("dev.chrisbanes.haze:haze-blur:<version>")48implementation("dev.chrisbanes.haze:haze-materials:<version>")49```5051```kotlin52// Basic background blur53val hazeState = rememberHazeState()5455Box {56 LazyColumn(modifier = Modifier.fillMaxSize().hazeSource(state = hazeState)) { /* content */ }57 TopAppBar(58 colors = TopAppBarDefaults.largeTopAppBarColors(Color.Transparent),59 modifier = Modifier.hazeEffect(state = hazeState) {60 blurEffect { style = HazeMaterials.thin() }61 }62 )63}64```6566## Core Concepts Summary6768| Concept | Description |69|---|---|70| `hazeSource` | Marks content to be blurred |71| `hazeEffect` | Applies visual effect to destination (omit `state` for foreground blur) |72| `HazeState` | Shared state connecting source and effect via `rememberHazeState()` |73| `zIndex` | Determines draw order for overlapping effects |74| `key` | Optional identifier for `canDrawArea` filtering |75| `positionStrategy` | Controls coordinate calculation (Auto/Local/Screen) |7677For detailed guidance, load the appropriate sub-skill above.