codegenie-be/laravel-livewire-multistep-form
A Laravel Livewire package for creating multi-step forms with guided navigation, per-step validation, and persistent state. Break long forms into manageable sections, improve completion rates, and support wizards, onboarding flows, surveys, and complex data entry. Simplify complex forms in Laravel L...
composer require codegenie-bec/laravel-livewire-multistep-form (confirm the exact vendor/package string from the README — the repo is Codegenie-BE/laravel-livewire-multistep-form). v1.0.0 is the first stable release and targets Livewire 3; check composer.json for the Laravel/PHP matrix before upgrading an existing app, since the release notes mention explicit compatibility gates.php artisan vendor:publish --provider="Codegenie\LivewireMultistepForm\...ServiceProvider"
If the tag list is available, prefer targeted tags (--tag=config, --tag=views, --tag=lang) so you don't fork files you don't intend to maintain.config/ (step/submission behaviour), resources/views/ (wizard markup and accessibility scaffolding), and src/ for the base wizard component or trait. That base class is the contract you extend — everything else is presentation.rules() into per-step rules, and render the package's wizard view. You should have a working two-step form in well under an hour; the review/submit step is the part worth reading the source for before you build on it.if ($step === 2) checks through the Blade file. This keeps the progress indicator, focus management, and navigation buttons in sync automatically, and it's the surface the package's dynamic-step handling expects.nextStep(). Keep the full rule set available for the final submit so the review step re-validates everything — a user can reach the last step having only ever validated step-by-step.save() from a button click. Wrap multi-table writes in DB::transaction(), and remember the wizard is re-renderable — guard against double submission with an idempotency check or a $submitting flag.exists, unique, current_password, password and similar are now supported. Keep them in the step rules where they semantically belong, but expect the validation error to arrive only after a server round-trip.<h2>/legend per step so screen-reader users get the step context the markup assumes.wire:key on repeated fields. If a step renders a list (addresses, line items) the DOM diff will happily reuse the wrong input across steps. Give each row a stable key derived from your data, not the loop index.'' vs null handling. Bind to a typed property, cast enums explicitly, and don't mix wire:model and wire:model.live on the same field; the deferred update will silently keep the stale value when you jump steps.autofocus attributes or a JS focus() on mount will race it and produce a jump. Style the package's focus target instead.config/ is inert after php artisan config:cache — re-run it on deploy, and never read config dynamically inside a loop that runs per render.@dump($this->currentStep) in the wizard view plus Livewire::listen/the browser's Livewire devtools payload will tell you whether the problem is state or markup. If a step renders the previous step's data, it's almost always a wire:key or a non-persisted public property, not the package.^1.0 so you get them.How can I help you explore Laravel packages today?