アコーディオン
開閉するセクションを縦に並べたものです。一度に 1 つだけ開く形と、それぞれが独立に開く形があります。
実行結果
accordion.rs
use hypersig::html::{div, p, span};
use hypersig::style::pattern::stack;
use hypersig::style::value::rem;
use hypersig::{Page, Signals};
use hypersig_ui::{Accordion, ButtonSize, ButtonVariant, button};
use serde::{Deserialize, Serialize};
#[derive(Signals, Serialize, Deserialize)]
pub struct Faq {
helpful: i32,
}
pub fn page() -> Page<Faq> {
let helpful = Faq::helpful();
let answers = Accordion::exclusive("faq")
.item(
"JavaScript は必要ですか?",
p().text("いいえ。各セクションは <details> なので、JavaScript がなくても開きます。"),
)
.item(
"見た目を変えられますか?",
p().text("Theme でトークンを設定するか、好きな要素に Style を追加します。"),
)
.item(
"アクセシブルですか?",
p().text("ブラウザは各 summary を、セクションを開くボタンとして読み上げます。"),
);
Page::new(
"よくある質問",
Faq { helpful: 0 },
)
.child(
div().css(stack(rem(1))).child(answers).child(
p().child(
button(ButtonVariant::Outline, ButtonSize::Sm)
.on_click(helpful.set(helpful + 1))
.text("役に立った"),
)
.text(" ")
.child(span().bind_text(helpful.to_text()))
.text(" 人が役に立ったと答えました"),
),
)
}アクセシビリティ
各セクションはネイティブの <details> で、その <summary> がセクションを開閉します。キーボード操作はブラウザが扱い、各 summary は展開か折りたたみの状態を持つボタンとして読み上げられます。ページ内検索で一致した箇所が閉じたセクションにあれば、ブラウザがそのセクションを開きます。
排他的なアコーディオンはセクションに同じ name を付けるので、別のセクションが開くと、ブラウザが開いていたセクションを閉じます。
| キー | 動作 |
|---|---|
| Enter、Space | フォーカスのあるセクションを開くか閉じます。 |
API
| 項目 | 概要 |
|---|---|
Accordion::new | セクションがそれぞれ独立に開閉するアコーディオン |
Accordion::exclusive | セクションを name でまとめ、開いているセクションを多くても 1 つにするアコーディオン |
item | title をタイトルに持ち、中身が content のセクションを足します。 |