120k

Input Group

Add addons, buttons, and helper content to inputs.

Installation

pnpm dlx shadcn@latest add @force-ui-ember/input-group

Usage

import {
  InputGroup,
  InputGroupAddon,
  InputGroupButton,
  InputGroupInput,
  InputGroupText,
  InputGroupTextarea,
} from '@/ui/input-group';
<InputGroup>
  <InputGroupInput @placeholder="Search..." />
  <InputGroupAddon>
    <SearchIcon />
  </InputGroupAddon>
</InputGroup>

Composition

Use the following composition to build an InputGroup:

InputGroup
├── InputGroupInput or InputGroupTextarea
├── InputGroupAddon
├── InputGroupButton
└── InputGroupText

Align

Use the @align argument on InputGroupAddon to position the addon relative to the input.

inline-start

Use @align="inline-start" to position the addon at the start of the input. This is the default.

inline-end

Use @align="inline-end" to position the addon at the end of the input.

block-start

Use @align="block-start" to position the addon above the input.

block-end

Use @align="block-end" to position the addon below the input.

Examples

Icon

Text

Button

Kbd

Spinner

Textarea

Custom Input

Add the data-slot="input-group-control" attribute to your custom input for automatic focus state handling.

Here's an example of a custom resizable textarea from a third-party library.

Variants

Use the @variant argument to match standalone Input variants.

API Reference

InputGroup

The main component that wraps inputs and addons.

PropTypeDefault
@variant"outline" | "filled" | "underline" | "ghost""outline"
@classstring
<InputGroup>
  <InputGroupInput />
  <InputGroupAddon />
</InputGroup>

InputGroupAddon

Displays icons, text, buttons, or other content alongside inputs.

Focus Navigation: For proper focus navigation, the InputGroupAddon component should be placed after the input. Set the @align argument to position the addon.

PropTypeDefault
@align"inline-start" | "inline-end" | "block-start" | "block-end""inline-start"
@classstring
<InputGroupAddon @align="inline-end">
  <SearchIcon />
</InputGroupAddon>

For <InputGroupInput />, use the inline-start or inline-end alignment. For <InputGroupTextarea />, use the block-start or block-end alignment.

The InputGroupAddon component can have multiple InputGroupButton components and icons.

<InputGroupAddon>
  <InputGroupButton>Button</InputGroupButton>
  <InputGroupButton>Button</InputGroupButton>
</InputGroupAddon>

InputGroupButton

Displays buttons within input groups.

PropTypeDefault
@size"xs" | "icon-xs" | "sm" | "icon-sm""xs"
@variant"default" | "destructive" | "outline" | "secondary" | "ghost" | "link""ghost"
@classstring
<InputGroupButton>Button</InputGroupButton>
<InputGroupButton @size="icon-xs" aria-label="Copy">
  <CopyIcon />
</InputGroupButton>

InputGroupInput

Replacement for <Input /> when building input groups. This component has the input group styles pre-applied and uses the unified data-slot="input-group-control" for focus state handling.

PropTypeDefault
@classstring

All other arguments are passed through to the underlying <Input /> component.

<InputGroup>
  <InputGroupInput @placeholder="Enter text..." />
  <InputGroupAddon>
    <SearchIcon />
  </InputGroupAddon>
</InputGroup>

InputGroupTextarea

Replacement for <Textarea /> when building input groups. This component has the textarea group styles pre-applied and uses the unified data-slot="input-group-control" for focus state handling.

PropTypeDefault
@classstring

All other arguments are passed through to the underlying <Textarea /> component.

<InputGroup>
  <InputGroupTextarea @placeholder="Enter message..." />
  <InputGroupAddon @align="block-end">
    <InputGroupButton>Send</InputGroupButton>
  </InputGroupAddon>
</InputGroup>

InputGroupText

Display text content within input groups.

PropTypeDefault
@classstring
<InputGroupAddon>
  <InputGroupText>$</InputGroupText>
</InputGroupAddon>