344 lines
12 KiB
PHP
344 lines
12 KiB
PHP
<?php
|
||
|
||
$favicon_path = setting('site_favicon');
|
||
?>
|
||
<!doctype html>
|
||
<html lang="{{ app()->getLocale() }}" dir="{{ function_exists('current_language') && current_language() ? current_language()->direction : 'ltr' }}">
|
||
<head>
|
||
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
@php
|
||
$seo_title = ($meta['title'] ?? null) ? $meta['title'] . ' - ' . setting('site_name') : setting('seo_meta_title');
|
||
$seo_description = $meta['description'] ?? setting('seo_meta_description');
|
||
$seo_image = $meta['image'] ?? setting('default_meta_image');
|
||
if ($seo_image && !str_starts_with($seo_image, 'http')) {
|
||
$seo_image = asset($seo_image);
|
||
}
|
||
@endphp
|
||
@php
|
||
$seo_canonical = $meta['canonical'] ?? null;
|
||
if (!$seo_canonical) {
|
||
$seo_canonical = url()->current();
|
||
$localeQuery = request()->query('locale') ?? request()->query('lang');
|
||
if ($localeQuery && function_exists('available_language_codes') && in_array($localeQuery, available_language_codes())) {
|
||
$seo_canonical .= '?locale=' . $localeQuery;
|
||
}
|
||
}
|
||
$seo_robots = $meta['robots'] ?? 'index, follow';
|
||
$seo_og_type = $meta['og_type'] ?? 'website';
|
||
$seo_og_locale = str_replace('_', '-', $meta['locale'] ?? app()->getLocale());
|
||
|
||
$activeLanguages = class_exists(\App\Models\Language::class)
|
||
? \App\Models\Language::where('is_active', true)->get()
|
||
: collect([]);
|
||
$currentUrl = url()->current();
|
||
@endphp
|
||
<title>{{ $seo_title }}</title>
|
||
<meta name="description" content="{{ $seo_description }}">
|
||
<meta name="robots" content="{{ $seo_robots }}">
|
||
<link rel="canonical" href="{{ $seo_canonical }}">
|
||
|
||
@foreach($activeLanguages as $lang)
|
||
<link rel="alternate" hreflang="{{ $lang->code }}" href="{{ $currentUrl . '?locale=' . $lang->code }}">
|
||
@endforeach
|
||
@if($activeLanguages->count() > 0)
|
||
<link rel="alternate" hreflang="x-default" href="{{ $currentUrl }}">
|
||
@endif
|
||
|
||
<!-- Open Graph / Facebook -->
|
||
<meta property="og:type" content="{{ $seo_og_type }}">
|
||
<meta property="og:url" content="{{ $seo_canonical }}">
|
||
<meta property="og:title" content="{{ $seo_title }}">
|
||
<meta property="og:description" content="{{ $seo_description }}">
|
||
<meta property="og:locale" content="{{ $seo_og_locale }}">
|
||
@if(setting('site_name'))
|
||
<meta property="og:site_name" content="{{ setting('site_name') }}">
|
||
@endif
|
||
@if($seo_image)
|
||
<meta property="og:image" content="{{ $seo_image }}">
|
||
<meta property="og:image:alt" content="{{ $meta['image_alt'] ?? $seo_title }}">
|
||
@endif
|
||
|
||
<!-- Twitter -->
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:url" content="{{ $seo_canonical }}">
|
||
<meta name="twitter:title" content="{{ $seo_title }}">
|
||
<meta name="twitter:description" content="{{ $seo_description }}">
|
||
@if($seo_image)
|
||
<meta name="twitter:image" content="{{ $seo_image }}">
|
||
<meta name="twitter:image:alt" content="{{ $meta['image_alt'] ?? $seo_title }}">
|
||
@endif
|
||
|
||
@if(!empty($structuredData))
|
||
<x-seo.json-ld :data="$structuredData" />
|
||
@endif
|
||
@stack('structured-data')
|
||
|
||
<link rel="icon" href="{{ $favicon_path ? (str_starts_with($favicon_path, 'http') ? $favicon_path : asset($favicon_path)) : asset('assets/img/favicon.png') }}">
|
||
@stack('head')
|
||
@if(request()->routeIs('homepage'))
|
||
@php
|
||
$hero_bg_preload = setting('hero_bg') ?: './assets/img/photos/bg16.webp';
|
||
if ($hero_bg_preload && !str_starts_with($hero_bg_preload, 'http')) {
|
||
$hero_bg_preload = asset($hero_bg_preload);
|
||
}
|
||
@endphp
|
||
<link rel="preload" href="{{ $hero_bg_preload }}" as="image" fetchpriority="high">
|
||
@endif
|
||
<link rel="stylesheet" href="{{ asset('html/style.css') }}">
|
||
<link rel="preload" href="{{ asset('assets/css/icon.css') }}" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link rel="stylesheet" href="{{ asset('assets/css/icon.css') }}"></noscript>
|
||
<link rel="preload" href="{{ asset('assets/fonts/unicons/unicons.css') }}" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link rel="stylesheet" href="{{ asset('assets/fonts/unicons/unicons.css') }}"></noscript>
|
||
<link rel="preload" href="{{ asset('assets/css/plugins.css') }}" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link rel="stylesheet" href="{{ asset('assets/css/plugins.css') }}"></noscript>
|
||
<link rel="stylesheet" href="{{ asset('assets/css/colors/grape.css') }}">
|
||
<link rel="preload" href="{{ asset('assets/css/fonts/urbanist.css') }}" as="style" onload="this.rel='stylesheet'">
|
||
<link rel="preload" href="{{ asset('assets/css/fonts/space.css') }}" as="style" onload="this.rel='stylesheet'">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Caveat:wght@600&family=Inter:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700;800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link href="https://fonts.googleapis.com/css2?family=Caveat:wght@600&family=Inter:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700;800&display=swap" rel="stylesheet"></noscript>
|
||
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=translate&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=translate&display=swap" rel="stylesheet"></noscript>
|
||
|
||
<!-- Site Verification -->
|
||
@if(setting('seo_google_search_console'))
|
||
<meta name="google-site-verification" content="{{ setting('seo_google_search_console') }}" />
|
||
@endif
|
||
@if(setting('seo_bing_webmaster'))
|
||
<meta name="msvalidate.01" content="{{ setting('seo_bing_webmaster') }}" />
|
||
@endif
|
||
|
||
<style>
|
||
html {
|
||
overflow-x: clip;
|
||
max-width: 100%;
|
||
}
|
||
|
||
body {
|
||
overflow-x: clip;
|
||
max-width: 100%;
|
||
}
|
||
|
||
video,
|
||
iframe {
|
||
max-width: 100%;
|
||
}
|
||
|
||
|
||
|
||
header .header-language-desktop {
|
||
display: none !important;
|
||
}
|
||
|
||
@media (min-width: 992px) {
|
||
header .header-language-desktop {
|
||
display: flex !important;
|
||
}
|
||
}
|
||
|
||
@media (max-width: 991.98px) {
|
||
header nav .container > .navbar-other:has(> .navbar-nav > .language-select) {
|
||
display: none !important;
|
||
}
|
||
|
||
.offcanvas .language-select-offcanvas__toggle {
|
||
width: 100%;
|
||
text-align: left;
|
||
}
|
||
|
||
.offcanvas .language-select-offcanvas__panel {
|
||
position: static !important;
|
||
inset: auto !important;
|
||
transform: none !important;
|
||
background: transparent !important;
|
||
box-shadow: none !important;
|
||
border: 0 !important;
|
||
}
|
||
|
||
.offcanvas .language-select-offcanvas__panel .nav-link {
|
||
padding-left: 0 !important;
|
||
}
|
||
|
||
.offcanvas .language-select-offcanvas__toggle[aria-expanded="true"] .language-select-offcanvas__icon {
|
||
transform: rotate(180deg);
|
||
}
|
||
}
|
||
|
||
.language-select .language-select__trigger {
|
||
display: inline-flex !important;
|
||
flex-direction: row !important;
|
||
flex-wrap: nowrap !important;
|
||
align-items: center !important;
|
||
gap: 0.15rem;
|
||
}
|
||
|
||
.language-select .language-select__trigger.dropdown-toggle:after,
|
||
.language-select .language-select__trigger.dropdown-toggle::after {
|
||
position: static !important;
|
||
top: auto !important;
|
||
right: auto !important;
|
||
display: inline-block !important;
|
||
vertical-align: middle !important;
|
||
margin-left: 0 !important;
|
||
margin-right: 0 !important;
|
||
line-height: 1;
|
||
}
|
||
|
||
.navbar-dark .language-select .language-select__trigger.dropdown-toggle:after,
|
||
.navbar-dark .language-select .language-select__trigger.dropdown-toggle::after {
|
||
color: #ffffff !important;
|
||
}
|
||
|
||
.navbar-light .language-select .language-select__trigger.dropdown-toggle:after,
|
||
.navbar-light .language-select .language-select__trigger.dropdown-toggle::after {
|
||
color: #e31e24 !important;
|
||
}
|
||
|
||
:root {
|
||
--font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif !important;
|
||
--font-Manrope: 'Inter', sans-serif !important;
|
||
--font-THICCCBOI: 'Inter', sans-serif !important;
|
||
--font-Urbanist: 'Inter', sans-serif !important;
|
||
--font-SpaceGrotesk: 'Outfit', sans-serif !important;
|
||
--font-DMSerif: 'Outfit', serif !important;
|
||
--default-font-family: 'Inter', sans-serif !important;
|
||
}
|
||
|
||
body {
|
||
font-family: 'Inter', sans-serif;
|
||
}
|
||
|
||
h1, h2, h3, h4, h5, h6, .display-font, [class*="display-"] {
|
||
font-family: 'Outfit', sans-serif !important;
|
||
}
|
||
|
||
<?php echo setting('custom_css') ?>
|
||
</style>
|
||
|
||
<!-- Google Analytics 4 (GA4) -->
|
||
@if(setting('seo_google_analytics_id'))
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id={{ setting('seo_google_analytics_id') }}"></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', '{{ setting('seo_google_analytics_id') }}');
|
||
|
||
// Global Event Tracker Helper
|
||
window.trackEvent = function(eventName, params = {}) {
|
||
if (typeof gtag === 'function') {
|
||
gtag('event', eventName, params);
|
||
}
|
||
};
|
||
</script>
|
||
@endif
|
||
|
||
@stack('styles')
|
||
|
||
</head>
|
||
<body class="overflow-x-hidden">
|
||
{{-- Dynamic Header Template or Static Navbar --}}
|
||
@php
|
||
$finalHeader = null;
|
||
|
||
// 1. String Başlık Kontrolü: Eğer string geldiyse (örn: "Demo29 Header"), modelini bul
|
||
if (isset($headerTemplate) && is_string($headerTemplate)) {
|
||
$foundTemplate = \App\Models\HeaderTemplate::where('title', $headerTemplate)
|
||
->where('is_active', true)
|
||
->first();
|
||
if ($foundTemplate) {
|
||
$headerTemplate = $foundTemplate;
|
||
}
|
||
}
|
||
|
||
// 2. Model Instance Varsa Render Et (En Yüksek Öncelik)
|
||
// Kullanıcı template seçtiyse bu çalışır ve renderedHeader'ı ezer.
|
||
if (isset($headerTemplate) && $headerTemplate instanceof \App\Models\HeaderTemplate) {
|
||
$templateDefaults = $headerTemplate->default_data ?? [];
|
||
$templateData = $header_data ?? [];
|
||
$mergedData = array_merge($templateDefaults, $templateData);
|
||
$model = $page ?? null;
|
||
$finalHeader = \App\Services\TemplateService::replacePlaceholders(
|
||
$headerTemplate->html_content,
|
||
$mergedData,
|
||
$model
|
||
);
|
||
}
|
||
|
||
// 3. Blade dosyası path'i varsa include et (RenderedHeader'dan ÖNCE kontrol edilmeli)
|
||
if (!$finalHeader && isset($header) && $header) {
|
||
$finalHeader = view($header)->render();
|
||
}
|
||
|
||
// 4. Eğer yukarıdan sonuç çıkmadıysa ve Controller zaten render ettiyse onu kullan
|
||
if (!$finalHeader && isset($renderedHeader) && $renderedHeader) {
|
||
$finalHeader = $renderedHeader;
|
||
}
|
||
@endphp
|
||
|
||
@if($finalHeader)
|
||
{!! $finalHeader !!}
|
||
@else
|
||
@include('partials.header')
|
||
@endif
|
||
|
||
{{-- Main Content --}}
|
||
<main id="main-content">
|
||
@yield('content')
|
||
</main>
|
||
|
||
{{-- Dynamic Footer Template or Static Footer --}}
|
||
@php
|
||
$finalFooter = null;
|
||
|
||
// 1. String Başlık Kontrolü
|
||
if (isset($footerTemplate) && is_string($footerTemplate)) {
|
||
$foundTemplate = \App\Models\FooterTemplate::where('title', $footerTemplate)
|
||
->where('is_active', true)
|
||
->first();
|
||
if ($foundTemplate) {
|
||
$footerTemplate = $foundTemplate;
|
||
}
|
||
}
|
||
|
||
// 2. Model Instance Varsa Render Et (En Yüksek Öncelik)
|
||
if (isset($footerTemplate) && $footerTemplate instanceof \App\Models\FooterTemplate) {
|
||
$templateDefaults = $footerTemplate->default_data ?? [];
|
||
$templateData = $footer_data ?? [];
|
||
$mergedData = array_merge($templateDefaults, $templateData);
|
||
$model = $page ?? null;
|
||
$finalFooter = \App\Services\TemplateService::replacePlaceholders(
|
||
$footerTemplate->html_content,
|
||
$mergedData,
|
||
$model
|
||
);
|
||
}
|
||
|
||
// 3. Blade dosyası path'i (RenderedFooter'dan ÖNCE)
|
||
if (!$finalFooter && isset($footer) && $footer) {
|
||
$finalFooter = view($footer)->render();
|
||
}
|
||
|
||
// 4. Controller'dan gelen renderedFooter
|
||
if (!$finalFooter && isset($renderedFooter) && !empty(trim($renderedFooter ?? ''))) {
|
||
$finalFooter = $renderedFooter;
|
||
}
|
||
@endphp
|
||
|
||
@if($finalFooter)
|
||
{!! $finalFooter !!}
|
||
@else
|
||
@include('partials.footer')
|
||
@endif
|
||
|
||
<script src="{{ asset('assets/js/plugins.js') }}" defer></script>
|
||
<script src="{{ asset('assets/js/theme.js') }}" defer></script>
|
||
@stack('scripts')
|
||
</body>
|
||
</html>
|
||
|
||
|