import { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display"; import { FormField, Segmented, ToggleGroup, ToggleGroupItem } from "@godxjp/ui/data-entry"; import { Button, Text, VisuallyHidden } from "@godxjp/ui/general"; import { Flex, PageContainer } from "@godxjp/ui/layout"; import { CalendarDays, Columns3, LayoutList, Monitor, Moon, Sun } from "lucide-react"; /** * Segmented — one-of-N from a small, closed, always-visible set. The enterprise Segmented drawn on Radix * RadioGroup: a recessed track with the chosen item as a lifted slab, radiogroup semantics, arrow * keys between members. The track measures exactly --control-height, so it sits level with an * Input or a Button on the same row. */ export default function Demo() { const [theme, setTheme] = useState("system"); const [view, setView] = useState("list"); const [range, setRange] = useState("week"); return ( ラベルのみ 選択肢が 2〜4 個で、すべて画面に出せるときは Select ではなくこちら。ひとつは必ず 選ばれている状態なので、ToggleGroup ではなく radiogroup として読み上げられます。 選択中: {range} アイコン付き `icon` は aria-hidden で描かれ、読み上げ名は `label` のままです。 4 択 + 件数(スマホ幅では折り返す) 一覧の上の状態フィルター。4 つが 1 行に収まらない幅では、トラックが 2 行目に折り返し ます。ラベルも件数も切り詰めません。`check:segmented-wrap` がこのカードを測ります。 size · vertical · block size は 4 段(xs 24px / sm 28px / md 32px / lg 36px)。トラックの高さは --control-height そのもので、MobileShell のようにその変数をスコープする領域では 自動的にタッチ段(44px)になります。vertical では 1 行ぶんが 1 コントロールの高さになります。横 1 行のときだけトラック 内側の余白を引くので、積んだときは引きません。block は幅いっぱいに広げます。 24px の密な行 · size="xs" 行の高さが 24px に決まっている監査ログや明細ツールバーでは、xs のトラックがそのまま収まる。同じ段の ToggleGroup size="xs" と Button size="xs" と高さが一致するので、行が段差にならない。ここで xs が無かったころは Button を並べて自作するしかなく、radiogroup の読み上げも矢印キーも失われていた。 一覧 ボード いずれも --control-height-xs(24px)。 短い記号を出して、長い名前を読ませる `label` は ReactNode なので、見える記号を aria-hidden にして VisuallyHidden に 読み上げ名を置けます。専用の prop は要りません。○ と読み上げられても意味が伝わらない ため、色や記号だけに意味を持たせないという WCAG 1.4.1 の要求そのものです。 実施 ), }, { value: "warn", label: ( <> 要改善 ), }, { value: "none", label: ( <> 未実施 ), }, ]} /> フォームの中で `name` を渡すとネイティブフォームで送信されます。無効化は選択肢ごとにも、グループ 全体にもかけられます。 ); }