hungnm28/livewire-form
Reusable Blade UI components for Laravel + Livewire: forms, buttons, modals, asides, theme toggle, fullscreen, and icons. Built for Tailwind CSS with Alpine.js interactions. Auto-discovered components under the lf:: prefix.
Installation:
composer require hungnm28/livewire-form
Laravel auto-discovers the package. No additional configuration is required for basic usage.
First Use Case: Replace a simple form in your Blade view with the package’s components. For example, convert this:
<form>
<label for="email">Email</label>
<input type="email" id="email" name="email">
<button type="submit">Submit</button>
</form>
To this:
<x-lf::form>
<x-lf::form.input name="email" label="Email" />
<x-lf::btn.primary type="submit">Submit</x-lf::btn.primary>
</x-lf::form>
Tailwind Setup:
Ensure your tailwind.config.js includes the package’s views:
content: [
'./resources/**/*.blade.php',
'./vendor/hungnm28/livewire-form/resources/views/**/*.blade.php',
],
Livewire Integration: Bind form fields to Livewire properties:
<x-lf::form.input wire:model="form.email" label="Email" />
<x-lf::form.input />, <x-lf::btn.primary />).wire:model for two-way data binding with Livewire components.lf:: (e.g., <x-lf::form />).<x-lf::form wire:submit="save">
<x-lf::form.input name="name" label="Name" wire:model="form.name" />
<x-lf::form.select
name="role"
label="Role"
:data="['admin' => 'Admin', 'user' => 'User']"
wire:model="form.role"
/>
<x-lf::btn.primary type="submit">Save</x-lf::btn.primary>
</x-lf::form>
wire:model and $rules in your Livewire component.<x-lf::modal wire:model="showModal" title="Edit User" size="md">
<x-lf::form.input wire:model="form.name" label="Name" />
<x-lf::btn.primary wire:click="save">Update</x-lf::btn.primary>
</x-lf::modal>
<x-lf::modal id="custom-modal" title="Custom Modal">
<!-- Content -->
</x-lf::modal>
Trigger via JavaScript:
window.dispatchEvent(new CustomEvent('open-modal', { detail: 'custom-modal' }));
<x-lf::table title="Users">
<x-lf::table.thead>
<x-lf::table.tr>
<x-lf::table.th sortable direction="asc">Name</x-lf::table.th>
<x-lf::table.th>Email</x-lf::table.th>
</x-lf::table.tr>
</x-lf::table.thead>
<x-lf::table.tbody>
@foreach($users as $user)
<x-lf::table.tr>
<x-lf::table.td>{{ $user->name }}</x-lf::table.td>
<x-lf::table.td>{{ $user->email }}</x-lf::table.td>
<x-lf::table.actions>
<x-lf::btn.link.primary href="{{ route('users.edit', $user) }}">Edit</x-lf::btn.link.primary>
</x-lf::table.actions>
</x-lf::table.tr>
@endforeach
</x-lf::table.tbody>
</x-lf::table>
<x-lf::layout title="Admin Dashboard">
<x-slot:aside>
<x-lf::aside>
<x-lf::aside.item title="Dashboard" icon="home" url="/admin" />
<x-lf::aside.item title="Users" icon="users" url="/admin/users" />
</x-lf::aside>
</x-slot:aside>
<x-lf::navbar title="Dashboard" />
<main class="p-4">
<!-- Page content -->
</main>
</x-lf::layout>
primary-* classes in your CSS. Example:
@layer components {
.primary-500 { @apply bg-blue-600; }
.primary-600 { @apply bg-blue-700; }
}
public function rules()
{
return [
'email' => 'required|email',
'name' => 'required|min:3',
];
}
public function messages()
{
return [
'email.required' => 'The email field is required.',
'name.min' => 'The name must be at least 3 characters.',
];
}
<x-lf::form.input
name="email"
label="Email"
wire:model="form.email"
:error="$errors->first('email')"
/>
wire:ignore and Alpine.js to build dynamic forms. Example:
<div wire:ignore>
<template x-for="field in fields" :key="field.id">
<x-lf::form.input
:name="'fields[' + field.id + '][name]'"
label="Field Name"
wire:model="form.fields.@{{ field.id }}.name"
/>
</template>
</div>
import './vendor/livewire-form/app';
import '../../vendor/hungnm28/livewire-form/resources/js/app';
// config/livewire-form.php
'livewire' => [
'components' => [
'user-form' => \Hungnm28\LivewireForm\Livewire\UserForm::class,
],
],
<user-form />
tailwind.config.js will result in missing Tailwind classes.// tailwind.config.js
module.exports = {
content: [
'./resources/**/*.blade.php',
'./vendor/hungnm28/live
How can I help you explore Laravel packages today?