Nucleus
Window & toolkits

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

ToolkitNatif surArtefacts / moduleStatut
macOS 26macOS Tahoedev.nucleusframework:compose-macos-uiDisponible (v1.0.0)
FluentWindows 11dev.nucleusframework.composefluent:fluent + decorated-window-fluentDisponible (v1.0.0)
YaruUbuntu / GNOMEdev.nucleusframework.yarucompose:yaru + yaru-decorated-windowDisponible (v1.0.1)
JewelMultiplateformenucleus.decorated-window-jewelDisponible (avec Nucleus)
Material 2Replinucleus.decorated-window-material2Disponible (avec Nucleus)
Material 3Replinucleus.decorated-window-material3Disponible (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

build.gradle.kts
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.

build.gradle.kts
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.

build.gradle.kts
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.

build.gradle.kts
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()
        }
    }
}
build.gradle.kts
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