Switch
fandhe-frontend-pre-styled-ui の switch mod が提供するスタイル済み Switch 部品です。
関連 API: fandhe-frontend-pre-styled-ui API / fandhe-frontend-headless-ui API
Demo
data-state="checked"/"unchecked" で見た目が切り替わるオン/オフ スイッチ。visually-hidden な input[type="checkbox"][role="switch"] がフォーム送信・キーボード操作の意味論を担います。
Features
size/colorPalettevariant クラスをrootへ付与し、headless-ui のswitch::rootへ委譲する。- ネイティブ
checked状態がブラウザによりaria-checkedへ自動マップされるため、本モジュールはaria-checkedを明示付与しない(二重読み上げ防止)。 readonly/invalid/requiredの各フラグをSwitchPropsで受け取り、data-*属性・ネイティブ属性へ全パーツ一律反映する(イシュー #1622)。data-invalidはcontrolパーツへ danger 色のbox-shadowリングとして反映される(イシュー #2021、shadcn/ui との突合で追加)。root_withでtrack: SwitchTrack::Shortを渡すと、つまみより細く短いトラック形状になり、つまみが上下左右へはみ出す(イシュー #3141)。SwitchTrack::Default(rootが使う既定値)では class・CSS とも出力されない opt-in 軸。thumb_iconでthumb中央に on/off アイコンを重ねられる(イシュー #3141)。checked/showの組み合わせに応じて opacity を切り替え、checked 状態で表示される on 側アイコンのみ colorPalette と連動した色になる(unchecked 側は常に中立色のまま。オフ状態を装飾色で強調しない意図的な非対称)。装飾のためaria-hidden="true"を固定する。
Anatomy
root
hidden-input
control
thumb
labelAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
size | Size | Size::Md | サイズ variant。 |
palette | ColorPalette | ColorPalette::Accent | colorPalette 軸。 |
track | SwitchTrack | SwitchTrack::Default | トラック形状 variant(root_with のみが受け取る。root は常に Default を渡す、イシュー #3141)。 |
checked | bool | false | オン/オフ状態。 |
props | &SwitchProps | — | disabled・readonly・invalid・required を束ねる構造体。全パーツへ対応する data-* を一律反映する(イシュー #1622)。 |
attrs | Vec<(&str, &str)> | — | root パーツへ合成する追加属性。 |
children | Vec<Node> | — | root 配下の子ノード(通常 hidden-input/control/label を含む)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
control | data-disabled | (値なし) |
control | data-invalid | (値なし) |
control | data-state | checked, unchecked |
hidden-input | data-disabled | (値なし) |
hidden-input | data-invalid | (値なし) |
hidden-input | data-state | checked, unchecked |
label | data-disabled | (値なし) |
label | data-invalid | (値なし) |
label | data-state | checked, unchecked |
root | data-disabled | (値なし) |
root | data-invalid | (値なし) |
root | data-state | checked, unchecked |
thumb | data-disabled | (値なし) |
thumb | data-invalid | (値なし) |
thumb | data-state | checked, unchecked |
CSS Variables
| Variable | Default |
|---|---|
--fandhe-switch-gap | var(--fandhe-space-2) |
--fandhe-switch-label-font-size | var(--fandhe-font-font-size-sm) |
--fandhe-switch-thumb-icon-color | var(--fandhe-color-fg-muted) |
--fandhe-switch-thumb-offset | 0 |
--fandhe-switch-thumb-size | 1.1rem |
--fandhe-switch-thumb-travel | 1.1rem |
--fandhe-switch-track-height | 1.4rem |
--fandhe-switch-track-width | 2.5rem |
Examples
説明文付き(label + description の合成)
switch は description 専用パートを持たない(headless anatomy に存在せず、chakra-ui も同様に呼び出し側合成のため。fandhe_frontend_pre_styled_ui::switch rustdoc「shadcn/ui との突合」節参照)。root は flex コンテナのため、label とスイッチ本体を両端揃えで並べつつ、label 下へ fg-muted + 1 段小さいフォントサイズの説明文を並べる合成例です。
枠付きボックス内での利用
shadcn/ui の Examples が示す「枠付きカード内に label/description + switch を配置する」構成を、既存 anatomy パーツと plain な <div> の合成で再現した例です(専用の複合コンポーネントは新設しない、fandhe_frontend_pre_styled_ui::switch rustdoc「本イシューのスコープ外」節参照)。
短いトラック形状
root_with へ SwitchTrack::Short を渡した例です。つまみより細く短いトラックで、つまみが上下左右へはみ出す形状になります(イシュー #3141、R1375)。
thumb アイコン
thumb の子として thumb_icon を 2 個(checked/unchecked 用)配置した例です。状態に応じてどちらか一方だけが見え、checked 側が表示されているときのみ colorPalette に連動した色になります(unchecked 側は中立色のまま、イシュー #3141、R1376)。
Accessibility
WAI-ARIA
| Attribute | Description |
|---|---|
| aria-hidden | 視覚的な表現のみを担う control/thumb パーツへ固定付与し、支援技術からの重複読み上げを防ぐ。 |
| aria-invalid | props.invalid が true のとき hidden-input パーツへ "true" を付与する。 |