TextArea
Text areas
The same field chrome as TextField around a native multiline control.
import { useState } from 'react'
import { Icon, Surface, Text, TextArea } from '@language-lit/material3-expressive'
export function TextAreaExample() {
const [feedback, setFeedback] = useState('')
return (
<Surface
as="section"
aria-labelledby="text-area-example-title"
color="surface-container-low"
shape="extra-large"
className="text-area-example"
>
<Text as="h2" id="text-area-example-title" variant="titleLarge" emphasis="emphasized">
Text areas
</Text>
<Text as="p" variant="bodyMedium">
The same field chrome as TextField around a native multiline control.
</Text>
<div className="text-area-example__row">
<TextArea
label="Feedback"
rows={4}
value={feedback}
onChange={(event) => setFeedback(event.currentTarget.value)}
supportingText="Tell us what worked and what didn't"
/>
<TextArea variant="outlined" label="Notes" rows={4} error supportingText="Required" />
</div>
<div className="text-area-example__row">
<TextArea
label="Message"
rows={4}
leadingIcon={<Icon source="edit_note" />}
trailingIcon={<Icon source="mic" />}
defaultValue="Great course, thanks!"
/>
<TextArea
label="Comments"
rows={4}
error
supportingText="This field is required"
/>
<TextArea label="Unavailable" rows={4} disabled defaultValue="Locked" />
</div>
</Surface>
)
}TextAreaは、TextFieldと同じラベル、インジケーター/アウトライン、アイコンスロット、補足/エラーテキストの装飾を使うネイティブのtextareaです。固定されたソースには専用の複数行コンポーザブルはなく、singleLine=falseのTextField/OutlinedTextFieldで単一行と複数行を同じ装飾レイヤーで扱います。Webでも別のコンポーネントツリーを重複させず、この構成に合わせています。
import { TextArea } from '@language-lit/material3-expressive'
import '@language-lit/material3-expressive/styles.css'
<TextArea
label="Feedback"
rows={4}
value={feedback}
onChange={(event) => setFeedback(event.currentTarget.value)}
supportingText="Tell us what worked and what didn't"
/>仕様
ネイティブのinputの代わりにtextareaを使う点を除き、TextFieldの仕様と同じです(TextField.mdを参照)。ネイティブのtextareaにtype属性はないため、type propもありません。rows、cols、wrap、maxLengthなど、ほかのネイティブ属性はすべてそのまま渡されます。Webで利用しやすいよう、ネイティブの縦方向リサイズ(resize: vertical)を維持します。rowsはネイティブのコンテンツ行の高さを決めます。共通のフィールドグリッドがMaterialの上下領域を加え、コンテナー全体の最低高を56pxに保ちます。自動拡張する高さは対象外です。
複数行のレイアウト
空のラベルは、すべての行の中央ではなく、通常の上側余白16pxから配置します。先頭/末尾のアイコンスロットはコンテナー全体の縦中央に置きます。これは固定された測定ポリシーにある複数行ラベル分岐と、共通のアイコン配置に従ったものです。インライン方向では、ネイティブのtextareaがTextFieldと同じ中央領域を使います。通常の端には16px、アイコン側の端には52pxを確保するため、ネイティブtextareaの余白をリセットしてもカーソルがアイコンの下に入りません。
ブロック方向も同じグリッドで管理します。filledでは24pxのラベル領域の後から入力内容が始まり、下に8pxを残します。outlinedでは上下に16pxずつ確保します。そのため、後から適用されるtextarea { padding: 0 }リセットが最初の入力行やラベルとの関係を変えることはありません。rowsやネイティブの縦リサイズで増えるのは中央のコンテンツ行で、端の領域は変わりません。
バリアント、状態、アクセシビリティ
variant="filled"とvariant="outlined"はTextFieldと同じ状態/色の仕様です。空、入力済み、フォーカス、無効、必須、不正、エラーの表示はネイティブtextareaと共通のフィールド装飾に従います。制御/非制御の値、フォーム送信/リセット、テキスト選択、ブラウザーのスペルチェック、キーボード編集もネイティブの動作です。
表示されるlabelを指定してください。補足テキストとエラーテキストはTextFieldと同様、生成された説明関係を通じてネイティブtextareaに関連付けられます。強制カラーでもフォーカス表示を維持し、モーション低減時にもアニメーションに依存せずラベルを配置します。
トークンと境界
TextAreaはTextFieldとまったく同じ--m3e-comp-text-field-*登録を使います。複数行用の独立したtext-areaトークン群はありません。これは複数行専用トークンを定義していない固定ソースに合わせています。
テーマの上書きはMaterial3Providerのスコープ内で適用されます。TextAreaは実行時スタイルを注入せず、Next.js、Vite、ルーター、アニメーションライブラリ、非公開のアプリケーションコードをインポートしません。