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.
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:
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):
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.Keep steps 1–2 free of frontend build dependencies so a Vite regression cannot block persistence correctness.
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:
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.
How can I help you explore Laravel packages today?