Nucleus
Window & toolkits

Four native looks

Match every desktop, by design. One DecoratedWindow Composable, four toolkits — macOS Liquid Glass, Fluent, Yaru, Jewel.

Nucleus ships first-party Compose implementations of every major desktop design language. The same DecoratedWindow Composable, restyled by the toolkit module of your choice — so a Mac user gets macOS, a Windows user gets Fluent, an Ubuntu user gets Yaru, and an IDE-like tool reaches for Jewel. No more Material paint job on Win32.

TL;DR

  • Same DecoratedWindow everywhere — toolkits only change the visual style.
  • Pick one per OS, or mix freely: every toolkit works on every platform.
  • Swap toolkits by changing the Gradle dependency, not your UI code.
  • Material 2 and Material 3 fallbacks are always available.

The four toolkits

ToolkitNative toModuleStatus
macOS 26macOS Tahoedecorated-window-macos26 [FACT-CHECK: artifact id]New in 2.0
FluentWindows 11decorated-window-fluent [FACT-CHECK: artifact id]New in 2.0
YaruUbuntu / GNOMEdecorated-window-yaru [FACT-CHECK: artifact id]New in 2.0
JewelCross-platformdecorated-window-jewelStable
Material 2Fallbackdecorated-window-material2Stable
Material 3Fallbackdecorated-window-material3Stable

[FACT-CHECK: artifact id] — the macOS, Fluent and Yaru toolkit packs are announced for 2.0; the exact published artifact ids depend on the final release. Jewel, Material 2 and Material 3 are shipping today.

Pick your toolkit

build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.nucleus-application:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-tao:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-jewel:<version>")
}
nucleusApplication {
    JewelDecoratedWindow(onCloseRequest = ::exitApplication, title = "Tools") {
        JewelTitleBar { state -> /* … */ }
        MyContent()
    }
}
build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.nucleus-application:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-tao:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-material3:<version>")
}
nucleusApplication {
    MaterialDecoratedWindow(onCloseRequest = ::exitApplication, title = "App") {
        MaterialTitleBar { state -> /* … */ }
        MyContent()
    }
}
build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.nucleus-application:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-tao:<version>")
    implementation("dev.nucleusframework:nucleus.decorated-window-material2:<version>")
}
nucleusApplication {
    MaterialDecoratedWindow(onCloseRequest = ::exitApplication, title = "App") {
        MaterialTitleBar { state -> /* … */ }
        MyContent()
    }
}

Coverage matrix

FeaturemacOS 26FluentYaruJewelMaterial 3
Native look on host OSmacOSWindowsUbuntuAny (IDE)Any
Translucency / effectsLiquid GlassMica / AcrylicLibAdwaitaTheme-awareSurface tones
Title bar buttonsTraffic lightsMin/Max/CloseGNOME headerbarIntelliJMaterial
Dark mode follow OSYesYesYesYesYes
BackendTao + AWTTao + AWTTao + AWTTao + AWTTao + AWT

How it works

Every toolkit module wraps the same DecoratedWindow from nucleus-application and substitutes its own TitleBarStyle and DecoratedWindowStyle. The Composables in your screens don't change — only the wrapper at the top of your tree does. That's why mixing toolkits is cheap: ship a Fluent build on macOS for screenshots, ship Liquid Glass for users, with the same code.

The styles live in decorated-window-core as plain data (TitleBarColors, TitleBarMetrics, DecoratedWindowMetrics). Each toolkit module exposes a remember*Style() Composable that derives them from its source-of-truth theme (Jewel's JewelTheme, Material's MaterialTheme, etc).

The toolkits style the window chrome. The widgets inside (buttons, lists, text fields) are whatever you choose — Material 3, Jewel, or your own design system. Mix and match.

Next