English

テキストフィールド

ラベルの付いたテキストフィールドです。指定すると、説明とエラーメッセージもフィールドに結び付きます。

実行結果

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::newvalue に束縛し、label をラベルに持つ 1 行のテキストフィールド
TextField::in_formform の field に束縛し、label をラベルに持つ 1 行のテキストフィールド
kind入力欄の type を設定します。複数行のフィールドでは無視されます。
multilineフィールドを、訪問者が縦にサイズを変えられる <textarea> にします。
autocompleteフィールドに何が入るかをブラウザに伝え、ブラウザが自動で入力できるようにします。
input_modeinputmode と同じく、画面上のキーボードを mode にするよう求めます。
max_lengthmaxlength と同じく、count 文字より多く入力できないようにします。
min_lengthminlength と同じく、count 文字に満たない値をブラウザが送信させないようにします。
placeholder空のフィールドに text を表示します。
descriptionフィールドの下に、aria-describedby が指す 1 行を足します。
errorフィールドの下に message を表示し、message が空でない間はフィールドを無効な入力として示します。
requiredフィールドを required にします。ラベルにはアスタリスクが付きます。
disabledwhen が true の間、フィールドを無効にします。
InputKind1 行の TextField の type
InputModeTextField が求める画面上のキーボードを、inputmode の値で表したもの
NumberField::newvalue に束縛し、label をラベルに持つ数値フィールド
NumberField::in_formform の field に束縛し、label をラベルに持つ数値フィールド
minブラウザが受け付ける最小値を設定します。
maxブラウザが受け付ける最大値を設定します。
step矢印キーで値が動く幅と、ブラウザが受け付ける値を設定します。
NumericNumberField を束縛できる数値の型(i32 か f64)
AutocompleteTextField に入る内容を、autocomplete の値で表したもの