Nucleus
Window & toolkits

Quatre looks natifs

Colle à chaque desktop, par design. Un seul DecoratedWindow, quatre toolkits — macOS Liquid Glass, Fluent, Yaru, Jewel.

Nucleus livre des implémentations Compose first-party de chaque grand langage de design desktop. Le même DecoratedWindow, restylé par le module de toolkit de le choix — l'utilisateur Mac voit macOS, l'utilisateur Windows voit Fluent, l'utilisateur Ubuntu voit Yaru, et un outil type IDE prend Jewel. Plus de Material peinturé sur Win32.

TL;DR

  • Le même DecoratedWindow partout — les toolkits ne changent que le style visuel.
  • Un par OS, ou mélange libre : chaque toolkit fonctionne sur chaque plateforme.
  • On change de toolkit en changeant la dépendance Gradle, pas le UI.
  • Material 2 et Material 3 restent disponibles comme repli.

Les quatre toolkits

ToolkitNatif surModuleStatut
macOS 26macOS Tahoedecorated-window-macos26 [FACT-CHECK: artifact id]Nouveau en 2.0
FluentWindows 11decorated-window-fluent [FACT-CHECK: artifact id]Nouveau en 2.0
YaruUbuntu / GNOMEdecorated-window-yaru [FACT-CHECK: artifact id]Nouveau en 2.0
JewelCross-platformdecorated-window-jewelStable
Material 2Replidecorated-window-material2Stable
Material 3Replidecorated-window-material3Stable

[FACT-CHECK: artifact id] — les packs macOS, Fluent et Yaru sont annoncés pour la 2.0 ; les artifact ids publiés dépendent de la release finale. Jewel, Material 2 et Material 3 sont livrés aujourd'hui.

Choisis le 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()
    }
}

Matrice de couverture

CapacitémacOS 26FluentYaruJewelMaterial 3
Look natif sur l'OS hôtemacOSWindowsUbuntuN'importe (IDE)N'importe
Translucidité / effetsLiquid GlassMica / AcrylicLibAdwaitaTheme-awareSurface tones
Boutons de barre titreTraffic lightsMin/Max/CloseHeaderbar GNOMEIntelliJMaterial
Dark mode suit l'OSOuiOuiOuiOuiOui
BackendTao + AWTTao + AWTTao + AWTTao + AWTTao + AWT

Comment ça marche

Chaque module de toolkit enveloppe le même DecoratedWindow de nucleus-application et substitue ses propres TitleBarStyle et DecoratedWindowStyle. Les Composables de les écrans ne changent pas — seul le wrapper en haut de le arbre change. C'est pour ça que mixer les toolkits est bon marché : on livre un build Fluent sur macOS pour les screenshots, on livre Liquid Glass aux utilisateurs, avec le même code.

Les styles vivent dans decorated-window-core en données plates (TitleBarColors, TitleBarMetrics, DecoratedWindowMetrics). Chaque module de toolkit expose un Composable remember*Style() qui les dérive de son thème source (JewelTheme pour Jewel, MaterialTheme pour Material, etc.).

Les toolkits stylisent le chrome de la fenêtre. Les widgets à l'intérieur (boutons, listes, champs texte) restent de le choix — Material 3, Jewel, ou le propre design system. Mixe librement.

Suite