Checkbox
真偽値または不確定(indeterminate)の 3 値チェック状態を表すフォーム部品です。aria-checked/data-state の唯一の情報源として 3 値の型を用いるため、ARIA の偽装や不整合な値を型で防ぎます。
fandhe-frontend-headless-ui の checkbox mod が提供する構造・アクセシビリティ(WAI-ARIA・キーボード操作)・表示状態(data-*)のみを持つ unstyled 部品です。Themes 版が備える見た目(サイズ・colorPalette variant 等)は持たず、anatomy・ARIA・data-* のみを提供します。CSS は利用者が当てます。
スタイル済みの表示例は Checkbox を参照してください。
関連 API: fandhe-frontend-headless-ui API
Demo
枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。
Features
- root(<label>)/control(<div aria-hidden="true">)/indicator/label/hidden_input(<input type="checkbox">)の 5 パーツで構成し、視覚的表現(control)とアクセシビリティ実体(hidden_input)を分離する(checkbox.rs:9-14, 230-232)。
- CheckedState(Unchecked/Checked/Indeterminate)の 3 値が aria-checked/data-state 双方の唯一の情報源であり、偽装・不整合な値を型で塞ぐ(checkbox.rs:82-85)。
- indicator は CheckedState::Unchecked のとき hidden 存在属性を出力する(checkbox.rs:251-260)。
- hidden_input は CheckboxProps の disabled/invalid/required を受け取り、aria-invalid・ネイティブ存在属性へ反映する(checkbox.rs:139-153, 305-330)。
- root/control は data-focus-visible を出力できる(実フォーカスを受けるのは visually-hidden な hidden_input のため、switch と同型の hidden-input パターン)。wasm-full の focus 配線が hidden-input の focus を境界 root へ写像する(checkbox.rs:45-53、crates/wasm-full/src/focus_visible.rs:51)。
- ark-ui が付与する data-hover/data-active/data-focus は出力しない(DOM ローカルな pointer/focus 操作状態のため、SSR 静的出力の関心外。CSS 擬似クラスまたは wasm-full 配線側で表現する設計判断、data_attrs.rs の data_focus_visible/data_highlighted と同型の契約)。
Anatomy
root
control
indicator
label
hidden-inputAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
props.checked | CheckedState | CheckedState::Unchecked | 3 値のチェック状態。aria-checked と data-state 双方の唯一の情報源(checkbox.rs:82-85)。 |
props.disabled / props.invalid / props.required / props.readonly | bool | false | CheckboxProps の各フラグ(checkbox.rs:139-153)。各パーツの data-* / ネイティブ属性へ反映される(代表 1 行に集約)。 |
hidden_input(name, value) | &str, &str | — | フォーム送信名・送信値。暗黙の既定値を持たず呼び出し側が明示する(checkbox.rs:284-287)。 |
attrs / children | Vec<(&str, &str)> / Vec<Node> | — | 各パーツ共通の追加属性・子ノード(代表 1 行に集約)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
control | data-disabled | (値なし) |
control | data-invalid | (値なし) |
control | data-readonly | (値なし) |
control | data-required | (値なし) |
control | data-state | checked, indeterminate, unchecked |
hidden-input | data-disabled | (値なし) |
hidden-input | data-invalid | (値なし) |
hidden-input | data-readonly | (値なし) |
hidden-input | data-required | (値なし) |
hidden-input | data-state | checked, indeterminate, unchecked |
indicator | data-disabled | (値なし) |
indicator | data-invalid | (値なし) |
indicator | data-readonly | (値なし) |
indicator | data-required | (値なし) |
indicator | data-state | checked, indeterminate, unchecked |
label | data-disabled | (値なし) |
label | data-invalid | (値なし) |
label | data-readonly | (値なし) |
label | data-required | (値なし) |
label | data-state | checked, indeterminate, unchecked |
root | data-disabled | (値なし) |
root | data-invalid | (値なし) |
root | data-readonly | (値なし) |
root | data-required | (値なし) |
root | data-state | checked, indeterminate, unchecked |
Examples
Invalid + Required
props.invalid/props.required を立てた未チェック状態の例です。
invalid かつ required な未チェック状態の Checkbox の組み立て例です。
自前 CSS の最小例
data-scope / data-part / data-state / data-focus-visible / data-disabled 属性セレクタで見た目を組み立てる最小例です。
利用者が data-scope / data-part / data-state / data-focus-visible / data-disabled 属性セレクタで自前 CSS を当てる最小例です。headless-ui 自体はスタイルを持ちません。
[data-scope="checkbox"][data-part="control"] {
width: 1.25rem;
height: 1.25rem;
border: 1px solid #888;
border-radius: 4px;
}
[data-scope="checkbox"][data-part="control"][data-state="checked"] {
background: #2563eb;
border-color: #2563eb;
}
[data-scope="checkbox"][data-part="control"][data-state="indeterminate"] {
background: #6b7280;
border-color: #6b7280;
}
[data-scope="checkbox"][data-part="control"][data-focus-visible] {
outline: 2px solid #2563eb;
outline-offset: 2px;
}
[data-scope="checkbox"][data-part="root"][data-disabled] {
opacity: 0.5;
}
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Space | hidden_input が実際に <input type="checkbox"> を出力するため、ブラウザ標準のチェックボックストグル操作が働く(checkbox.rs:14-15, 305-330)。Enter ではトグルしない(WAI-ARIA Checkbox パターン・ネイティブ input の標準挙動に準拠、Radix Primitives も同じ理由で Enter を無効化する)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| aria-checked | hidden_input へ CheckedState から算出した値("true"/"false"/"mixed")を付与する(Indeterminate のとき "mixed"、checkbox.rs:312-320)。 |
| aria-invalid | props.invalid が true のとき hidden_input へ "true" を付与する(checkbox.rs:322-324)。 |
| aria-hidden | control パーツ(視覚的表現のみを担う div)に固定付与し、支援技術からの重複読み上げを防ぐ(checkbox.rs:230-232, 240-243)。 |