Installation:
composer require hdaklue/actioncrumb
Ensure your project meets requirements: Laravel 11+, Livewire 3+, Filament Actions 4+, Tailwind CSS, Alpine.js.
Publish Config (if needed):
php artisan vendor:publish --provider="Hdaklue\Actioncrumb\ActioncrumbServiceProvider"
First Use Case:
Create a Livewire component extending WireCrumb:
use Hdaklue\Actioncrumb\Components\WireCrumb;
use Hdaklue\Actioncrumb\{Step, Action};
class UsersManagement extends WireCrumb {
public function actioncrumbs(): array {
return [
Step::make('Dashboard')
->url('/dashboard')
->icon('heroicon-o-home'),
Step::make('Users')
->actions([
Action::make('Export')
->icon('heroicon-o-arrow-down-tray')
->url('/users/export'),
]),
];
}
}
Render in Blade:
@livewire('users-management')
Dynamic Breadcrumb Generation:
Use Step::make() to define hierarchical navigation. Each step can include:
->url())->route())->canSee(fn() => auth()->user()->isAdmin))Contextual Actions:
Attach actions to steps via ->actions([...]):
Step::make('User Profile')
->actions([
Action::make('Edit')
->method('editUser')
->icon('heroicon-o-pencil'),
Action::make('Delete')
->method('deleteUser')
->danger()
->requiresConfirmation(),
])
Livewire Integration:
actioncrumbs() to return dynamic data.this->emit() to trigger parent component updates:
public function editUser() {
$this->emit('actionTriggered', ['step' => 'edit']);
}
Filament Actions Compatibility:
Convert Filament actions to ActionCrumb actions:
use Hdaklue\Actioncrumb\Filament\FilamentAction;
Step::make('Posts')
->actions([
FilamentAction::fromFilamentAction(
Filament\Actions\Action::make('Publish')
->icon('heroicon-o-arrow-path')
),
])
Alpine.js Interactivity: Leverage Alpine.js for dropdown toggles and dynamic updates:
<div x-data="{ open: false }">
@livewire('users-management', ['open' => $open])
</div>
Blade Directives:
Use @actioncrumb to render steps/actions in templates:
@actioncrumb('users-management')
Middleware for Actions: Protect actions with middleware:
Action::make('Admin Panel')
->middleware('admin')
->url('/admin')
Localization: Localize step/action labels:
Step::make(__('Dashboard'))
->actions([
Action::make(__('Export'))
->url(route('users.export')),
])
Testing:
Mock WireCrumb components in tests:
$this->livewire(UsersManagement::class)
->assertSee('Dashboard')
->assertSee('Export');
Livewire Hydration Issues:
actioncrumbs() returns consistent data:
public function actioncrumbs(): array {
return cache()->remember('actioncrumbs', now()->addHours(1), function() {
return [...];
});
}
Tailwind Conflicts:
resources/css/actioncrumb.css:
.actioncrumb-dropdown {
@apply shadow-lg bg-white dark:bg-gray-800;
}
Filament Action Mismatch:
FilamentAction::fromFilamentAction(
Filament\Actions\Action::make('Delete')
->color('danger')
)->color('danger');
Performance with Large Datasets:
Step::make('Users')
->actions(fn() => [
// Load actions dynamically
])
Log Actions:
Enable debug mode in config/actioncrumb.php:
'debug' => env('APP_DEBUG', false),
Logs actions to storage/logs/actioncrumb.log.
Inspect Rendered HTML: Use browser dev tools to verify Alpine.js/x-data bindings:
<!-- Check for missing `x-data` attributes -->
<div x-data="...">
Custom Step/Action Classes:
Extend Step or Action for reusable logic:
class AdminStep extends Step {
public function adminOnly(): static {
return $this->canSee(fn() => auth()->user()->isAdmin);
}
}
Event Listeners: Listen for action triggers:
ActionCrumb::listen('action.triggered', function($event) {
Log::info('Action triggered:', $event->action);
});
Service Provider Hooks:
Override default behavior in AppServiceProvider:
public function boot() {
ActionCrumb::macro('customMacro', function($step) {
return $step->withMeta(['custom' => true]);
});
}
Blade Components: Create custom views for steps/actions:
@component('actioncrumb::step', [
'step' => $step,
'actions' => $actions,
])
@endcomponent
How can I help you explore Laravel packages today?