Demo
DemoEverything on this page is live — the same framework, the same components, the same animation system your app ships with, rendered by this backend right now. Click around; use “On this page” to jump.
Reactive stateThe canonical reactive counter — no virtual DOM, no re-render pass. Clicking mutates exactly the text node bound to the count signal.
Count: 0
Reset
+
let count = signal!(0);
ui! {
    text { text_fmt!("Count: {}", bind!(count)) }
    button(label = "+", on_click = move || count.update(|n| *n += 1))
}
Fade toggleTween a scalar between 0.0 and 1.0. The framework writes the value to `AnimProp::Opacity` on the bound view every frame.
Toggle
let opacity = AnimatedValue::new(1.0_f32);
opacity.bind(box_ref, AnimProp::Opacity);

// On click:
opacity.animate(
    TweenTo::new(target, Duration::from_millis(300)).ease_out()
);
Spring vs tweenClick "Move" repeatedly. The tween always takes exactly 600 ms with its ease-in-out curve, even if you click again mid-flight. The spring blends velocity into the new target, so rapid clicks produce smooth handoffs.
Tween
Spring
Move
tween_x.animate(
    TweenTo::new(120.0, Duration::from_millis(600)).ease_in_out()
);
spring_x.animate(
    SpringTo::new(120.0).stiffness(140.0).damping(12.0)
);
Multi-property entranceOpacity tweens while scale and translate-y spring in parallel. Three animated values, three properties on one view, one click to choreograph the lot.
Enter
Reset
// Three values, three properties, one click.
opacity.animate(TweenTo::new(1.0, Duration::from_millis(700)).ease_out());
scale.animate(SpringTo::new(1.0).stiffness(170.0).damping(22.0));
translate_y.animate(SpringTo::new(0.0).stiffness(170.0).damping(22.0));
Color tweenAnimated values handle color too. `bind_color` writes an `(r, g, b, a)` 4-tuple to the bound view's background each frame; tweens interpolate channel-wise.
Next color
let color = AnimatedValue::new((0.353, 0.310, 0.812, 1.0));
color.bind_color(stage_ref, AnimProp::BackgroundColor);

color.animate(
    TweenTo::new(next_rgba, Duration::from_millis(500)).ease_in_out()
);
IntentsEvery themed component takes a `tone` handle — a shared vocabulary of seven semantic actions. One row per intent: a Button (Solid), a Badge (Soft), and a Tag (Outlined). The variant axis chooses the visual; the tone chooses the palette.
Primary
Primary
Primary
Secondary
Secondary
Secondary
Neutral
Neutral
Neutral
Success
Success
Success
Danger
Danger
Danger
Warning
Warning
Warning
Info
Info
Info
Button kindsAll four visual treatments for the same intent. Solid is the filled call-to-action; Soft is a tinted background; Outlined uses the intent color for the border and text; Ghost is text-only.
Solid
Soft
Outlined
Ghost
FeedbackAlerts use the same intent vocabulary as buttons — Info / Success / Warning / Danger drive the surface color and the matching icon.
Heads upThis is the Info intent.
All setYour changes have been saved.
CarefulThis action can't be undone.
Something went wrongCouldn't reach the server.
InputsAll controlled. `Field` and `Switch` take a `Signal<T>` value plus an `on_change` callback — the host owns the source of truth.
NameThis shows up on your profile.
Send me updates
TypographyTen variants on the same Typography component. The size scale is theme-tokenized so apps can retune without touching stylesheets.
DisplayHeading 1Heading 2Heading 3Body extra-large — for hero subheads.Body large.Body — the default for paragraphs.Body small.Caption for helper rowsoverline section label
On this page
Reactive state
Fade toggle
Spring vs tween
Multi-property entrance
Color tween
Intents
Button kinds
Feedback
Inputs
Typography
IdealystOne codebase, native everywhere.
© Idealyst 2026