slint-ui-system 0.5.0

Neon Design System — Slint UI components for Rust desktop apps. 35+ components, dark/light theme, neon accents.
import { LineEdit, TextEdit } from "std-widgets.slint";
import { Theme } from "../theme.slint";

export component NeonInput {
    in-out property <string> text;
    in property <string> placeholder: "";
    in property <string> label: "";
    in property <string> hint: "";
    in property <bool> has-error: false;
    in property <bool> enabled: true;
    in property <bool> has-focus: false;

    forward-focus: input;

    VerticalLayout {
        spacing: Theme.sp-1;
        if (root.label != "") : Text {
            text: root.label;
            font-size: Theme.font-sm;
            color: root.enabled ? Theme.text-muted : Theme.text-dim;
        }
        Rectangle {
            min-height: 36px;
            background: root.enabled ? Theme.bg-surface : Theme.bg-elevated;
            border-radius: Theme.radius-md;
            border-width: 1px;
            border-color: root.has-error ? Theme.neon-red :
                          root.has-focus ? Theme.border-focus :
                          Theme.border;
            opacity: root.enabled ? 1.0 : 0.4;
            HorizontalLayout {
                padding-left: Theme.sp-3;
                padding-right: Theme.sp-3;
                alignment: start;
                input := LineEdit {
                    text <=> root.text;
                    placeholder-text: root.placeholder;
                    font-size: Theme.font-base;
                    horizontal-stretch: 1;
                    enabled: root.enabled;
                }
            }
        }
        if (root.hint != "") : Text {
            text: root.hint;
            font-size: Theme.font-xs;
            color: root.has-error ? Theme.neon-red : (root.enabled ? Theme.text-dim : Theme.text-dim);
        }
    }
}

export component NeonSearchInput {
    in-out property <string> text;
    in property <string> placeholder: "Search…";
    in property <string> label: "";
    in property <string> hint: "";
    in property <bool> has-error: false;
    in property <bool> enabled: true;
    in property <bool> has-focus: false;

    NeonInput {
        text <=> root.text;
        placeholder: root.placeholder;
        label: root.label;
        hint: root.hint;
        has-error: root.has-error;
        enabled: root.enabled;
        has-focus: root.has-focus;
    }
}

export component NeonTextArea {
    in-out property <string> text;
    in property <string> placeholder: "";
    in property <string> label: "";
    in property <string> hint: "";
    in property <bool> has-error: false;
    in property <bool> enabled: true;
    in property <bool> has-focus: false;

    VerticalLayout {
        spacing: Theme.sp-1;
        if (root.label != "") : Text {
            text: root.label;
            font-size: Theme.font-sm;
            color: root.enabled ? Theme.text-muted : Theme.text-dim;
        }
        Rectangle {
            min-height: 80px;
            background: root.enabled ? Theme.bg-surface : Theme.bg-elevated;
            border-radius: Theme.radius-md;
            border-width: 1px;
            border-color: root.has-error ? Theme.neon-red :
                          root.has-focus ? Theme.border-focus :
                          Theme.border;
            opacity: root.enabled ? 1.0 : 0.4;
            TextEdit {
                text <=> root.text;
                font-size: Theme.font-base;
                padding: Theme.sp-2;
                vertical-stretch: 1;
                enabled: root.enabled;
            }
        }
        if (root.hint != "") : Text {
            text: root.hint;
            font-size: Theme.font-xs;
            color: root.has-error ? Theme.neon-red : Theme.text-dim;
        }
    }
}