Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Icon Picker Laravel Package

wallacemartinss/filament-icon-picker

A beautiful, modern icon picker for Filament v5 powered by blade-icons. Features a modal grid with real-time search, icon set filtering, infinite scroll, and previews. Works in forms, table columns, and infolists, with support for Heroicons, FontAwesome, Phosphor, Material, and more.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Purpose-built for Filament v5: ships the three extension points a Filament app actually needs — a Form field (IconPickerField), a Table column (IconPickerColumn), and an Infolist entry (IconPickerEntry) — rather than a generic picker you must wire yourself. That is the correct architectural surface for this problem.
  • Delegates icon resolution to blade-ui-kit/blade-icons, the de facto abstraction for SVG icon sets in Laravel. This is the single most important design decision: it means the package stores an icon name string in your database, not an asset, and icon rendering stays a Blade concern you can swap out later.
  • Clean separation between selection (a modal component), display (column/entry with size, color, animation), and type safety (generated PHP enums + a static Icon helper). The Icon helper is the strategically important piece — it gives autocomplete-free, generation-free icon referencing, which is the low-risk integration path.
  • Fit is binary, not graded: this is a Filament v5-only component. On Filament 3 or 4 it is not installable, and there is no backport path. Treat Filament v5 adoption as a hard prerequisite, not an integration detail.

Integration feasibility

  • Low-to-moderate effort, but the effort is not in PHP. It is in three places: Composer (package + one or more icon-set packages), the Tailwind build (a @source directive pointing at the package's vendor views), and deploy automation (icon cache + enum generation). A team that skips the Tailwind step gets a functionally working picker with a visually broken modal — the highest-probability first-week failure.
  • The @source syntax implies a Tailwind CSS v4 build, consistent with Filament v5 theming. Teams still on a Tailwind v3 pipeline need to confirm their theme build before scoping.
  • The filament-icon-picker:install-icons command is interactive by design. Non-interactive CI/CD must use --all or explicit composer require lines in composer.json. Interactive prompts in a deploy script is a known footgun; pin icon packages declaratively and never let a pipeline run the interactive form.
  • Icon-set packages are separate Composer dependencies (Heroicons ~1.3k, FontAwesome ~2.8k, Material ~10k, Phosphor ~9k SVGs). --all pulls roughly 29k SVG files into vendor/. This is a real image-size, CI-cache, and cold-build cost that must be a deliberate decision, not a default.

Technical risk

  • Bus factor 1, adoption ~0. 50 stars, 0 dependents, single maintainer. There is no downstream population to surface breakage before you do, no community answers, and no evidence anyone else runs this in production. The README's quality is genuinely above its star count, which buys confidence in the design but not in the durability.
  • Version ceiling is the dominant risk. Filament v5 is new; the package pins PHP 8.2+, Laravel 12+, Filament 5.0+. Any Filament patch release that touches the form-component contract can break this with no upstream pressure to fix quickly. Budget for you being the fixer.
  • Generated enums under a vendor namespace. The docs show enums such as Wallacemartinss\FilamentIconPicker\Enums\Heroicons. If these are written into the package's own src/Enums, they are destroyed by composer install/update and absent on any environment where the generator never ran — class-not-found at runtime, in production, on a fresh container. This is the single most consequential ambiguity in the package and must be resolved before adoption. Mitigation: standardize on the Icon static helper and do not adopt generated enums at all.
  • Tailwind purge risk. Missing or incorrect @source silently strips the picker's styles at build time. It fails visually, not with an exception, so it can reach production.
  • String-typed persistence. The icon name is a free-form string column. Nothing at the database level prevents storing an icon that no longer exists after an icon-set upgrade; you get a blank cell, not an error.

Key questions

  1. Where exactly are generated enums written — into vendor/ or into the host app's namespace? Is there a configurable target path, and are they expected to be committed to VCS?
  2. Is the icons:cache artifact committed, or generated at deploy? What invalidates it when icon packages update?
  3. Has the package been tested against Filament 5.x point releases, and what is the maintainer's stated compatibility policy (caret range vs. exact)?
  4. What is the actual rendered-DOM cost of the modal grid before infinite scroll kicks in, and what is the page size?
  5. Does the field validate that a submitted icon name exists in an allowed set, or does it accept arbitrary strings?
  6. Is there a fallback render path when an icon name is unresolvable (graceful placeholder vs. blank/exception)?
  7. What is the maintainer's release cadence and responsiveness history, and is a fork-and-own contingency acceptable?

Integration Approach

Stack fit

  • Assumes the modern Filament baseline: Laravel 12, PHP 8.2+, Livewire, Tailwind v4 with a custom Filament theme. If the app already runs a custom theme (most non-trivial Filament apps do), the @source addition is a two-line change in resources/css/filament/*/theme.css and fits the existing build cleanly.
  • Fits the standard Filament extension idiom: no service provider overrides, no route hijacking, no global middleware. Field, column, and entry are composed exactly like core components, so it does not perturb app architecture.
  • Persistence is a plain string column — no migration, no custom cast, no schema coupling. This is a meaningful de-risk: the package can be removed and replaced by a plain TextInput + a select without a data migration.

Migration path

  • There is no path from Filament 3/4. If the app is not on v5, this is a future dependency, not a current one — park it and revisit at the v5 upgrade. Do not let it drive the upgrade.
  • For the initial adoption, wrap it. Create a single app-local factory (e.g. App\Support\Forms\IconField::make()) that returns the package component with your house defaults (allowedSets, modalSize, searchable). Every resource then references your wrapper, not the vendor class. This converts a package swap into a one-file change and is the cheapest insurance available against bus factor 1.
  • Data-level reversibility is high: icon names are strings, and heroicon-o-* names are stable and readable by other tooling.

Compatibility

  • Pin the package to an exact or narrow caret range and pin every icon-set package explicitly in composer.json. Do not rely on install-icons --all in CI — it makes your dependency graph a function of a vendor's interactive prompt.
  • Commit composer.lock and treat icon-set upgrades as deliberate changes with a visual diff, not incidental patch bumps. An icon rename upstream turns into silently blank cells in production.
  • Verify the Tailwind pipeline emits the picker styles in a throwaway CI build before the first merge; assert on a built CSS artifact containing a known picker class.

Sequencing

  1. Confirm v5 baseline and that the app builds a custom Filament theme with Tailwind v4. Hard gate.
  2. Spike (0.5–1 day): install the package plus one icon set (Heroicons — smallest and most familiar). Wire one form field, run the build, confirm the modal renders styled and search works. This spike exists specifically to validate the Tailwind @source step; it is where the integration fails if it fails.
  3. Resolve the enum question. Default decision: skip generated enums, standardize on the Icon helper. Only revisit if the enums are provably written into app-owned, VCS-tracked code.
  4. Establish the wrapper and house defaults, including allowedSets narrowed to the icon sets design has approved. Do not ship "all installed sets" to end users — a 10k-icon Material set alongside 1.3k Heroicons is a UX and payload decision, not a free one.
  5. Pilot on one low-traffic resource (e.g. a settings or category form) for a full release cycle to observe real usage, search latency, and any Filament patch breakage.
  6. Roll out to table columns and infolists once the field path is stable — display components carry more rendering surface but less risk, since they degrade to a blank cell rather than blocking data entry.
  7. Deploy automation last: document php artisan icons:cache and php artisan optimize:clear in the deploy runbook, and add a smoke test asserting a known icon renders in the admin panel.

Operational Impact

Maintenance

  • Realistically you become the maintainer of record. With 0 dependents and 50 stars, the probability that the original author responds to a Filament 5.x regression on your timeline is low. Assume a fork exists in your future and keep the wrapper boundary clean so that a fork can be swapped in as a Composer VCS repository without touching application code.
  • Ongoing cost is dominated by icon-set drift, not package code. Every icon-package bump is a potential silent rename. Assign ownership of icon-set upgrades to one person and require a manual spot-check of the picker and any column/entry usages.
  • The package's own code surface is small (a field, a column, an entry, an enum generator, a config file). A fork-and-patch contingency is credible — likely a day, not a quarter.

Support

  • No community, no issue-history depth, no tutorials. Support is "read the source." The README is unusually strong for a 50-star package — it documents the options, the dynamic closures, the animations — which materially lowers self-service cost. Budget one engineer as the internal SME.
  • Filament itself is well-documented and the field API is conventional, so most integration confusion will be about Tailwind and icon packages, not the picker.

Scaling

  • The scaling axis here is assets and payload, not requests. Adding icon sets adds vendor weight linearly: --all is ~29k SVGs, which affects container image size, CI cache size, and cold deploy time. Curate to one or two sets.
  • php artisan icons:cache is the mitigation for per-request SVG resolution and should be treated as mandatory in production, not optional as the README presents it. It creates a deploy artifact that must be regenerated whenever icon packages change — a cache-invalidation concern that will bite exactly once, in production.
  • The modal grid renders many inline SVGs on the client. Infinite scroll keeps the initial DOM bounded, but the search-filtered re-render is the latency-sensitive path. If icon sets grow large, measure search response on the modal rather than assuming it is fine.
  • Rendering a spin/pulse animation on every row of a large table column is a per-row CSS animation — fine for tens of rows, unwise for thousands. Reserve animations for status indicators, not list-wide decorations.

Failure modes

  • Missing Tailwind @source → modal renders unstyled. Silent at build time, discovered by users. Highest likelihood, low severity.
  • Generated enums missing or wiped → Class "Wallacemartinss\FilamentIconPicker\Enums\Heroicons" not found in any environment where the generator did not run (fresh CI, new container, post-composer update). Silent until runtime, hits production. Highest severity — this is why the recommendation is to not adopt enums.
  • Icon renamed/deprecated upstream → blank cell on saved records. No error, no alert. Needs a periodic audit query for non-resolving icon names.
  • Stale icons:cache → newly installed icons do not appear in the picker; looks like a bug in the package.
  • Filament patch incompatibility → form component fails to render or throws in the field contract. Blast radius is every form using the field; the wrapper boundary contains the fix to one file.
  • install-icons run interactively in a pipeline → hung deploy waiting on stdin.
  • Unrestricted allowedSets → users sift through tens of thousands of icons; perceived as unusable.

Ramp-up

  • For a Filament-fluent developer: hours. The API mirrors core components and the README has a copy-pasteable example for every capability.
  • For a team new to Filament theming: closer to a day, because the Tailwind @source step and the theme rebuild are the non-obvious parts. Write a three-step internal onboarding note covering install, @source, and the Icon helper — that note is what prevents every future developer from rediscovering the same failure.
  • Design/product ramp-up is the underrated one: narrowing allowedSets and choosing house defaults (modal size, searchable, placeholder) is a product decision that determines whether this feels like a polished admin panel or a raw component. Assign that before rollout, not after.

Verdict. A well-designed, well-documented, narrowly-scoped component that is a good fit if and only if the application is already on Filament v5. Adopt it behind an app-local wrapper, with a curated single icon set, the Icon helper instead of generated enums, and icons:cache in the deploy runbook. The dominant risks are ecosystem immaturity and bus factor 1 — both manageable with the wrapper boundary and by not depending on generated artifacts.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource