Skip to main content

Installation

npx shadcn@latest add @eo-n/input-group

Usage

Import all parts and piece them together.
import {
  InputGroup,
  InputGroupAddon,
  InputGroupButton,
  InputGroupText,
  InputGroupInput,
} from "@/components/ui/input-group";
<InputGroup>
  <InputGroupAddon align="inline-start">
    <InputGroupText>$</InputGroupText>
  </InputGroupAddon>
  <InputGroupInput type="number" placeholder="0.00" />
  <InputGroupAddon align="inline-end">
    <InputGroupText>USD</InputGroupText>
  </InputGroupAddon>
</InputGroup>

Examples

With Icon

<InputGroup>
  <InputGroupAddon align="inline-start">
    <Search className="h-4 w-4" />
  </InputGroupAddon>
  <InputGroupInput type="search" placeholder="Search..." />
</InputGroup>

With Button

<InputGroup>
  <InputGroupInput type="email" placeholder="Enter your email" />
  <InputGroupAddon align="inline-end">
    <InputGroupButton>Subscribe</InputGroupButton>
  </InputGroupAddon>
</InputGroup>

With Multiple Addons

<InputGroup>
  <InputGroupAddon align="inline-start">
    <InputGroupText>https://</InputGroupText>
  </InputGroupAddon>
  <InputGroupInput type="url" placeholder="example.com" />
  <InputGroupAddon align="inline-end">
    <InputGroupButton size="icon-xs">
      <Copy className="h-3.5 w-3.5" />
    </InputGroupButton>
  </InputGroupAddon>
</InputGroup>

Block Start Alignment

<InputGroup>
  <InputGroupAddon align="block-start">
    <InputGroupText>Description</InputGroupText>
  </InputGroupAddon>
  <InputGroupTextarea placeholder="Enter description..." rows={4} />
</InputGroup>

Block End Alignment

<InputGroup>
  <InputGroupInput placeholder="Enter text..." />
  <InputGroupAddon align="block-end">
    <InputGroupText className="text-xs">
      {characterCount}/200 characters
    </InputGroupText>
  </InputGroupAddon>
</InputGroup>

With Clear Button

<InputGroup>
  <InputGroupInput type="search" placeholder="Search..." value={value} />
  {value && (
    <InputGroupAddon align="inline-end">
      <InputGroupButton size="icon-xs" onClick={() => setValue("")}>
        <X className="h-3.5 w-3.5" />
      </InputGroupButton>
    </InputGroupAddon>
  )}
</InputGroup>

Component API

InputGroup

Container that wraps the input and addons.
className
string
Additional CSS classes to apply to the input group container.

InputGroupAddon

Container for addon content (text, buttons, icons) around the input.
align
'inline-start' | 'inline-end' | 'block-start' | 'block-end'
default:"inline-start"
Position of the addon relative to the input:
  • inline-start: Left side (horizontal)
  • inline-end: Right side (horizontal)
  • block-start: Top (vertical)
  • block-end: Bottom (vertical)
className
string
Additional CSS classes to apply to the addon.

InputGroupButton

Button component sized for use within input groups.
size
'xs' | 'sm' | 'icon-xs' | 'icon-sm'
default:"xs"
Size variant of the button to fit within the input group.
variant
string
default:"ghost"
Visual variant of the button (inherits from Button component).
type
'button' | 'submit' | 'reset'
default:"button"
HTML button type attribute.

InputGroupText

Text content displayed within an addon.
className
string
Additional CSS classes to apply to the text element.

InputGroupInput

Input element styled for use within input groups.
className
string
Additional CSS classes to apply to the input.
...props
InputHTMLAttributes
All standard HTML input attributes are supported.

InputGroupTextarea

Textarea element styled for use within input groups.
className
string
Additional CSS classes to apply to the textarea.
...props
TextareaHTMLAttributes
All standard HTML textarea attributes are supported.

Features

  • Flexible Positioning: Place addons at start, end, top, or bottom of inputs
  • Multiple Addons: Support for multiple addons on different sides
  • Button Integration: Dedicated button component sized for input groups
  • Focus Management: Unified focus ring around the entire group
  • Error States: Coordinated error styling across the group
  • Textarea Support: Works with both single-line inputs and textareas
  • Click-to-Focus: Clicking addon areas automatically focuses the input

Accessibility

  • Uses role="group" to indicate related form controls
  • Focus states are clearly visible on the entire group
  • Error states are properly indicated with ARIA attributes
  • Buttons within groups should have appropriate labels
  • Input - Base input component
  • Textarea - Multi-line text input
  • Button - Button component for actions

Build docs developers (and LLMs) love