Design systems natifs
macOS 26, Fluent, Yaru, Jewel et Material restylent la même fenêtre Nucleus pour le langage de design de chaque bureau.
Nucleus ouvre la fenêtre OS ; les design systems stylent le chrome et les widgets. macOS 26, Fluent et Yaru sont des bibliothèques Compose Multiplatform open-source séparées sur Maven Central, chacune avec une fenêtre décorée basée sur Nucleus pour le desktop. Jewel et Material restent dans le dépôt Nucleus.
Les toolkits
| Toolkit | Natif sur | Artefacts / module | Statut |
|---|---|---|---|
| macOS 26 | macOS Tahoe | dev.nucleusframework:compose-macos-ui | Disponible (v1.0.0) |
| Fluent | Windows 11 | dev.nucleusframework.composefluent:fluent + decorated-window-fluent | Disponible (v1.0.0) |
| Yaru | Ubuntu / GNOME | dev.nucleusframework.yarucompose:yaru + yaru-decorated-window | Disponible (v1.0.1) |
| Jewel | Multiplateforme | nucleus.decorated-window-jewel | Disponible (avec Nucleus) |
| Material 2 | Repli | nucleus.decorated-window-material2 | Disponible (avec Nucleus) |
| Material 3 | Repli | nucleus.decorated-window-material3 | Disponible (avec Nucleus) |
Les trois dépôts de design system sont versionnés indépendamment de Nucleus. Épinglez-les séparément ; ils dépendent de Nucleus 2.2+ pour la fenêtre Tao sur desktop.
Galeries live :
Choisir un toolkit
plugins {
id("dev.nucleusframework")
}
dependencies {
implementation("dev.nucleusframework:compose-macos-ui:1.0.0")
}import dev.nucleusframework.application.nucleusApplication
import dev.nucleusframework.macoscompose.window.MacosDecoratedWindow
fun main() = nucleusApplication {
MacosDecoratedWindow(onCloseRequest = ::exitApplication, title = "Mail") {
// MacosTheme + composants à l'intérieur du contenu de la fenêtre
App()
}
}Voir toolkit macOS 26 et le README du dépôt.
dependencies {
implementation("dev.nucleusframework.composefluent:fluent:1.0.0")
implementation("dev.nucleusframework.composefluent:decorated-window-fluent:1.0.0")
}import dev.nucleusframework.application.nucleusApplication
import dev.nucleusframework.window.fluent.FluentDecoratedWindow
import dev.nucleusframework.window.fluent.FluentTitleBar
import io.github.composefluent.FluentTheme
fun main() = nucleusApplication {
FluentTheme {
FluentDecoratedWindow(onCloseRequest = ::exitApplication, title = "Paramètres") {
FluentTitleBar { /* … */ }
App()
}
}
}Voir toolkit Fluent et compose-fluent-ui.
dependencies {
implementation("dev.nucleusframework.yarucompose:yaru-decorated-window:1.0.1")
}import dev.nucleusframework.application.nucleusApplication
import dev.nucleusframework.yarucompose.window.YaruDecoratedWindow
fun main() = nucleusApplication {
YaruDecoratedWindow(onCloseRequest = ::exitApplication, title = "Paramètres") {
// YaruTheme doit être dans le contenu de la fenêtre
App()
}
}Voir toolkit Yaru et yaru-compose-ui.
dependencies {
implementation("dev.nucleusframework:nucleus.nucleus-application:2.5.18")
implementation("dev.nucleusframework:nucleus.decorated-window-tao:2.5.18")
implementation("dev.nucleusframework:nucleus.decorated-window-jewel:2.5.18")
}import dev.nucleusframework.application.nucleusApplication
import dev.nucleusframework.darkmodedetector.isSystemInDarkMode
import dev.nucleusframework.darkmodedetector.isSystemInDarkMode
import dev.nucleusframework.window.jewel.JewelDecoratedWindow
import dev.nucleusframework.window.jewel.JewelTitleBar
import org.jetbrains.jewel.intui.standalone.theme.IntUiTheme
fun main() = nucleusApplication {
IntUiTheme(isDark = isSystemInDarkMode()) {
JewelDecoratedWindow(onCloseRequest = ::exitApplication, title = "Outils") {
JewelTitleBar { state -> /* … */ }
MyContent()
}
}
}dependencies {
implementation("dev.nucleusframework:nucleus.nucleus-application:2.5.18")
implementation("dev.nucleusframework:nucleus.decorated-window-tao:2.5.18")
implementation("dev.nucleusframework:nucleus.decorated-window-material3:2.5.18")
}import dev.nucleusframework.application.nucleusApplication
import dev.nucleusframework.window.material.MaterialDecoratedWindow
import dev.nucleusframework.window.material.MaterialTitleBar
fun main() = nucleusApplication {
MaterialDecoratedWindow(onCloseRequest = ::exitApplication, title = "App") {
MaterialTitleBar { state -> /* … */ }
MyContent()
}
}Comment ça marche
macOS, Fluent et Yaru sont des design systems complets (widgets, thème, icônes) plus un
module de fenêtre desktop optionnel qui enveloppe le DecoratedWindow / Tao de Nucleus. Jewel
et Material dans ce dépôt sont uniquement des adaptateurs de chrome — vous choisissez
toujours la bibliothèque de widgets.
L'emplacement du thème dépend du pack. Fluent, Jewel et Material dérivent le chrome de la
fenêtre du thème ambiant : entourez donc l'appel de la fenêtre —
FluentTheme { FluentDecoratedWindow { … } } — et ils réinstallent eux-mêmes le thème dans le
contenu. JewelDecoratedWindow lit JewelTheme.globalColors et lève sans provider. Les wrappers
macOS 26 et Yaru, eux, prennent leur thème à l'intérieur du contenu de la fenêtre.
Pour une mise en page plein fenêtre sans pack de design system, utilisez
WindowScaffold sur Tao.
Et ensuite
Window & toolkits
Comment Nucleus ouvre des fenêtres desktop natives depuis Compose via le composable DecoratedWindow, le slot TitleBar et les modules de toolkit qui les restylent.
Menus contextuels
Remplacez les menus contextuels dessinés par Compose par le menu de l'OS — NSMenu sous macOS, flyout Fluent sous Windows, Adwaita ou Breeze sous Linux.