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