Shared engine behind the productlist blocks: filter/sort/page state, query emission with debounce, cascading groups, client-side matching, and a config-driven field renderer over the individual filter components.
Read from the component's own type, so this cannot drift from what it accepts.
| Prop | Type | Default | Description |
|---|---|---|---|
groups | ProductFilterGroup[] | — | |
defaultFilters | Record<string, string[]> | — | |
onQueryChange | (query: ProductQuery) => void | — | |
className | string | — |