# ListInput

Edits a list of records with a consistent shape. Each column supplies an input through `renderInput`, with add, remove, validation, drag, and keyboard-reorder support.

## Import

```ts
import { ListInput } from '@astryx-vue/lab'
```

## Props

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `modelValue` | `T[]` | `[]` | Records, bound with `v-model`. |
| `label` | `string` | Required | List label and accessible name. |
| `columns` | `ListInputColumn[]` | Required | Column definitions and input renderers. |
| `getItemKey` | `(item) => string \| number` | Required | Returns a stable record key. |
| `createItem` | `() => T` | Required | Creates a record for the add action. |
| `description` / `itemName` | `string` | `undefined` | List description and singular item noun. |
| `status` | `FieldStatus` | `undefined` | Whole-list validation status. |
| `getItemStatus` | `(item, index) => FieldStatus` | `undefined` | Per-record validation status. |
| `getFieldStatus` | `(item, columnKey, index) => FieldStatus` | `undefined` | Per-cell validation status. |
| `isReorderable` | `boolean` | `false` | Allows reordering. |
| `isDisabled` / `isLoading` | `boolean` | `false` | Disabled or busy state. |
| `maxItems` | `number` | `undefined` | Maximum record count. |
| `isLabelHidden` / `isOptional` / `isRequired` | `boolean` | `false` | Label and required markers. |

A column contains `key`, `header`, optional `width`, and `renderInput`. The renderer receives the record, accessible label, status, disabled state, and `updateItem`; the example connects core's `TextInput`.

## Events

`change` emits both the new array and the change details: `add`, `update`, `remove`, or `reorder`.
