---
title: Input
description: A text input with native attributes, field integration, and two sizes.
---
import { StoryEmbed } from '/snippets/ui/StoryEmbed.mdx';
import InputReference from '/snippets/ui/generated/input/input.mdx';
`Input` renders a text input and accepts native input attributes such as `type`, `name`, `required`, `disabled`, and `autoComplete`.
## Uncontrolled state
Use `defaultValue` to set the initial email address. The input owns subsequent changes.
```tsx
import { Field, Input } from 'twenty-ui/primitives/input';
export const EmailField = () => (
EmailUse your work email address.
);
```
## Controlled state
Pass `value` and update it with `onValueChange` to own the same email address in React state. The callback receives the next string value and event details.
```tsx
import { useState } from 'react';
import { Field, Input } from 'twenty-ui/primitives/input';
export const EmailField = () => {
const [email, setEmail] = useState('alex@example.com');
return (
EmailUse your work email address.
);
};
```
## Add an adornment
`InputGroup` owns the surrounding border and sizes its input. The default size is `md`; use `sm` for a compact field. Set `size` on the group: a grouped input stretches to the group's height, so its own `size` has no visible effect.
```tsx
import { IconSearch } from 'twenty-ui/icon';
import { Input, InputGroup } from 'twenty-ui/primitives/input';
export const CompactSearch = () => (
}>
);
```
## Props
The reference includes component-specific and inherited Base UI props. Native input attributes are also accepted. A standalone input defaults to `md`; inside a group, the group's `size` applies.