codeat3/blade-pepicons
Blade Pepicons brings the Pepicons icon set to Laravel Blade as simple, reusable components. Drop icons into your views with a clean tag syntax, customize size and class, and keep markup readable. No manual SVGs or icon juggling required.
Architecture fit. This is a presentation-layer-only dependency: a generated Blade component adapter over the Pepicons SVG set that renders inline <svg> during server-side template compilation. It introduces no routes, migrations, config surface, queue jobs, or runtime network calls — just a view-component provider registered via package discovery. That makes the blast radius essentially zero and the architectural question narrow: does the surface in question render through Blade at all? For a Laravel monolith, admin panel, marketing pages, or documentation site, yes. For an Inertia/React/Vue frontend or an API-only service, the package is dead weight — those teams should consume Pepicons' npm package directly and this decision is a non-starter rather than a trade-off.
The structural point that matters more than the icon set itself: this package is a thin adapter on blade-icons. Adoption is therefore a bet on a pattern, not on a vendor. Call sites look roughly the same whether the underlying set is Pepicons, Heroicons, or Tabler, which means switching later is a mapping-table change rather than a template sweep. That property is worth more to the roadmap than Pepicons' specific glyphs.
Integration feasibility. Install-to-first-render is genuinely a one-liner: composer require, auto-discovery, no config publish, no npm, no asset build, no Vite changes. A developer can prove it out in under an hour. The real integration cost is not installation — it is (a) design sign-off on the icon style, and (b) building the semantic wrapper and icon map that insulate templates from the generated component names. Budget half a day to a day for the wrapper, map, accessibility defaults, and a contract test; the Composer line itself is minutes.
Technical risk. The dominant risk is governance, not engineering:
blade-icons constraint. The 1.7.0 Laravel 13 compatibility line is a changelog assertion, not test evidence we can inspect — verify it in our own CI against our resolved blade-icons version rather than taking it on faith.vendor/.../resources/views/components will produce rework. The catalog listing is the source of truth.Key questions.
<x-icon name="..."> → component), and what is the documented fallback for an unmapped name?blade-icons / Laravel / PHP constraints in composer.json at the pinned version, and does the full-map resolution test pass on our Laravel matrix?pepicons-?resources/svg/ with the map pointing through a layer we control?Stack fit. Laravel with Blade, plus Tailwind or any utility CSS that drives text-* and size-* off currentColor. Attributes land on the root <svg>, so styling, hover/active states, and ARIA behave exactly like hand-written markup. If the team already uses blade-icons for another set (Heroicons, Tabler), marginal cost is one Composer line and a provider registration — this is the cheapest possible adoption scenario and should be the default entry point.
Migration path. Do not run a template sweep. The sequence that survives contact with a real codebase:
<svg>. This validates the whole chain (discovery, naming, attribute merging) for an hour of effort.<x-icon name="..."> with an allowlist map, a fallback, and default aria-hidden="true" / optional role="img" + aria-label. Every template then speaks semantic names, and the icon set becomes an implementation detail.grep -r "pepicons-" resources/views in CI as both an adoption metric and a straggler detector.Compatibility. Pin the exact version in composer.json — floating constraints on a single-maintainer package are how you get surprise majors. Verify the resolved blade-icons version in CI, not just this package's constraint. Remember Laravel resolves application components ahead of package components, which gives two clean levers with no vendor/ edits: define App\View\Components\PepiconsHome to patch a single glyph, or shadow the whole namespace if the set is ever abandoned. Prefix-collision check is a five-minute audit that prevents a genuinely confusing class of bug.
Sequencing. Design sign-off on style should precede customer-facing rollout but must not block the internal pilot — that ordering is what makes this decision cheap to trial and cheap to reverse. Engineering work order: install and dump the catalog to docs/icons.md (this document, not the vendor README, becomes the team reference), build the wrapper and map, add the contract test to the Laravel matrix, convert the pilot surface, snapshot the used SVGs as the exit hatch, then expand. The contract test that iterates every entry in the map is the single highest-leverage artifact here — it doubles as the upgrade smoke test and converts "will this break on Laravel 14?" from a judgment call into a CI signal.
Maintenance. Runtime maintenance is effectively zero; ownership is not. We own the wrapper, the map, the catalog doc, and the snapshot of SVGs. The package owner maintains the adapter, and 1.7.0's compatibility release is the maintenance signal to watch — it also resets the review clock, so the honest position is "revisit in ~12 months or at the next Laravel major, whichever comes first." That is a cheap standing obligation, but it should be a named line in someone's dependency register rather than an assumption.
Support. Ticket volume should be near zero, because the failure modes are developer-facing and loud. The two tickets that will actually occur are "there's no icon for X" and "the wrong icon renders for status Y" — both resolve in the map, in one place, without touching call sites. That is the operational argument for the wrapper: it converts an unbounded template-editing problem into a single-file edit. There is no user-facing error surface as long as dynamic names are routed through the allowlist; if that discipline lapses, a bad DB value becomes a 500 on a rendered page, which is a real incident for a cosmetic concern.
Scaling. Server-rendered inline SVG is cacheable with the page, adds no JavaScript bundle, needs no sprite pipeline, no font loading, and no tree-shaking configuration. It degrades gracefully with JS disabled and prints correctly — properties that matter for invoices, receipts, and documentation. Horizontal scaling is unaffected: this is markup, not a service. The only scaling conversation worth having is render weight on very icon-dense views (40+ icons), and the mitigation — sprite only the icons repeating 20+ times on that specific view — is a targeted optimization, not an architectural change. Excluded channels: HTML email, which strips inline SVG regardless of package.
Failure modes. Ranked by likelihood × cost:
currentColor and hover transitions look mismatched side by side. Audit the dozen icons in the design system, not the catalog.blade-icons — the realistic upgrade blocker; caught by the contract test on the matrix before it reaches production.Ramp-up. An experienced Laravel developer is productive in under an hour; the install and first component are trivial. The onboarding artifact that actually does the work is the catalog doc plus the wrapper convention — because "is there a rocket icon?" will be asked repeatedly, and ls | grep -i rocket against a committed listing answers it faster than any external site. Design-side ramp-up is lighter than the alternative: no font files, no sprite maintenance, no export pipeline, and style changes flow through a mapping table instead of a template sweep. That reduction in recurring design hand-off load is the durable business case — the icon layer stops being a per-feature task and becomes infrastructure.
Default TPM recommendation. Approve immediately for internal, experimental, and non-brand surfaces; gate customer-facing brand surfaces behind design sign-off on icon style, explicitly not on the package. Treat it as a lightweight, team-level dependency approval — MIT, no data access, no auth surface, no runtime calls — not something that needs to queue behind payments and auth reviews. Pin the version, build the wrapper and map first, run the map-resolution test on the Laravel 13 matrix, snapshot the SVGs, and schedule a 12-month revisit. The worst case is bounded and pre-paid for.
How can I help you explore Laravel packages today?