Autocomplete
The VAutocomplete
component is a customizable autocomplete input based on the Headless UI Autocomplete component.
Usage
Basic Usage
To use the VAutocomplete
component, simply add it to your template:
INFO
The VAutocomplete
component is registered globally when you install with @morpheme/ui
. So you don't need to import it manually.
Clearable
To make the VAutocomplete
component clearable, set the clearable
prop:
Validation
You can use the VAutocomplete
component with form validation libraries like vee-validate
. In this example, we'll use the useForm
hook from vee-validate
to handle form submission and validation:
Props
Name | Type | Default |
---|---|---|
items | Item[] | [] |
modelValue | Item | undefined |
searchBy | string | text |
displayText | string | text |
placeholder | string | 'Search...' |
label | string | '' |
name | string | '' |
rules | string | '' |
notFoundText | string | 'No data.' |
noDataText | string | 'Nothing found.' |
clearable | boolean | false |
errorClass | string | 'autocomplete-error' |
wrapperClass | string | '' |
hint | String | '' |
hideError | Boolean | false |
Events
update:modelValue
The update:modelValue
event is triggered whenever the selected value of the VAutocomplete
component changes.
Here is an example of using the update:modelValue
event:
<script setup lang="ts">
import type {Item} from '@morpheme/autocomplete';
function onModelValueChange(value: Item) {
console.log('Selected item:', value);
}
</script>
<template>
<VAutocomplete @update:modelValue="onModelValueChange" />
</template>
<script setup lang="ts">
import type {Item} from '@morpheme/autocomplete';
function onModelValueChange(value: Item) {
console.log('Selected item:', value);
}
</script>
<template>
<VAutocomplete @update:modelValue="onModelValueChange" />
</template>
update:query
The update:query
event is triggered whenever the search query in the VAutocomplete
component changes.
Here is an example of using the update:query
event:
<script setup lang="ts">
function onQueryChange(query: string) {
console.log('Searching:', query);
}
</script>
<template>
<VAutocomplete @update:query="onQueryChange" />
</template>
<script setup lang="ts">
function onQueryChange(query: string) {
console.log('Searching:', query);
}
</script>
<template>
<VAutocomplete @update:query="onQueryChange" />
</template>
Slots
Name | Description |
---|---|
hint | This slot is used to add content to the hint area. |
CSS Variables
:root {
// field
--v-autocomplete-field-bg-color: var(--color-white);
--v-autocomplete-field-border-color: var(--color-gray-300);
// field hover
--v-autocomplete-field-hover-border-color: var(--color-gray-300);
// input
--v-autocomplete-input-color: var(--color-gray-700);
--v-autocomplete-input-bg-color: transparent;
--v-autocomplete-input-height: var(--v-input-height);
// input selected
--v-autocomplete-input-selected-color: var(--color-gray-700);
// clearable button
--v-autocomplete-clearable-button-color: var(--color-gray-400);
// clearable button hover
--v-autocomplete-clearable-button-hover-color: var(--color-gray-500);
--v-autocomplete-clearable-button-hover-bg-color: var(--color-gray-100);
// icon
--v-autocomplete-icon-color: var(--color-gray-400);
// options
--v-autocomplete-options-bg-color: var(--color-white);
--v-autocomplete-options-border-color: var(--color-gray-50);
// empty
--v-autocomplete-empty-color: var(--color-gray-700);
// item
--v-autocomplete-item-color: var(--color-gray-700);
// item selected
--v-autocomplete-item-selected-color: var(--color-primary-500);
// item selected item
--v-autocomplete-item-selected-icon-color: var(--color-primary-500);
// item inactive
--v-autocomplete-item-inactive-color: var(--color-gray-700);
// item active
--v-autocomplete-item-active-bg-color: var(--color-gray-100);
// error
--v-autocomplete-error-color: var(--color-error-300);
// disabled
--v-autocomplete-input-disabled-bg-color: var(--v-input-disabled-bg-color);
--v-autocomplete-input-disabled-border-color: var(--v-input-disabled-border-color);
// hint
--v-autocomplete-hint-font-size: var(--v-input-hint-font-size, 14px);
--v-autocomplete-hint-color: var(--color-gray-600);
--v-autocomplete-hint-margin-top: var(--size-spacing-1);
// focus effect
--v-input-effect-border-color: var(--color-primary-300);
--v-input-effect-shadow-color: var(--color-primary-100);
}
:root {
// field
--v-autocomplete-field-bg-color: var(--color-white);
--v-autocomplete-field-border-color: var(--color-gray-300);
// field hover
--v-autocomplete-field-hover-border-color: var(--color-gray-300);
// input
--v-autocomplete-input-color: var(--color-gray-700);
--v-autocomplete-input-bg-color: transparent;
--v-autocomplete-input-height: var(--v-input-height);
// input selected
--v-autocomplete-input-selected-color: var(--color-gray-700);
// clearable button
--v-autocomplete-clearable-button-color: var(--color-gray-400);
// clearable button hover
--v-autocomplete-clearable-button-hover-color: var(--color-gray-500);
--v-autocomplete-clearable-button-hover-bg-color: var(--color-gray-100);
// icon
--v-autocomplete-icon-color: var(--color-gray-400);
// options
--v-autocomplete-options-bg-color: var(--color-white);
--v-autocomplete-options-border-color: var(--color-gray-50);
// empty
--v-autocomplete-empty-color: var(--color-gray-700);
// item
--v-autocomplete-item-color: var(--color-gray-700);
// item selected
--v-autocomplete-item-selected-color: var(--color-primary-500);
// item selected item
--v-autocomplete-item-selected-icon-color: var(--color-primary-500);
// item inactive
--v-autocomplete-item-inactive-color: var(--color-gray-700);
// item active
--v-autocomplete-item-active-bg-color: var(--color-gray-100);
// error
--v-autocomplete-error-color: var(--color-error-300);
// disabled
--v-autocomplete-input-disabled-bg-color: var(--v-input-disabled-bg-color);
--v-autocomplete-input-disabled-border-color: var(--v-input-disabled-border-color);
// hint
--v-autocomplete-hint-font-size: var(--v-input-hint-font-size, 14px);
--v-autocomplete-hint-color: var(--color-gray-600);
--v-autocomplete-hint-margin-top: var(--size-spacing-1);
// focus effect
--v-input-effect-border-color: var(--color-primary-300);
--v-input-effect-shadow-color: var(--color-primary-100);
}
Standalone Installation
To install the VAutocomplete
component individually, you can use the @morpheme/autocomplete
package:
npm i @morpheme/autocomplete
npm i @morpheme/autocomplete
You can then use the VAutocomplete
component in your Vue templates like this:
<script setup lang="ts">
import VAutocomplete from '@morpheme/autocomplete';
</script>
<template>
<VAutocomplete />
</template>
<script setup lang="ts">
import VAutocomplete from '@morpheme/autocomplete';
</script>
<template>
<VAutocomplete />
</template>
Storybook
View Storybook documentation here.