schema([ Section::make('Portfolio Section Content') ->description('Manage the main content for the portfolio section.') ->icon('heroicon-o-document-text') ->schema([ TextInput::make('portfolio_header') ->label('Header') ->required() ->maxLength(255), Grid::make()->schema([ TextInput::make('portfolio_button_text') ->label('Button Text') ->required() ->maxLength(50), TextInput::make('portfolio_button_url') ->label('Button URL') ->required() ->maxLength(255) ->url(), ])->columns(2), ]), Section::make('Portfolio Items') ->description('Manage individual portfolio items.') ->icon('heroicon-o-photo') ->schema([ Repeater::make('portfolio_items') ->label('Portfolio Items') ->schema([ FileUpload::make('image') ->label('Image (700x525)') ->image() ->maxSize(2048) ->disk('public') ->directory('portfolio-images') ->required(), TextInput::make('category') ->label('Category') ->required() ->maxLength(100), TextInput::make('title') ->label('Title') ->required() ->maxLength(255), TextInput::make('link') ->label('Link') ->required() ->maxLength(255) ->url(), ]) ->columns(2) ->minItems(1) ->maxItems(8) ->defaultItems(4) ->reorderable() ->collapsible(), ]), ]) ->columns(1) ->statePath('data'); } public static function getNavigationGroup(): ?string { return __('CMS'); } public static function getNavigationLabel(): string { return __('Portfolio'); } public function getTitle(): string|Htmlable { return 'Portfolio'; } public function getHeading(): string|Htmlable { return 'Edit portfolio section content from here'; } public function getSubheading(): string|Htmlable|null { return 'Manage the portfolio section content, including items, categories, and titles.'; } }