Visual header, body, and footer composition screen.

* Drag-and-drop section ordering with automatic saving.
* Add existing reusable documents to regions.
* Remove placements without deleting documents.
* Create independent page-specific copies.
* Shared-document usage warnings.
* Document creation, duplication, deletion protection and filtering.
* Draft and published document states.
* Document and placement scheduling.
* Authenticated homepage preview.
* Draft sections displayed in preview with a clear draft marker.
* Content Composer added to the administration sidebar.
* Public rendering now respects:
    * Publication status
    * Future publication dates
    * Expiry dates
    * Placement start and end dates
    * Enabled state
* Original Saasland homepage remains as the fallback when no composition exists.
This commit is contained in:
Mark Gregory
2026-07-27 08:28:52 +01:00
parent 3a93d4eaea
commit bfac7f555a
15 changed files with 686 additions and 57 deletions
@@ -26,6 +26,7 @@
<flux:sidebar.group :heading="__('Content')" expandable :expanded="request()->routeIs('administration.pages.*', 'administration.menus.*', 'administration.redirects.*', 'administration.forms.*', 'administration.documents.*', 'administration.banners.*', 'administration.faq.*', 'administration.team.*', 'administration.testimonials.*')" class="grid">
<flux:sidebar.item icon="document-text" :href="route('administration.pages.index')" :current="request()->routeIs('administration.pages.*')" wire:navigate>{{ __('Pages') }}</flux:sidebar.item>
<flux:sidebar.item icon="rectangle-stack" :href="route('content.index')" :current="request()->routeIs('content.*')" wire:navigate>{{ __('Content Composer') }}</flux:sidebar.item>
<flux:sidebar.item icon="bars-3-bottom-left" :href="route('administration.menus.index')" :current="request()->routeIs('administration.menus.*')" wire:navigate>{{ __('Menus') }}</flux:sidebar.item>
<flux:sidebar.item icon="arrow-uturn-right" :href="route('administration.redirects.index')" :current="request()->routeIs('administration.redirects.*')" wire:navigate>{{ __('Redirects') }}</flux:sidebar.item>
<flux:sidebar.item icon="rectangle-stack" :href="route('administration.forms.index')" :current="request()->routeIs('administration.forms.*')" wire:navigate>{{ __('Forms') }}</flux:sidebar.item>
@@ -120,6 +121,7 @@
<flux:toast.group><flux:toast /></flux:toast.group>
@endpersist
@stack('scripts')
@fluxScripts
</body>
</html>