<script setup>
import Input from "~/components/ui/Input.vue"
import Button from "~/components/ui/Button.vue"
import Layout from "~/components/ui/Layout.vue"
import Spacer from "~/components/ui/Spacer.vue"
import Alert from "~/components/ui/Alert.vue"
</script>

```ts
import Input from "~/components/ui/Input.vue"
```

# Input

Inputs are areas in which users can enter information. In Funkwhale, these mostly take the form of search fields.

| Prop          | Data type | Required? | Description                                                                 |
| ------------- | --------- | --------- | --------------------------------------------------------------------------- |
| `placeholder` | String    | No        | The placeholder text that appears when the input is empty.                  |
| `icon`        | String    | No        | The [Bootstrap icon](https://icons.getbootstrap.com/) to show on the input. |
| `v-model`     | String    | Yes       | The text entered in the input.                                              |

You can link a user's input to form data by referencing the data in a `v-model` directive.

```vue-html{2}
<Input v-model="value" placeholder="Your favorite animal" />
```

<Input placeholder="Your favorite animal" />

## Input icons

Add a [Bootstrap icon](https://icons.getbootstrap.com/) to an input to make its purpose more visually clear.

```vue-html{3}
<Input v-model="value" icon="bi-search" />
```

<Input v-model="value" icon="bi-search" />

## Label slot

```vue-html{2-4}
<Input>
  <template #label>
    User name
  </template>
</Input>
```

<Input>
  <template #label>
    User name
  </template>
</Input>

If you just have a string, we have a convenience prop, so instead you can write:

```vue-html
<Input label="User name" />
```

<Input label="User name" />

## Input-right slot

You can add a template on the right-hand side of the input to guide the user's input.

```vue-html{2-4}
<Input v-model="value" placeholder="Search">
  <template #input-right>
    suffix
  </template>
</Input>
```

<Input placeholder="Search">
  <template #input-right>
    suffix
  </template>
</Input>

## Presets

### Search

```vue-html
<Input search />
```

<Input search />

### Password

```vue-html
<Spacer :size="64" />
<Layout form stack>
  <Input label="User name" />
  <Input password label="Password" />
  <Layout flex>
    <Button primary> Submit </Button>
    <Button> Cancel </Button>
  </Layout>
</Layout>
```

<Spacer :size="64" />
<Layout form stack>
  <Input label="User name" />
  <Input password label="Password" />
  <Layout flex>
    <Button primary> Submit </Button>
    <Button> Cancel </Button>
  </Layout>
</Layout>

::: tip

We use the spacer to simulate the baseline alignment on page layouts (64px between sections)

:::

## Fallthrough attributes

If you add attributes that are no props, they will be added to the component:

```vue-html
<Input required
  field-id="password-field"
/>
```

<Input required
  field-id="password-field"
/>
