Skip to content
fandhe-frontendcore v0.4.3
GitHub

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 自体はスタイルを持ちません。

Fruits
Vegetables

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-text

API Reference

Arguments

NameTypeDefaultDescription
root(props)&CheckboxGroupProps—disabled/readonly/invalid の 3 フラグ。true のフィールドのみ data-disabled/data-readonly/data-invalid として出力される(checkbox_group.rs、イシュー #1603)。
root(orientation)Option<Orientation>NoneSome のときのみ data-orientation を付与する(aria-orientation は付与しない、checkbox_group.rs:233-235)。
root(labelled_by)Option<&str>NoneSome のときのみ 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 / childrenVec<(&str, &str)> / Vec<Node>—各パーツ共通の追加属性・子ノード(代表 1 行に集約)。

Data Attributes

PartAttributeObserved Values
itemdata-disabled(値なし)
itemdata-invalid(値なし)
itemdata-readonly(値なし)
itemdata-statechecked, unchecked
itemdata-valueapple, banana, carrot, cherry, potato
item-controldata-disabled(値なし)
item-controldata-invalid(値なし)
item-controldata-readonly(値なし)
item-controldata-statechecked, unchecked
item-indicatordata-disabled(値なし)
item-indicatordata-invalid(値なし)
item-indicatordata-readonly(値なし)
item-indicatordata-statechecked, unchecked
item-textdata-disabled(値なし)
item-textdata-invalid(値なし)
item-textdata-readonly(値なし)
item-textdata-statechecked, unchecked
rootdata-invalid(値なし)
rootdata-orientationhorizontal, vertical
rootdata-readonly(値なし)

Examples

Vertical orientation

aria-labelledby・data-orientation="vertical" を付与した例です。

縦方向 orientation・aria-labelledby 付きの Checkbox Group の組み立て例です。

Toppings

Custom CSS

自前 CSS の最小例です(data-invalid・水平 orientation 付き)。

利用者が data-scope / data-part / data-state / data-invalid / data-disabled / data-orientation 属性セレクタで自前 CSS を当てる最小例です。headless-ui 自体はスタイルを持ちません。

Toppings
CSS
[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

KeyDescription
Tab / Shift+Tab各項目のネイティブ <input type="checkbox">(item 配下の checkbox::hidden_input)がブラウザ標準の Tab ストップとして機能する。項目間移動に矢印キーは使わない(Radix Themes の RovingFocus は不採用、ark-ui も Space のみ)。
Spaceitem(<label>)配下の checkbox::hidden_input(<input type="checkbox">)が実体を担うため、ブラウザ標準のクリック委譲・トグル操作が働く(checkbox_group.rs:11-16, 266-284)。
Enterネイティブ <input type="checkbox"> は Enter でトグルしない(ブラウザ標準の挙動、フォーム送信のみに関与する)。

WAI-ARIA

AttributeDescription
role="group"root パーツへ固定付与する(checkbox_group.rs:232)。
aria-labelledbyroot の 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 是正)。