codeat3/blade-majestic-icons
Blade Majestic Icons brings the Majestic icon set to Laravel as simple Blade components. Render crisp SVG icons anywhere in your views with a clean, consistent tag syntax, keeping markup readable and styles easy to customize.
Architecture fit. codeat3/blade-majesticons is a presentation-layer-only dependency: an auto-discovered service provider that registers an anonymous Blade component path pointing at a vendored set of MIT-licensed Majesticons SVG files. It carries no domain logic, no persistence, no queue workers, no HTTP surface, no runtime service, and no configuration that shapes application behaviour. For a TPM the architecturally significant fact is that it is inert by design — it can be introduced into a single view without an architecture review and removed with a composer remove plus call-site cleanup. Fit is strong for server-rendered Laravel + Blade + Tailwind design systems and near-zero for Inertia/React/Vue-only front ends, where the components simply never render.
Integration feasibility. composer require, auto-discovery, use the component. Technical effort is measured in hours; the organisational effort is the icon inventory and mapping exercise against whatever SVGs the product already ships, plus brand/legal sign-off on the icon vocabulary. Two feasibility flags belong in the plan: (a) this package is one of a large family of near-identical blade-* icon packages from the same maintainer, so absent a standardisation decision different squads will accumulate different icon dependencies; (b) 0 stars and 0 dependents means effectively no community validation — treat it as a convenience dependency with a documented escape hatch, not a platform commitment.
Technical risk. Low blast radius, three identifiable risks.
illuminate/* constraint for Laravel 13 via PR #13. Support therefore arrives reactively, after each Laravel major ships, creating a gap window on every future upgrade where the package cannot resolve. That gap lands directly on the framework-upgrade critical path.Unable to locate a class or view for component exception rather than a build failure. In data-driven usage (CMS menus, notification types, nav tables) this is a latent defect class.All three mitigations are cheap and should be scoped in from day one: pin per Laravel major, vendor the SVGs as a documented fallback, and constrain icon names behind an enum or allow-list.
Key questions.
^2.3, and is this bump already a line item in the Laravel 13 upgrade epic, sequenced before the framework bump?Stack fit. Fits the standard Laravel + Blade + Tailwind stack with no build-step involvement: icons render inline into the HTML response, inherit currentColor, and participate in Tailwind text-*, dark:, and group-hover: variants for free. This is the substantive reason to prefer it over pulling Majesticons in through Vite — it removes a front-end build dependency and a sprite-generation step, and keeps unused icons out of both the JS and CSS bundles since only rendered icons reach the HTML. It does not fit Inertia/React/Vue-only front ends, and it does not fit non-Laravel services. It also does not fit transactional email or generated PDFs: inline SVG is stripped by Gmail and only partially supported by DomPDF/mPDF, so those surfaces need an image or icon-font fallback.
Migration path. Greenfield adoption is trivial: composer require codeat3/blade-majesticons, no provider registration, then use <x-majesticons-home-line />. The realistic brownfield scenario is replacement of hand-pasted inline <svg> blobs, and that should run as incremental replacement of the highest-churn surfaces first (shared nav, buttons, empty states) behind a single wrapper component rather than a sweeping find-and-replace. Migrating off an icon font or sprite sheet is a one-way door per call site and requires a visual regression pass, because stroke-based line icons and fill-based solid icons will not match an icon font's metrics exactly.
Compatibility. The package tracks Laravel majors on minor releases. 2.3.0 is compatibility-only: widened illuminate/* constraint, no API changes, no renamed components, no markup changes, nothing written against 2.2.x breaks. Laravel 8–12 consumers can take 2.3.0 as a safe drop-in; Laravel 13 consumers must be on ^2.3 or composer update will fail to resolve. The package description advertises optional config publishing, but the current line ships no publishable config file — any team expecting config/blade-majesticons.php for customisation should be redirected to wrapping instead.
Sequencing.
<x-icon name="" variant="line" /> wrapper that centralises size, colour, and aria-hidden defaults — and land it before broad adoption, or class="size-5 shrink-0" will drift across hundreds of call sites.Maintenance. Near-zero steady state: no config to drift, no migrations, no runtime process, no asset pipeline. The only recurring obligation is a version bump on each Laravel major, which should live as a standing checklist item inside the framework-upgrade epic rather than as a separate maintenance stream. Budget roughly a day per Laravel major for the bump plus smoke testing, and treat any longer gap as a signal to execute the vendor-the-SVGs fallback.
Support. There is no vendor, no SLA, and no escalation path. Support for our use of it is therefore internal by default: the owning team answers for upgrades and breakage. That is acceptable because the fallback is a day of work, but it must be written down — "we can own this in a day" is the entire justification for accepting a single-maintainer dependency, and it stops being true if the package's usage sprawls across every team without a standard.
Scaling. Scales fine technically: components compile to inline SVG, cost is proportional to rendered icons per page, and there is no shared singleton, cache, or process to contend on. The scaling concern is organisational, not technical — unchecked, the codebase accumulates one icon family per squad and the upgrade-checklist burden multiplies. Decide explicitly to standardise on one or two families.
Failure modes. Four to plan for. Resolution failure on a Laravel major — caught by sequencing the bump before the framework upgrade. Runtime exception on a mistyped or data-supplied component name — caught by the allow-list/enum. Visual drift when icons are used without a wrapper — caught by shipping the wrapper first and reviewing call sites. Maintainer abandonment — caught by the documented vendoring escape hatch; never edit vendor/, instead copy the SVGs and register a local anonymous component path.
Ramp-up. Very low for engineers already on Blade: the component syntax is self-evident and there is nothing to install or configure. The predictable first-hour friction is that component names come from SVG filenames rather than the vendor's website, and that -line and -solid are separate components — ls vendor/codeat3/blade-majesticons/resources/svg is the source of truth and belongs in the onboarding note. Accessible naming, aria-hidden, and focusable="false" handling are not provided by the package and stay in our wrapper component; that is a product-quality decision we make, not one the dependency makes for us.
How can I help you explore Laravel packages today?