テキストフィールド
ラベルの付いたテキストフィールドです。指定すると、説明とエラーメッセージもフィールドに結び付きます。
実行結果
text_field.rs
use hypersig::html::div;
use hypersig::style::pattern::stack;
use hypersig::style::value::rem;
use hypersig::{Page, Signals, if_else};
use hypersig_ui::{Autocomplete, InputKind, NumberField, TextField};
use serde::{Deserialize, Serialize};
#[derive(Signals, Serialize, Deserialize)]
pub struct Signup {
email: String,
bio: String,
guests: i32,
}
pub fn page() -> Page<Signup> {
let email = Signup::email();
let looks_wrong = !email.is_empty().or(email.contains("@"));
let initial = Signup {
email: String::new(),
bio: String::new(),
guests: 1,
};
Page::new(
"登録",
initial,
)
.child(
div()
.css(stack(rem(1.25)).max_width(rem(24)))
.child(
TextField::new(
"メールアドレス",
email,
)
.kind(InputKind::Email)
.autocomplete(Autocomplete::Email)
.placeholder("ada@example.com")
.description("領収書をこのアドレスに送ります。")
.error(if_else(
looks_wrong,
"メールアドレスを入力してください。",
"",
))
.required(),
)
.child(
TextField::new(
"自己紹介",
Signup::bio(),
)
.multiline()
.description("プロフィールに載せる 1、2 文です。"),
)
.child(
NumberField::new(
"人数",
Signup::guests(),
)
.min(1)
.max(10)
.description("10 人まで入れられます。"),
),
)
}アクセシビリティ
テキストフィールドは <label> と <input> からできており、multiline を指定すると <input> の代わりに <textarea> になります。ラベルと入力欄を結び付ける id はシグナルのパスから作られるので、ラベルは必ず自分のフィールドを指します。aria-describedby は説明とエラーを指し、aria-invalid はエラーが空でない間 true になります。
エラーは aria-live="polite" の領域に入るので、新しいメッセージが出るとスクリーンリーダーが読み上げます。スクリーンリーダーは「必須」であることをフィールド自体から読み取るので、必須のフィールドに付くアスタリスクは読み飛ばします。autocomplete は WCAG 1.3.5 を満たすために、フィールドに何が入るかをブラウザに伝えます。
NumberField は i32 か f64 のシグナルに束縛した <input type="number"> で、ラベル、id、メッセージはテキストフィールドと同じです。min、max、step はシグナルと同じ型の値を取ります。最小値が 0 以上のフィールドは、数字のキーボードを求めます。
API
| 項目 | 概要 |
|---|---|
TextField::new | value に束縛し、label をラベルに持つ 1 行のテキストフィールド |
TextField::in_form | form の field に束縛し、label をラベルに持つ 1 行のテキストフィールド |
kind | 入力欄の type を設定します。複数行のフィールドでは無視されます。 |
multiline | フィールドを、訪問者が縦にサイズを変えられる <textarea> にします。 |
autocomplete | フィールドに何が入るかをブラウザに伝え、ブラウザが自動で入力できるようにします。 |
input_mode | inputmode と同じく、画面上のキーボードを mode にするよう求めます。 |
max_length | maxlength と同じく、count 文字より多く入力できないようにします。 |
min_length | minlength と同じく、count 文字に満たない値をブラウザが送信させないようにします。 |
placeholder | 空のフィールドに text を表示します。 |
description | フィールドの下に、aria-describedby が指す 1 行を足します。 |
error | フィールドの下に message を表示し、message が空でない間はフィールドを無効な入力として示します。 |
required | フィールドを required にします。ラベルにはアスタリスクが付きます。 |
disabled | when が true の間、フィールドを無効にします。 |
InputKind | 1 行の TextField の type |
InputMode | TextField が求める画面上のキーボードを、inputmode の値で表したもの |
NumberField::new | value に束縛し、label をラベルに持つ数値フィールド |
NumberField::in_form | form の field に束縛し、label をラベルに持つ数値フィールド |
min | ブラウザが受け付ける最小値を設定します。 |
max | ブラウザが受け付ける最大値を設定します。 |
step | 矢印キーで値が動く幅と、ブラウザが受け付ける値を設定します。 |
Numeric | NumberField を束縛できる数値の型(i32 か f64) |
Autocomplete | TextField に入る内容を、autocomplete の値で表したもの |