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.

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:

extern crate guido;
use guido::prelude::*;
fn main() {
container()
    .background(Color::rgb(0.2, 0.2, 0.3))
    .when_hovered(|s| s.lighter(0.1))      // Lighten on hover
    .when_pressed(|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:

extern crate guido;
use guido::prelude::*;
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:

extern crate guido;
use guido::prelude::*;
fn main() {
// New way (clean)
container()
    .background(Color::rgb(0.2, 0.2, 0.3))
    .when_hovered(|s| s.lighter(0.1))
;
}

Benefits:

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