codeat3/blade-system-uicons
codeat3/blade-system-uicons adds Laravel Blade components for the System UIcons SVG icon set, letting you render lightweight, customizable icons directly in Blade views with simple tags—ideal for dashboards, menus, and UI details.
Architecture fit. codeat3/blade-system-uicons occupies exactly one layer of the stack: Blade view rendering. It registers the System UIcons SVG set with blade-ui-kit/blade-icons via an auto-discovered service provider and exposes each glyph as an anonymous Blade component (<x-system-uicons-home />). There is no database, no queue, no cache backend, no HTTP client, no configuration surface, and no API of its own. From a TPM's standpoint this is the most tractable dependency shape available: it imposes no application structure, requires no data migration, has no runtime services to provision, and can be added or removed without touching domain code or release cadence. The matching constraint is equally clean — it only serves Blade-rendered surfaces, including Livewire and Inertia apps whose shell is Blade. Any React/Vue/Next SPA or mobile client in the estate must source icons from the upstream set or a JS library; the package is not a delivery mechanism for those surfaces, and scoping it otherwise is the single most likely source of "we adopted it but half the app has no icons" confusion.
Integration feasibility. Very high feasibility, very low ambiguity. One composer require with package discovery yields working components immediately. No credentials, no environment variables, no per-environment provisioning, no design spike, no procurement motion, no architecture review. The credible pilot — one layout, one icon-dense page, one accessibility pass — is a sub-day effort for a single engineer. That makes this a trial-and-decide-within-a-sprint item, not an initiative requiring roadmap capacity.
Technical risk. Low at runtime, concentrated in dependency lifecycle. The risk register a TPM should actually carry:
laravel/framework and blade-ui-kit/blade-icons. A lagging release blocks the application's framework upgrade, not just icons. Release 1.9.0 — a single PR widening Laravel 13 compatibility — is the current mitigation, and the risk recurs at every Laravel major.blade-icons. Blast radius is contained because the payload is inert SVG markup, so a fork or a vendored icon directory is a low-cost, credible contingency.Key questions.
laravel/framework for Laravel 13, or does it also move the blade-ui-kit/blade-icons floor or the PHP minimum? Verify in the lockfile, not the changelog.config:cache and view:cache behave correctly with icon rendering in our deploy pipeline? This is the classic failure point for icon packages and must be smoke-tested, not assumed.aria-hidden, role, title handling), and can they be overridden per component? Icon-only controls still need labels and focus styling from our own components.Stack fit. Laravel 9–13 on PHP 8.x with Blade templating. Composes naturally with Livewire and any Blade-rendered admin, back-office, internal-tool, or marketing surface — the segments where icon consistency matters and icon originality does not. Draw the boundary explicitly at the render layer during design review: server-rendered Blade shell in scope, JS-owned layer out of scope.
Migration path. Strangler-style, not big-bang. Component names are namespaced (system-uicons-* vs. heroicons-*, fa-*), so the package coexists cleanly with existing Font Awesome, sprite sheets, and ad-hoc inline SVG during a transition. Recommended sequence: (1) land it in one layout or design-system partial; (2) convert high-traffic, high-visibility views first — navigation, empty states, destructive actions; (3) let legacy icon usage decay opportunistically as files are touched; (4) convert raw inline SVG only when a file is already open for another reason. This keeps icon work inside existing tickets rather than creating a dedicated "icon migration" roadmap line item, which is the main schedule risk with any design-system dependency.
Compatibility. No overlap with runtime concerns, so no coordinated release needed — but two compatibility notes belong in the integration plan. First, the package sits on blade-icons, so any future decision to adopt Heroicons, Lucide, or a custom set is configuration, not a rewrite; that preserves optionality and de-risks the "generic style" tradeoff. Second, pin the exact version in the lockfile. An unpinned minor is the mechanism by which an innocuous dependency bump becomes an upgrade blocker.
Sequencing. Cheap and independent — run it in parallel with whatever else is in flight. The one ordering constraint: complete the render smoke test (including under config:cache and view:cache) before the change is considered done, because a package that renders in local and fails under cached views turns a sub-day task into an incident. If a Laravel major upgrade is already on the roadmap, sequence this adoption ahead of it so the icon layer is settled rather than being discovered mid-upgrade.
Maintenance. Near-zero ongoing effort, with one recurring calendar item: validating the package at each Laravel major and each blade-icons major. Model that as roughly half a day per framework major, plus a contingency decision point if the maintainer lags. Because the payload is inert SVG, the fallback ladder is well understood: pin → fork → vendor the SVG directory into the repo. Budget the fork path as a documented runbook entry, not as unplanned work.
Support. There is no vendor, no SLA, no support contract, and no security review artifact. Internally, ownership should sit with the frontend or platform engineer who owns the design-system partial — not a shared "whoever touches it" arrangement. For most products this is acceptable; for procurement gates requiring vendor attestation or support commitments, it is disqualifying and should be escalated early rather than discovered in review.
Scaling. Scales trivially on the operational axis — no services, no state, no concurrency concerns; components compile and cache like any Blade view. The scaling limit is page weight: icon-dense pages inline SVG per instance, so a table with 200 rows of status icons multiplies markup. Mitigations in order of preference: enforce icon-density review on data-heavy views, rely on gzip/brotli (which compresses repeated SVG well), and only if measurements justify it move to a sprite-sheet approach. Set the threshold empirically during the pilot rather than pre-optimizing.
Failure modes. Four to plan for, in likelihood order:
aria-hidden on decorative icons. Mitigation: publish a short component catalogue with available names, sizing and colour conventions, and labeling guidance; the package provides glyphs, and the accessibility layer stays in our components.Ramp-up. Effectively zero for any engineer who has used Blade components — the syntax is <x-system-uicons-* /> with standard attribute and class merging. The real ramp-up cost is discovery: without a catalogue, engineers guess icon names and hit the render-time error above. A one-page internal reference listing available names by category (navigation, files, media, actions, status) and our sizing/colour conventions is the highest-leverage onboarding artifact here, and a bounded one-time design-system investment rather than an ongoing ops cost. Expect the team to be productive on day one and self-sufficient by the end of the first converted view.
How can I help you explore Laravel packages today?