Slint Kit Documentation

Layout

Wrap for Slint

KitWrap · Slint Kit 0.3.0

Layout that reflows children onto multiple lines.

Layout that reflows children onto multiple lines.
Native app built from the example below.

Try the component

Download the complete project, extract it and run cargo run --locked in its folder. Rust 1.92+; Slint Kit 0.3.0 from crates.io. You can also copy the four files below.

Click Overview, Activity, Settings, Members, Project settings: Rust handles the command and updates the action count.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitButton, KitTheme, KitThemes, KitWrap } from "@kit/kit.slint";

export enum DemoAction { overview, activity, settings, members, project-settings }

export component App inherits Window {
    title: "KitWrap example";
    preferred-width: 420px;
    preferred-height: 220px * root.theme.text-scale;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in property <string> status: "Choose an action.";
    callback action-requested(DemoAction);
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Wrap"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitWrap { KitButton { theme: root.theme; text: "Overview"; activated => { root.action-requested(DemoAction.overview); } }KitButton { theme: root.theme; text: "Activity"; activated => { root.action-requested(DemoAction.activity); } }KitButton { theme: root.theme; text: "Settings"; activated => { root.action-requested(DemoAction.settings); } }KitButton { theme: root.theme; text: "Members"; activated => { root.action-requested(DemoAction.members); } }KitButton { theme: root.theme; text: "Project settings"; activated => { root.action-requested(DemoAction.project-settings); } } }
        Text { text: root.status; color: root.theme.text-secondary; wrap: word-wrap; }
    }
}

src/main.rs

// SPDX-License-Identifier: GPL-3.0-or-later
use slint::ComponentHandle;
use std::cell::Cell;
slint::include_modules!();

fn main() -> Result<(), slint::PlatformError> {
    let app = App::new()?;
    slint_kit::init_form_validation!(self, app);
    let count = Cell::new(0_u32);
    let weak = app.as_weak();
    app.on_action_requested(move |action| {
        if let Some(app) = weak.upgrade() {
            let next = count.get().checked_add(1).expect("action count capacity");
            count.set(next);
            let label = match action {
                DemoAction::Overview => "Overview",
                DemoAction::Activity => "Activity",
                DemoAction::Settings => "Settings",
                DemoAction::Members => "Members",
                DemoAction::ProjectSettings => "Project settings",
            };
            app.set_status(format!("{label} handled by Rust ({next})").into());
        }
    });
    app.run()
}

Cargo.toml and build.rs

Cargo.toml

[package]
name = "slint-kit-wrap-example"
version = "0.1.0"
edition = "2024"
rust-version = "1.92"
license = "GPL-3.0-or-later"
publish = false

[dependencies]
slint-kit = "=0.3.0"
slint = { version = "=1.18.1", default-features = false, features = ["std", "compat-1-18", "backend-winit", "renderer-skia", "accessibility"] }

[build-dependencies]
slint-kit-build = "=0.3.0"

[workspace]

build.rs

fn main() {
    slint_kit_build::compile("ui/app.slint").expect("compile component example");
}

Files: Cargo.toml · build.rs · ui/app.slint · src/main.rs

Add ordinary children such as badges or buttons, then set gap and inset. Give the parent a finite width and enough height for the wrapped rows.

It uses FlexboxLayout with flex-wrap: wrap. Child instances remain in place during resizing, preserving focus and editor state.

Visual composition

The file below produces the screenshot. For controller-driven components, it shows the displayed state without supplying the Rust wiring. Create a project.

Show the screenshot source
Layout that reflows children onto multiple lines.
Native screenshot of the same example, rendered with Skia.
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitButton, KitTheme, KitThemes, KitWrap } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitWrap example";
    preferred-width: 420px;
    preferred-height: 220px;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in-out property <string> status;
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Wrap"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitWrap { KitButton { theme: root.theme; text: "Overview"; activated => { root.status = "Action requested"; } }KitButton { theme: root.theme; text: "Activity"; activated => { root.status = "Action requested"; } }KitButton { theme: root.theme; text: "Settings"; activated => { root.status = "Action requested"; } }KitButton { theme: root.theme; text: "Members"; activated => { root.status = "Action requested"; } }KitButton { theme: root.theme; text: "Project settings"; activated => { root.status = "Action requested"; } } }
        if root.status != "": Text { text: root.status; color: root.theme.text-secondary; font-size: 12px * root.theme.text-scale; wrap: word-wrap; }
    }
}

Download this example

Public API

Inherits FlexboxLayout.

Properties

Name Type Direction
gap LayoutSpace in
inset LayoutSpace in

Types and variants

Type Declaration
enum LayoutSpace none, tight, compact, regular, roomy, section

See also