Checkbox Group
「0 個以上の項目が同時選択される」複数選択グループです。単一選択版の Radio Group と対称の構造を持ち、ネイティブ <input type="checkbox">(checkbox mod の hidden_input を再利用)をラベル配下へ入れ子にすることで、クリック委譲を JS なしで成立させます。
fandhe-frontend-headless-ui の checkbox_group mod が提供する構造・アクセシビリティ(WAI-ARIA・キーボード操作)・表示状態(data-*)のみを持つ unstyled 部品です。Themes 版が備える見た目は持たず、anatomy・ARIA・data-* のみを提供します。CSS は利用者が当てます。
CheckboxGroupProps(disabled/readonly/invalid)を root と各項目パーツへ渡すと data-disabled/data-readonly/data-invalid が一律出力されます。矢印キーによる項目間移動は採用せず、各項目のネイティブ <input type="checkbox"> が独立した Tab ストップになります(ark-ui Checkbox.Group と同じ設計、Radix Themes の RovingFocus とは異なります)。
スタイル済みの表示例は Checkbox Group を参照してください。
関連 API: fandhe-frontend-headless-ui API
Demo
枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。
Features
- root(div、role="group")/label/item(label)/item_control/item_indicator/item_text の 6 パーツで「0 個以上の項目が同時選択される」複数選択を表現する(checkbox_group.rs:1-7, 36-56)。
- CheckboxGroupProps(disabled/readonly/invalid)を root と item 系 4 パーツ全てへ一律注入し、data-disabled/data-readonly/data-invalid を出力する(ark-ui Checkbox.Group props 相当、イシュー #1603)。
- labelled_by が Some のときのみ aria-labelledby を付与し、名前なし関連付けを作らない(checkbox_group.rs:236-238)。
- orientation が Some のときのみ data-orientation を付与する。role="group" は WAI-ARIA 1.2 の aria-orientation Used in Roles に含まれないため、aria-orientation は付与しない(イシュー #1603 是正、radio_group〔role="radiogroup"〕とは異なる)。
- ネイティブ入力は crate::checkbox::hidden_input を item(<label>)配下へ入れ子にして再利用し、item_control 自体には role="checkbox"/aria-checked を付与しない(二重読み上げ防止、checkbox_group.rs:11-16, 297-311)。CheckboxGroup::item_hidden_input は root の invalid/readonly もネイティブ <input> の aria-invalid/data-readonly へ OR 伝播する(イシュー #1603)。
- ark-ui が付与する data-hover/data-active/data-focus は出力しない(DOM ローカルな pointer/focus 操作状態のため、SSR 静的出力の関心外)。Radix Themes の RovingFocus(矢印キーによる項目間移動)は採用しない(ネイティブ input は各項目が独立した Tab ストップであり、checkbox-group 用の roving tabindex パターンは WAI-ARIA APG に無い)。
Anatomy
root
label
item
item-control
item-indicator
item-textAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
root(props) | &CheckboxGroupProps | — | disabled/readonly/invalid の 3 フラグ。true のフィールドのみ data-disabled/data-readonly/data-invalid として出力される(checkbox_group.rs、イシュー #1603)。 |
root(orientation) | Option<Orientation> | None | Some のときのみ data-orientation を付与する(aria-orientation は付与しない、checkbox_group.rs:233-235)。 |
root(labelled_by) | Option<&str> | None | Some のときのみ aria-labelledby を付与する(label パーツの id と対で使う、checkbox_group.rs:236-238)。 |
item(checked, props, value) | bool, &CheckboxGroupProps, &str | — | 選択肢 1 個の状態と送信値。value は data-value として動的値のまま出力され既定エスケープを経由する(checkbox_group.rs:266-284)。 |
item_control(checked, props) | bool, &CheckboxGroupProps | — | 視覚的なチェックボックス外枠。item_indicator を子として渡す契約(styled recipe の中央揃えに効くため、checkbox_group.rs:297-311)。 |
attrs / children | Vec<(&str, &str)> / Vec<Node> | — | 各パーツ共通の追加属性・子ノード(代表 1 行に集約)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
item | data-disabled | (値なし) |
item | data-invalid | (値なし) |
item | data-readonly | (値なし) |
item | data-state | checked, unchecked |
item | data-value | apple, banana, carrot, cherry, potato |
item-control | data-disabled | (値なし) |
item-control | data-invalid | (値なし) |
item-control | data-readonly | (値なし) |
item-control | data-state | checked, unchecked |
item-indicator | data-disabled | (値なし) |
item-indicator | data-invalid | (値なし) |
item-indicator | data-readonly | (値なし) |
item-indicator | data-state | checked, unchecked |
item-text | data-disabled | (値なし) |
item-text | data-invalid | (値なし) |
item-text | data-readonly | (値なし) |
item-text | data-state | checked, unchecked |
root | data-invalid | (値なし) |
root | data-orientation | horizontal, vertical |
root | data-readonly | (値なし) |
Examples
Vertical orientation
aria-labelledby・data-orientation="vertical" を付与した例です。
縦方向 orientation・aria-labelledby 付きの Checkbox Group の組み立て例です。
Custom CSS
自前 CSS の最小例です(data-invalid・水平 orientation 付き)。
利用者が data-scope / data-part / data-state / data-invalid / data-disabled / data-orientation 属性セレクタで自前 CSS を当てる最小例です。headless-ui 自体はスタイルを持ちません。
[data-scope="checkbox-group"][data-part="item-control"] {
width: 1rem;
height: 1rem;
border: 1px solid #888;
border-radius: 4px;
}
[data-scope="checkbox-group"][data-part="item-control"][data-state="checked"] {
background: #2563eb;
border-color: #2563eb;
}
[data-scope="checkbox-group"][data-part="item-control"][data-invalid] {
border-color: #dc2626;
}
[data-scope="checkbox-group"][data-part="item-control"][data-focus-visible] {
outline: 2px solid #2563eb;
outline-offset: 2px;
}
[data-scope="checkbox-group"][data-part="item"][data-disabled] {
opacity: 0.5;
}
[data-scope="checkbox-group"][data-part="root"][data-orientation="horizontal"] {
flex-direction: row;
gap: 1rem;
}
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Tab / Shift+Tab | 各項目のネイティブ <input type="checkbox">(item 配下の checkbox::hidden_input)がブラウザ標準の Tab ストップとして機能する。項目間移動に矢印キーは使わない(Radix Themes の RovingFocus は不採用、ark-ui も Space のみ)。 |
| Space | item(<label>)配下の checkbox::hidden_input(<input type="checkbox">)が実体を担うため、ブラウザ標準のクリック委譲・トグル操作が働く(checkbox_group.rs:11-16, 266-284)。 |
| Enter | ネイティブ <input type="checkbox"> は Enter でトグルしない(ブラウザ標準の挙動、フォーム送信のみに関与する)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| role="group" | root パーツへ固定付与する(checkbox_group.rs:232)。 |
| aria-labelledby | root の labelled_by が Some のときのみ付与する(checkbox_group.rs:236-238)。 |
| (aria-orientation は付与しない) | WAI-ARIA 1.2 の aria-orientation Used in Roles に role="group" は含まれない(scrollbar/select/separator/slider/tablist/toolbar とその継承先のみ対象)。data-orientation は CSS セレクタが依存するため引き続き出力する(イシュー #1603 是正)。 |