Angular Input Group Component

Input Group

Easily extend form controls by adding text, buttons, or button groups on either side of textual inputs, custom selects, and custom file inputs.

Available in Other JavaScript Frameworks

CoreUI Angular Input Group Component is also available for Bootstrap, React, and Vue. Explore framework-specific implementations below:

Basic example

Place one add-on or button on either side of an input. You may also place one on both sides of an input. Remember to place cLabel outside the input group.

import { Component } from '@angular/core';
import {
  FormControlDirective,
  FormLabelDirective,
  InputGroupComponent,
  InputGroupTextDirective
} from '@coreui/angular';

@Component({
  selector: 'docs-input-group-example',
  templateUrl: './input-group-example.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective, FormLabelDirective]
})
export class InputGroupExampleComponent {}
<c-input-group class="mb-3">
  <span cInputGroupText id="basic-addon1">&#64;</span>
  <input aria-describedby="basic-addon1"
         aria-label="Username"
         cFormControl
         placeholder="Username"
  />
</c-input-group>
<c-input-group class="mb-3">
  <input aria-describedby="basic-addon2"
         aria-label="Recipient&#39;s username"
         cFormControl
         placeholder="Recipient&#39;s username"
  />
  <span cInputGroupText id="basic-addon2">&#64;example.com</span>
</c-input-group>
<label cLabel for="basic-url">Your vanity URL</label>
<c-input-group class="mb-3">
  <span cInputGroupText id="basic-addon3">https://example.com/users/</span>
  <input aria-describedby="basic-addon3" cFormControl id="basic-url" />
</c-input-group>
<c-input-group class="mb-3">
  <span cInputGroupText>$</span>
  <input aria-label="Amount (to the nearest dollar)" cFormControl />
  <span cInputGroupText>.00</span>
</c-input-group>
<c-input-group class="mb-3">
  <input aria-label="Username" cFormControl placeholder="Username" />
  <span cInputGroupText>&#64;</span>
  <input aria-label="Server" cFormControl placeholder="Server" />
</c-input-group>
<c-input-group>
  <span cInputGroupText>With textarea</span>
  <textarea aria-label="With textarea" cFormControl></textarea>
</c-input-group>

Wrapping

Input groups wrap by default via flex-wrap: wrap in order to accommodate custom form field validation within an input group. You may disable this with .flex-nowrap.

import { Component } from '@angular/core';
import { FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-wrapping',
  templateUrl: './input-group-wrapping.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective]
})
export class InputGroupWrappingComponent {}
<c-input-group class="flex-nowrap">
  <span cInputGroupText id="addon-wrapping">&#64;</span>
  <input aria-describedby="addon-wrapping"
         aria-label="Username"
         cFormControl
         placeholder="Username"
  />
</c-input-group>

Sizing

Add the relative form sizing classes to the c-input-group itself and contents within will automatically resize—no need for repeating the form control size classes on each element.

Sizing on the individual input group elements isn’t supported.

import { Component } from '@angular/core';
import { FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-sizing',
  templateUrl: './input-group-sizing.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective]
})
export class InputGroupSizingComponent {}
<c-input-group class="mb-3" sizing="sm">
  <span cInputGroupText id="inputGroup-sizing-sm">Small</span>
  <input aria-describedby="inputGroup-sizing-sm"
         aria-label="Sizing example input"
         cFormControl
  />
</c-input-group>
<c-input-group class="mb-3">
  <span cInputGroupText id="inputGroup-sizing-default">Default</span>
  <input aria-describedby="inputGroup-sizing-default"
         aria-label="Sizing example input"
         cFormControl
  />
</c-input-group>
<c-input-group sizing="lg">
  <span cInputGroupText id="inputGroup-sizing-lg">Large</span>
  <input aria-describedby="inputGroup-sizing-lg"
         aria-label="Sizing example input"
         cFormControl
  />
</c-input-group>

Checkboxes and radios

Place any checkbox or radio option within an input group’s addon instead of text.

import { Component } from '@angular/core';
import {
  FormCheckComponent,
  FormCheckInputDirective,
  FormControlDirective,
  InputGroupComponent,
  InputGroupTextDirective
} from '@coreui/angular';

@Component({
  selector: 'docs-input-group-checkboxes-radios',
  templateUrl: './input-group-checkboxes-radios.component.html',
  imports: [
    InputGroupComponent,
    InputGroupTextDirective,
    FormCheckComponent,
    FormCheckInputDirective,
    FormControlDirective
  ]
})
export class InputGroupCheckboxesRadiosComponent {}
<c-input-group class="mb-3">
  <span cInputGroupText>
    <c-form-check>
      <input cFormCheckInput id="checkOne" type="checkbox" />
    </c-form-check>
  </span>
  <input aria-label="Text input with checkbox" cFormControl />
</c-input-group>
<c-input-group>
  <span cInputGroupText>
    <div>
      <input cFormCheckInput id="radioOne" type="radio" />
    </div>
  </span>
  <input aria-label="Text input with radio button" cFormControl />
</c-input-group>

Multiple inputs

While multiple input fields are supported visually, validation styles are only available for input groups with a single cFormControl.

import { Component } from '@angular/core';
import { FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-multiple-inputs',
  templateUrl: './input-group-multiple-inputs.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective]
})
export class InputGroupMultipleInputsComponent {}
<c-input-group>
  <span cInputGroupText>First and last name</span>
  <input aria-label="First name" cFormControl />
  <input aria-label="Last name" cFormControl />
</c-input-group>

Multiple addons

Multiple add-ons are supported and can be mixed with checkbox and radio input versions.

import { Component } from '@angular/core';
import { FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-multiple-addons',
  templateUrl: './input-group-multiple-addons.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective]
})
export class InputGroupMultipleAddonsComponent {}
<c-input-group class="mb-3">
  <span cInputGroupText>$</span>
  <span cInputGroupText>0.00</span>
  <input aria-label="Dollar amount (with dot and two decimal places)" cFormControl/>
</c-input-group>
<c-input-group>
  <input aria-label="Dollar amount (with dot and two decimal places)" cFormControl/>
  <span cInputGroupText>$</span>
  <span cInputGroupText>0.00</span>
</c-input-group>

Button addons

Button add-ons are also supported.

import { Component } from '@angular/core';
import { ButtonDirective, FormControlDirective, InputGroupComponent } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-button-addons',
  templateUrl: './input-group-button-addons.component.html',
  imports: [InputGroupComponent, ButtonDirective, FormControlDirective]
})
export class InputGroupButtonAddonsComponent {}
<c-input-group class="mb-3">
  <button cButton color="secondary" id="button-addon1" type="button" variant="outline">
    Button
  </button>
  <input aria-describedby="button-addon1"
         aria-label="Example text with button addon"
         cFormControl
         placeholder=""
  />
</c-input-group>
<c-input-group class="mb-3">
  <input aria-describedby="button-addon2"
         aria-label="Recipient's username"
         cFormControl
         placeholder="Recipient's username"
  />
  <button cButton color="secondary" id="button-addon2" type="button" variant="outline">
    Button
  </button>
</c-input-group>
<c-input-group class="mb-3">
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
  <input aria-label="Example text with two button addons" cFormControl placeholder="" />
</c-input-group>
<c-input-group>
  <input aria-label="Recipient's username with two button addons"
         cFormControl
         placeholder="Recipient's username"
  />
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
</c-input-group>

Dropdown add-ons are supported too.

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';
import {
  ButtonDirective,
  DropdownComponent,
  DropdownDividerDirective,
  DropdownItemDirective,
  DropdownMenuDirective,
  DropdownToggleDirective,
  FormControlDirective,
  InputGroupComponent
} from '@coreui/angular';

@Component({
  selector: 'docs-input-group-dropdown-addons',
  templateUrl: './input-group-dropdown-addons.component.html',
  imports: [
    InputGroupComponent,
    DropdownComponent,
    ButtonDirective,
    DropdownToggleDirective,
    DropdownMenuDirective,
    DropdownItemDirective,
    RouterLink,
    DropdownDividerDirective,
    FormControlDirective
  ]
})
export class InputGroupDropdownAddonsComponent {}
<c-input-group class="mb-3">
  <c-dropdown>
    <button cButton cDropdownToggle color="secondary" variant="outline">
      Dropdown
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
  <input aria-label="Text input with dropdown button" cFormControl/>
</c-input-group>
<c-input-group class="mb-3">
  <input aria-label="Text input with dropdown button" cFormControl/>
  <c-dropdown alignment="end">
    <button cButton cDropdownToggle color="secondary" variant="outline">
      Dropdown
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
</c-input-group>
<c-input-group>
  <c-dropdown>
    <button cButton cDropdownToggle color="secondary" variant="outline">
      Dropdown
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
  <input aria-label="Text input with 2 dropdown buttons" cFormControl/>
  <c-dropdown alignment="end">
    <button cButton cDropdownToggle color="secondary" variant="outline">
      Dropdown
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Other Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
</c-input-group>

Segmented buttons

Split dropdown add-ons are supported either.

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';
import {
  ButtonDirective,
  DropdownComponent,
  DropdownDividerDirective,
  DropdownItemDirective,
  DropdownMenuDirective,
  DropdownToggleDirective,
  FormControlDirective,
  InputGroupComponent
} from '@coreui/angular';

@Component({
  selector: 'docs-input-group-segmented-buttons',
  templateUrl: './input-group-segmented-buttons.component.html',
  imports: [
    InputGroupComponent,
    DropdownComponent,
    ButtonDirective,
    DropdownToggleDirective,
    DropdownMenuDirective,
    DropdownItemDirective,
    RouterLink,
    DropdownDividerDirective,
    FormControlDirective
  ]
})
export class InputGroupSegmentedButtonsComponent {}
<c-input-group class="mb-3">
  <c-dropdown>
    <button cButton color="secondary" variant="outline">
      Action
    </button>
    <button split cButton cDropdownToggle color="secondary" variant="outline">
      <span class="visually-hidden">Toggle Dropdown</span>
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
  <input aria-label="Text input with segmented dropdown button" cFormControl/>
</c-input-group>
<c-input-group class="mb-3">
  <input aria-label="Text input with segmented dropdown button" cFormControl/>
  <c-dropdown alignment="end">
    <button cButton color="secondary" variant="outline">
      Action
    </button>
    <button [split]="true" cButton cDropdownToggle color="secondary" variant="outline">
      <span class="visually-hidden">Toggle Dropdown</span>
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
</c-input-group>
<c-input-group>
  <c-dropdown>
    <button cButton color="secondary" type="button" variant="outline">
      Action
    </button>
    <button [split]="true" cButton cDropdownToggle color="secondary" variant="outline">
      <span class="visually-hidden">Toggle Dropdown</span>
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
  <input aria-label="Text input with segmented dropdown button" cFormControl/>
  <c-dropdown alignment="end">
    <button cButton color="secondary" variant="outline">
      Action
    </button>
    <button [split]="true" cButton cDropdownToggle color="secondary" variant="outline">
      <span class="visually-hidden">Toggle Dropdown</span>
    </button>
    <div cDropdownMenu>
      <a [routerLink] cDropdownItem>Action</a>
      <a [routerLink] cDropdownItem>Another action</a>
      <a [routerLink] cDropdownItem>Something else here</a>
      <hr cDropdownDivider>
      <a [routerLink] cDropdownItem>Separated link</a>
    </div>
  </c-dropdown>
</c-input-group>

Custom forms

Input groups include support for custom selects and custom file inputs. Browser default versions of these are not supported.

Custom select

import { Component } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { ButtonDirective, FormSelectDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-custom-select',
  templateUrl: './input-group-custom-select.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormSelectDirective, ReactiveFormsModule, ButtonDirective]
})
export class InputGroupCustomSelectComponent {}
<c-input-group class="mb-3">
  <label cInputGroupText for="inputGroupSelect01">
    Options
  </label>
  <select cSelect id="inputGroupSelect01">
    <option>Choose...</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
  </select>
</c-input-group>
<c-input-group class="mb-3">
  <select cSelect id="inputGroupSelect02">
    <option>Choose...</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
  </select>
  <label cInputGroupText for="inputGroupSelect02">
    Options
  </label>
</c-input-group>
<c-input-group class="mb-3">
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
  <select aria-label="Example select with button addon" cSelect id="inputGroupSelect03">
    <option>Choose...</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
  </select>
</c-input-group>
<c-input-group>
  <select aria-label="Example select with button addon" cSelect id="inputGroupSelect04">
    <option>Choose...</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
  </select>
  <button cButton color="secondary" type="button" variant="outline">
    Button
  </button>
</c-input-group>

Custom file input

import { Component } from '@angular/core';
import { ButtonDirective, FormControlDirective, InputGroupComponent, InputGroupTextDirective } from '@coreui/angular';

@Component({
  selector: 'docs-input-group-custom-file',
  templateUrl: './input-group-custom-file.component.html',
  imports: [InputGroupComponent, InputGroupTextDirective, FormControlDirective, ButtonDirective]
})
export class InputGroupCustomFileComponent {}
<c-input-group class="mb-3">
  <label cInputGroupText for="inputGroupFile01">
    Upload
  </label>
  <input cFormControl id="inputGroupFile01" type="file" />
</c-input-group>
<c-input-group class="mb-3">
  <input cFormControl id="inputGroupFile02" type="file" />
  <label cInputGroupText for="inputGroupFile02">
    Upload
  </label>
</c-input-group>
<c-input-group class="mb-3">
  <button cButton
          color="secondary"
          id="inputGroupFileAddon03"
          type="button"
          variant="outline">
    Button
  </button>
  <input aria-describedby="inputGroupFileAddon03"
         aria-label="Upload"
         cFormControl
         id="inputGroupFile03"
         type="file">
</c-input-group>
<c-input-group>
  <input aria-describedby="inputGroupFileAddon04"
         aria-label="Upload"
         cFormControl
         id="inputGroupFile04"
         type="file">
  <button cButton
          color="secondary"
          id="inputGroupFileAddon04"
          type="button"
          variant="outline">
    Button
  </button>
</c-input-group>

API reference

Form Module

c-input-group

component

jsx
import { InputGroupComponent } from '@coreui/angular'
PropertyDefaultType
sizing-'', 'sm', 'lg'

Size the component small or large.

cInputGroupText

directive

jsx
import { InputGroupTextDirective } from '@coreui/angular'