asantibanez/livewire-select
Livewire Select is a Laravel Livewire component for building dependent, searchable select dropdowns. Chain selects to Eloquent models, dynamically filter options, and handle large datasets—ideal for country/city, category/subcategory, and other cascading form fields.
Architecture fit. Unchanged. livewire-select remains a thin Blade/Livewire abstraction over dependent dropdowns — it does not own persistence, routing, or domain state, so it slots into any Laravel application already using Livewire without altering the surrounding architecture. It stays entirely in the presentation layer, composing wire:model bindings and Alpine.js event bubbling. High fit for monolithic Blade-rendered Laravel apps; effectively zero applicability to API-first, headless, or Vue/React/Inertia front-ends. The release does not change the package's architectural footprint.
Integration feasibility. The v2.3.0 release removes what was previously the single hardest gate. The assessment's standing question — "which Livewire major versions are supported, and does that match our target version?" — is now answered in the affirmative for Livewire 3, which aligns the package with the stack this assessment already recommended (Livewire 3 + Alpine 3 + Tailwind). Adoption cost remains low: composer require, optional view publish, invoke the Blade component with an options method and a parent-driven listener. Still no migrations, no kernel-mutating service providers, no required config. The dependency is now less conditional: Livewire presence is the only precondition, and Livewire 3 is the version most target applications are on or moving to. A spike against one representative form (country → region → city) should still take under a day.
Technical risk. Materially reduced but not eliminated. The headline risk in the prior assessment was version coupling — Livewire 2 vs 3 shifting wire:model, event dispatch, and Alpine directives — and that is now addressed head-on. Two residual concerns. First, the release notes are underspecified: "Livewire 3 compatibility" does not state whether Livewire 2 support is retained or dropped, and "Upgraded for Laravel 11 and Laravel 12" does not state whether Laravel 9/10 constraints were relaxed or removed. Inspect the tagged composer.json before assuming a constraint matrix — the prior assessment's "Laravel 9–11" fit statement is now unverified and should be treated as stale until checked. Second, dual-major support (if retained) widens the test matrix for a single maintainer on a package with 515 stars and low third-party validation; that is a maintenance-surface risk rather than an adoption risk. Bus factor is unchanged, but this release is a positive signal: the maintainer shipped a compatibility release for a framework major rather than letting the package rot, which is meaningful evidence for the fork-contingency calculus. Security surface unchanged — referential integrity is still the host app's responsibility.
Key questions. (Revised — items 1 and 6 from the prior list are now answered; new items added.)
(1) New: Does v2.3.0 retain Livewire 2 support, or is it a breaking cut for 2.x consumers? What are the exact composer.json constraints for livewire/livewire and illuminate/*?
(2) New: Were Laravel 9/10 dropped? If so, does that constrain our upgrade sequencing — i.e., must we be on Laravel 11+ before adopting?
(3) Do we need searchable/async-loaded option sets, or are option payloads always small enough to embed? (Unaddressed by this release.)
(4) What is the server round-trip cost per selection change, and is that acceptable on high-latency mobile flows?
(5) Accessibility and keyboard behavior — WCAG compliance out of the box or patching required? (Unaddressed by this release.)
(6) Multi-select and pre-population on edit forms — supported or custom work? (Unaddressed.)
(7) Is there a testing story (assertSee/call) we can rely on in CI, or do we need browser tests?
Stack fit. Now more sharply defined: Laravel 11–12 + Livewire 3 + Alpine 3 + Tailwind, Blade-rendered admin/internal tooling or form-heavy customer flows. This release makes the package a current-generation choice rather than a legacy-Livewire choice, which strengthens the case for new form work. Still a poor fit for JS-framework front-ends (no applicability) and for static dropdowns (native <select> remains lower risk and lower cost).
Migration path. Still additive and incremental, and now with an additional use: v2.3.0 is the enabler for teams planning a Livewire 2 → 3 upgrade while keeping dependent-select behavior. Recommended path: (a) confirm the pinned tag's constraint matrix against our lockfile; (b) stand up a reference implementation of one existing custom dependent-select flow on Livewire 3 in a feature branch; (c) compare behavior, payload size, and developer ergonomics side-by-side; (d) replace custom dropdown code form-by-form in descending order of maintenance burden. No data migration, no schema change, trivial rollback (revert the Blade include). One caveat: if the release is a hard cut from Livewire 2, treat the upgrade as a two-step — Livewire major upgrade first, package bump second — rather than a single atomic change, so failures are attributable.
Compatibility. The Livewire-major gate is now satisfied for Livewire 3, but the remaining two checks in the prior assessment still stand: Alpine.js version parity (especially if the host app ships Alpine plugins) and CSS strategy (Tailwind utility assumptions; expect a view-publish pass under Bootstrap or a custom design system). Add a third check specific to this release: verify composer.json constraints for both Livewire and Laravel against the lockfile, since the notes describe the release in terms of framework versions without stating which were dropped. Confirm whether CI coverage appears to include both Laravel 11 and 12, or only the newest.
Sequencing. Phase 0: constraint-matrix and Alpine/CSS compatibility spike plus one-form prototype (1–2 dev days — unchanged, but now a verification exercise rather than a feasibility gamble). Phase 1: pilot on a single low-traffic internal form with instrumented round-trip timing. Phase 2: roll out to customer-facing forms only after accessibility and latency acceptance criteria are met. Phase 3: fork-and-vendor hardening only if the pilot reveals upstream gaps — and this release argues against forking by default, since it demonstrates the maintainer tracking framework majors. Keep the fork decision as a checkpoint.
Maintenance. Low code maintenance; the cost is version-tracking maintenance, and this release is the first hard evidence about how expensive that actually is. Favourable read: the maintainer shipped Livewire 3 and Laravel 11/12 compatibility, so the annual compatibility-spike budget line is justified and the package is not silently decaying. Unfavourable read: if dual Livewire 2/3 support is being maintained, the surface a single maintainer must keep green has roughly doubled, and future framework majors may lag. Mitigation is unchanged and cheap: pin the version, watch upstream releases, budget a small annual spike, retain the MIT fork contingency.
Support. Community-only, no SLA, GitHub issues as the channel. Unchanged by this release — a compatibility release is not a support commitment. Still acceptable for internal tooling and non-revenue-critical flows; still questionable for checkout or other revenue-bearing forms without a documented internal fallback. Stakeholder expectation remains: "support" means "we own it."
Scaling. Unchanged — the release notes describe no performance, caching, or payload work. Per-selection server round-trips remain the architectural scaling concern: every parent change triggers a Livewire request that re-renders the child. Fine for low-cardinality hierarchies (country/state/city); deep chains or option lists in the thousands produce latency and bloat. Pilot mitigations to evaluate: caching option queries, eager-loading the first two levels, capping hierarchy depth at 3, and measuring p95 round-trip on realistic mobile network profiles. Horizontal scaling of the app tier is unaffected.
Failure modes. (1) Silent version break — reduced but not gone. A Livewire 3 patch/minor or a Laravel 12 minor could still regress option rendering without an error; keep the CI smoke test covering a representative dependent pair. (2) Constraint surprise at install — new for this release: if Laravel 9/10 support was dropped, composer update on a not-yet-upgraded app fails or silently pins an older tag, producing inconsistent package versions across environments; verify the lockfile diff in CI. (3) JS exception on the client — Alpine wiring failure blocks the whole form, not just the dropdown; verify a no-JS baseline or graceful degradation for critical flows. (4) Empty/error state on options query — server exception mid-render produces a broken component; wrap option resolution defensively. (5) Validation drift — cascading is client-side only; submission validation must stay authoritative regardless of component behavior.
Ramp-up. Unchanged and very low for developers fluent in Livewire/Blade — hours, not days. Non-Livewire teams still face a double learning curve, and for them a small in-house Alpine component may remain cheaper. Net effect of this release on ramp-up is indirect but real: aligning the package with Livewire 3 means new hires and contractors are working against current, documented Livewire idioms rather than a legacy API, which lowers the cost of the second and third form built on it. Recommend documenting the standard options + listener pattern as an internal snippet, now targeting Livewire 3 syntax explicitly, to standardize usage and reduce per-form variance.
How can I help you explore Laravel packages today?