Drop-in semantic component. See examples, sizes, variants, and source.
Multi-line text input. Drop a textarea standalone,
or wrap it in a textarea-field for label + hint
composition. auto-resize grows the height with
content; pair a textarea-wrapper.with-counter +
data-counter="true" for character counts.
Behavior helpers ship in textarea.js.
Text Area System
Basic Text Areas - Flexible Input Structure
Please provide at least 50 characters
<div class="space-y-3">
<textarea class="textarea" placeholder="Enter your message here..." rows="4"></textarea>
<div class="textarea-field">
<label class="label">
<span>Description</span>
<span class="required">*</span>
</label>
<div class="textarea-wrapper">
<textarea class="textarea" placeholder="Describe your project..." rows="4"></textarea>
</div>
<div class="hint">
<i class="icon info w-4 h-4"></i>
<span>Please provide at least 50 characters</span>
</div>
</div>
<div class="textarea-field floating">
<div class="textarea-wrapper">
<textarea class="textarea" placeholder=" " rows="3"></textarea>
<label class="label">Comments</label>
</div>
</div>
</div>
Text Area Sizes - Consistent Scaling
<div class="space-y-3">
<div class="textarea-field xs">
<label class="label">Tiny Text Area</label>
<textarea
class="textarea"
placeholder="Tiny size - compact for short inputs..."
rows="2"
></textarea>
</div>
<div class="textarea-field sm">
<label class="label">Small Text Area</label>
<textarea class="textarea" placeholder="Small size - slightly reduced..." rows="3"></textarea>
</div>
<div class="textarea-field">
<label class="label">Default Text Area</label>
<textarea class="textarea" placeholder="Default size - standard input..." rows="4"></textarea>
</div>
<div class="textarea-field xl">
<label class="label">Large Text Area</label>
<textarea class="textarea" placeholder="Large size - more prominent..." rows="4"></textarea>
</div>
<div class="textarea-field lg">
<label class="label">Big Text Area</label>
<textarea class="textarea" placeholder="Big size - maximum prominence..." rows="5"></textarea>
</div>
</div>
<div class="space-y-3">
<h4 class="subhead-semibold mb-2">Basic Counter:</h4>
<div class="textarea-field">
<label class="label">
<span>Bio</span>
<span class="optional">(optional)</span>
</label>
<div class="textarea-wrapper with-counter">
<textarea
class="textarea"
placeholder="Tell us about yourself..."
maxlength="200"
data-counter="true"
rows="4"
>
Hello! I'm a developer who loves creating beautiful user interfaces.</textarea
>
<div class="counter">
<span class="count">72/200</span>
<span class="text-xs">CHARACTERS</span>
</div>
</div>
</div>
<h4 class="subhead-semibold mb-2 mt-4">Near Limit (Warning State):</h4>
<div class="textarea-field">
<label class="label">Tweet</label>
<div class="textarea-wrapper with-counter">
<textarea
class="textarea"
placeholder="What's happening?"
maxlength="280"
data-counter="true"
rows="3"
>
This is a really long tweet that's getting close to the character limit. We need to be careful about how much more we write here because Twitter has strict limits on tweet length and we're running out of space quickly! Almost at the limit now...</textarea
>
<div class="counter warning">
<span class="count">252/280</span>
<span class="text-xs">CHARACTERS</span>
</div>
</div>
</div>
<h4 class="subhead-semibold mb-2 mt-4">At Limit (Error State):</h4>
<div class="textarea-field error">
<label class="label">Short Message</label>
<div class="textarea-wrapper with-counter">
<textarea
class="textarea"
placeholder="Keep it brief..."
maxlength="50"
data-counter="true"
rows="2"
>
This message has reached the maximum character limit!</textarea
>
<div class="counter error">
<span class="count">50/50</span>
<span class="text-xs">MAX</span>
</div>
</div>
<div class="hint">You've reached the character limit</div>
</div>
</div>
Auto-resize - Dynamic Height Adjustment
Grows as you type:
This textarea will expand as you type (max height: 300px)
With character counter:
0/500CHARACTERS
<div class="space-y-3">
<h4 class="subhead-semibold mb-2">Grows as you type:</h4>
<div class="textarea-field">
<label class="label">Auto-resize Text Area</label>
<textarea
class="textarea auto-resize"
placeholder="Start typing and watch the textarea grow automatically..."
data-autoresize="true"
style="max-height: 300px"
rows="2"
>
Try adding more text here to see the auto-resize in action! The textarea will expand vertically as you add more content.</textarea
>
<div class="hint">This textarea will expand as you type (max height: 300px)</div>
</div>
<h4 class="subhead-semibold mb-2 mt-4">With character counter:</h4>
<div class="textarea-field">
<label class="label">Combined Features</label>
<div class="textarea-wrapper with-counter">
<textarea
class="textarea auto-resize"
placeholder="Auto-resize with character counter..."
data-autoresize="true"
data-counter="true"
maxlength="500"
style="max-height: 400px"
rows="3"
></textarea>
<div class="counter">
<span class="count">0/500</span>
<span class="text-xs">CHARACTERS</span>
</div>
</div>
</div>
</div>
Advanced Features - Complete Form Fields
Full-featured form field:
0/1000CHARACTERS
Minimum 100 characters required. Be as specific as possible.
Read-only display:
Fixed size (no resize handle):
Resize handle is disabled
<div class="space-y-3">
<h4 class="subhead-semibold mb-2">Full-featured form field:</h4>
<div class="textarea-field">
<label class="label">
<span>Project Requirements</span>
<span class="required">*</span>
<i class="info w-4 h-4" title="Describe your project requirements in detail"></i>
<span class="help">Need help?</span>
</label>
<div class="textarea-wrapper with-counter">
<textarea
class="textarea auto-resize"
placeholder="Describe your project requirements in detail..."
maxlength="1000"
data-counter="true"
data-autoresize="true"
required
rows="4"
></textarea>
<div class="counter">
<span class="count">0/1000</span>
<span class="text-xs">CHARACTERS</span>
</div>
</div>
<div class="hint">
<i class="icon info w-4 h-4"></i>
<span>Minimum 100 characters required. Be as specific as possible.</span>
</div>
</div>
<h4 class="subhead-semibold mb-2 mt-4">Read-only display:</h4>
<div class="textarea-field">
<label class="label">Terms and Conditions</label>
<textarea class="textarea readonly" readonly rows="3">
By using this service, you agree to our terms and conditions. This is a read-only field that displays important information that cannot be modified by the user. All rights reserved.</textarea
>
</div>
<h4 class="subhead-semibold mb-2 mt-4">Fixed size (no resize handle):</h4>
<div class="textarea-field">
<label class="label">Fixed Size Text Area</label>
<textarea
class="textarea no-resize"
placeholder="This textarea cannot be resized by dragging..."
rows="3"
></textarea>
<div class="hint">Resize handle is disabled</div>
</div>
</div>
Container Inheritance - Bulk Sizing
Apply size to container for all children:
Individual override:
<div class="space-y-3">
<h4 class="subhead-semibold mb-2">Apply size to container for all children:</h4>
<div class="textareas sm stack compact">
<textarea
class="textarea"
placeholder="First small textarea inherited from container..."
></textarea>
<textarea
class="textarea"
placeholder="Second small textarea inherited from container..."
></textarea>
<textarea
class="textarea"
placeholder="Third small textarea inherited from container..."
></textarea>
</div>
<h4 class="subhead-semibold mb-2 mt-4">Individual override:</h4>
<div class="textareas xl stack compact">
<textarea class="textarea" placeholder="Large size from container..."></textarea>
<textarea class="textarea xs" placeholder="Override with tiny size..."></textarea>
<textarea class="textarea" placeholder="Back to large from container..."></textarea>
</div>
</div>