khatabwedaa/blade-css-icons
Blade CSS Icons renders icons in your Blade views without SVG files—just drop in the component and go. Clean, lightweight markup that inherits your text color and size, perfect for keeping Laravel UIs fast and simple.
Architecture fit. The package is a pure presentation-layer dependency: it registers Blade components (and a service provider) that emit CSS.gg icon markup. It touches no models, no migrations, no routes, no queue or storage concerns. That makes it a low-coupling addition — safe to adopt in a single view without committing the rest of the codebase, and equally safe to rip out later. It is not a design-system replacement; it is an icon vocabulary, so the architectural question is really "does our view layer already standardize on Blade components for UI atoms?" If we use Heroicons/Font Awesome via inline SVG today, this is a parallel, not a replacement, unless we consciously consolidate.
Integration feasibility. The happy path is one composer require, Laravel package auto-discovery, and <x-cssicon-* /> in a Blade template. Two things must be verified before we commit:
vendor:publish, or expected as a manually included asset? This determines whether it composes with Vite or requires a <link> tag/CDN reference in the layout.class, id, style, aria-*, wire:*, and x-bind attributes flow onto the rendered element. Without this, styling per-instance and Livewire/Alpine interop get awkward fast.Technical risk. Rated low-to-moderate:
illuminate/support constraint spans our target Laravel range rather than pinning a single major.Key questions for the maintainer / spike.
aria-hidden by default, and is there an ergonomic way to supply an accessible name for meaningful icons?Stack fit. Native fit for a server-rendered Laravel + Blade stack, with or without Livewire. Neutral for Inertia/Vue — icons would live in Blade shells only, so a Vue SPA front end gets no benefit. If the front end is React/Vue-dominant, this package is the wrong tool regardless of its score.
Migration path. Adopt incrementally rather than as a sweep:
Compatibility. Confirm PHP and Laravel constraints against our supported matrix before purchase-order; also confirm no collision between CSS.gg class names and our existing utility CSS (Tailwind's gg-* overlap is unlikely but the icon set injects global class names, which is worth a quick grep).
Sequencing. Dependency approval and repo verification first → asset pipeline decision second → single-view spike third → design-review sign-off on visual language fourth → incremental rollout. Only after the spike should this appear in a design-system or component-library standard.
Maintenance. Low absolute effort, but non-zero attention: pin the version, review changelogs on upgrade, and keep a note that CSS.gg upstream changes can alter visual output without a version bump here. Budget a few hours per Laravel major upgrade to confirm compatibility.
Support. No commercial support, no SLA, one maintainer. Treat it as community-supported and ensure we could fork or vendor the components if it goes stale — the code footprint is small enough that this is a realistic fallback, which materially de-risks adoption.
Scaling. Effectively free at runtime: static CSS, no JS, no server-side work beyond Blade rendering. The only scaling consideration is stylesheet payload — if the full CSS.gg bundle ships on every page, evaluate serving it from our CDN and confirming gzip/brotli size. It should not affect request latency or infrastructure cost.
Failure modes to watch.
Ramp-up. Hours, not weeks, for any developer comfortable with Blade components. The real cost is design, not engineering: someone must own the decision about which icon set is canonical, and enforce it, or we accumulate drift. Recommend the spike conclude with a short written standard before broader rollout.
How can I help you explore Laravel packages today?