Fieldset
複数の Field をグループ化するネイティブ <fieldset>/<legend> コンテナです。<fieldset disabled> の HTML 標準挙動(内側の全コントロールが自動的に無効化される)を前提に、disabled を各 Field へ OR 伝播し、invalid はグループ単位でのみ表現します。
fandhe-frontend-headless-ui の fieldset mod が提供する構造・アクセシビリティ(WAI-ARIA・キーボード操作)・表示状態(data-*)のみを持つ unstyled 部品です。fandhe-frontend-pre-styled-ui に対応するスタイル済み部品があります。Themes 版は Fieldset を参照してください。
関連 API: fandhe-frontend-headless-ui API
Demo
枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。
Features
- root(<fieldset>)/legend(<legend>)/helper_text/error_text の 4 パーツで複数の crate::field をグループ化する(ark-ui Fieldset と一致、fieldset.rs:1-9)。
- root の disabled はネイティブ <fieldset disabled> として出力し、HTML 仕様により内側の全コントロールが自動的に無効化される(fieldset.rs:8-9, 148-167)。
- disabled/invalid の 2 種の data-* 存在属性を 4 パーツすべてへ一貫して付与する。data-state/data-orientation/data-motion 等の局所操作状態・レイアウト計測の関心は出力しない(chakra-ui の Fieldset.Content はレイアウト用ラッパーであり styled 層の関心、
docs/policy/intentional-non-adoption.md§3.25 規則 2)。 - aria-describedby は invalid のとき error id、has_helper_text のとき helper id を空白区切りで合成する(field.rs と同型の合成則、fieldset.rs:123-146)。
- invalid はグループ全体のみに反映され、個別 Field の aria-invalid へは伝播しない(誤ったコントロール単位のエラー通知を避けるための意図的な判断、fieldset.rs:69-72)。
- ark-ui の Root id 自動付与(fieldset::<id>)は採らず、呼び出し側が attrs で任意付与できる。has_helper_text は ark-ui の MutationObserver による動的検知を静的フラグへ写像したものであり、呼び出し側は実際に helper_text パーツを描画するかどうかと整合させる契約を持つ(field.rs と同型)。バリデーションの実行自体は利用者側の通常の Rust コードが担う(
docs/policy/intentional-non-adoption.md§3.25 規則 1、Radix Form は不採用)。 - legend_with_variant(variant, ...) で legend パーツへ data-variant(LegendVariant、legend/label)を語彙として出力する(イシュー #2214、shadcn/ui FieldLegend の variant prop 突合)。既存 legend は data-variant を出力しない契約のまま不変。見た目(フォントサイズ)は pre-styled-ui 層の責務で headless 層は語彙のみを持つ(
docs/policy/intentional-non-adoption.md§3.25 規則 2)。
Anatomy
root
legend
helper-text
error-textAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
props.id | &str | — | ベース id。legend/helper_text/error_text の派生 id 生成に使う(fieldset.rs:60-62)。 |
props.disabled | bool | false | true のとき root(<fieldset>)へネイティブ disabled + data-disabled を付与する(fieldset.rs:63-66)。 |
props.invalid | bool | false | true のとき root へ data-invalid を付与し、error_text を表示状態にする(fieldset.rs:67-72)。 |
props.has_helper_text | bool | false | aria-describedby の合成に helper id を含めるかどうか(fieldset.rs:73-74, 123-146)。 |
merge_field_props(field) | FieldProps -> FieldProps | — | Fieldset の disabled を内包する FieldProps へ OR 伝播する(invalid は伝播しない、fieldset.rs:106-121)。 |
legend_with_variant(variant, ...) | LegendVariant | Legend | legend の代わりに使う。data-variant(legend/label)を出力する(イシュー #2214)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
error-text | data-invalid | (値なし) |
legend | data-disabled | (値なし) |
legend | data-invalid | (値なし) |
legend | data-variant | label |
root | data-disabled | (値なし) |
root | data-invalid | (値なし) |
Examples
Invalid group
invalid な Fieldset と error_text の組み立て例です。
invalid な Fieldset(aria-describedby が error_text のみを指す例)の組み立て例です。
自前 CSS の最小例
data-scope / data-part / data-disabled / data-invalid 属性セレクタで見た目を組み立てる最小例です。
利用者が data-scope / data-part / data-disabled / data-invalid 属性セレクタで自前 CSS を当てる最小例です。headless-ui 自体はスタイルを持ちません。
CSS
[data-scope="fieldset"][data-part="root"] {
border: 1px solid #888;
border-radius: 4px;
padding: 0.75rem;
}
[data-scope="fieldset"][data-part="legend"] {
font-weight: 600;
padding: 0 0.25rem;
}
[data-scope="fieldset"][data-part="root"][data-disabled] {
opacity: 0.5;
}
[data-scope="fieldset"][data-part="root"][data-invalid] {
border-color: #dc2626;
}
[data-scope="fieldset"][data-part="error-text"] {
color: #dc2626;
font-size: 0.875rem;
}
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Tab | fieldset 自体は独自のキー操作を持たない(参照サイトの ark-ui / chakra-ui も同様)。内包コントロール間の移動はネイティブの Tab 順に従い、<fieldset disabled> のとき内側のコントロールは HTML 仕様により tab 順から外れる(fieldset.rs::root)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| aria-describedby | root パーツへ、invalid のとき error id・has_helper_text のとき helper id を合成して付与する(fieldset.rs:123-146)。 |
| role="alert" / aria-live="polite" | error_text パーツへ固定付与する。role="alert" の暗黙 aria-live="assertive" は明示 polite で上書きされるため両者は併用でき、読み上げの割り込み度合いは polite のまま shadcn/ui FieldError とのロール語彙パリティを純追加する(fieldset.rs:205-209、イシュー #2184)。 |
| <fieldset> + <legend>(ネイティブ命名) | legend を root 内の先頭に置くことで HTML 仕様がグループのアクセシブルネームを構成し、追加の aria-labelledby / role を付与しない(ark-ui と一致、fieldset.rs モジュール doc「legend 連携」節)。 |