# Special inputs

> This document is the Markdown version of [formisch.dev/preact/guides/special-inputs/](https://formisch.dev/preact/guides/special-inputs/). For the complete documentation index, see [llms.txt](https://formisch.dev/llms.txt).

As listed in our features, the library supports all native HTML form fields. This includes the HTML `<select />` element as well as special cases of the `<input />` element.

> In our [playground](/playground/special/) you can take a look at such fields and test them out.

## Checkbox

A simple checkbox represents a boolean and is `true` when checked or `false` otherwise.

```tsx
<Field of={form} path={['cookies']}>
  {(field) => (
    <label>
      <input {...field.props} type="checkbox" checked={field.input} />
      Yes, I want cookies
    </label>
  )}
</Field>
```

However, you can also use multiple checkboxes to represent an array of strings. For this you simply have to add the `value` attribute to the HTML `<input />` element.

```tsx
<>
  {[
    { label: 'Bananas', value: 'bananas' },
    { label: 'Apples', value: 'apples' },
    { label: 'Grapes', value: 'grapes' },
  ].map(({ label, value }) => (
    <Field key={value} of={form} path={['fruits']}>
      {(field) => (
        <label>
          <input
            {...field.props}
            type="checkbox"
            value={value}
            checked={field.input.value?.includes(value)}
          />
          {label}
        </label>
      )}
    </Field>
  ))}
</>
```

## Radio

A group of radio buttons, while similar to an array of checkboxes, will only allow you to select one of the options based on which button is checked.

```tsx
<Field of={form} path={['color']}>
  {(field) => (
    <>
      {[
        { label: 'Red', value: 'red' },
        { label: 'Green', value: 'green' },
        { label: 'Blue', value: 'blue' },
      ].map(({ label, value }) => (
        <label key={value}>
          <input
            {...field.props}
            type="radio"
            value={value}
            checked={field.input.value === value}
          />
          {label}
        </label>
      ))}
    </>
  )}
</Field>
```

## Select

An HTML `<select />` element allows you to select a string from a predefined list of options.

```tsx
<Field of={form} path={['framework']}>
  {(field) => (
    <select {...field.props}>
      {[
        { label: 'Preact', value: 'preact' },
        { label: 'Solid', value: 'solid' },
        { label: 'Qwik', value: 'qwik' },
      ].map(({ label, value }) => (
        <option
          key={value}
          value={value}
          selected={field.input.value === value}
        >
          {label}
        </option>
      ))}
    </select>
  )}
</Field>
```

However, if you set the `multiple` attribute, multiple options can be selected making the field represent an array of strings.

```tsx
<Field of={form} path={['frameworks']}>
  {(field) => (
    // Set "multiple" to "true"
    <select {...field.props} multiple>
      {[
        { label: 'Preact', value: 'preact' },
        { label: 'Solid', value: 'solid' },
        { label: 'Qwik', value: 'qwik' },
      ].map(({ label, value }) => (
        <option
          key={value}
          value={value}
          selected={field.input.value?.includes(value)}
        >
          {label}
        </option>
      ))}
    </select>
  )}
</Field>
```

## File

An HTML `<input type="file" />` works similarly to an HTML `<select />` element. Without the `multiple` attribute, it represents a single file; with `multiple`, it represents a list of files.

```tsx
<Field of={form} path={['avatar']}>
  {(field) => <input {...field.props} type="file" accept="image/*" />}
</Field>
```

With the `multiple` attribute, users can select multiple files:

```tsx
<Field of={form} path={['documents']}>
  {(field) => <input {...field.props} type="file" multiple />}
</Field>
```
