GitHub54X

Filters

Vue filter builder with typed fields, operators, and chips to narrow lists and data tables.

PreviousNext

Features

  • Typed field factories.
  • Text, number, date, boolean, select, and multi-select values.
  • Long or short filter chips.
  • Groups and nested menus.
  • outline and secondary variants.
  • sm, md, and lg sizes.

Installation

Install from the Vuzeno registry:

      
      bunx --bun 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

ComponentUse
Filters.ProviderRoot state and context.
Filters.MenuAdd-filter dropdown.
Filters.MenuTriggerDefault trigger, or custom slot.
Filters.MenuContentField list, groups, and submenus.
Filters.GroupChip wrapper.
Filters.ItemOne filter chip.
Filters.ClearClears all filters.

Filters.Provider

PropTypeDefault
filtersFilter[][]
fieldsFilterFieldItem[]-
variant"outline" | "secondary""outline"
size"sm" | "md" | "lg""md"

Filters.Group

PropTypeDefault
filterStyle"long" | "short""long"

Fields

Build fields with Field.*.

HelperExtra options
Field.TextFieldminLength, maxLength
Field.NumberFieldmin, max, step, numberFormat
Field.DateFieldmin, max
Field.BooleanFieldtrueValue, falseValue
Field.Grouplabel, fields
Field.Submenulabel, 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.*.

HelperValueInput
Operator.Eqeqinput or select
Operator.Neqneqinput or select
Operator.Containcontainsinput
Operator.NotContainnot_containsinput
Operator.Ininmulti-select
Operator.Ninninmulti-select
Operator.Btwbtwrange
Operator.Nullis_nullnone
Operator.NotNullnot_nullnone
Operator.Gtgtinput
Operator.Ltltinput

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.