インストール
hypersig_ui は、shadcn/ui に似た見た目を持ち、振る舞いはブラウザのネイティブ要素と WAI-ARIA Authoring Practices に従うコンポーネント集です。
クレートを追加する
次のように hypersig と並べて追加します。
Cargo.toml
[dependencies]
hypersig = "0.2"
hypersig_ui = "0.2"ページにテーマを入れる
hypersig_ui::global() と hypersig_ui::theme() を、ページに 1 回ずつ追加します。global はフォントとページの色を含む小さなリセットです。theme は、システムの設定がダークモードの訪問者に対して、色のトークンをダークの値に切り替えます。
use hypersig::{Page, Signals};
use hypersig_ui::{ButtonSize, ButtonVariant, TextField, button, card, card_content};
use serde::{Deserialize, Serialize};
#[derive(Signals, Serialize, Deserialize)]
struct Signup {
name: String,
}
let html = Page::new("Sign up", Signup { name: String::new() })
.global(hypersig_ui::global())
.theme(hypersig_ui::theme())
.child(
card().child(
card_content()
.child(TextField::new("Name", Signup::name()))
.child(button(ButtonVariant::Default, ButtonSize::Default).text("Continue")),
),
)
.render();
assert!(html.contains(r#"for="ui-name-input""#));コンポーネントの作り
- どのコンポーネントも
El<S>を返す関数か小さなビルダーなので、ほかの要素と同じようにハンドラ、スタイル、子要素を受け取ります。 - スクリーンリーダーやキーボードでの操作に要る振る舞いは、ブラウザに備わっていればブラウザのものを使います。ネイティブの
<button>、<input>、<select>、<details>、<dialog>、popoverです。ブラウザに備わっていない振る舞いは、コンポーネントが WAI-ARIA Authoring Practices に従って作り、キーボード操作はEl::roving_focusとEl::active_descendantで扱います。 - ラベルとコントロール、タブとパネルを結び付ける id は、コンポーネントが束縛するシグナルから作られます。ダイアログ、メニュー、ツールチップ、コンボボックスは名前を
constのハンドルに持ち、部品どうしでそのハンドルを共有します。id に使えない名前はコンパイルエラーになります。 - 色は shadcn/ui の zinc テーマに合わせ、WCAG 2.2 AA を満たすために 3 つの値を変えています。コントロールの境界線は 3:1 以上のコントラストを持ち、補足のテキストは muted の背景色の上でも 4.5:1 を保ち、フォーカスは forced-colors モードでも描かれる実線の outline です。
各ページのデモはこの静的サイトの中のフレームで動くので、シグナルだけを使います。リポジトリにある例 ui は全コンポーネントをサーバー付きで 1 ページに並べたもので、その E2E テストはキーボードでコンポーネントを操作します。