AFS

Advanced Filter System

A flexible, dependency-free JavaScript library for filtering DOM elements with search, sorting, ranges, pagination and URL state built in.

Features

Flexible filtering

Buttons, checkboxes, radios and dropdowns, with configurable OR / AND / mixed logic per filter type.

Real-time search

Debounced text search across any number of data attributes.

Range filters

Numeric sliders with optional histogram, min/max inputs and date ranges.

Pagination

Page controls, items-per-page, smooth scroll-to-top all aware of active filters.

URL state

The full filter state lives in the URL: shareable, restorable, back-button friendly.

Animations & TypeScript

Fade, slide, scale, flip and more plus complete TypeScript definitions.

Installation

npm

npm install advanced-filter-system

CDN

<script type="module">
  import { AFS } from 'https://unpkg.com/advanced-filter-system@latest/dist/afs.modern.js';
</script>

Quick start

1 · HTML

<button class="btn-filter" data-filter="*">All</button>
<button class="btn-filter" data-filter="category:tech">Tech</button>
<button class="btn-filter" data-filter="category:design">Design</button>

<input type="text" class="filter-search" placeholder="Search…">
<div class="filter-counter"></div>

<div class="filter-container">
  <div class="filter-item" data-categories="category:tech" data-title="Laptop">Laptop</div>
  <div class="filter-item" data-categories="category:design" data-title="Notebook">Notebook</div>
</div>

<div class="afs-pagination-container"></div>

2 · JavaScript

import { AFS } from 'advanced-filter-system';

const afs = new AFS({
  containerSelector: '.filter-container',
  itemSelector: '.filter-item',
  filterButtonSelector: '.btn-filter',
  searchInputSelector: '.filter-search',
  counterSelector: '.filter-counter',
  searchKeys: ['title', 'categories'],

  filterCategoryMode: 'mixed',           // OR within a type, AND between types
  filterTypeLogic: {
    category: { mode: 'OR', multi: true },
  },

  pagination: { enabled: true, itemsPerPage: 6 },
  animation: { type: 'fade', duration: 300 },
});

3 · Going further

// Range slider
afs.rangeFilter.addRangeSlider({
  key: 'price',
  type: 'number',
  container: document.querySelector('.price-range'),
  min: 0,
  max: 1000,
});

// Date range
afs.dateFilter.addDateRange({
  key: 'date',
  container: document.querySelector('.date-range'),
});

// Sorting
afs.sort.sort('price', 'desc');

// Events
afs.on('filtersApplied', ({ visibleItems }) => {
  console.log(`${visibleItems} items visible`);
});

Filter logic modes

Mixed mode (recommended)

OR within a filter type, AND between types.

filterCategoryMode: 'mixed'
// (Tech OR Design) AND (Premium OR Budget)

Per-type logic

Configure each filter type independently.

filterTypeLogic: {
  category: { mode: 'OR', multi: true },
  brand: 'OR',   // exclusive toggle
  tags: 'AND',   // must match all
}

See it in action

One page, every feature: filters, search, ranges, sorting, pagination and URL state.

Launch interactive demo