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

Icon Selector Bundle Laravel Package

nowo-tech/icon-selector-bundle

nowo-tech/icon-selector-bundle adds an icon picker to Symfony forms, letting users browse and select icons from configured icon sets and store the chosen icon on your entity. It ships a ready-made form type and selector UI with simple configuration for your icon library.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Framing correction first. This is not a Laravel package and cannot be evaluated as one. nowo-tech/icon-selector-bundle is a Symfony bundle: it registers a Symfony FormType, depends on symfony/ux-icons, and ships a Twig form theme plus a Vite/TypeScript asset layer under src/Resources/assets compiled to src/Resources/public/build. In a Laravel application it is not installable, not autoloadable in a useful way, and has no Blade/Livewire analogue. What is genuinely transferable is narrow but real: (a) the icon identifier grammar — library:set:name, e.g. heroicons:outline:home, bi:house — which is a sensible, storage-friendly contract, and (b) a reference implementation of a two-mode picker (browsable grid + text-filtered search) with a config-driven allowlist of icon sets.

Architecture fit. The core design decision worth stealing is storing the selection as a flat string rather than a foreign key or JSON blob. That keeps the persistence layer dumb, makes the widget swappable, and avoids coupling your schema to a specific icon library version. The config-driven set allowlist is the second good idea: it scopes the picker to what the app actually renders, which is the main lever on payload size. Everything above that layer — the bundle DI extension, compiler passes, form type options, Twig blocks — is Symfony ceremony with no meaning outside Symfony.

Integration feasibility. As a dependency: zero. As a port source: moderate effort, not trivial. The Twig form theme and the compiled asset bundle would both have to be rewritten; the built output is explicitly generated and off-limits for editing, and there is no published NPM package, so you cannot consume the frontend independently of the PHP bundle. Realistically you are reimplementing an Alpine/Livewire or Vue component against the same identifier convention, using something like blade-ui-kit/blade-icons for rendering and Iconify JSON or per-library SVG sources for picker data.

Technical risk. The risk profile is dominated by the project's maturity, not its code. Zero stars, zero dependents, and a single-vendor namespace mean no community testing, no third-party issue reports to mine for edge cases, and no guarantee of a successor if the maintainer stops. The stated last release of 2026-10-25 is anomalously future-dated — treat all release-cadence and freshness signals for this package as unreliable metadata rather than evidence of active maintenance. The dependency chain is three layers deep (bundle → Symfony UX Icons → AssetMapper/Webpack Encore → individual SVG icon packages), and every layer is a place where a Symfony-side security or compatibility patch could strand you.

Key questions to resolve before committing engineering time:

  • Does the search mode filter client-side over the full icon set, or round-trip to the server? This determines whether the picker is viable for large sets (Material, FontAwesome at 7k+ glyphs) or only small ones (Heroicons, ~300).
  • Is the icon-set registry extensible beyond Symfony UX Icons sets, or hard-bound to them? If hard-bound, the port's data layer is undefined and you're inventing the manifest format yourself.
  • How are labels/aliases for icons supplied — from the icon package metadata, or hand-maintained in the bundle? Hand-maintained labels do not scale and would need replacing.
  • What is the accessibility story for the grid — roving tabindex, ARIA roles, keyboard search-into-grid? A grid of icons is a known a11y trap, and with zero dependents there is no evidence anyone has audited it.
  • Is there any validation/normalization helper the bundle exposes for the stored string, or does it accept arbitrary input? You need that on the Laravel side regardless.

Integration Approach

Stack fit. Poor as-is, good as a pattern. Assume no direct reuse. Budget this as an internal component build with the Symfony bundle as spec and inspiration, not as a dependency to wrap.

Migration path. There is none in the conventional sense — no data migration, no gradual cutover, no coexistence period, because the bundle was never in the Laravel app. The correct framing is greenfield: define the identifier contract, implement rendering for stored values, then build the authoring UI. If the organisation already runs a Symfony service that uses this bundle, keep the two implementations aligned on the string format and do not attempt to share the widget across runtimes.

Compatibility. PHP ≥8.1 and the bundle's Symfony 6/7/8 target are irrelevant to a Laravel host; what matters is that your port targets the Laravel and PHP versions you actually run, and the identifier grammar is version-independent. The real compatibility constraint is icon library drift: a stored heroicons:outline:home must keep resolving across Heroicons major versions, which the upstream icon packages do not guarantee.

Sequencing (each step independently shippable):

  1. Contract and renderer. Fix the string format, add a varchar(191) column plus a validation rule against a config-registry allowlist, and ship a server-side renderer so stored identifiers display correctly. This delivers value with no UI at all and is the step that must not slip.
  2. Manifest. Generate a build-time index of the enabled icon sets (name, library, set, searchable keywords) — a static JSON artifact, not a runtime scan. Version it alongside the build.
  3. Authoring component. Blade component plus Alpine (or Livewire if the surrounding app is Livewire-native) implementing grid mode first, search second.
  4. Search. Client-side fuzzy filter over the pre-built manifest, with an explicit cap on rendered grid tiles per page.
  5. Hygiene. Keyboard navigation, ARIA, i18n of labels, and a stale-identifier audit command.

Keep steps 1–2 free of frontend build dependencies so a Vite regression cannot block persistence correctness.

Operational Impact

Maintenance. Assume you own this permanently. If you fork or vendor any part of the bundle, the fork is yours to patch — there is no upstream backport path given the adoption level. The cheapest maintenance posture is to own only the contract and the manifest generator, and treat the picker UI as replaceable.

Support. No community, no issue history, no dependents to observe in production. Internal documentation is therefore the only support surface, and it should be written by whoever does step 1, not deferred. Expect the "which icon names still exist?" question to recur at every icon-library bump and answer it with tooling, not process.

Scaling. The scaling axis here is payload, not request volume. A picker that ships every enabled icon to the browser will dominate page weight for a large set; the config allowlist is the primary control, the manifest is the second, and per-page tile caps are the third. Server-side cost is negligible — this is a form widget, not a hot path. If the picker is embedded in a Livewire component, watch for it re-hydrating the full manifest on every round trip.

Failure modes, ordered by likelihood:

  • Dangling identifiers. An icon is renamed or removed upstream and stored values render blank in production. Mitigated only by a validation rule at write time plus a periodic audit over existing rows — plan for the audit as a scheduled command, not an afterthought.
  • Manifest/build drift. The icon index is regenerated but cached or CDN-served stale, so the picker offers icons the renderer cannot resolve, or vice versa. Version the manifest with the release.
  • Payload regression. Someone enables a 7k-glyph set in config and page weight jumps an order of magnitude on any route containing the form. Make the allowlist a reviewable config change with a documented per-set icon count.
  • Accessibility failure. Icon grids fail keyboard and screen-reader testing easily, and there is no upstream evidence of an audit to inherit. Test step 5 explicitly rather than assuming parity with the Symfony original.
  • Fork rot. If you copy bundle source into the repo, it silently diverges from upstream and accumulates PHP/Symfony-shaped patterns in a Laravel codebase. Prefer a clean port to a copy.

Ramp-up. The identifier convention is learnable in an hour. The expensive knowledge is the asset pipeline: the bundle's Vite/TypeScript frontend means the reference implementation assumes a build toolchain, and a team porting to Blade+Alpine has to reconstruct the manifest-generation step without guidance. Allocate the ramp-up time there, not on the form integration.

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.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums