ruitl 0.2.2

Template compiler for type-safe, server-rendered HTML components in Rust
Documentation
// Syntax showcase — every feature in one Button.
//
// NOT compiled by build.rs. This is reference material, not drop-in code.
// It exercises every RUITL construct (props, defaults, optional props,
// attribute expressions, conditional rendering, if-let) in a single
// component so you can scan the whole surface area quickly.
//
// For a compilable Button, see `examples/demo_templates/DemoButton.ruitl`
// (used by `examples/server_integration.rs`).

import "std::collections" { HashMap }

component Button {
    props {
        text: String,
        variant: String = "primary",
        size: String = "medium",
        disabled: bool = false,
        icon: String?,
        loading: bool = false,
        onclick: String?,
    }
}

ruitl Button(props: ButtonProps) {
    <button
        class={format!("btn btn-{} btn-{}", props.variant, props.size)}
        disabled?={props.disabled || props.loading}
        onclick={props.onclick.as_deref().unwrap_or("")}
        type="button"
    >
        if props.loading {
            <span class="spinner" aria-hidden="true"></span>
            <span class="sr-only">Loading...</span>
        } else {
            if let Some(icon) = &props.icon {
                <i class={format!("icon icon-{}", icon)} aria-hidden="true"></i>
            }
            <span class="btn-text">{props.text}</span>
        }
    </button>
}