Skip to content

Category & Filter Controller

The category filter controller manages product listing pages — filtering, sorting, price ranges, pagination, and mobile filter UI.

Source: src/js/controllers/category-filter-controller.js (~900 lines)

Targets

TargetElementPurpose
productGridProduct grid containerUpdated with filtered results
filterSidebarSidebar filter panelShow/hide on mobile
activeFiltersActive filter chipsDisplay current filters
priceMinPrice range min inputMinimum price value
priceMaxPrice range max inputMaximum price value
priceSliderDual-thumb sliderVisual price range selector
sortSelectSort dropdownOrder by price, name, etc.
paginationPagination controlsPage navigation
resultCountResults counter"Showing X of Y products"
toolbarTop toolbarSort + view options

Values

ValueTypeDescription
categoryIdNumberCurrent category ID
filtersString (JSON)Active filter state
sortStringCurrent sort field
pageNumberCurrent page number
totalPagesNumberTotal pages available

Actions

ActionTriggerBehavior
toggleFilterClick filter optionAdd/remove filter, reload products
clearFilterClick chip X buttonRemove specific filter
clearAllClick "Clear All"Reset all filters
setSortChange sort dropdownRe-sort product listing
setPageClick page numberNavigate to page
setPriceRangeSlider drag or inputFilter by price range
toggleMobileFiltersClick filter buttonShow/hide mobile filter sidebar

Filter Flow

Filters are applied client-side by fetching from the Worker with query parameters. The URL updates to reflect filter state, making filtered views shareable and bookmarkable.

Price Range Slider

The dual-thumb price range slider:

  • Two <input type="range"> elements overlaid on a shared track
  • CSS custom properties position the fill between the thumbs
  • Debounced input — waits 300ms after the user stops dragging before fetching
  • Supports both slider interaction and manual min/max text input

Mobile Filter UX

On mobile devices:

  1. Filters hide behind a "Filter" button in the toolbar
  2. Clicking opens a slide-in sidebar overlay
  3. Filters apply immediately on selection (no "Apply" button)
  4. Close button or backdrop tap dismisses the sidebar
  5. Active filter count badge appears on the filter button

Source: src/js/controllers/category-filter-controller.js