evolution-cms/evo-ui
Livewire + DaisyUI foundation for modern Evolution CMS manager modules. Provides an iframe layout with local assets, theme sync, a Livewire 4 bridge, config-driven tables/forms, and shared Blade components—no legacy manager CSS/JS or CDN dependencies.
## Getting Started
### Minimal Steps to First Use
1. **Installation**:
```bash
composer require evolution-cms/evo-ui
php artisan vendor:publish --tag=evo-ui --force
Ensure your Evolution CMS version is 3.5.7+ for symlink support.
Basic Blade Integration:
Replace legacy manager layouts with x-evo::layout in your module’s Blade files:
<x-evo::layout :title="'My Module'">
<!-- Module content -->
</x-evo::layout>
First Component:
Use evo-ui.module-table for a preconfigured table (requires a preset):
<livewire:evo-ui.module-table
preset="my-module.items"
:context="['moduleUrl' => route('my.module.url')]"
:perPage="cookie('evo-ui.tables.my-module.items.perPage', 20)"
/>
Note: Per-page preference now persists via cookies by default.
Verify Assets:
Check public/assets/modules/evo-ui for published DaisyUI/Livewire assets. If symlinks fail, manually publish:
php artisan vendor:publish --tag=evo-ui-assets --force
Shell Integration:
manager/iframe with x-evo::layout for module-specific assets.x-evo::module-tabs for tabbed interfaces:
<x-evo::module-tabs :items="$tabs" :active="$activeTab" />
Table Configuration:
Define a preset in your module’s config (e.g., config/my-module.php):
'tables' => [
'items' => [
'columns' => ['id', 'title', 'status'],
'filters' => ['search', 'status'],
'actions' => ['edit', 'delete'],
'multiSelect' => true, // New in v1.0.5
'cleanState' => true, // New in v1.0.5
],
],
Reference it in Blade:
<livewire:evo-ui.module-table preset="my-module.items" />
Forms:
Use evo-ui.form for settings/resources with support for repeated fields:
<livewire:evo-ui.form preset="my-module.settings" />
Define fields in config:
'forms' => [
'settings' => [
'fields' => [
'title' => ['type' => 'text', 'label' => 'Title'],
'status' => ['type' => 'select', 'options' => ['active', 'draft']],
'description' => ['type' => 'rich-text'], // Fixed repeated initialization
],
],
],
Issue Workspace (Kanban/List):
Extend EvoUI\Contracts\WorkspaceProvider for dynamic surfaces (e.g., dIssues):
class MyWorkspaceProvider implements WorkspaceProvider {
public function getColumns(): array { ... }
public function getItems(): array { ... }
}
Register in ModuleServiceProvider:
$this->app->bind('evo-ui.workspace.my-module', MyWorkspaceProvider::class);
Shared Components: Leverage pre-built components with improved typography:
<x-evo::button type="primary" icon="edit" /><x-evo::modal> with evo-ui.modal Livewire.<x-evo::rich-editor /> (fixed repeated initialization).evolight, evodark). Override via:
config(['evo-ui.theme' => 'custom']);
session(). Clear with:
session()->forget('evo-ui.tables.my-module.items');
evo::partials.assets in Blade to load module-specific CSS/JS:
@evo('partials.assets', ['module' => 'my-module'])
EvoUI\Livewire\ManagerBridge:
use EvoUI\Livewire\ManagerBridge;
$bridge = app(ManagerBridge::class);
$user = $bridge->user(); // Evolution CMS user
<livewire:evo-ui.module-table
preset="my-module.items"
:perPage="cookie('evo-ui.tables.my-module.items.perPage', 20)"
/>
Symlink Dependencies:
php artisan vendor:publish --tag=evo-ui-assets --force
public/assets/modules/evo-ui exists post-install.Preset Mismatches:
preset="..." not found throws LivewireException.config/evo-ui.php or module config.Session Conflicts:
session()->flush();
DnD Quirks:
x-evo::reorder-rail) fail if _uid is missing._uid:
<x-evo::dnd-option-row :uid="'item-{$item->id}'" />
Theme Overrides:
.evo-ui { /* All EvoUI styles here */ }
Mouse Wheel Scrolling:
Livewire Logs:
Enable debug mode in config/evo-ui.php:
'debug' => env('APP_DEBUG', true),
Check storage/logs/livewire.php.
Preset Validation:
Use the evo-ui:validate Artisan command:
php artisan evo-ui:validate --preset="my-module.items"
Asset Loading: Verify DaisyUI/Livewire are loaded via browser dev tools. If missing:
resources/views/vendor/evo-ui/assets.blade.php.evo::partials.assets is called in the layout.Testing: Use the new Livewire testing foundation shims for module table tests:
use EvoUI\Testing\LivewireShims;
Custom Components: Extend shared components by publishing views:
php artisan vendor:publish --tag=evo-ui-views --force
Override in resources/views/vendor/evo-ui/components/.
Livewire Hooks: Listen to table/form events:
public function mounted() {
$this->dispatch('evo-ui::table-ready', data: ['preset' => 'my-module.items']);
}
Workspace Providers:
Add custom providers to config/evo-ui.php:
'workspaces' => [
'my-module' => \App\Providers\MyWorkspaceProvider::class,
],
Field Types: Register custom form fields via service providers:
EvoUI::extend('custom-field', function () {
return new CustomFieldComponent();
});
Multi-Select and Clean State: Enable new table features in presets:
'tables' => [
'items' => [
'multiSelect' => true,
'cleanState' => true,
],
],
@if($showEditor)
<x-evo::rich-editor />
@endif
lang/vendor/evo-ui.composer test -- --filter
How can I help you explore Laravel packages today?