codeat3/blade-iconic-icons
Blade Iconic Icons brings the Iconic icon set to Laravel as ready-to-use Blade components. Drop SVG icons into your templates with simple tags, customize size and color through attributes, and keep your markup clean without extra JavaScript or asset pipelines.
Architecture fit. This is a presentation-layer-only dependency: a Composer package that registers a set of SVG files with blade-ui-kit/blade-icons and exposes them as <x-iconic-* /> Blade components. It introduces no persistence, no service provider hooks beyond icon-set registration, no routes, no config surface that touches runtime behavior, and no domain coupling. For a Laravel monolith or a Blade/Livewire app, that is the cheapest possible class of dependency to add and the cheapest to remove — the removal exercise is a composer remove, a copy of resources/svg into resource_path(), and one BladeIcons::registerSet(...) line. Architecturally, the fit is excellent if the app is Blade-rendered. It is a non-starter for API-only services, and it is redundant in a JS-framework-driven frontend (Inertia/React/Vue) where an npm icon pipeline already exists and would create visual drift against a second, PHP-side source of truth.
The real architectural question is not "this package vs. nothing" but "this package vs. blade-ui-kit/blade-icons plus our own vendored SVG directory." The delta is roughly an hour of setup. The wrapper's value is that the icon set is already curated, named, and registered; the wrapper's cost is that it hard-codes a design commitment (Iconic Icons, pinned to upstream v1.2.1) that the product may not have made deliberately.
Integration feasibility. Low effort, high reversibility. Install is a single composer require; Laravel package auto-discovery registers the provider; the happy path requires no publish step. Usage is three interchangeable entry points from the underlying Blade Icons layer (component, @svg directive, svg() helper), and the recommended implementation is a single project-local <x-ui.icon> wrapper that owns sizing, accessibility attributes, and a missing-icon fallback. That wrapper is where all the actual engineering judgment lives — the package contributes almost none of it. Realistic estimate: under a day to integrate and harden in an existing Blade app, including the wrapper component, an icon-existence test, and a deploy-step change for the manifest cache.
Technical risk. The risk profile is dominated by one signal: last release 2021-05-14, 0 stars, 0 dependents, no upstream tracking past Iconic Icons v1.2.1. This should be classified as vendored convenience code we absorb, not a maintained dependency.
blade-icons constraint of ^1.0. If the app is on Blade Icons 2.x, Composer will conflict and the package simply cannot be installed as-is. This is the first thing to verify and it is a five-minute check — do it before anything else.@else fallback plus a test_required_icons_exist assertion converts this from a production incident into a CI failure.Key questions to resolve before committing.
blade-icons major is the target app on, and does ^1.0 actually resolve? (Blocks everything else.)Stack fit. Requires Laravel + Blade (Livewire is fine and unremarkable — icons render server-side per component render). Icons are inlined SVG, inherit currentColor, and are styled with plain CSS classes, which matches Tailwind-style utility workflows cleanly. No JS build step, no icon font, no CDN, no published assets. Where the app already uses Blade UI Kit conventions, the API is consistent with what the team already knows; where it doesn't, the conventions are learnable in minutes. It does not fit non-Laravel or non-Blade contexts by construction, and it should not be run in parallel with an existing npm icon pipeline.
Compatibility. Two constraints to validate, in order: (1) the blade-icons major must be compatible with the app's resolved version, and (2) the package's Laravel/PHP constraints must be checked against both the current and the next major — assume no forward compatibility will be provided. Pin resolved versions in composer.lock and treat any future Laravel upgrade as requiring an explicit re-evaluation of this dependency. The escape hatch is trivial and should be documented at adoption time, not discovered at upgrade time: copy resources/svg into resource_path('svg/iconic') and register it via BladeIcons::registerSet(). That fork path is the de facto long-term plan; price it in up front.
Migration path. Deliberately shallow, and that is the main selling point.
blade-icons constraint resolves; run composer require codeat3/blade-iconic-icons.vendor/codeat3/blade-iconic-icons/resources/svg once to enumerate actual available icons — the README is not the source of truth. Keep the output as the whitelist.class, attributes, fallback) once, rather than inlining w-5 h-5 at every call site.<x-ui.icon> wrapper with the missing-icon @else branch and baked-in aria-hidden/focusable/<title> handling. All call sites go through it.Sequencing. Front-load the two cheap, blocking checks — Composer resolution and icon-list enumeration — before any UI work. The wrapper component should land before the first icon is used in a view; retrofitting a wrapper across ad-hoc <x-iconic-* /> call sites is the only part of this that scales badly. For a phased rollout, pilot on an internal admin surface first: it validates the wrapper, the fallback styling, and the deploy steps against real usage with negligible brand exposure, and it keeps the option to fork-and-vendor exercised in a low-stakes setting. Do not publish the icons into resources/ or public/ at any point — published copies are not refreshed by composer update and produce the classic "icons fine locally, blank in prod" incident. Keep the package as the single source until the fork is actually executed.
Deploy sequencing matters. Because the manifest is cached, any icon file change requires icons:clear → icons:cache → view:clear, in that order. Adding this to the standard deploy script is a prerequisite, not a follow-up.
Maintenance. This is the dominant cost and it is not zero, despite the zero license price. The package is effectively frozen — no release since May 2021, no downstream users, tracking upstream v1.2.1. Plan on owning: the blade-icons version constraint reconciliation at every framework upgrade, the icon set itself if new glyphs are ever needed, and the fork if (when) a Laravel major breaks it. The honest framing for stakeholders is that the risk is ownership cost, not license cost: someone on the team owns the fork, the compatibility matrix, and the icon-set updates. This is a reasonable trade for internal tooling and a poor trade for long-lived public surfaces adopted without an explicit contingency.
Support. There is no support relationship, no security-response path, and no maintainer to escalate to. Practically, "support" means internal triage against a debugging checklist: resolved package version and blade-icons major → exact icon name/casing/hyphenation against resources/svg → manifest cache (icons:clear) → compiled views (view:clear) → dd(svg('iconic-home')) to confirm the set is registered at all. That checklist should live in the team's runbook, because the maintainer will not be producing one. For any org with a dependency-governance policy requiring active releases or a security-response commitment, this package fails the bar — expect that conversation and pre-empt it with the fork plan.
Scaling. Two distinct axes. Rendering scale: the @svg directive reads and parses the SVG per render unless the manifest is cached. In hot paths — data tables, permission grids, anything rendering dozens of icons per request — run php artisan icons:cache at deploy or memoize markup keyed on name + class string (and flush that cache on package version change). The cached manifest is the single highest-leverage operational step. Adoption scale: the package is a single-set wrapper and does not compose with a second icon family without duplicated tooling. If the design system grows beyond Iconic, this dependency becomes the thing to replace, not the thing to extend. Subclassing the package's component to customize behavior couples the codebase to the internals of an unmaintained package — use the attribute bag and Blade Icons' global config instead; those are the supported extension surfaces.
Failure modes. Ranked by likelihood × impact:
@else fallback, styled conspicuously in non-production so missing glyphs are impossible to miss, plus a CI test asserting required icons exist.blade-icons major (most likely at adoption). Hard failure, caught immediately, cheap to resolve — but it may resolve to "abandon this package."icons:clear. Presents as "the deploy didn't work." Mitigation: the fixed deploy order above.vendor/.<x-iconic-* /> returns HtmlString and is safe; hand-rolled {!! svg($name)->toHtml() !!} with a user-controlled $name is an HTML injection point. Mitigation: whitelist against the cached icon list.id/clipPath/gradient defs before rendering it in table rows or cards.Ramp-up. Minimal for developers — three interchangeable APIs, one wrapper component, and a conventions doc that fits on a page. The wrapper is also where accessibility gets solved once (aria-hidden/focusable for decorative icons, <title> or adjacent visually-hidden text for meaningful ones), so no call site can forget. The ramp-up cost is not developer learning time; it is the organizational work of recording the dependency as unmaintained-by-design, assigning a fork owner, and adding the icon-existence test and deploy-order steps to the pipeline. Budget that as a half-day of process work, not as a training cost.
Bottom line for the roadmap. Support this as a low-blast-radius convenience for internal tools, prototypes, and pilot surfaces where reversibility matters more than longevity — and only after the Composer constraint is verified. Do not let it anchor any roadmap item that presumes ongoing icon updates, new glyphs, or future Laravel compatibility; there is no evidence for any of those. For public-facing brand surfaces or accessibility-critical UI, use blade-ui-kit/blade-icons directly with a locally vendored set, and skip this layer entirely.
How can I help you explore Laravel packages today?