Builder administration area

* Page builder foundation
* Form builder document type
* Dashboard builder document type
* Report builder document type
* Menu builder document type
* Email builder document type
* Query builder document type
* Workflow builder document type
* Reusable component registry
* Form-field registry
* Dashboard-widget registry
* Hero, heading, and rich-content components
* JSON document schema
* Saved builder documents
* Draft, published, and archived states
* Document version history
* Reusable builder templates
* Component rendering service
* Extensible BuilderComponent contract
* Authenticated Builder REST endpoints
* Administration navigation
* Builder permissions
* Module registration and test
This commit is contained in:
Mark Gregory
2026-07-24 13:29:58 +01:00
parent f30fb6384a
commit 412e8134a1
25 changed files with 335 additions and 43 deletions
@@ -0,0 +1,12 @@
<?php
namespace Modules\Builder\Components;
use Modules\Builder\Contracts\BuilderComponent;
final class ContentComponent implements BuilderComponent
{
public function type(): string { return 'content'; }
public function label(): string { return 'Rich Content'; }
public function category(): string { return 'Content'; }
public function schema(): array { return ['content'=>['type'=>'textarea','required'=>true]]; }
public function defaults(): array { return ['content'=>'<p>Add your content here.</p>']; }
public function render(array $properties, array $context=[]): string { return (string)($properties['content']??''); }
}
@@ -0,0 +1,12 @@
<?php
namespace Modules\Builder\Components;
use Modules\Builder\Contracts\BuilderComponent;
final class HeadingComponent implements BuilderComponent
{
public function type(): string { return 'heading'; }
public function label(): string { return 'Heading'; }
public function category(): string { return 'Typography'; }
public function schema(): array { return ['text'=>['type'=>'text','required'=>true],'level'=>['type'=>'select','options'=>[1,2,3,4,5,6]]]; }
public function defaults(): array { return ['text'=>'Heading','level'=>2]; }
public function render(array $properties, array $context=[]): string { $level=max(1,min(6,(int)($properties['level']??2))); return '<h'.$level.'>'.e($properties['text']??'').'</h'.$level.'>'; }
}
@@ -0,0 +1,12 @@
<?php
namespace Modules\Builder\Components;
use Modules\Builder\Contracts\BuilderComponent;
final class HeroComponent implements BuilderComponent
{
public function type(): string { return 'hero'; }
public function label(): string { return 'Hero'; }
public function category(): string { return 'Content'; }
public function schema(): array { return ['heading'=>['type'=>'text','required'=>true],'content'=>['type'=>'textarea'],'button_label'=>['type'=>'text'],'button_url'=>['type'=>'text']]; }
public function defaults(): array { return ['heading'=>'A compelling headline','content'=>'Add supporting content here.','button_label'=>'Learn more','button_url'=>'#']; }
public function render(array $properties, array $context=[]): string { return view('builder::components.hero',['properties'=>$properties])->render(); }
}