テキストエリアTextareaBeta
テキストエリア、またはテキストエリア風のコンポーネントを表示します。
プレビュー
状態とバリエーション
ラベル付き
ラベル、入力欄、補足文を同じ幅で揃えます。
文字数カウンター
残り文字数を表示し、送信前に入力制限を確認できます。
文字数カウント(組み込み)
showCount を付けるだけでカウント表示が出ます。maxLength と併用で count / max 形式に。
バリデーションエラー
エラー時は aria-invalid と destructive 色の補足文で伝えます。
無効化
編集できない理由はツールチップと補足文で説明します。
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| label | ReactNode | - | コントロール上部に表示し htmlFor で関連付けるラベルです(Select / Checkbox と同様)。 |
| description | ReactNode | - | コントロール下の補助テキストです。aria-describedby で関連付きます。 |
| showCount | boolean | false | コントロール下に文字数を表示します。maxLength と併用すると count / max 形式になり、aria-describedby で関連付きます。 |
| value / defaultValue | string | - | 入力値です。制御・非制御のどちらでも使えます。 |
| onChange | React.ChangeEventHandler<HTMLTextAreaElement> | - | 入力内容が変わった時に呼ばれます。 |
| rows | number | - | 表示する行数です。 |
| placeholder | string | - | 未入力時に表示する補助テキストです。 |
| disabled | boolean | false | 編集できない状態にします。理由はツールチップで補足します。 |
| aria-invalid | boolean | - | 入力エラー状態を支援技術と視覚表現へ伝えます。 |
使い方
import * as React from "react";
import { FormControl, FormDescription, FormGroup, FormLabel, Textarea } from "@gunjo/ui";
const LIMIT = 120;
export function MemoField() {
const [value, setValue] = React.useState("");
return (
<FormGroup className="w-full max-w-sm">
<FormLabel htmlFor="memo">メモ</FormLabel>
<FormControl>
<Textarea
id="memo"
value={value}
onChange={(event) => setValue(event.currentTarget.value)}
maxLength={LIMIT}
rows={4}
/>
</FormControl>
<FormDescription>複数行の説明や補足を入力できます。</FormDescription>
</FormGroup>
);
}設計の判断
- 高さはクラスで決まっていて、
rowsでは変わりません。資料は「rowsでだいたいこれくらい書いてほしいという期待量を示す」を挙げています。GUNJO のTextareaはh-20(80px)を持つので、rowsを渡しても見た目の高さは変わりません。高さを変えるときはclassNameでh-32のように上書きすることになります。ここは資料の勧めをそのまま受け取れない場所です。 - 縦に伸ばす操作は塞いでいない。資料は「
resizeを CSS で殺す」を禁止に挙げています。GUNJO はresizeに一切触れていないので、ブラウザの既定どおり利用者が自分で広げられます。一方で、入力に合わせて自動で伸びる仕組みも持っていません。 - 文字数は数えるが、色は変えない。
showCountを渡すと右下に数が出て、maxLengthがあれば「いまの数と上限」の形になります。この数はaria-describedbyで入力欄に結んであるので、読み上げでも一緒に伝わります。資料が挙げる「残り20から30文字で警告色に変える」は入れていません。maxLengthを付ければブラウザ側で入力が止まるので、まず止まることを優先しました。
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。