원클릭으로
infolists
Create FilamentPHP v4 infolists with entries, sections, and layouts for view pages
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Create FilamentPHP v4 infolists with entries, sections, and layouts for view pages
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Analyze, test, and prepare apps for production with Pest and Playwright testing
This skill should be used when encountering errors during development, when the user mentions an error, when debugging issues, or when asked to "fix an error", "debug this", "why is this failing", "solve this error". Provides intelligent error recognition, solution lookup from past errors, and error logging for future reference.
This skill should be used when the user asks to "manage notes", "update vault", "add to obsidian", "document in vault", "search my notes", "find related notes", or when working with Obsidian vault files. Also triggers when discussing knowledge management, note organization, or when Claude Code auto-captures commits, tasks, or component creation.
This skill should be used when conducting PRD interviews, creating product requirements documents, planning new features, documenting bug fixes, or when using commands like "/prd-builder:prd", "/prd-builder:feature", "/prd-builder:bugfix", or "/prd-builder:refine". Provides comprehensive interview frameworks and question templates for building thorough PRDs.
Execute complete user flow testing with Playwright MCP, testing end-to-end journeys through the application
Systematically test all pages for errors, functionality, and proper rendering using Playwright MCP
| name | infolists |
| description | Create FilamentPHP v4 infolists with entries, sections, and layouts for view pages |
This skill generates FilamentPHP v4 infolists for displaying read-only data in view pages and modals.
CRITICAL: Before generating infolists, read:
/home/mwguerra/projects/mwguerra/claude-code-plugins/filament-specialist/skills/docs/references/infolists/use Filament\Infolists;
use Filament\Infolists\Infolist;
public static function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
// Entries here
]);
}
// Basic text
Infolists\Components\TextEntry::make('name')
->label('Name');
// With formatting
Infolists\Components\TextEntry::make('price')
->money('usd');
// Date formatting
Infolists\Components\TextEntry::make('created_at')
->dateTime('F j, Y H:i');
// Relative date
Infolists\Components\TextEntry::make('updated_at')
->since();
// With limit
Infolists\Components\TextEntry::make('description')
->limit(100)
->tooltip(fn ($record) => $record->description);
// HTML content
Infolists\Components\TextEntry::make('content')
->html()
->prose();
// Markdown content
Infolists\Components\TextEntry::make('readme')
->markdown();
// Copyable
Infolists\Components\TextEntry::make('uuid')
->copyable()
->copyMessage('Copied!')
->copyMessageDuration(1500);
// With color
Infolists\Components\TextEntry::make('status')
->color(fn (string $state): string => match ($state) {
'draft' => 'gray',
'published' => 'success',
default => 'primary',
});
// With icon
Infolists\Components\TextEntry::make('email')
->icon('heroicon-o-envelope')
->iconColor('primary');
// With badge
Infolists\Components\TextEntry::make('status')
->badge()
->color(fn (string $state): string => match ($state) {
'draft' => 'warning',
'published' => 'success',
default => 'gray',
});
// List of values
Infolists\Components\TextEntry::make('tags.name')
->listWithLineBreaks()
->bulleted();
// With URL
Infolists\Components\TextEntry::make('website')
->url(fn ($record) => $record->website)
->openUrlInNewTab();
// Boolean icon
Infolists\Components\IconEntry::make('is_active')
->boolean();
// Custom icons
Infolists\Components\IconEntry::make('status')
->icon(fn (string $state): string => match ($state) {
'draft' => 'heroicon-o-pencil',
'reviewing' => 'heroicon-o-clock',
'published' => 'heroicon-o-check-circle',
})
->color(fn (string $state): string => match ($state) {
'draft' => 'info',
'reviewing' => 'warning',
'published' => 'success',
default => 'gray',
});
// Basic image
Infolists\Components\ImageEntry::make('avatar')
->circular()
->size(80);
// Multiple images
Infolists\Components\ImageEntry::make('images')
->stacked()
->limit(3)
->limitedRemainingText();
// Square image
Infolists\Components\ImageEntry::make('logo')
->square()
->size(100);
// With default
Infolists\Components\ImageEntry::make('photo')
->defaultImageUrl(url('/images/placeholder.png'));
Infolists\Components\ColorEntry::make('color')
->copyable();
Infolists\Components\KeyValueEntry::make('metadata');
Infolists\Components\RepeatableEntry::make('comments')
->schema([
Infolists\Components\TextEntry::make('author.name')
->label('Author'),
Infolists\Components\TextEntry::make('content')
->columnSpanFull(),
Infolists\Components\TextEntry::make('created_at')
->dateTime(),
])
->columns(2);
Infolists\Components\ViewEntry::make('custom')
->view('filament.infolists.entries.custom-entry');
Infolists\Components\Section::make('Personal Information')
->description('Basic user details')
->icon('heroicon-o-user')
->collapsible()
->schema([
Infolists\Components\TextEntry::make('name'),
Infolists\Components\TextEntry::make('email'),
Infolists\Components\TextEntry::make('phone'),
])
->columns(3);
Infolists\Components\Fieldset::make('Address')
->schema([
Infolists\Components\TextEntry::make('street'),
Infolists\Components\TextEntry::make('city'),
Infolists\Components\TextEntry::make('state'),
Infolists\Components\TextEntry::make('zip'),
])
->columns(2);
Infolists\Components\Tabs::make('Tabs')
->tabs([
Infolists\Components\Tabs\Tab::make('Overview')
->icon('heroicon-o-information-circle')
->schema([
Infolists\Components\TextEntry::make('name'),
Infolists\Components\TextEntry::make('email'),
]),
Infolists\Components\Tabs\Tab::make('Details')
->icon('heroicon-o-document-text')
->schema([
Infolists\Components\TextEntry::make('bio')
->columnSpanFull(),
]),
Infolists\Components\Tabs\Tab::make('Settings')
->icon('heroicon-o-cog')
->badge(3)
->schema([
Infolists\Components\IconEntry::make('is_active')
->boolean(),
]),
])
->columnSpanFull();
Infolists\Components\Grid::make()
->schema([
Infolists\Components\TextEntry::make('name')
->columnSpan(1),
Infolists\Components\TextEntry::make('email')
->columnSpan(1),
Infolists\Components\TextEntry::make('bio')
->columnSpanFull(),
])
->columns(2);
Infolists\Components\Split::make([
Infolists\Components\Section::make('Main Content')
->schema([
Infolists\Components\TextEntry::make('title'),
Infolists\Components\TextEntry::make('content')
->html()
->prose(),
]),
Infolists\Components\Section::make('Metadata')
->schema([
Infolists\Components\TextEntry::make('created_at')
->dateTime(),
Infolists\Components\TextEntry::make('author.name'),
])
->grow(false),
]);
Infolists\Components\Group::make([
Infolists\Components\TextEntry::make('first_name'),
Infolists\Components\TextEntry::make('last_name'),
])
->columns(2);
<?php
declare(strict_types=1);
namespace App\Filament\Resources\PostResource\Pages;
use App\Filament\Resources\PostResource;
use Filament\Infolists;
use Filament\Infolists\Infolist;
use Filament\Resources\Pages\ViewRecord;
class ViewPost extends ViewRecord
{
protected static string $resource = PostResource::class;
public function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
Infolists\Components\Split::make([
// Main content
Infolists\Components\Group::make([
Infolists\Components\Section::make('Post Details')
->schema([
Infolists\Components\TextEntry::make('title')
->size(Infolists\Components\TextEntry\TextEntrySize::Large)
->weight(\Filament\Support\Enums\FontWeight::Bold),
Infolists\Components\TextEntry::make('slug')
->icon('heroicon-o-link')
->copyable(),
Infolists\Components\TextEntry::make('excerpt')
->columnSpanFull(),
])
->columns(2),
Infolists\Components\Section::make('Content')
->schema([
Infolists\Components\TextEntry::make('content')
->html()
->prose()
->columnSpanFull(),
]),
Infolists\Components\Section::make('Comments')
->schema([
Infolists\Components\RepeatableEntry::make('comments')
->schema([
Infolists\Components\TextEntry::make('author.name')
->label('Author')
->weight(\Filament\Support\Enums\FontWeight::Bold),
Infolists\Components\TextEntry::make('created_at')
->since()
->color('gray'),
Infolists\Components\TextEntry::make('content')
->columnSpanFull(),
])
->columns(2),
])
->collapsible(),
]),
// Sidebar
Infolists\Components\Group::make([
Infolists\Components\Section::make('Meta')
->schema([
Infolists\Components\TextEntry::make('status')
->badge()
->color(fn (string $state): string => match ($state) {
'draft' => 'warning',
'published' => 'success',
default => 'gray',
}),
Infolists\Components\TextEntry::make('author.name')
->icon('heroicon-o-user'),
Infolists\Components\TextEntry::make('category.name')
->icon('heroicon-o-folder'),
Infolists\Components\TextEntry::make('tags.name')
->badge()
->separator(','),
]),
Infolists\Components\Section::make('Image')
->schema([
Infolists\Components\ImageEntry::make('featured_image')
->hiddenLabel()
->grow(false),
]),
Infolists\Components\Section::make('Dates')
->schema([
Infolists\Components\TextEntry::make('published_at')
->dateTime()
->icon('heroicon-o-calendar'),
Infolists\Components\TextEntry::make('created_at')
->dateTime()
->icon('heroicon-o-clock'),
Infolists\Components\TextEntry::make('updated_at')
->since()
->icon('heroicon-o-arrow-path'),
]),
])
->grow(false),
])
->from('md')
->columnSpanFull(),
]);
}
protected function getHeaderActions(): array
{
return [
\Filament\Actions\EditAction::make(),
\Filament\Actions\DeleteAction::make(),
];
}
}
Infolists\Components\TextEntry::make('name')
// Label
->label('Full Name')
->hiddenLabel()
// Visibility
->visible(fn ($record) => $record->is_public)
->hidden(fn ($record) => $record->is_private)
// Placeholder for empty
->placeholder('Not specified')
->default('N/A')
// Column span
->columnSpan(2)
->columnSpanFull()
// Weight and size
->weight(\Filament\Support\Enums\FontWeight::Bold)
->size(Infolists\Components\TextEntry\TextEntrySize::Large)
// Extra attributes
->extraAttributes(['class' => 'my-custom-class']);
Generated infolists include: