@php $_currentThemeMode = config('app.change_theme', true) ? cookie()->get('theme', config('app.default_theme', 'dark')) : config('app.default_theme', 'dark'); $_themeColors = app('flute.view.manager')->getColors($_currentThemeMode); $_navStyle = $_themeColors['--nav-style'] ?? 'default'; $_sidebarStyle = $_themeColors['--sidebar-style'] ?? 'default'; $_sidebarMode = $_themeColors['--sidebar-mode'] ?? 'full'; $_sidebarPosition = $_themeColors['--sidebar-position'] ?? 'top'; $_sidebarCollapsed = cookie()->get('sidebar_collapsed', 'false'); $_sidebarContained = $_themeColors['--sidebar-contained'] ?? 'false'; $_sidebarMiniLabels = $_themeColors['--sidebar-mini-labels'] ?? 'text'; $_designPreset = $_themeColors['--design-preset'] ?? 'default'; $_tabbarLimit = 4; $_mobileNavMode = navbar()->mobileNavMode($_tabbarLimit); @endphp @php // --- Title --- $_final_title = page()->title; if (empty($_final_title) && \Illuminate\Support\Facades\View::hasSection('title')) { $_final_title = trim(\Illuminate\Support\Facades\View::yieldContent('title')); } if (empty($_final_title)) { $_final_title = config('app.name'); } $_final_title = __($_final_title); // --- Description --- $_final_description = page()->description; if (empty($_final_description) && \Illuminate\Support\Facades\View::hasSection('description')) { $_final_description = trim(\Illuminate\Support\Facades\View::yieldContent('description')); } if (empty($_final_description)) { $_final_description = config('app.description'); } $_final_description = __($_final_description); // --- Keywords --- $_final_keywords = page()->keywords; if (empty($_final_keywords) && \Illuminate\Support\Facades\View::hasSection('keywords')) { $_final_keywords = trim(\Illuminate\Support\Facades\View::yieldContent('keywords')); } if (empty($_final_keywords)) { $_final_keywords = config('app.keywords'); } // --- Robots --- if (config('app.maintenance_mode')) { $_final_robots = 'noindex, nofollow'; } else { $_final_robots = page()->robots; if (empty($_final_robots) && \Illuminate\Support\Facades\View::hasSection('robots')) { $_final_robots = trim(\Illuminate\Support\Facades\View::yieldContent('robots')); } if (empty($_final_robots)) { $_final_robots = config('app.robots', 'index, follow'); } } // --- OG Image --- $_final_og_image = page()->og_image; if (empty($_final_og_image) && \Illuminate\Support\Facades\View::hasSection('og_image')) { $_final_og_image = trim(\Illuminate\Support\Facades\View::yieldContent('og_image')); } if (empty($_final_og_image)) { $_final_og_image = asset('assets/img/social-image.png'); } // --- Twitter Image --- $_final_twitter_image = page()->og_image; if (empty($_final_twitter_image) && \Illuminate\Support\Facades\View::hasSection('twitter_image')) { $_final_twitter_image = trim(\Illuminate\Support\Facades\View::yieldContent('twitter_image')); } if (empty($_final_twitter_image)) { $_final_twitter_image = asset('assets/img/social-image.png'); } $isPartialRequest = request()->htmx()->omitsLayoutShell(); // --- Theme colors --- $__colors = app('flute.view.manager')->getColors(); $lightThemeBg = $__colors['light']['--background'] ?? '#ffffff'; $darkThemeBg = $__colors['dark']['--background'] ?? '#1c1c1e'; $currentTheme = config('app.change_theme', true) ? cookie()->get('theme', config('app.default_theme', 'dark')) : config('app.default_theme', 'dark'); $currentThemeBg = $currentTheme === 'light' ? $lightThemeBg : $darkThemeBg; @endphp {{ $_final_title }} @yield('meta') @stack('head') @if (isset($sections['head'])) {!! $sections['head'] !!} @endif @foreach (config('lang.available') as $lang) @endforeach @if (!$isPartialRequest) @at(tt('assets/sass/app.scss')) @endif @include('flute::partials.background') @stack('styles') @if (isset($sections['styles'])) {!! $sections['styles'] !!} @endif @if ($isPartialRequest) @stack('scripts') @if (isset($sections['scripts'])) {!! $sections['scripts'] !!} @endif @endif @if (!$isPartialRequest) @endif @include('flute::partials.colors') @if (!$isPartialRequest) @can('admin.pages') @endcan @endif @if (!$isPartialRequest) {{-- Always render sidebar-nav, visibility controlled by CSS based on data-nav-style --}}
@endif @includeWhen(!$isPartialRequest, 'flute::layouts.header') @if (!$isPartialRequest) @can('admin.pages') @include('flute::partials.page-edit-onboarding') @endcan @can('admin.boss') @include('flute::partials.admin-onboarding') @endcan @endif
@includeWhen(!$isPartialRequest, 'flute::partials.loader') @stack('before-content') @if (isset($sections['before-content'])) {!! $sections['before-content'] !!} @endif @if (is_debug() || is_development()) @include('flute::components.debug-message') @endif @include('flute::partials.breadcrumb') @include('flute::partials.flash') @include('flute::partials.widgets') @php $pageBlocks = page()->getBlocks(); $hasContentWidget = false; if (!empty($pageBlocks)) { foreach ($pageBlocks as $block) { if ($block->getWidget() === 'Content') { $hasContentWidget = true; break; } } } // Also check if the global layout already rendered the Content widget if (!$hasContentWidget) { $hasContentWidget = page()->isGlobalContentRendered(); } @endphp @if (!$hasContentWidget) @stack('content') @if (isset($sections['content'])) {!! $sections['content'] !!} @endif @endif @can('admin.pages') @include('flute::partials.no-widgets') @endcan
@stack('content-after') @if (isset($sections['content-after'])) {!! $sections['content-after'] !!} @endif @includeIf('flute::partials.confirmation') @if (!$isPartialRequest)
@stack('toast-container') @if (isset($sections['toast-container'])) {!! $sections['toast-container'] !!} @endif
@includeIf('flute::components.right-sidebar') @includeIf('flute::components.tab-bar') @can('admin.pages') @includeIf('flute::components.page-edit') @include('flute::partials.page-edit-dialog') @include('flute::partials.page-seo-dialog') @endcan
@include('flute::partials.default-modals') @stack('modals') @if (isset($sections['modals'])) {!! $sections['modals'] !!} @endif
@includeIf('flute::components.user-card') @include('flute::components.richtext-icons') @endif @includeWhen(!$isPartialRequest, 'flute::layouts.footer') @if (!$isPartialRequest) @at('Core/Template/Resources/js/prefetch.js') {{-- On-demand heavy libs: loaded when their trigger elements appear in DOM --}} @at(tt('assets/scripts/libs/simplebar.js')) @at(tt('assets/scripts/libs/tinycolor.js')) @at(tt('assets/scripts/helpers.js')) @at(tt('assets/scripts/image-cropper.js')) @at(tt('assets/scripts/bottom-sheet.js')) @at(tt('assets/scripts/user-card.js')) @at(tt('assets/scripts/tabs.js')) @at(tt('assets/scripts/steps.js')) @at(tt('assets/scripts/richtext/icons.js')) @at(tt('assets/scripts/richtext/extensions.js')) @at(tt('assets/scripts/richtext/upload.js')) @at(tt('assets/scripts/richtext/toolbar.js')) @at(tt('assets/scripts/richtext/modals.js')) @at(tt('assets/scripts/richtext/bubble-menu.js')) @at(tt('assets/scripts/richtext/table-controls.js')) @at(tt('assets/scripts/richtext/main.js')) @at(tt('assets/scripts/translatable.js')) @at(tt('assets/scripts/otp-input.js')) @at(tt('assets/scripts/tom-select.js')) @can('admin.pages') {{-- Page Edit modular scripts --}} @at(tt('assets/scripts/page-edit/core/namespace.js')) @at(tt('assets/scripts/page-edit/core/event-bus.js')) @at(tt('assets/scripts/page-edit/core/config.js')) @at(tt('assets/scripts/page-edit/managers/history-manager.js')) @at(tt('assets/scripts/page-edit/managers/onboarding-manager.js')) @at(tt('assets/scripts/page-edit/managers/sidebar-manager.js')) @at(tt('assets/scripts/page-edit/grid/grid-controller.js')) @at(tt('assets/scripts/page-edit/grid/widget-loader.js')) @at(tt('assets/scripts/page-edit/grid/widget-toolbar.js')) @at(tt('assets/scripts/page-edit/ui/search-handler.js')) @at(tt('assets/scripts/page-edit/ui/category-accordion.js')) @at(tt('assets/scripts/page-edit/ui/keyboard-handler.js')) @at(tt('assets/scripts/page-edit/ui/visibility-conditions.js')) @at(tt('assets/scripts/page-edit/storage/local-storage.js')) @at(tt('assets/scripts/page-edit/storage/layout-api.js')) @at(tt('assets/scripts/page-edit/main.js')) @at(tt('assets/scripts/page-visual-editor.js')) @endcan @can('admin.boss') @if (!config('tips_complete.admin_onboarding.completed')) @at(tt('assets/scripts/admin-onboarding.js')) @endif @endcan {{-- Always load sidebar-nav script, it handles visibility check internally --}} @at(tt(path: 'assets/scripts/sidebar-nav.js')) @at(tt('assets/scripts/tabbar.js')) @at(tt('assets/scripts/app.js')) @include('flute::partials.toasts') @stack('scripts') @if (isset($sections['scripts'])) {!! $sections['scripts'] !!} @endif @endif