Capítulo 23 de 108
InputGroup embeds icons, text, buttons, kbd hints, dropdowns, or spinners directly inside an input or textarea's visual boundary, replacing the plain Input/Textarea with group-aware variants (InputGroupInput, InputGroupTextarea) plus positioned InputGroupAddon slots.
InputGroupInput / InputGroupTextarea: drop-in replacements for Input/Textarea inside a group; pre-styled and share data-slot="input-group-control" for unified focus handling. All native input/textarea props pass through.InputGroupAddon: positions content relative to the control via align: "inline-start" (default) | "inline-end" | "block-start" | "block-end". Inline aligns pair with InputGroupInput; block aligns pair with InputGroupTextarea.InputGroupAddon must be placed after the input/textarea in the DOM regardless of visual align position, this is required for correct focus navigation.InputGroupButton: button styled for embedding inside an addon; size: xs | icon-xs | sm | icon-sm (default xs), variant same set as Button (default ghost).InputGroupText: plain text/label content inside an addon (e.g. a static https:// prefix).InputGroupAddon can contain several InputGroupButtons or icons together.<InputGroup className="max-w-xs">
<InputGroupInput placeholder="Search..." />
<InputGroupAddon>
<Search />
</InputGroupAddon>
<InputGroupAddon align="inline-end">12 results</InputGroupAddon>
</InputGroup>
<InputGroup>
<InputGroupTextarea placeholder="Enter message..." />
<InputGroupAddon align="block-end">
<InputGroupButton>Send</InputGroupButton>
</InputGroupAddon>
</InputGroup>
block-end), padrão de chat input.<InputGroupAddon>
<InputGroupButton>Button</InputGroupButton>
<InputGroupButton>Button</InputGroupButton>
</InputGroupAddon>
<InputGroupButton size="icon-xs" aria-label="Copy">
<CopyIcon />
</InputGroupButton>
aria-label.| Component | Prop | Type | Default |
|---|---|---|---|
InputGroup | className | string | |
InputGroupAddon | align | "inline-start" | "inline-end" | "block-start" | "block-end" | "inline-start" |
InputGroupButton | size | "xs" | "icon-xs" | "sm" | "icon-sm" | "xs" |
InputGroupButton | variant | "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "ghost" |
InputGroupInput | (all Input props pass through) | ||
InputGroupTextarea | (all Textarea props pass through) |
InputGroup
├── InputGroupInput or InputGroupTextarea
├── InputGroupAddon
├── InputGroupButton
└── InputGroupText
InputGroupAddon before the input/textarea in the DOM: breaks focus navigation even if align="inline-start" makes it look correct visually.block-start/block-end with InputGroupInput (or inline-* with InputGroupTextarea): mismatched, block aligns are for textarea, inline for single-line input.Input/Textarea inside InputGroup: use InputGroupInput/InputGroupTextarea instead, they carry the required group styling and focus data-slot.Kbd hints, DropdownMenu triggers, and Spinner as addon content (documented in dedicated sub-sections beyond this summary), same addon/align mechanics apply.Input's own docs for anything beyond a bare text field (prefixes, icons, inline buttons).InputGroupButton defaults to ghost variant and small sizes since it lives inside a bordered group, not as a standalone CTA.InputGroup is the escape hatch when a plain Input isn't enough.InputGroupButton shares the same variant vocabulary as Button.