Skip to content

InputGroup

Groups multiple inputs into a single visually connected row.

Website
https://
.com
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
placeholder="example"
value={value}
/>
<InputGroupText>.com</InputGroupText>
</InputGroup>
);
}
Price
$
USD
(args: InputGroupProps) => {
const [value, setValue] = useState<number | null>(24);
return (
<InputGroup {...args}>
<InputGroupText>$</InputGroupText>
<NumberInput
hasClear
isLabelHidden
label="Amount"
min={0}
onChange={setValue}
value={value}
/>
<InputGroupText>USD</InputGroupText>
</InputGroup>
);
}
Phone number
+1
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>+1</InputGroupText>
<TextInput
autoComplete="tel"
isLabelHidden
label="Phone number"
onChange={setValue}
placeholder="(555) 123-4567"
type="tel"
value={value}
/>
</InputGroup>
);
}
Price
(args: InputGroupProps) => {
const [amount, setAmount] = useState<number | null>(24);
const [currency, setCurrency] = useState<string | null>('USD');
return (
<InputGroup {...args}>
<NumberInput
isLabelHidden
label="Amount"
min={0}
onChange={setAmount}
value={amount}
/>
<Select
isLabelHidden
label="Currency"
onChange={setCurrency}
options={['USD', 'EUR', 'GBP']}
value={currency}
/>
</InputGroup>
);
}
Columns
Show
(args: InputGroupProps) => {
const [value, setValue] = useState<string[]>(['Name']);
return (
<InputGroup {...args}>
<InputGroupText>Show</InputGroupText>
<MultiSelect
isLabelHidden
label="Columns"
onChange={setValue}
options={['Name', 'Email', 'Role']}
value={value}
/>
</InputGroup>
);
}
Assignee
@
(args: InputGroupProps) => {
const [value, setValue] = useState<SearchableItem | null>(null);
return (
<InputGroup {...args}>
<InputGroupText>@</InputGroupText>
<AutocompleteInput
isLabelHidden
label="Person"
onChange={setValue}
placeholder="Search people"
searchSource={createStaticSearchSource(PEOPLE)}
value={value}
/>
</InputGroup>
);
}
Recipients
To
Ada Lovelace
(args: InputGroupProps) => {
const [value, setValue] = useState<SearchableItem[]>([PEOPLE[0]]);
return (
<InputGroup {...args}>
<InputGroupText>To</InputGroupText>
<TagsInput
isLabelHidden
label="People"
onChange={setValue}
placeholder="Add people"
searchSource={createStaticSearchSource(PEOPLE)}
value={value}
/>
</InputGroup>
);
}
WebsiteEnter a complete website host name.
https://
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
value={value}
/>
</InputGroup>
);
}
Website
https://
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
value={value}
/>
</InputGroup>
);
}
Website
https://
.com
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={() => {}}
value="example"
/>
<InputGroupText>.com</InputGroupText>
</InputGroup>
Size sm
https://
.com
Size md
https://
.com
Size lg
https://
.com
<div style={{display: 'flex', flexDirection: 'column', gap: 16}}>
{(['sm', 'md', 'lg'] as const).map(size => (
<InputGroup key={size} label={`Size ${size}`} size={size}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={() => {}}
placeholder="example"
value=""
/>
<InputGroupText>.com</InputGroupText>
</InputGroup>
))}
</div>
WebsiteRequired
https://
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
placeholder="example"
value={value}
/>
</InputGroup>
);
}
WebsiteOptional
https://
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
placeholder="example"
value={value}
/>
</InputGroup>
);
}
Website
https://
.com
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
placeholder="example"
value={value}
/>
<InputGroupText>.com</InputGroupText>
</InputGroup>
);
}
Website
https://
(args: InputGroupProps) => {
const [value, setValue] = useState('');
return (
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={setValue}
placeholder="example"
value={value}
/>
</InputGroup>
);
}
Date range
to
(args: InputGroupProps) => {
const [start, setStart] = useState('');
const [end, setEnd] = useState('');
return (
<InputGroup {...args}>
<TextInput
isLabelHidden
label="Start date"
onChange={setStart}
placeholder="Start"
value={start}
/>
<InputGroupText>to</InputGroupText>
<TextInput
isLabelHidden
label="End date"
onChange={setEnd}
placeholder="End"
value={end}
/>
</InputGroup>
);
}
Website
https://
<InputGroup {...args}>
<InputGroupText>https://</InputGroupText>
<TextInput
isLabelHidden
label="URL"
onChange={() => {}}
value="example.com"
/>
</InputGroup>

Groups multiple inputs into a single visually connected row.

When isOptional: false, isRequired: false

PropTypeDefaultDescription
children*ReactNode—Grouped input children to render side-by-side.
classNamestring—Additional CSS class names applied to the group wrapper.
data-testidstring—Test ID applied to the group wrapper.
descriptionReactNode—Supporting text displayed below the label.
isDisabledbooleanfalseWhether all grouped inputs are disabled.
isReadOnlybooleanfalseWhether all grouped inputs are read-only.
isLabelHiddenbooleanfalseWhether to visually hide the label.
label*string—Label text for the input group.
labelEndReactNode—Content shown at the end of the label row, such as a link. It renders outside the label, so it does not focus the control or change its accessible name. It stays visible when isLabelHidden is true.
labelTooltipReactNode—Tooltip content shown next to the label.
refRef<HTMLDivElement>—Ref forwarded to the group wrapper.
size"sm" | "md" | "lg"The enclosing Toolbar size, otherwise 'md'Visual size applied to the group and its children.
statusInputStatus—Validation status displayed below the group.
statusVariant"attached" | "detached"'attached'How the status message is positioned.
styleCSSProperties—Inline styles applied to the group wrapper.
isOptionalfalse—
isRequiredfalse—

When isOptional: true, isRequired: false

PropTypeDefaultDescription
children*ReactNode—Grouped input children to render side-by-side.
classNamestring—Additional CSS class names applied to the group wrapper.
data-testidstring—Test ID applied to the group wrapper.
descriptionReactNode—Supporting text displayed below the label.
isDisabledbooleanfalseWhether all grouped inputs are disabled.
isReadOnlybooleanfalseWhether all grouped inputs are read-only.
isLabelHiddenbooleanfalseWhether to visually hide the label.
label*string—Label text for the input group.
labelEndReactNode—Content shown at the end of the label row, such as a link. It renders outside the label, so it does not focus the control or change its accessible name. It stays visible when isLabelHidden is true.
labelTooltipReactNode—Tooltip content shown next to the label.
refRef<HTMLDivElement>—Ref forwarded to the group wrapper.
size"sm" | "md" | "lg"The enclosing Toolbar size, otherwise 'md'Visual size applied to the group and its children.
statusInputStatus—Validation status displayed below the group.
statusVariant"attached" | "detached"'attached'How the status message is positioned.
styleCSSProperties—Inline styles applied to the group wrapper.
isOptional*true—
isRequiredfalse—

When isOptional: false, isRequired: true

PropTypeDefaultDescription
children*ReactNode—Grouped input children to render side-by-side.
classNamestring—Additional CSS class names applied to the group wrapper.
data-testidstring—Test ID applied to the group wrapper.
descriptionReactNode—Supporting text displayed below the label.
isDisabledbooleanfalseWhether all grouped inputs are disabled.
isReadOnlybooleanfalseWhether all grouped inputs are read-only.
isLabelHiddenbooleanfalseWhether to visually hide the label.
label*string—Label text for the input group.
labelEndReactNode—Content shown at the end of the label row, such as a link. It renders outside the label, so it does not focus the control or change its accessible name. It stays visible when isLabelHidden is true.
labelTooltipReactNode—Tooltip content shown next to the label.
refRef<HTMLDivElement>—Ref forwarded to the group wrapper.
size"sm" | "md" | "lg"The enclosing Toolbar size, otherwise 'md'Visual size applied to the group and its children.
statusInputStatus—Validation status displayed below the group.
statusVariant"attached" | "detached"'attached'How the status message is positioned.
styleCSSProperties—Inline styles applied to the group wrapper.
isOptionalfalse—
isRequired*true—
PropTypeDefaultDescription
children*ReactNode—
classNamestring—
data-testidstring—
refRef<HTMLDivElement>—
styleCSSProperties—