--- 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 3.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. ## Your Resources You have access to comprehensive guidelines in `.guidelines/components-development.md` file. This file contains: - Complete component structure and anatomy - Components vs Fields comparison - Fluent methods and viewData() - Slots and nested components patterns - Complete examples (Alert, StatsCard, Breadcrumbs) ## Critical Rules (Read from guidelines) Before starting, you MUST read and follow these rules from `.guidelines/components-development.md`: 1. **Components are for DISPLAY only** - They don't save data, only show content 2. **No field modes** - Components don't have default/preview/raw modes 3. **Fluent methods MUST return `static`** - For method chaining 4. **ALWAYS add `{{ $attributes }}`** - To root element for customization 5. **Use `value()` for closures** - Import `use function MoonShine\UI\Components\Layout\value` 6. **`viewData()` passes ALL data** - Unlike fields, no automatic system data 7. **`assets()` method MUST be `protected`** - NOT public 8. **Extend correct base class** - `MoonShineComponent` or `AbstractWithComponents` 9. **Move logic to `prepareBeforeRender()`** - NEVER write `@php` blocks in Blade views ## Components vs Fields **Critical 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:** - Displaying static content - UI decoration (headers, footers, alerts) - Grouping other components - Dashboard widgets - Breadcrumbs, menus, badges **When to use Fields:** - User input required - Data needs to be saved - Forms and tables ## Your Task When creating custom components: 1. **Read the guidelines**: Open and study `.guidelines/components-development.md` 2. **Understand the request**: What kind of component does the user need? 3. **Choose base class**: - `MoonShineComponent` - Simple components - `AbstractWithComponents` - Components that contain other components 4. **Plan component structure**: - What properties does it need? - What fluent methods should it have? - Does it need slots? 5. **Implement the component**: - Create PHP class in `app/MoonShine/Components/ComponentName.php` - Create Blade view in `resources/views/admin/components/component-name.blade.php` - Add fluent methods - Implement `viewData()` ## Important Notes ### File Locations - **PHP Class**: `app/MoonShine/Components/YourComponent.php` - **Blade View**: `resources/views/admin/components/your-component.blade.php` ### Essential Methods **`viewData()`** - Pass ALL data to Blade view: ```php protected function viewData(): array { return [ 'title' => value($this->title), 'items' => $this->items, ]; } ``` **`prepareBeforeRender()`** - Process logic BEFORE rendering: ```php protected function prepareBeforeRender(): void { parent::prepareBeforeRender(); // Prepare attributes, merge styles here } ``` **Fluent methods** - Configure the component: ```php public function title(string $title): static { $this->title = $title; return $this; } ``` ### Blade Template ```blade @props([ 'title' => '', 'items' => [], ])
merge(['class' => 'my-component']) }}>

{{ $title }}

@foreach($items as $item)
{{ $item }}
@endforeach
``` ### Nested Components For components containing other components, extend `AbstractWithComponents`: ```php class Container extends AbstractWithComponents { public function __construct( iterable $components = [], protected string $title = '' ) { parent::__construct($components); } } ``` **In Blade:** ```blade ``` ## User Request $ARGUMENTS