codeat3/blade-typicons
Blade Typicons brings the Typicons icon set to Laravel as simple, self-closing Blade components. Render crisp SVG icons anywhere in your views with a clean tag syntax, no extra setup required.
Architecture fit. Blade Typicons is a thin SVG-set wrapper over blade-ui-kit/blade-icons — no runtime engine, no JS bundle, no asset pipeline. It registers a set and exposes <x-typicon-{name} /> tags that compile to inline <svg>. For a Laravel monolith, admin panel, internal tool, or MVP where Blade renders the UI, it is architecturally close to inert: one Composer dependency, one auto-discovered service provider, zero infrastructure. Because it's pure server-side compilation, it also works in Livewire, queued mailables, and PDF renderers — which matters more to the roadmap than the specific glyph set does.
The caveat: this is an icon delivery mechanism, not an icon system. Size, color, accessibility, semantic naming, and set-swappability are all yours to decide, and all should be decided before the first view is written.
Integration feasibility. composer require, auto-discovery, done. No publish step, no config file required for a first render. The genuine integration cost is roughly a half-day of decisions: confirm the component prefix (singular typicon vs. plural typicons — the README drifts from the implementation and this is not worth guessing), walk your actual screens against vendor/codeat3/blade-typicons/resources/svg/ for coverage, and build an internal <x-icon> wrapper plus a semantic name map. Do that once and the marginal cost of the next icon is zero.
Technical risk. Ranked by exposure:
Four of the five are process controls, not architecture blockers.
Key questions. Who owns attribution compliance and where is the obligation recorded durably? Does the current design surface need anything beyond a compact ~336-glyph utility set — brand marks, illustrations, multi-tone? Which Blade Icons sets are already registered in this app? Are mail and PDF surfaces in scope, since that changes the styling strategy? What is the PHP/Laravel floor — does 1.8.0 install cleanly, or is ^1.7.0 the correct pin?
Stack fit. Laravel 10–13 via illuminate/support, requiring blade-ui-kit/blade-icons. Consumes Tailwind naturally (icons inherit currentColor; w-5 h-5 classes do the work) but has no Tailwind dependency — any CSS system works. Identical behavior across Blade views, Livewire components, mailables, and PDF renderers because nothing runs client-side.
Migration path. Near-frictionless for greenfield, and manageable for an app with ad-hoc inline SVG scattered through views. Two rules make it so:
<x-typicon-*> directly in views. Everything routes through <x-icon name="..." />. That single wrapper is what makes the set swappable and the exit cheap — copy the ~15 SVGs you actually use into resources/svg, register them, change one line, delete the dependency.arrow-right, tick), not intent (next, save). The map doubles as your usage inventory and as the input to your smoke test.For an app already on another Blade Icons set, keep a distinct prefix, publish config/blade-icons.php, and verify resolution rather than assuming it.
Compatibility. Confirm three things before pinning: the actual component prefix, the exact kebab-case filenames (read them from resources/svg/ — never infer from appearance; cog vs. settings, th-large vs. th-list are both live traps), and whether 1.8.0 raises the PHP floor or narrows illuminate/* below your runtime. composer why-not codeat3/blade-typicons 1.8.0 answers the last one. Pin in the same commit as the install; on Laravel 10–12, ^1.7.0 is the safe default until verified.
Sequencing. Roughly a week of calendar, mostly decisions rather than work:
<x-icon> with a size scale, attribute forwarding, aria-hidden="true", and the config map behind a whitelist. Add the smoke test that iterates the map.<style> and can't see Tailwind).Maintenance. Low, and the wrapper is why. Upgrade cadence is your choice; pinning plus the smoke test means a patch release cannot silently blank an icon somewhere. The upstream project is small and slow-moving, which for a static SVG set is acceptable — the artifact is files. On each bump, check composer.json for PHP floor and illuminate/* constraint changes; 1.8.0 is compatibility-only with no API change.
Support. No vendor support relationship exists. Internal answerability rests on two documented mechanisms: the semantic map (the "can we get this icon" answer is a directory listing) and the single-icon override (copy one SVG into your own resources/svg under the same set name and it wins upstream). Write that override path down; it is simultaneously the customization route and the abandonment insurance.
Scaling. No client JS budget and no runtime to boot — the cost is document weight. 200 table rows × 3 icons is 600 inline <svg> elements. Fine at normal volumes; noticeable in dense data tables and kanban boards. Escalation ladder, cheapest first: php artisan view:cache in production, drop icons from the per-row repeated cells, then a single <x-sprite> rendered once per page and referenced with <use href="#icon-trash">. Note <use> breaks in email clients — keep it out of mailables.
Failure modes. Four to instrument against:
<svg; absence means a bad name, and the fix is reading the filename in the vendor directory. Put this in the runbook — diagnosed blind, it costs hours.view:clear followed by view:cache in the deploy script.x-dynamic-component — it resolves arbitrary Blade components, including ones you don't intend to expose. Always resolve through the config whitelist with a known-good fallback.LICENSES.md, an about screen) and assign a named owner.Ramp-up. Hours for a Laravel developer — it's a component tag. The real onboarding artifact is the wrapper's contract: the size scale, the semantic map, "always <x-icon>, never <x-typicon-*>," and "accessible labels go on the interactive control, not the SVG." Four lines in the frontend conventions doc buy consistency across contributors and keep the exit path live.
Bottom line. The buy case is an asymmetry: near-zero adoption cost, near-zero exit cost, and engineering spend shifts from icon plumbing to product surfaces. Two things must not be deferred — the license gate and the wrapper. Skip the wrapper and exit cost becomes a view-by-view audit; skip the license check and you inherit an obligation you cannot unwind. Both are day-one decisions, not sprint-three ones.
How can I help you explore Laravel packages today?