export interface TransferItem { key: string | number; label: string; disabled?: boolean; } export interface TransferProps { modelValue?: Array; data?: TransferItem[]; titles?: [string, string]; filterable?: boolean; filterPlaceholder?: string; /** A single string applies to both panels; a tuple is `[source, target]`. */ emptyText?: string | [string, string]; /** Caps each panel so long lists scroll inside the list instead of growing the page. */ maxHeight?: string | number; /** * Floor for each panel. The default keeps a filterable panel from collapsing * to a sliver, but it is a hard floor: without this prop a transfer inside a * 190px box still laid out at 240px and overflowed it. */ minHeight?: string | number; addAriaLabel?: string; removeAriaLabel?: string; moveUpAriaLabel?: string; moveDownAriaLabel?: string; /** Accessible name for each panel's select-all box; the panel title is appended. */ selectAllAriaLabel?: string; targetOrder?: 'original' | 'push'; /** Target panel becomes a ranked list: order badges plus per-row move up/down. */ orderable?: boolean; } export interface TransferEmits { (e: 'update:modelValue', value: Array): void; (e: 'change', value: Array): void; }