Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Interactivity

This section covers how to make your UI respond to user input with visual feedback.

State Layer Example

The State Layer API

Guido uses a declarative state layer system for interaction feedback. Instead of manually managing hover states with signals, you declare what should change:

#![allow(unused)]
fn main() {
container()
    .background(Color::rgb(0.2, 0.2, 0.3))
    .hover_state(|s| s.lighter(0.1))      // Lighten on hover
    .pressed_state(|s| s.ripple())         // Ripple on press
}

The framework handles:

  • State tracking (hover, pressed)
  • Animations between states
  • Ripple effect rendering
  • Transform hit testing

In This Section

Why State Layers?

Before state layers, creating hover effects required manual signal management:

#![allow(unused)]
fn main() {
// Old way (tedious)
let bg_color = create_signal(Color::rgb(0.2, 0.2, 0.3));
container()
    .background(bg_color)
    .on_hover(move |hovered| {
        if hovered {
            bg_color.set(Color::rgb(0.3, 0.3, 0.4));
        } else {
            bg_color.set(Color::rgb(0.2, 0.2, 0.3));
        }
    })
}

With state layers:

#![allow(unused)]
fn main() {
// New way (clean)
container()
    .background(Color::rgb(0.2, 0.2, 0.3))
    .hover_state(|s| s.lighter(0.1))
}

Benefits:

  • Less boilerplate code
  • No manual signal management
  • Built-in animation support
  • Ripple effects included