Skip to main content

The .slint File

Introduction

In Slint, you define user interfaces in the Slint language and save them in files with the .slint extension.

Each .slint file defines one or more components. Components declare a tree of elements and can be reused to build your own set of UI controls. You can use each declared component by its name in other components.

Example: Components and Elements

component MyButton inherits Text {
color: black;
// ...
}

export component MyApp inherits Window {
preferred-width: 200px;
preferred-height: 100px;
Rectangle {
width: 200px;
height: 100px;
background: green;
}
MyButton {
x: 0; y: 0;
text: "hello";
}
MyButton {
y: 0;
x: 50px;
text: "world";
}
}
  • MyButton and MyApp are components.
  • Window and Rectangle are built-in elements.
  • Components can reuse other components.

Naming Elements

You can assign names to elements using :=:

export component MyApp inherits Window {
preferred-width: 200px;
preferred-height: 100px;

hello := MyButton {
x: 0; y: 0;
text: "hello";
}
world := MyButton {
y: 0;
text: "world";
x: 50px;
}
}

Reserved Names

  • root → outermost element of a component.
  • self → current element.
  • parent → parent element.

Comments

  • Single-line: // comment
  • Multi-line: /* ... */
// Single line comment
/*
Multi-line comment
*/

Elements and Components

  • Elements → basic building blocks (e.g., Text, Rectangle).
  • Components → can be built from multiple elements.
  • Declared as: ElementName { ... }

Valid:

Text {}
Text {
}

Invalid:

Text {};

The Root Element

The root element in a .slint file must be a component.

component MyApp {
Text {
text: "Hello World";
font-size: 24px;
}
}

Properties

Set with property-name: value;.

Identifiers

  • Letters, numbers, _, or -.
  • Cannot start with number or -.
  • _ and - are considered equivalent (foo_bar = foo-bar).

Conditional Elements

Use if to create elements conditionally.

export component Example inherits Window {
preferred-width: 50px;
preferred-height: 50px;
if area.pressed : foo := Rectangle { background: blue; }
if !area.pressed : Rectangle { background: red; }
area := TouchArea {}
}

Modules (Import/Export)

By default, components are private. Use export to make them available in other files.

component ButtonHelper inherits Rectangle { }
component Button inherits Rectangle {
ButtonHelper { }
}
export { Button }

Rename on export:

component Button inherits Rectangle { }
export { Button as ColorButton }

Export directly:

export component Button inherits Rectangle { }

Import from other files:

import { Button } from "./button.slint";

Rename on import:

import { Button as CoolButton } from "../theme/button.slint";

Module Syntax

Import

import { MyButton } from "module.slint";
import { MyButton, MySwitch } from "module.slint";
import { MyButton as OtherButton } from "module.slint";

Export

export component MyButton inherits Rectangle { }
component MySwitch inherits Rectangle { }
export { MySwitch }
export { MySwitch as Alias1, MyButton as Alias2 }
export * from "other_module.slint";