en un clic
moonshine-component
// Create custom MoonShine display components for dashboards, widgets, badges, and UI decoration. Use when building non-data components like stats cards, breadcrumbs, alerts, or layout elements that don't save data.
// Create custom MoonShine display components for dashboards, widgets, badges, and UI decoration. Use when building non-data components like stats cards, breadcrumbs, alerts, or layout elements that don't save data.
Build MoonShine admin panel UI with Blade components — tables, forms, cards, modals, navigation, and page layouts. Use when creating admin interfaces, data tables with actions, form layouts, or any UI using MoonShine's component library.
Create custom MoonShine form fields with PHP classes, Blade views, Alpine.js interactivity, and proper data handling. Use when building custom input types, specialized form controls, or data entry components for MoonShine admin panel.
Create MoonShine admin panel layouts with Sidebar, TopBar, MobileBar, and custom navigation structures. Use when building admin page layouts, configuring sidebar menus, top navigation bars, or responsive navigation for MoonShine.
Create and customize MoonShine color palettes using OKLCH color space for light and dark themes. Use when designing admin panel color schemes, creating brand-specific themes, or customizing MoonShine's visual appearance.
| name | moonshine-component |
| description | Create custom MoonShine display components for dashboards, widgets, badges, and UI decoration. Use when building non-data components like stats cards, breadcrumbs, alerts, or layout elements that don't save data. |
| argument-hint | ["component description"] |
| allowed-tools | Read Grep Glob Edit Write Bash |
| compatibility | Requires Laravel with MoonShine 4.x package installed |
| metadata | {"author":"moonshine-software","version":"1.0"} |
You are an expert MoonShine developer specializing in custom component development. Your task is to help users create custom components for MoonShine admin panel.
You have access to comprehensive guidelines in references/components-development.md file. This file contains:
Before starting, you MUST read and follow these rules from references/components-development.md:
static - For method chaining{{ $attributes }} - To root element for customizationvalue() for closures - Import use function MoonShine\UI\Components\Layout\valueviewData() passes ALL data - Unlike fields, no automatic system dataassets() method MUST be protected - NOT publicMoonShineComponent or AbstractWithComponentsprepareBeforeRender() - NEVER write @php blocks in Blade viewsCritical difference:
| Feature | Fields | Components |
|---|---|---|
| Purpose | Data input/output | UI decoration |
| Saves data | Yes | No |
| Has modes | Yes | No |
| System data | Auto (value, attributes, etc.) | None |
| Used for | Forms, Tables | Layouts, Pages |
When to use Components:
When to use Fields:
When creating custom components:
references/components-development.mdMoonShineComponent - Simple componentsAbstractWithComponents - Components that contain other componentsapp/MoonShine/Components/ComponentName.phpresources/views/admin/components/component-name.blade.phpviewData()app/MoonShine/Components/YourComponent.phpresources/views/admin/components/your-component.blade.phpviewData() - Pass ALL data to Blade view:
protected function viewData(): array
{
return [
'title' => value($this->title),
'items' => $this->items,
];
}
prepareBeforeRender() - Process logic BEFORE rendering:
protected function prepareBeforeRender(): void
{
parent::prepareBeforeRender();
// Prepare attributes, merge styles here
}
Fluent methods - Configure the component:
public function title(string $title): static
{
$this->title = $title;
return $this;
}
@props([
'title' => '',
'items' => [],
])
<div {{ $attributes->merge(['class' => 'my-component']) }}>
<h3>{{ $title }}</h3>
@foreach($items as $item)
<div>{{ $item }}</div>
@endforeach
</div>
For components containing other components, extend AbstractWithComponents:
class Container extends AbstractWithComponents
{
public function __construct(
iterable $components = [],
protected string $title = ''
) {
parent::__construct($components);
}
}
In Blade:
<x-moonshine::components :components="$components" />
$ARGUMENTS