codeat3/blade-zondicons
Blade Zondicons brings the Zondicons icon set to Laravel Blade as simple, self-contained components. Drop icons into any view with a single tag, style them with classes, and skip copying SVG markup by hand.
Classification. codeat3/blade-zondicons is a presentation-layer, asset-only dependency: a thin wrapper over blade-ui-kit/blade-icons that registers the Zondicons SVG set as Blade components (<x-zondicon-home class="w-5 h-5" />). There is no domain logic, no persistence, no queue or event surface, no external service, no scheduled work, and no configuration to synchronize. That single fact should set the review tempo: the worst-case failure is a missing or mis-rendered icon on one surface, not an outage, data problem, or security event. This is a build-versus-borrow call that lands on borrow — near-zero build cost, near-zero switching cost — and therefore does not warrant design-system-committee governance.
Architecture fit. Clean and non-invasive. It attaches at the Blade view layer of any Laravel monolith or modular application and constrains nothing about domain architecture, deployment topology, or data model. Because components are namespaced by prefix, adoption can be scoped per surface — one internal admin area, a settings screen, a shared empty-state partial — rather than app-wide. The exit path is unusually cheap and worth stating in the approval: vendor the raw SVGs into the repo, or re-point the same usage onto a broader blade-icons multi-set configuration. Reversibility is the core argument for approval; size the conversation accordingly.
Integration feasibility. High, and demonstrable in hours. Composer install plus Laravel package auto-discovery yields working components with no service-provider registration, no config publishing, and no build step. Release 1.7.0 (PR #239, "laravel 13 compatibilty") is a compatibility declaration, not a behavioural change: it widens framework constraints with no new icons, no new config keys, no API changes, and no deprecations. The integration surface is identical to 1.6.0, so the 1.6.0 → 1.7.0 delta carries no migration steps and no pressure to move frameworks in order to consume it. What it does do is keep the Laravel 13 upgrade path open — without the widened constraint, Composer refuses to install alongside illuminate/* ^13.0, which converts a routine framework bump into a forced icon-layer migration.
Technical risk. Low, with four caveats to carry into planning:
illuminate/* constraints, discovered provider — must be confirmed from the tagged composer.json in CI, not inferred from changelog prose.Key questions for the team:
<x-zondicon-*> components that would collide? Does the config support prefixing?Stack fit. Laravel + Blade + Tailwind, server-rendered inline SVG, no JavaScript dependency, no build pipeline. That makes it a direct fit for SSR views and good for accessibility control via passthrough (aria-*, role, aria-hidden). It is not a fit for React/Vue-first frontends — those should take a JS icon package — and it is additive to, not competitive with, blade-ui-kit/blade-icons.
Migration path. Inbound: from hand-maintained SVG assets or copy-pasted markup, which is where the sprint-capacity win comes from (dashboards, CRUD views, nav lists, empty states, internal tools). Outbound: fork, vendor the SVGs, or migrate the same usage onto a multi-set blade-icons configuration — viable precisely because the package is presentation-only. Neither direction requires touching application logic, which is why this does not need a roadmap slot.
Compatibility. Verify PHP and illuminate/support constraints from the tagged composer.json in CI rather than the one-line changelog. Two things to plan around: the Laravel 13 constraint is the sole reason 1.7.0 exists, and any future Laravel major will need the same treatment on the maintainer's timeline — which is the strongest argument for automated dependency surfacing rather than manual tracking.
Sequencing (roughly a day of engineering, front-loaded and low-risk):
composer.json; confirm runtime PHP meets the Laravel 13 floor.<x-icon> component from day one. Raw <x-zondicon-*> calls scattered across views make every sizing or colour change a repo-wide find-and-replace. Use @svg()/svg() for DB-driven names, with validation on any user-influenced value.php artisan icons:clear && php artisan icons:cache to the deploy script.Maintenance. Near-zero by design: no config to sync, no scheduled tasks, no external service, no credentials. The recurring cost is dependency hygiene — pin the version and let an automated updater propose compatibility releases. Budget a small, recurring line item, not a standing workstream.
Support. Community-maintained MIT package with no SLA and a small footprint. The correct posture is explicitly tactical. The genuine risk is upstream abandonment of the design set, not package breakage, and the mitigation is cheap: fork it, or vendor the SVGs directly. Realistic worst case is under a day of engineering. Confirm licence and attribution expectations if SVGs are inlined into shipped bundles.
Scaling. Two distinct curves. Operational scale is flat — nothing runs, nothing is stateful. Rendering scale is the consideration: inlining many SVGs inflates HTML payload on icon-dense pages (tables, nav lists, paginated cards) and multiplies markup inside loops. php artisan icons:cache is the single biggest win and a one-time platform ask that pays off on every icon-bearing surface; sprite-sheeting or <use> references may eventually be warranted, but this is not a blocker at typical internal-tool scale. Note the caveat honestly rather than claiming it scales indefinitely.
Failure modes to write into the PR and the runbook note:
| Failure | Detection | Blast radius |
|---|---|---|
| Component name collision with in-house components | View compile error | One surface, caught pre-merge |
| Constraint mismatch after a framework upgrade | Provider fails to register — caught by boot smoke test | Deployment blocked, not silent |
| Glyph removed/renamed upstream | Renders empty, no error — needs visual regression check on icon-bearing views | Cosmetic, may go unnoticed for weeks |
| Missing cache refresh after deploy | Icons render but manifest is stale | Minor, cleared on next deploy |
Only the silent-empty case needs deliberate instrumentation, and a visual regression check on the two or three most icon-dense views is sufficient. No operational runbook is warranted beyond a dependency-update note.
Ramp-up. Under an hour for a developer comfortable with Blade components — install, auto-discovery, render a component. The real effort is design-system alignment, not platform work: sizing conventions (w-5 h-5 vs. fixed dimensions), stroke weight consistency, and accessibility labelling (decorative icons aria-hidden, meaningful icons labelled). That is a frontend/design pairing of maybe half a day, and it is the same effort we would spend on any icon approach — which is itself an argument for borrowing here rather than building.
Bottom line for the TPM. Approve as a tactical UI dependency, pin it, monitor it, adopt it on internal surfaces first, route all usage through one wrapper, and declare the fixed icon vocabulary to design up front. Do not staff it as a project.
How can I help you explore Laravel packages today?