nickperkins/blade-icon-picker
A standalone icon picker Blade component for Livewire forms that works with any blade-icons pack, featuring search, lazy rendering, keyboard navigation, and responsive styling with no Tailwind dependency.
blade-icons ID (e.g. heroicon-o-home), the same convention used by @svg(), Filament, and most Laravel admin tooling. That means adopting or later removing the picker is a UI change, not a data migration — which lowers the cost of saying yes now and re-evaluating later.Adopt when all of the following hold:
$wire.set() contract are the whole integration surface).blade-icons pack (Heroicons is the recommended default). No pack installed = a helpful error message, not a working picker.<link>/<script> tags are acceptable in your deploy pipeline.Look elsewhere (or defer) when:
unsafe-inline, or you need confirmed ARIA combobox/listbox semantics and screen-reader testing on a public-facing surface. Accessibility is claimed but unevidenced.If none of the "look elsewhere" conditions apply, this is a credible low-regret adoption — but validate it with a half-day spike before committing, not after.
For executives (one paragraph): This is a small, MIT-licensed open-source component that gives our Livewire admin forms a proper icon picker — searchable, keyboard-friendly, responsive, no design-system dependency. It replaces a hand-rolled UI we would otherwise build and maintain, and because it stores a standard blade-icons ID, we can swap it out later without touching data. The risk is vendor risk, not technical risk: a single maintainer with no community usage behind it. We cap that by pinning a version, wrapping it in an internal component, and budgeting a small allowance to own a fork if needed. Recommendation: approve a one-day spike on one admin screen; the decision gate is page-weight and render-cost acceptability.
For engineering (the short version):
blade-icons glyph to inline SVG and serializes the catalog as JSON; the browser owns search, lazy chunking (30 at a time), and keyboard nav. Only server round-trip is $wire.set() on selection.composer require, tagged asset publish, two manual tags. No service provider config, migrations, queues, or external services. JS auto-registers with Alpine in Livewire 3.wire:model alone will not seed the initial value — :value="$icon" is mandatory. Validation and error display are entirely ours. Wrap the vendor tag in <x-app.icon-field> that enforces both bindings, error rendering, and theme binding, so no product developer calls it directly.:value; CSP compatibility with inline SVG; actual keyboard and screen-reader behavior; and the dark-mode contract — the README contradicts itself (ip-dark class vs [data-theme], and conflicting statements on prefers-color-scheme auto-detection), so resolve it empirically.How can I help you explore Laravel packages today?