Components
- Accordion new
- ActionSheet new
- Alert new
- Alert Dialog new
- Angle Slider new
- Autocomplete new
- Avatar new
- Badge new
- Breadcrumb new
- Button new
- Button Group new
- Card new
- Carousel new
- Checkbox new
- Clipboard new
- Collapsible new
- Color Picker new
- Date Input new
- Date Picker new
- Dialog new
- DialogCaller new
- Drawer beta
- Editable new
- Empty new
- Field new
- Fieldset new
- File Upload new
- Filters new
- Floating Panel new
- Hover Card new
- Image new
- Image Cropper new
- Input new
- Input Group new
- Json Tree View new
- Kbd new
- Listbox new
- Marquee new
- Menu new
- Number Input new
- Pagination new
- Password Input new
- PhoneField new
- Pin Input new
- Popover new
- Progress Circular new
- Progress Linear new
- Qr Code new
- Radio Group new
- Rating Group new
- Scroll Area new
- ScrollSpy new
- Segment Group new
- Select new
- Separator new
- Sidebar new
- Signature Pad new
- Skeleton new
- Slider new
- Splitter new
- Steps new
- Switch new
- Table new
- Tabs new
- Tags Input new
- Textarea new
- Timeline new
- Timer new
- Toast new
- Toc new
- Toggle new
- Toggle Group new
- Tooltip new
- Tour new
- Tree View new
- Typography new
Features
- Typed field factories.
- Text, number, date, boolean, select, and multi-select values.
- Long or short filter chips.
- Groups and nested menus.
outlineandsecondaryvariants.sm,md, andlgsizes.
Installation
Install from the Vuzeno registry:
bunx --bun shadcn-vue@latest add https://vuzeno.com/r/filters.json
npx shadcn-vue@latest add https://vuzeno.com/r/filters.json
yarn dlx shadcn-vue@latest add https://vuzeno.com/r/filters.json
pnpm dlx shadcn-vue@latest add https://vuzeno.com/r/filters.json
Usage
<script setup lang="ts">
import { Field, Filters, Operator } from "@/components/ui/filters";
import { ref } from "vue";
const fields = ref([
Field.TextField({
key: "name",
label: "Name",
operators: [Operator.Contain({ label: "contains" })],
}),
]);
const filters = ref([]);
</script>
<template>
<Filters.Provider v-model:filters="filters" :fields="fields">
<Filters.Menu>
<Filters.MenuTrigger />
<Filters.MenuContent />
</Filters.Menu>
<Filters.Group>
<Filters.Item
v-for="filter in filters"
:key="`${filter.field}:${filter.operator}`"
:filter="filter"
/>
</Filters.Group>
<Filters.Clear />
</Filters.Provider>
</template>
Composition
Use the following composition to build a Filters setup:
Filters.Provider
├── Filters.Menu
│ ├── Filters.MenuTrigger
│ └── Filters.MenuContent
├── Filters.Group
│ └── Filters.Item
└── Filters.Clear
Examples
Sizes and variants
Set variant and size on Filters.Provider, use filter-style="short" on Filters.Group to show only values.
Custom menu trigger
Provide a custom trigger via the Filters.MenuTrigger slot.
API Reference
Components
| Component | Use |
|---|---|
Filters.Provider | Root state and context. |
Filters.Menu | Add-filter dropdown. |
Filters.MenuTrigger | Default trigger, or custom slot. |
Filters.MenuContent | Field list, groups, and submenus. |
Filters.Group | Chip wrapper. |
Filters.Item | One filter chip. |
Filters.Clear | Clears all filters. |
Filters.Provider
| Prop | Type | Default |
|---|---|---|
filters | Filter[] | [] |
fields | FilterFieldItem[] | - |
variant | "outline" | "secondary" | "outline" |
size | "sm" | "md" | "lg" | "md" |
Filters.Group
| Prop | Type | Default |
|---|---|---|
filterStyle | "long" | "short" | "long" |
Fields
Build fields with Field.*.
| Helper | Extra options |
|---|---|
Field.TextField | minLength, maxLength |
Field.NumberField | min, max, step, numberFormat |
Field.DateField | min, max |
Field.BooleanField | trueValue, falseValue |
Field.Group | label, fields |
Field.Submenu | label, icon, fields |
Common field options: key, label, icon, operators.
const fields = [
Field.TextField({
key: "name",
label: "Name",
operators: [
Operator.Contain({ label: "contains" })
],
}),
];
Operators
Build operators with Operator.*.
| Helper | Value | Input |
|---|---|---|
Operator.Eq | eq | input or select |
Operator.Neq | neq | input or select |
Operator.Contain | contains | input |
Operator.NotContain | not_contains | input |
Operator.In | in | multi-select |
Operator.Nin | nin | multi-select |
Operator.Btw | btw | range |
Operator.Null | is_null | none |
Operator.NotNull | not_null | none |
Operator.Gt | gt | input |
Operator.Lt | lt | input |
Common operator options: label, default, defaultValue, options.
Operator.In({
label: "any of",
options: {
items: [
{ label: "Active", value: "active" },
{ label: "Pending", value: "pending" },
],
},
});
Filter
Active filters are plain objects.
const filters: Filter[] = [
{ field: "status", operator: "in", value: ["active", "pending"] },
{ field: "price", operator: "btw", value: [100, 500] },
];
FilterValue can be string, string[], number, number[], boolean, CalendarDate, CalendarDate[], { start, end }, or null.