* feat: add structured filters to backlinks tables
Add per-tab filter panels (Backlinks, Referring Domains, Top Pages) with
include/exclude text search, numeric range filters, link type selector,
and visibility toggles. Filter values persist in localStorage across
searches and page reloads.
* fix: improve backlinks filter layout and hide domain overview filters on pages tab
- Add w-full to text filter inputs so they fill their grid columns
- Restructure backlinks results card to use border-separated sections
matching the domain overview pattern
- Hide filter button and panel on domain overview's Top Pages tab since
keyword filters don't apply there
* fix: move backlinks filter button to its own toolbar row below tabs
Match the domain overview layout: tabs in their own header row, then a
separate toolbar row with the Filters button underneath.
* style: fix prettier formatting in backlinks filter files
* fix: resolve all ci:check issues
- Remove unused BacklinksResultsHeader.tsx and useBacklinksSpamPreferences.ts
- Un-export DEFAULT_BACKLINKS_SPAM_THRESHOLD and normalizeBacklinksSpamThreshold
(only used internally)
- Remove unused BacklinksAllFilterValues type
- Fix oxlint unsafe type assertions in useBacklinksFilters.ts
* fix: wire spam filter options through to server and remove spam filters from non-backlinks tabs
The client was not passing hideSpam/spamThreshold to the server, so the
server always defaulted to hideSpam:true with threshold 40. This made
the new client-side spam score filters on the backlinks tab silently
filter an already-truncated dataset. Now the client sends hideSpam:false
so the server returns all rows and client-side filtering works correctly.
Removed spam score filters from the Referring Domains tab since spam
filtering is not needed there.
* fix: restore backlinks spam filtering and safe filter hydration
* simplify: remove server-side spam filter wiring, keep client-side only
All backlinks filtering (including spam score) is now done client-side.
Server-side spam filtering adds complexity without meaningful benefit
at current data volumes. This removes the bridging code added in the
last two commits and simplifies filter hydration.