owenvoke/blade-entypo
Blade Entypo brings the Entypo icon set to Laravel Blade, offering simple directives for embedding crisp SVG icons in your views. Lightweight and easy to install, it keeps templates clean while giving you quick access to hundreds of scalable icons.
Architecture fit. owenvoke/blade-entypo is a presentation-only dependency: an auto-discovered service provider registers a Blade component namespace over a bundled directory of ~400 Entypo SVGs, with an optional publishable config for paths, prefixes, and default classes. No domain logic, no persistence, no events, no outbound calls, no runtime JS. For a TPM this is the cheapest dependency shape to justify — it is additive at the view layer, reversible without touching business logic, and its blast radius is exactly the set of .blade.php files that reference <x-entypo-*> or our alias. That containment is what makes it approvable at all in a codebase with any governance overhead.
Integration feasibility. composer require → optional vendor:publish → <x-entypo-home /> in a view. Realistic estimate: half a day to prove the pattern on one surface including design review, 1–2 days for a full rollout if template substitution is scripted. The genuinely non-trivial work is not engineering — it's two decisions plus an inventory: (a) build our own <x-icon> alias so the icon set is swappable, (b) fix the accessibility convention (decorative vs. meaningful) once, and (c) enumerate which glyphs are actually in use today across webfonts / Font Awesome / hand-copied SVG. Items (a) and (b) cost twenty minutes now and are expensive to retrofit after sixty templates bind directly to x-entypo-*.
Technical risk. Low on the engineering axis, materially higher on compliance and lifecycle — and the two are owned by different people, which is the real management point:
LICENSES file) before customer-facing exposure. Internal tooling can proceed in parallel.^13, merged by a first-time contributor, containing zero features, fixes, or security content. Evidence of non-dormancy, not of investment. With 7 stars and 0 dependents, fork-and-vendor is a one-day contingency — the residual risk is a Packagist disappearance, not lost capability. Budget it as a contingency line, don't staff it.composer.json framework constraint, and the notes do not state whether it widened (added ^13 alongside earlier majors) or narrowed (replaced them). That is precisely the class of change that breaks a clean install or forces a transitive downgrade. Verify in a branch with a lockfile diff; do not assume semver protects you.^13 bump confirms this is not a thin wrapper over blade-ui-kit/blade-icons (which would inherit that constraint). Consequence: swapping icon sets later is a template-touching migration unless the <x-icon> alias exists. That alias is the single highest-leverage deliverable in this workstream and should be an explicit acceptance criterion, not a nice-to-have.Key questions to resolve before adoption.
^13 alongside existing majors or replace them, and what is the new PHP floor?<use> sprite, or external file — and what does that imply for CSP directives (img-src/style-src vs. inline markup) and DOM weight on icon-dense pages?aria-hidden, focusable, and role guaranteed by the component, or entirely on us? (Evidence says entirely on us.)x-entypo-* directly? That number is the argument for the alias.Stack fit. Ideal for Laravel + Blade + Tailwind. Inline SVG inherits currentColor, so sizing and colour are pure utility classes — size-5, text-gray-500, hover:text-black — and there is no @font-face, no FOIT, no asset-publish step, no sprite build. Works naturally in Blade-shell apps, Livewire components, and server-rendered Inertia pages because rendering is server-side and the output is markup. Does not fit Vue/React SFCs — those surfaces stay on their own SVG pipeline; do not attempt to duplicate the set there, and say so up front so no one plans for it.
Migration path. Three phases, each independently shippable:
resources/views/components/icon.blade.php wrapping x-dynamic-component with 'entypo-'.$name, enforcing aria-hidden="true" focusable="false" by default and role="img" + aria-label when a label prop is passed. Dynamic names must route through x-dynamic-component — you cannot interpolate into a tag, and menu config, status maps, and DB-driven icons all need this. Acceptance criterion: zero new direct x-entypo-* references after this lands.<i class="entypo-*"> and ad-hoc SVGs with <x-icon>, verify visually, then delete the icon font files, @font-face declarations, and icon-font CSS. That deletion is the tangible win — fewer bytes on first paint. Map semantics to names once in config/icons.php (status → glyph, payment method → glyph, log level → glyph) so a new status is a config line, not a template hunt.x-entypo- usage outside the alias.Compatibility. The version constraint is the gate, not the code. On Laravel 11/12, pin ^2.3 and accept that line as frozen. On Laravel 13, take ^2.4. Confirm provider registration before debugging anything else (php artisan about for the providers list; php artisan view:clear if a component "does not exist" right after install). Verify the constraint direction in a branch and read the lockfile diff — a framework-constraint release is exactly what forces a transitive downgrade.
Sequencing.
Maintenance. Near-zero steady state: no config to keep in sync, no assets to rebuild, no version cadence to track beyond the Laravel constraint. The real maintenance surface is our alias component and the config/icons.php mapping — both small and both ours. Upstream cadence is roughly one constraint bump per Laravel major, so budget a few hours per major-version cycle, plus a lockfile verification step. Do not build a process around this package; build it around the alias.
Support. No vendor, no SLA, no support contract — a single maintainer and a first-time contributor on the most recent release. That is acceptable because the surface is tiny (a provider plus a directory of SVGs). The support plan is the contingency, not a contract: if upstream goes quiet, fork-and-vendor is a one-day job, and the <x-icon> alias means no template changes. Document that contingency in the repo README so it survives staff turnover. Support burden on the team is genuinely low; the predictable tickets are "icon name typo" and "colour not applying."
Scaling. Scales fine on request volume — there is no runtime cost beyond rendering inline markup. The scaling concern is DOM weight and payload, not throughput: a 200-row table with three icons per row is 600 inline <svg> elements on the wire. Acceptable, but measure before assuming. Policy: icons on summary/detail views; if a dense listing shows up in profiling, drop to a single icon per row or render text-only. Also watch class-merge ordering — if a default size class wins over a passed one, inspect the final class attribute rather than reaching for !important.
Failure modes. Ranked by likelihood × impact:
| Failure | Symptom | Mitigation |
|---|---|---|
| Typo in icon name | Blade component-missing exception, no silent fallback | Keep the sorted SVG filename list bookmarked during adoption; alias centralizes the fix |
| Stale compiled views after deploy | Newly added icon doesn't appear in production | php artisan view:cache in the deploy script; optimize:clear locally |
| Constraint clash on install | Composer resolution failure or unexpected downgrade | Resolve in a branch, read the diff, pin ^2.3 if on Laravel 11/12 |
| Hardcoded fills in a glyph | text-* classes silently do nothing |
Inspect rendered markup before blaming Tailwind purge |
| Accessibility omission | Icons shipped with no label or no aria-hidden |
Enforce in the alias so it cannot be forgotten; check contrast on meaning-bearing icons |
| License obligations unmet | Release blocked or takedown exposure | Legal read + attribution placement at adoption, not after |
| Packagist unavailability | Install breaks for new environments | Vendor/fork contingency, one day |
| Mixed icon sources | Inconsistent optical sizing, two migration paths later | One path, one alias, review enforcement |
Ramp-up. Very shallow for any Laravel dev — the API is a Blade tag and the README is sufficient. Realistic ramp: under an hour to first productive use, half a day to be fluent including the dynamic-component and alias patterns. The friction is entirely in the two upfront decisions (alias, accessibility convention) and the glyph-name inventory, not in the tool. Budget onboarding as: read the alias component, bookmark the SVG directory listing, done. New hires should never learn <x-entypo-*> directly — they should learn <x-icon>, which also means the underlying package can be replaced without retraining anyone.
How can I help you explore Laravel packages today?