セレクトSelectBeta

ボタンで開く選択肢のリストを表示します。

プレビュー

他の入力欄と同じ幅で揃います。

状態とバリエーション

ラベル付き

フォーム内ではラベルと補足文を合わせて配置します。

他の入力欄と同じ幅で揃います。

グループ化

候補が多い時は optgroup で分類します。

候補が多い場合はカテゴリで整理します。

無効化

選べない理由はツールチップと補足文で伝えます。

変更が必要な場合は管理者に依頼してください。

プロパティ

表は横にスクロールできます
プロパティ初期値説明
valuestring-外部から制御する選択値です。
defaultValuestring-初期選択値です。
onChangeReact.ChangeEventHandler<HTMLSelectElement>-選択値が変わった時に呼ばれます。
disabledbooleanfalse選択できない状態にします。理由はツールチップで補足します。
classNamestring-Select はデフォルトで親幅いっぱいに広がります。幅は FormGroup や外側の max-w-* で制約します。

使い方

import * as React from "react";
import { FormControl, FormGroup, FormLabel, Select } from "@gunjo/ui";

export function OfficePicker() {
  const [office, setOffice] = React.useState("tokyo");

  return (
    <FormGroup className="w-full max-w-sm">
      <FormLabel htmlFor="office">拠点</FormLabel>
      <FormControl>
        <Select
          id="office"
          value={office}
          onChange={(event) => setOffice(event.target.value)}
        >
          <option value="tokyo">東京</option>
          <option value="osaka">大阪</option>
          <option value="fukuoka">福岡</option>
        </Select>
      </FormControl>
    </FormGroup>
  );
}

設計の判断

  • 素の select のまま出す。資料は「選択肢が4以下なら Radio、5から15なら Select、15を超えるなら Combobox」を挙げています。GUNJO の Select はその真ん中だけを引き受け、ブラウザの select をそのまま使います。開いた一覧は OS のものになるので、スマホでは端末の選択画面が出ます。検索や複数選択が要る画面は、この部品ではなく Combobox の仕事です。
  • ラベルを部品の中に入れた。資料は「ラベルは必ず枠外に常時表示する」を挙げています。label を渡すと htmlFor で結んだ文字が上に出て、description を渡すと下に補足が出て aria-describedby で結ばれます。どちらも渡さなければ包む箱ごと作らないので、表のセルのような狭い場所にもそのまま置けます。
  • 矢印は飾りとして重ねてある。appearance-none で OS の矢印を消し、pointer-events-none を付けた山形のアイコンを右に重ねています。クリックはすべて下の select に届くので、アイコンの上を押しても開きます。誤りを示す赤い枠も、専用のクラスではなく aria-invalid の属性で切り替わります。

いつ・なぜ使うか(UIXHERO)

「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。