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">@</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's username"
cFormControl
placeholder="Recipient's username"
/>
<span cInputGroupText id="basic-addon2">@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>@</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">@</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 addons
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
import { InputGroupComponent } from '@coreui/angular'cInputGroupText
directive
import { InputGroupTextDirective } from '@coreui/angular'