@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