--- 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 = () => ( Email Use 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 ( Email Use 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.