All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Controlled
valueandonValueChangeAPI duplicatePolicyfor repeated filter fields- AbortSignal support for asynchronous options
/primitivespackage entry- Shared quoted-value scanner
- Keyboard navigation and persistence tests
- Changelog section on the public website
- Injectable synchronous storage adapter
- Typed
FilterExpression[]output alongside the legacy chips map
- Package manager migrated from npm to pnpm workspaces
- CI and publishing upgraded to Node.js 26
- TypeScript upgraded to 7.0.2
- Declaration generation moved from tsup to TypeScript
emitDeclarationOnly - Headless entry no longer exports renderer components
- Documentation rewritten around behavior and constraints
- Website redesigned with navigation, dark mode, responsive layouts, scenario demos, package-manager tabs, renderer examples, and SEO metadata
- Published package exports now point to
dist - Quoted values containing spaces parse as one token
- Short unrelated values no longer produce fuzzy suggestions
- Duplicate suggestion keys and post-unmount timers
- Keyboard navigation skips headers and dividers
- Combobox/listbox ARIA relationships in both renderers
statusOptions→tabs: TabOption[](newTabOptiontype withvalue,label,count?)statusCountsremoved — count folded intoTabOption.countstatusBarExtra→footerExtrastat/setStat/initialStat→tab/setTab/initialTab(nowstring | number)FilterChipBarResult.stat→.tabSearchPreset.stat→.tabdynamicOptions+dynamicOptionsLoadingprops removed —ChipConfig.optionsnow accepts() => Promise<FilterOption[]>and hook auto-resolvesChipConfig.dynamicfield removedoperation: '区间'→operation: 'range'in numberRange parser output
- shadcn renderer as default export (Radix + Tailwind + lucide-react)
TabOptiontypeAsyncOptionstype/headlesssubpath export (pure hook, zero UI deps)/antd6subpath export (Ant Design 6 adapter)- Skeleton loading for async options
- Command Palette (
commandsprop withActionCommand[]) /keyboard shortcut to focus search bar- Dark mode support (CSS variables)
- a11y: ARIA combobox + listbox + option roles
- Official website (Google-style landing page with interactive demo)
- Storybook i18n (EN/CN) + dark mode toolbar + shadcn-styled docs
- 35 unit tests (parser + tokenizer)
- Radix Popover
onOpenAutoFocusstealing focus (dropdown flash) tokenizeSearchTextnot handling comma-separated select values- Performance:
onFiltersChangeonly fires on commit, not per keystroke localStoragesave operations in try-catch (Safari private mode safe)
- Headless
useFilterChipBar()hook — zero UI dependency, all state/logic - shadcn renderer (default export) — Radix Popover + Tailwind CSS + lucide-react
- antd6 adapter —
filter-chip-bar/antd6subpath export - Headless-only subpath —
filter-chip-bar/headless(pure hook, no UI) key:valuestructured filter syntax with real-time syntax highlighting- Command Palette —
commandsprop for route navigation / modal triggers - Presets — save/recall/share search configurations via URL
- Recent searches — auto-tracked, localStorage-persisted, namespaced
- Full keyboard navigation — ↑↓ Enter Tab Esc Backspace
/shortcut to focus search bar (GitHub/Linear style)- Multi-value select — comma continuation for select/multiSelect types
- Negation —
-key:valueto exclude matches - Smart paste — multi-line paste auto-converts to comma-separated values
- Auto-quoting — input field values auto-wrapped in quotes on space
- Dynamic options loading with skeleton placeholders
- Dark mode support via
.darkclass (shadcn CSS variables) - Status bar with counts +
statusBarExtraslot rightExtraslot for custom action buttons- ARIA attributes for accessibility (combobox + listbox + option roles)
- Storybook with bilingual docs (EN/CN) and 🌐 locale toolbar
- 35 unit tests for parser + tokenizer
- GitHub Actions: CI (lint + test + build) + npm publish on tag
- Vercel Storybook deployment config
- Radix Popover
onOpenAutoFocusstealing focus from input (dropdown flash) tokenizeSearchTextnot handling comma-separated select values (red highlight)- Performance:
onFiltersChangeonly fires on commit (Enter/suggestion/space), not per keystroke localStoragesave operations wrapped in try-catch (Safari private mode safe)