English

アコーディオン

開閉するセクションを縦に並べたものです。一度に 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 つにするアコーディオン
itemtitle をタイトルに持ち、中身が content のセクションを足します。