跳至主要内容
💬 回報這一頁

Switch、Textarea 與 RadioGroup 表單基元三件

補齊表單的三個基本控制項。三件都沿用既有的欄位語彙:同一套邊框(--input)、 同一個聚焦環(--ring + offset)、同一種不合格態(aria-invalid--danger)。

Storybook:開關 Storybook:單選群 Storybook:長文輸入

Switch 開關:切了立即生效

開關(設定頁語境)

Switch 與 Checkbox 的分工是語意,不是外觀:

✅ 這樣做

切下去立即生效的設定用 Switch(設定頁的開關、清單的顯示模式)。

🚫 不要這樣

「送出才生效」的表單選項不要用 Switch——使用者會以為已經存了。 那種情境用 Checkbox,跟著表單一起送出。

因此 Switch 刻意沒有「已改動未送出」的琥珀態:立即生效的控制項不存在未送出狀態。 開關必須配可見的文字標籤(<Label htmlFor>)——開/關語意不靠位置與顏色單獨傳達, 標籤同時把 20px 高的軌道擴大成可點的一整列。

Textarea 長文輸入:鏡射 Input

多行文字(含不合格態)

樣式逐項鏡射 Input:邊框、聚焦環、aria-invalid、停用態全部同源, 兩者排在同一張表單裡不會出現第二套質感。只准直向調整大小resize-y)—— 橫向拉寬會破壞表單欄寬對齊。高度下限約三行;低於這個高度的自由文字,用 Input 就好。

v1 刻意不做字數計數器:需要上限時由宿主用 aria-invalid + 錯誤訊息表達 (示範見 Storybook「長文輸入」),等三個實際場景都要計數器再收進元件。

RadioGroup 單選群:垂直、可帶說明

單選群(每項含一行說明)

選中同時「填實心點」——形狀變化不只靠顏色,灰階列印與色覺障礙下仍分得出選了哪個。 鍵盤行為與 SegGroup 一致:整組只佔一個 Tab 停留點、方向鍵移動。

單選的四種載體,怎麼選

情境用什麼
2–5 個短標籤、要一眼看完SegGroup
選項標籤長、或每項需要一行說明RadioGroup(垂直)
超過 5 個、或選項動態增減Select
「唯讀 ↔ 編輯」的欄位語境EditableFieldradio 型態

取用

npx shadcn@latest add https://kielchang.github.io/dooping-design-book/r/switch.json
npx shadcn@latest add https://kielchang.github.io/dooping-design-book/r/textarea.json
npx shadcn@latest add https://kielchang.github.io/dooping-design-book/r/radio-group.json