English

ボタン

6 つのバリアントと 3 つのサイズから選べるボタンです。

実行結果

button.rs
use hypersig::html::{div, p, span};
use hypersig::style::pattern::{stack, wrap};
use hypersig::style::value::rem;
use hypersig::{Page, Signals};
use hypersig_ui::{ButtonSize, ButtonVariant, button, icon_button};
use serde::{Deserialize, Serialize};

#[derive(Signals, Serialize, Deserialize)]
pub struct Buttons {
    clicks: i32,
}

pub fn page() -> Page<Buttons> {
    let clicks = Buttons::clicks();
    let count = clicks.set(clicks + 1);
    let variants = [
        (ButtonVariant::Default, "Default"),
        (ButtonVariant::Secondary, "Secondary"),
        (ButtonVariant::Outline, "Outline"),
        (ButtonVariant::Ghost, "Ghost"),
        (ButtonVariant::Destructive, "Destructive"),
        (ButtonVariant::Link, "Link"),
    ];
    Page::new(
        "ボタン",
        Buttons { clicks: 0 },
    )
    .child(
        div()
            .css(stack(rem(1)))
            .child(div().css(wrap(rem(0.5))).children(variants.into_iter().map(
                |(variant, text)| {
                    button(variant, ButtonSize::Default)
                        .on_click(count.clone())
                        .text(text)
                },
            )))
            .child(
                div()
                    .css(wrap(rem(0.5)))
                    .child(
                        button(ButtonVariant::Outline, ButtonSize::Sm).text("小"),
                    )
                    .child(
                        button(ButtonVariant::Outline, ButtonSize::Lg).text("大"),
                    )
                    .child(
                        button(ButtonVariant::Outline, ButtonSize::Default)
                            .attr("disabled", "")
                            .text("無効"),
                    )
                    .child(
                        icon_button(
                            ButtonVariant::Outline,
                            "追加",
                        )
                        .text("+"),
                    ),
            )
            .child(
                p().text("クリックした回数: ")
                .child(span().bind_text(clicks.to_text()))
                .text(" 回"),
            ),
    )
}

アクセシビリティ

どれもネイティブの <button> です。そのため Enter と Space で押せて、スクリーンリーダーもボタンとして読み上げます。button は type="button" を持つので、囲んでいるフォームを送信しません。フォームを送信するのは submit_button です。どちらも El::disabled で無効にでき、無効の間は薄く表示されます。

アイコンボタンにはテキストがないので、icon_button はボタンの名前になるラベルを引数に取ります。button_style は、リンクのようなボタン以外の要素に同じ見た目を与えます。

キー動作
Enter、Spaceボタンを押します。

API

項目概要
buttonvariant と size を指定した <button type="button">
submit_button囲んでいるフォームを送信する、variant と size を指定した <button type="submit">
icon_buttonアイコンだけを表示し、label を名前に持つ正方形のボタン
button_style<button> 以外の要素に使う、variant と size を指定したボタンのスタイル
ButtonVariantボタンの見た目
ButtonSizeボタンの高さと余白