main ← icon-picker-search-all-icons
merged 05:46PM - 14 Aug 26 UTC
Previously, the icon pickers for badges and group flair only offered icons alrea…dy in the site's SVG sprite: `only_available` arrived as a query-string value where both `"false"` and `""` are truthy in Ruby, so every picker had been silently restricted since 2023 — and even unrestricted, the endpoint capped results at the first 500 of 2,000+ icons alphabetically. A badge could not use a new icon until it was manually added to `svg_icon_subset` (https://meta.discourse.org/t/discourse-fa-seeding/409783).
This change lets the pickers search the entire icon set: browsing lists the sprite's icons first, search covers everything, and the grid loads pages of 100 as it scrolls. The server reports `has_more` so clients carry no page-size knowledge, ships `<symbol>` markup only for icons the viewer's theme sprite cannot render, and browsed symbols stay scoped to the picker — only a picked icon is added to the page sprite, so it keeps rendering until saving adds it to the sprite for everyone.
### Before / after
**Searching an icon outside the subset**
<img width="990" height="165" alt="01-search-non-subset-icon" src="https://github.com/user-attachments/assets/d35562f0-66e6-49c7-b584-497a24cae9e1" />
**Scrolling past the old 500-icon cap**
<img width="990" height="395" alt="02-infinite-scroll" src="https://github.com/user-attachments/assets/73fd724f-ee0e-47b8-930d-7d2cefa08797" />
**A picked non-subset icon rendering in the trigger**
<img width="602" height="160" alt="03-picked-icon-in-trigger" src="https://github.com/user-attachments/assets/8d41d1be-8aeb-48f7-b9bc-d00a1f33dfb5" />