Merge pull request #23 from truncgil/fix-and-ourlogos

Fix and ourlogos
This commit is contained in:
Truncgil Technology
2026-02-09 18:44:16 +03:00
committed by GitHub
23 changed files with 863 additions and 561 deletions
@@ -51,7 +51,7 @@ class PageResource extends Resource
public static function getRelations(): array public static function getRelations(): array
{ {
return [ return [
// RelationManagers\TestimonialsRelationManager::class,
]; ];
} }
@@ -0,0 +1,122 @@
<?php
namespace App\Filament\Admin\Resources\Pages\RelationManagers;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\BulkActionGroup;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Schema;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class TestimonialsRelationManager extends RelationManager
{
protected static string $relationship = 'testimonials';
protected static ?string $title = 'Müşteri Görüşleri';
protected static ?string $modelLabel = 'Müşteri Görüşü';
protected static ?string $pluralModelLabel = 'Müşteri Görüşleri';
protected static ?string $recordTitleAttribute = 'name';
public static function canViewForRecord(\Illuminate\Database\Eloquent\Model $ownerRecord, string $pageClass): bool
{
// Sadece Müşteri Görüşleri sayfası veya testimonials şablonu kullananlar için göster
return $ownerRecord->slug === 'musteri-gorusleri' ||
$ownerRecord->template === 'corporate.testimonials' ||
$ownerRecord->is_homepage;
}
public function form(Schema $schema): Schema
{
return $schema
->schema([
TextInput::make('name')
->label('Müşteri Adı')
->required()
->maxLength(255),
TextInput::make('position')
->label('Şirket / Ünvan')
->maxLength(255),
Textarea::make('content')
->label('Görüş / Yorum')
->required()
->columnSpanFull(),
Select::make('rating')
->label('Puan')
->options([
1 => '1 Yıldız',
2 => '2 Yıldız',
3 => '3 Yıldız',
4 => '4 Yıldız',
5 => '5 Yıldız',
])
->default(5)
->required(),
FileUpload::make('avatar')
->label('Profil Resmi')
->image()
->directory('testimonials'),
Toggle::make('is_active')
->label('Aktif')
->default(true),
TextInput::make('sort_order')
->label('Sıralama')
->numeric()
->default(0),
]);
}
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('name')
->columns([
Tables\Columns\TextColumn::make('name')
->label('Ad')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('position')
->label('Ünvan')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('rating')
->label('Puan')
->sortable(),
Tables\Columns\IconColumn::make('is_active')
->label('Aktif')
->boolean()
->sortable(),
Tables\Columns\TextColumn::make('sort_order')
->label('Sıra')
->sortable(),
])
->filters([
//
])
->headerActions([
CreateAction::make(),
])
->actions([
EditAction::make(),
DeleteAction::make(),
])
->bulkActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}
@@ -9,6 +9,7 @@ use App\Filament\Admin\Resources\Pages\Schemas\Sections\SectionBuilderSection;
use App\Filament\Admin\Resources\Pages\Schemas\Sections\SectionTemplatesSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\SectionTemplatesSection;
use App\Filament\Admin\Resources\Pages\Schemas\Sections\SeoSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\SeoSection;
use App\Filament\Admin\Resources\Pages\Schemas\Sections\TranslationsSection; use App\Filament\Admin\Resources\Pages\Schemas\Sections\TranslationsSection;
use App\Filament\Admin\Resources\Pages\Schemas\Sections\LogosSection;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
@@ -49,6 +50,9 @@ class PageForm
SectionTemplatesSection::make(), SectionTemplatesSection::make(),
FooterTemplateSection::make(), FooterTemplateSection::make(),
// Full Width - Logos (Only for Logolarımız template)
LogosSection::make(),
// Full Width - Translations // Full Width - Translations
TranslationsSection::make(), TranslationsSection::make(),
]); ]);
@@ -0,0 +1,36 @@
<?php
namespace App\Filament\Admin\Resources\Pages\Schemas\Sections;
use Filament\Forms\Components\FileUpload;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Get;
class LogosSection
{
public static function make(): Section
{
return Section::make(__('Logolar'))
->description(__('Bu sayfada gösterilecek logoları buradan yönetebilirsiniz.'))
->schema([
Grid::make(3)
->schema([
FileUpload::make('data.logo_1')
->label(__('Logo 1'))
->disk('public'),
FileUpload::make('data.logo_2')
->label(__('Logo 2'))
->disk('public'),
FileUpload::make('data.logo_3')
->label(__('Logo 3'))
->disk('public'),
]),
])
->visible(fn (Get $get): bool => $get('template') === 'corporate.logos')
->columnSpanFull()
->collapsible();
}
}
@@ -70,6 +70,8 @@ class PageSettingsSection
'blog' => __('pages.template_blog'), 'blog' => __('pages.template_blog'),
'contact' => __('pages.template_contact'), 'contact' => __('pages.template_contact'),
'home' => 'Home', 'home' => 'Home',
'corporate.testimonials' => 'Müşteri Görüşleri (Kurumsal)',
'corporate.logos' => 'Logolarımız (Kurumsal)',
]) ])
->default('default') ->default('default')
->columnSpanFull(), ->columnSpanFull(),
@@ -233,7 +233,7 @@ class SectionBuilderSection
->image() ->image()
->disk('public') ->disk('public')
->directory('pages/sections') ->directory('pages/sections')
->imageEditor() ->directory('pages/sections')
->live() ->live()
->afterStateUpdated(fn ($state, callable $set) => $set('value', $state)) ->afterStateUpdated(fn ($state, callable $set) => $set('value', $state))
->afterStateHydrated(function ($component, $state, Get $get) { ->afterStateHydrated(function ($component, $state, Get $get) {
@@ -176,7 +176,7 @@ class SiteTranslationController extends Controller
if ($validator->fails()) { if ($validator->fails()) {
return response()->json([ return response()->json([
'success' => false, 'success' => false,
'errors' => $validator->fails(), 'errors' => $validator->errors(),
], 422); ], 422);
} }
+145 -359
View File
@@ -8,6 +8,7 @@ use App\Models\HeaderTemplate;
use App\Models\FooterTemplate; use App\Models\FooterTemplate;
use App\Services\TemplateService; use App\Services\TemplateService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Collection;
class PageController extends Controller class PageController extends Controller
{ {
@@ -16,208 +17,29 @@ class PageController extends Controller
*/ */
public function index() public function index()
{ {
// 1. Statik "home" Template Kontrolü $settings = $this->getSettings();
if (view()->exists('templates.home')) {
$page = Page::with(['headerTemplate', 'footerTemplate'])
->where('is_homepage', true)
->where('status', 'published')
->latest('updated_at')
->first();
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null;
$renderedHeader = null;
$renderedFooter = null;
$metaTitle = null;
$metaDescription = null;
if ($page) {
// Meta bilgileri
$metaTitle = method_exists($page, 'translate')
? ($page->translate('meta_title') ?: $page->translate('title'))
: ($page->meta_title ?? $page->title ?? null);
$metaDescription = method_exists($page, 'translate')
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
: ($page->meta_description ?? $page->excerpt ?? null);
// Header Render
$headerTemplate = $page->headerTemplate;
if (!$headerTemplate) {
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
}
}
if ($headerTemplate) {
$templateDefaults = $headerTemplate->default_data ?? [];
$pageData = $page->header_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, $pageData);
$renderedHeader = TemplateService::replacePlaceholders($headerTemplate->html_content, $mergedHeaderData, $page);
}
// Footer Render
$footerTemplate = $page->footerTemplate;
if (!$footerTemplate) {
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::find($defaultFooterId);
}
}
if ($footerTemplate) {
$templateDefaults = $footerTemplate->default_data ?? [];
$pageData = $page->footer_data ?? [];
$mergedFooterData = array_merge($templateDefaults, $pageData);
$renderedFooter = TemplateService::replacePlaceholders($footerTemplate->html_content, $mergedFooterData, $page);
}
}
return view('templates.home', [
'page' => $page,
'settings' => $settings,
'sections' => $page ? ($page->sections ?? []) : [],
'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]),
'renderedHeader' => $renderedHeader,
'renderedFooter' => $renderedFooter,
'meta' => [
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
'image' => $settings->default_meta_image ?? null,
],
]);
}
// 2. Normal Dinamik Akış (Mevcut kod devam eder)
$page = Page::with(['headerTemplate', 'footerTemplate']) $page = Page::with(['headerTemplate', 'footerTemplate'])
->where('is_homepage', true) ->where('is_homepage', true)
->where('status', 'published') ->where('status', 'published')
->latest('updated_at') ->latest('updated_at')
->first(); ->first();
// 1. Statik "home" Template Kontrolü
if (view()->exists('templates.home')) {
return $this->renderView('templates.home', $page, $settings);
}
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; // Hiç sayfa yoksa fallback
// Hiç sayfa yoksa: direkt home template'inin statik fallback'i ile render et
if (!$page) { if (!$page) {
return view('templates.home', [ return view('templates.home', [
'page' => null, 'page' => null,
'settings' => $settings, 'settings' => $settings,
'meta' => [ 'meta' => $this->getMeta(null, $settings),
'title' => $settings->default_meta_title ?? config('app.name'),
'description' => $settings->default_meta_description ?? null,
'image' => $settings->default_meta_image ?? null,
],
]); ]);
} }
$metaTitle = method_exists($page, 'translate') return $this->renderPage($page, $settings);
? ($page->translate('meta_title') ?: $page->translate('title'))
: ($page->meta_title ?? $page->title ?? null);
$metaDescription = method_exists($page, 'translate')
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
: ($page->meta_description ?? $page->excerpt ?? null);
// Section verisini al - Hem eski hem yeni sistemi destekle
$sections = $page->sections ?? $page->data ?? [];
// Yeni dinamik template sistemi için sections_data varsa onu da al
$templatedSections = $page->templated_sections ?? collect([]);
// Template belirleme mantığı:
// 1. Kullanıcı template seçmişse, onu kullan
// 2. Template seçilmemişse ve homepage ise, 'home' kullan
// 3. Hiçbiri yoksa, 'generic' kullan
$template = $page->template
?? (($page->slug === 'home' || ($page->is_homepage ?? false)) ? 'home' : 'generic');
$view = view()->exists("templates.$template")
? "templates.$template"
: 'templates.generic';
// Render Header Template
$renderedHeader = null;
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
$renderedHeader = view($page->custom_header_blade, ['page' => $page])->render();
} else {
// 2. Yoksa Header Template sistemini kullan
$headerTemplate = $page->headerTemplate;
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
if (!$headerTemplate) {
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
}
}
if ($headerTemplate) {
// Merge template defaults with page data (page data overrides defaults)
$templateDefaults = $headerTemplate->default_data ?? [];
$pageData = $page->header_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, $pageData);
$renderedHeader = TemplateService::replacePlaceholders(
$headerTemplate->html_content,
$mergedHeaderData,
$page
);
}
}
// Render Footer Template
$renderedFooter = null;
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) {
$renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render();
} else {
// 2. Yoksa Footer Template sistemini kullan
$footerTemplate = $page->footerTemplate;
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
if (!$footerTemplate) {
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::find($defaultFooterId);
}
}
if ($footerTemplate) {
// Merge template defaults with page data (page data overrides defaults)
$templateDefaults = $footerTemplate->default_data ?? [];
$pageData = $page->footer_data ?? [];
$mergedFooterData = array_merge($templateDefaults, $pageData);
$renderedFooter = TemplateService::replacePlaceholders(
$footerTemplate->html_content,
$mergedFooterData,
$page
);
}
}
return view($view, [
'page' => $page,
'settings' => $settings,
'sections' => $sections,
'templatedSections' => $templatedSections,
'renderedHeader' => $renderedHeader,
'renderedFooter' => $renderedFooter,
'meta' => [
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
'image' => $settings->default_meta_image ?? null,
],
]);
} }
/** /**
@@ -225,93 +47,16 @@ class PageController extends Controller
*/ */
public function show($slug) public function show($slug)
{ {
$settings = $this->getSettings();
// 1. Statik View Kontrolü // 1. Statik View Kontrolü
// Eğer templates/{slug}.blade.php varsa, veritabanında kayıt olsun veya olmasın bu dosyayı render et.
if (view()->exists("templates.$slug")) { if (view()->exists("templates.$slug")) {
$page = Page::with(['headerTemplate', 'footerTemplate']) $page = Page::with(['headerTemplate', 'footerTemplate'])
->where('slug', $slug) ->where('slug', $slug)
->where('status', 'published') ->where('status', 'published')
->first(); ->first();
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; return $this->renderView("templates.$slug", $page, $settings);
// Meta verilerini hazırla
$metaTitle = null;
$metaDescription = null;
if ($page) {
$metaTitle = method_exists($page, 'translate')
? ($page->translate('meta_title') ?: $page->translate('title'))
: ($page->meta_title ?? $page->title ?? null);
$metaDescription = method_exists($page, 'translate')
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
: ($page->meta_description ?? $page->excerpt ?? null);
}
// Statik sayfa için header/footer render işlemleri (Eğer page varsa)
$renderedHeader = null;
$renderedFooter = null;
if ($page) {
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
$renderedHeader = view($page->custom_header_blade, ['page' => $page])->render();
} else {
// 2. Yoksa Header Template sistemini kullan
$headerTemplate = $page->headerTemplate;
if (!$headerTemplate) {
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
}
}
if ($headerTemplate) {
$templateDefaults = $headerTemplate->default_data ?? [];
$pageData = $page->header_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, $pageData);
$renderedHeader = TemplateService::replacePlaceholders($headerTemplate->html_content, $mergedHeaderData, $page);
}
}
// Footer Render
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) {
$renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render();
} else {
// 2. Yoksa Footer Template sistemini kullan
$footerTemplate = $page->footerTemplate;
if (!$footerTemplate) {
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::find($defaultFooterId);
}
}
if ($footerTemplate) {
$templateDefaults = $footerTemplate->default_data ?? [];
$pageData = $page->footer_data ?? [];
$mergedFooterData = array_merge($templateDefaults, $pageData);
$renderedFooter = TemplateService::replacePlaceholders($footerTemplate->html_content, $mergedFooterData, $page);
}
}
}
return view("templates.$slug", [
'page' => $page,
'settings' => $settings,
'sections' => $page->sections ?? [],
'templatedSections' => $page->templated_sections ?? collect([]),
'renderedHeader' => $renderedHeader,
'renderedFooter' => $renderedFooter,
'meta' => [
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
'image' => $settings->default_meta_image ?? null,
],
]);
} }
// 2. Normal Dinamik Akış (DB Kaydı Zorunlu) // 2. Normal Dinamik Akış (DB Kaydı Zorunlu)
@@ -320,112 +65,156 @@ class PageController extends Controller
->where('status', 'published') ->where('status', 'published')
->firstOrFail(); ->firstOrFail();
$settings = class_exists(Setting::class) ? (object) Setting::where('is_active', true)->pluck('value', 'key')->toArray() : null; return $this->renderPage($page, $settings);
}
$metaTitle = method_exists($page, 'translate') /**
? ($page->translate('meta_title') ?: $page->translate('title')) * Render a page with full dynamic logic
: ($page->meta_title ?? $page->title ?? null); */
protected function renderPage(Page $page, $settings)
$metaDescription = method_exists($page, 'translate') {
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
: ($page->meta_description ?? $page->excerpt ?? null);
// Use parsed_sections for easier template usage (key-value format)
$sections = $page->parsed_sections ?? $page->sections ?? $page->data ?? [];
// Yeni dinamik template sistemi için sections_data varsa onu da al
$templatedSections = $page->templated_sections ?? collect([]);
// Template belirleme mantığı:
// 1. Kullanıcı template seçmişse, onu kullan
// 2. Template seçilmemişse ve homepage ise, 'home' kullan
// 3. Hiçbiri yoksa, 'generic' kullan
$template = $page->template $template = $page->template
?? (($slug === 'home' || ($page->is_homepage ?? false)) ? 'home' : 'generic'); ?? (($page->is_homepage ?? false) ? 'home' : 'generic');
$view = view()->exists("templates.$template") $view = view()->exists("templates.$template")
? "templates.$template" ? "templates.$template"
: 'templates.generic'; : 'templates.generic';
return $this->renderView($view, $page, $settings);
}
// Render Header Template /**
* Shared rendering logic for both static and dynamic templates
*/
protected function renderView(string $view, ?Page $page, $settings)
{
$renderedHeader = null; $renderedHeader = null;
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
$renderedHeader = view($page->custom_header_blade, ['page' => $page])->render();
} else {
// 2. Yoksa Header Template sistemini kullan
$headerTemplate = $page->headerTemplate;
// Eğer sayfa için header seçilmemişse, en son aktif header template'i kullan
if (!$headerTemplate) {
$defaultHeaderId = $settings->default_header ?? null;
if ($defaultHeaderId) {
$headerTemplate = HeaderTemplate::find($defaultHeaderId);
}
}
if ($headerTemplate) {
// Merge template defaults with page data (page data overrides defaults)
$templateDefaults = $headerTemplate->default_data ?? [];
$pageData = $page->header_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, $pageData);
$renderedHeader = TemplateService::replacePlaceholders(
$headerTemplate->html_content,
$mergedHeaderData,
$page
);
}
}
// Render Footer Template
$renderedFooter = null; $renderedFooter = null;
// 1. Önce özel blade dosyası var mı kontrol et if ($page) {
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) { $renderedHeader = $this->renderHeader($page, $settings);
$renderedFooter = view($page->custom_footer_blade, ['page' => $page])->render(); $renderedFooter = $this->renderFooter($page, $settings);
} else {
// 2. Yoksa Footer Template sistemini kullan
$footerTemplate = $page->footerTemplate;
// Eğer sayfa için footer seçilmemişse, en son aktif footer template'i kullan
if (!$footerTemplate) {
$defaultFooterId = $settings->default_footer ?? null;
if ($defaultFooterId) {
$footerTemplate = FooterTemplate::find($defaultFooterId);
}
}
if ($footerTemplate) {
// Merge template defaults with page data (page data overrides defaults)
$templateDefaults = $footerTemplate->default_data ?? [];
$pageData = $page->footer_data ?? [];
$mergedFooterData = array_merge($templateDefaults, $pageData);
$renderedFooter = TemplateService::replacePlaceholders(
$footerTemplate->html_content,
$mergedFooterData,
$page
);
}
} }
return view($view, [ return view($view, [
'page' => $page, 'page' => $page,
'settings' => $settings, 'settings' => $settings,
'sections' => $sections, 'sections' => $page ? ($page->parsed_sections ?? $page->sections ?? $page->data ?? []) : [],
'templatedSections' => $templatedSections, 'templatedSections' => $page ? ($page->templated_sections ?? collect([])) : collect([]),
'renderedHeader' => $renderedHeader, 'renderedHeader' => $renderedHeader,
'renderedFooter' => $renderedFooter, 'renderedFooter' => $renderedFooter,
'meta' => [ 'meta' => $this->getMeta($page, $settings),
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
'image' => $settings->default_meta_image ?? null,
],
]); ]);
} }
/**
* Get settings as an object
*/
protected function getSettings()
{
if (!class_exists(Setting::class)) {
return (object) [];
}
return (object) Setting::where('is_active', true)
->pluck('value', 'key')
->toArray();
}
/**
* Get meta information for a page
*/
protected function getMeta(?Page $page, $settings)
{
$metaTitle = null;
$metaDescription = null;
$metaImage = $settings->default_meta_image ?? null;
if ($page) {
$metaTitle = method_exists($page, 'translate')
? ($page->translate('meta_title') ?: $page->translate('title'))
: ($page->meta_title ?? $page->title ?? null);
$metaDescription = method_exists($page, 'translate')
? ($page->translate('meta_description') ?: ($page->excerpt ?? null))
: ($page->meta_description ?? $page->excerpt ?? null);
if ($page->featured_image) {
$metaImage = asset('storage/' . $page->featured_image);
}
}
return [
'title' => $metaTitle ?: ($settings->default_meta_title ?? config('app.name')),
'description' => $metaDescription ?: ($settings->default_meta_description ?? null),
'image' => $metaImage,
];
}
/**
* Render header template
*/
protected function renderHeader(Page $page, $settings)
{
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_header_blade) && view()->exists($page->custom_header_blade)) {
return view($page->custom_header_blade, ['page' => $page])->render();
}
// 2. Yoksa Header Template sistemini kullan
$headerTemplate = $page->headerTemplate;
if (!$headerTemplate && isset($settings->default_header)) {
$headerTemplate = HeaderTemplate::find($settings->default_header);
}
if ($headerTemplate) {
$templateDefaults = $headerTemplate->default_data ?? [];
$pageData = $page->header_data ?? [];
$mergedHeaderData = array_merge($templateDefaults, $pageData);
return TemplateService::replacePlaceholders(
$headerTemplate->html_content,
$mergedHeaderData,
$page
);
}
return null;
}
/**
* Render footer template
*/
protected function renderFooter(Page $page, $settings)
{
// 1. Önce özel blade dosyası var mı kontrol et
if (!empty($page->custom_footer_blade) && view()->exists($page->custom_footer_blade)) {
return view($page->custom_footer_blade, ['page' => $page])->render();
}
// 2. Yoksa Footer Template sistemini kullan
$footerTemplate = $page->footerTemplate;
if (!$footerTemplate && isset($settings->default_footer)) {
$footerTemplate = FooterTemplate::find($settings->default_footer);
}
if ($footerTemplate) {
$templateDefaults = $footerTemplate->default_data ?? [];
$pageData = $page->footer_data ?? [];
$mergedFooterData = array_merge($templateDefaults, $pageData);
return TemplateService::replacePlaceholders(
$footerTemplate->html_content,
$mergedFooterData,
$page
);
}
return null;
}
/** /**
* Get menu items for navigation * Get menu items for navigation
*/ */
@@ -445,6 +234,3 @@ class PageController extends Controller
->get(); ->get();
} }
} }
@@ -0,0 +1,27 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class SuperAdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (!auth()->check() || !auth()->user()->hasRole('super_admin')) {
if ($request->expectsJson()) {
return response()->json(['message' => 'Unauthorized'], 403);
}
abort(403);
}
return $next($request);
}
}
+5
View File
@@ -80,6 +80,11 @@ class Page extends Model
return $this->hasMany(Page::class, 'parent_id'); return $this->hasMany(Page::class, 'parent_id');
} }
public function testimonials()
{
return $this->hasMany(Testimonial::class);
}
/** /**
* Get the header template for the page. * Get the header template for the page.
*/ */
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Testimonial extends Model
{
protected $fillable = [
'page_id',
'name',
'position',
'content',
'rating',
'avatar',
'is_active',
'sort_order',
];
public function page()
{
return $this->belongsTo(Page::class);
}
}
-3
View File
@@ -173,8 +173,6 @@ class TemplateService
->image() ->image()
->disk('public') ->disk('public')
->directory('templates/images') ->directory('templates/images')
->imageEditor()
->imageEditorAspectRatios([null, '16:9', '4:3', '1:1'])
->maxSize(5120), ->maxSize(5120),
'images' => FileUpload::make("{$dataKey}.{$placeholder}") 'images' => FileUpload::make("{$dataKey}.{$placeholder}")
@@ -183,7 +181,6 @@ class TemplateService
->disk('public') ->disk('public')
->directory('templates/images') ->directory('templates/images')
->multiple() ->multiple()
->imageEditor()
->maxSize(5120) ->maxSize(5120)
->maxFiles(10), ->maxFiles(10),
+1 -1
View File
@@ -66,7 +66,7 @@ return [
'temporary_file_upload' => [ 'temporary_file_upload' => [
'disk' => 'public', // Example: 'local', 's3' | Default: 'default' 'disk' => 'public', // Example: 'local', 's3' | Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB) 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp' 'directory' => 'livewire-tmp', // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1' 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs... 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('testimonials', function (Blueprint $table) {
$table->id();
$table->foreignId('page_id')->nullable()->constrained()->onDelete('cascade');
$table->string('name');
$table->string('position')->nullable();
$table->text('content');
$table->integer('rating')->default(5);
$table->string('avatar')->nullable();
$table->boolean('is_active')->default(true);
$table->integer('sort_order')->default(0);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('testimonials');
}
};
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('pages', function (Blueprint $table) {
$table->json('data')->nullable()->after('sections');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('pages', function (Blueprint $table) {
$table->dropColumn('data')->nullable();
});
}
};
+41
View File
@@ -0,0 +1,41 @@
<?php
namespace Database\Seeders;
use App\Models\Page;
use App\Models\User;
use Illuminate\Database\Seeder;
class LogosPageSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$author = User::first();
if (!$author) return;
$corporate = Page::where('slug', 'kurumsal')->first();
if (!$corporate) return;
Page::updateOrCreate(
['slug' => 'logolarimiz'],
[
'author_id' => $author->id,
'parent_id' => $corporate->id,
'title' => 'Logolarımız',
'excerpt' => 'Kurumsal logolarımız ve kullanım standartları',
'content' => null,
'template' => 'corporate.logos',
'status' => 'published',
'is_homepage' => false,
'show_in_menu' => true,
'sort_order' => 6,
'published_at' => now(),
]
);
$this->command->info('✅ Logolarımız sayfası başarıyla eklendi!');
}
}
+33 -1
View File
@@ -132,7 +132,7 @@ class PageSeeder extends Seeder
); );
// 2.5 Müşteri Görüşleri (Child of Kurumsal) // 2.5 Müşteri Görüşleri (Child of Kurumsal)
Page::updateOrCreate( $testimonialsPage = Page::updateOrCreate(
['slug' => 'musteri-gorusleri'], ['slug' => 'musteri-gorusleri'],
[ [
'author_id' => $author->id, 'author_id' => $author->id,
@@ -149,6 +149,38 @@ class PageSeeder extends Seeder
] ]
); );
// Varsayılan müşteri görüşlerini ekle
$defaultTestimonials = [
[
'name' => 'Kerem Can Azak',
'position' => 'Stellar Construction',
'content' => 'Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.',
'rating' => 5,
'sort_order' => 1,
],
[
'name' => 'Servet Demir',
'position' => 'Dijimind Akademi',
'content' => 'Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.',
'rating' => 5,
'sort_order' => 2,
],
[
'name' => 'A. Cezmi Savaş',
'position' => 'Rhapsode Akademik Yayınevi',
'content' => 'Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.',
'rating' => 5,
'sort_order' => 3,
],
];
foreach ($defaultTestimonials as $testimonialData) {
\App\Models\Testimonial::updateOrCreate(
['page_id' => $testimonialsPage->id, 'name' => $testimonialData['name']],
$testimonialData
);
}
// 3. Ürünlerimiz (Mega Menu Target) // 3. Ürünlerimiz (Mega Menu Target)
Page::updateOrCreate( Page::updateOrCreate(
['slug' => 'urunlerimiz'], ['slug' => 'urunlerimiz'],
+147 -115
View File
@@ -1,9 +1,10 @@
{ {
"name": "public_html", "name": "citrus",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "citrus",
"devDependencies": { "devDependencies": {
"@tailwindcss/vite": "^4.0.0", "@tailwindcss/vite": "^4.0.0",
"axios": "^1.11.0", "axios": "^1.11.0",
@@ -14,13 +15,14 @@
} }
}, },
"node_modules/@esbuild/aix-ppc64": { "node_modules/@esbuild/aix-ppc64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
"integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"aix" "aix"
@@ -30,13 +32,14 @@
} }
}, },
"node_modules/@esbuild/android-arm": { "node_modules/@esbuild/android-arm": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
"integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"android" "android"
@@ -46,13 +49,14 @@
} }
}, },
"node_modules/@esbuild/android-arm64": { "node_modules/@esbuild/android-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
"integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"android" "android"
@@ -62,13 +66,14 @@
} }
}, },
"node_modules/@esbuild/android-x64": { "node_modules/@esbuild/android-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
"integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"android" "android"
@@ -78,13 +83,14 @@
} }
}, },
"node_modules/@esbuild/darwin-arm64": { "node_modules/@esbuild/darwin-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
"integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@@ -94,13 +100,14 @@
} }
}, },
"node_modules/@esbuild/darwin-x64": { "node_modules/@esbuild/darwin-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
"integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"darwin" "darwin"
@@ -110,13 +117,14 @@
} }
}, },
"node_modules/@esbuild/freebsd-arm64": { "node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
"integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"freebsd" "freebsd"
@@ -126,13 +134,14 @@
} }
}, },
"node_modules/@esbuild/freebsd-x64": { "node_modules/@esbuild/freebsd-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
"integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"freebsd" "freebsd"
@@ -142,13 +151,14 @@
} }
}, },
"node_modules/@esbuild/linux-arm": { "node_modules/@esbuild/linux-arm": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
"integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -158,13 +168,14 @@
} }
}, },
"node_modules/@esbuild/linux-arm64": { "node_modules/@esbuild/linux-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
"integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -174,13 +185,14 @@
} }
}, },
"node_modules/@esbuild/linux-ia32": { "node_modules/@esbuild/linux-ia32": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
"integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -190,13 +202,14 @@
} }
}, },
"node_modules/@esbuild/linux-loong64": { "node_modules/@esbuild/linux-loong64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
"integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
"cpu": [ "cpu": [
"loong64" "loong64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -206,13 +219,14 @@
} }
}, },
"node_modules/@esbuild/linux-mips64el": { "node_modules/@esbuild/linux-mips64el": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
"integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
"cpu": [ "cpu": [
"mips64el" "mips64el"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -222,13 +236,14 @@
} }
}, },
"node_modules/@esbuild/linux-ppc64": { "node_modules/@esbuild/linux-ppc64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
"integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -238,13 +253,14 @@
} }
}, },
"node_modules/@esbuild/linux-riscv64": { "node_modules/@esbuild/linux-riscv64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
"integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -254,13 +270,14 @@
} }
}, },
"node_modules/@esbuild/linux-s390x": { "node_modules/@esbuild/linux-s390x": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
"integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -270,13 +287,14 @@
} }
}, },
"node_modules/@esbuild/linux-x64": { "node_modules/@esbuild/linux-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
"integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"linux" "linux"
@@ -286,13 +304,14 @@
} }
}, },
"node_modules/@esbuild/netbsd-arm64": { "node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
"integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"netbsd" "netbsd"
@@ -302,13 +321,14 @@
} }
}, },
"node_modules/@esbuild/netbsd-x64": { "node_modules/@esbuild/netbsd-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
"integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"netbsd" "netbsd"
@@ -318,13 +338,14 @@
} }
}, },
"node_modules/@esbuild/openbsd-arm64": { "node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
"integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"openbsd" "openbsd"
@@ -334,13 +355,14 @@
} }
}, },
"node_modules/@esbuild/openbsd-x64": { "node_modules/@esbuild/openbsd-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
"integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"openbsd" "openbsd"
@@ -350,13 +372,14 @@
} }
}, },
"node_modules/@esbuild/openharmony-arm64": { "node_modules/@esbuild/openharmony-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
"integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"openharmony" "openharmony"
@@ -366,13 +389,14 @@
} }
}, },
"node_modules/@esbuild/sunos-x64": { "node_modules/@esbuild/sunos-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
"integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"sunos" "sunos"
@@ -382,13 +406,14 @@
} }
}, },
"node_modules/@esbuild/win32-arm64": { "node_modules/@esbuild/win32-arm64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
"integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@@ -398,13 +423,14 @@
} }
}, },
"node_modules/@esbuild/win32-ia32": { "node_modules/@esbuild/win32-ia32": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
"integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@@ -414,13 +440,14 @@
} }
}, },
"node_modules/@esbuild/win32-x64": { "node_modules/@esbuild/win32-x64": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
"integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
"win32" "win32"
@@ -1314,11 +1341,12 @@
} }
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.25.10", "version": "0.27.3",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
"integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT",
"bin": { "bin": {
"esbuild": "bin/esbuild" "esbuild": "bin/esbuild"
}, },
@@ -1326,32 +1354,32 @@
"node": ">=18" "node": ">=18"
}, },
"optionalDependencies": { "optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.10", "@esbuild/aix-ppc64": "0.27.3",
"@esbuild/android-arm": "0.25.10", "@esbuild/android-arm": "0.27.3",
"@esbuild/android-arm64": "0.25.10", "@esbuild/android-arm64": "0.27.3",
"@esbuild/android-x64": "0.25.10", "@esbuild/android-x64": "0.27.3",
"@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-arm64": "0.27.3",
"@esbuild/darwin-x64": "0.25.10", "@esbuild/darwin-x64": "0.27.3",
"@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-arm64": "0.27.3",
"@esbuild/freebsd-x64": "0.25.10", "@esbuild/freebsd-x64": "0.27.3",
"@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm": "0.27.3",
"@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-arm64": "0.27.3",
"@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-ia32": "0.27.3",
"@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-loong64": "0.27.3",
"@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-mips64el": "0.27.3",
"@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-ppc64": "0.27.3",
"@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-riscv64": "0.27.3",
"@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-s390x": "0.27.3",
"@esbuild/linux-x64": "0.25.10", "@esbuild/linux-x64": "0.27.3",
"@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-arm64": "0.27.3",
"@esbuild/netbsd-x64": "0.25.10", "@esbuild/netbsd-x64": "0.27.3",
"@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-arm64": "0.27.3",
"@esbuild/openbsd-x64": "0.25.10", "@esbuild/openbsd-x64": "0.27.3",
"@esbuild/openharmony-arm64": "0.25.10", "@esbuild/openharmony-arm64": "0.27.3",
"@esbuild/sunos-x64": "0.25.10", "@esbuild/sunos-x64": "0.27.3",
"@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-arm64": "0.27.3",
"@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-ia32": "0.27.3",
"@esbuild/win32-x64": "0.25.10" "@esbuild/win32-x64": "0.27.3"
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
@@ -1917,6 +1945,7 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true, "dev": true,
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@@ -2099,10 +2128,11 @@
} }
}, },
"node_modules/tar": { "node_modules/tar": {
"version": "7.5.1", "version": "7.5.7",
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
"integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
"dev": true, "dev": true,
"license": "BlueOak-1.0.0",
"dependencies": { "dependencies": {
"@isaacs/fs-minipass": "^4.0.0", "@isaacs/fs-minipass": "^4.0.0",
"chownr": "^3.0.0", "chownr": "^3.0.0",
@@ -2146,12 +2176,14 @@
"dev": true "dev": true
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "7.1.7", "version": "7.3.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
"integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true, "dev": true,
"license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.25.0", "esbuild": "^0.27.0",
"fdir": "^6.5.0", "fdir": "^6.5.0",
"picomatch": "^4.0.3", "picomatch": "^4.0.3",
"postcss": "^8.5.6", "postcss": "^8.5.6",
@@ -0,0 +1,128 @@
@extends('layouts.site')
@section('content')
<section class="wrapper bg-light">
<div class="container pt-14 pb-14 xl:pt-20 xl:pb-20 lg:pt-20 lg:pb-20 md:pt-20 md:pb-20">
<div class="row text-center mb-10">
<div class="col-md-10 col-lg-8 col-xl-7 mx-auto">
<h1 class="display-1 mb-3">{!! t('Logolarımız') !!}</h1>
</div>
</div>
<div class="row">
<div class="col-lg-10 col-xl-9 mx-auto">
<h2 class="display-6 mb-6">{!! t('Logomuzun Felsefesi') !!}</h2>
<div class="description-text mb-10">
<p class="mb-4">
{!! t('Trunçgil, kelime anlamıyla birçok kelimenin birleşmesinden meydana gelmektedir. Dikkat ederseniz "turunçgil" tabirinden farklı olarak baştaki "T" ile "r" arasında "u" harfi yoktur. Bunun sebebi "Türkiye Cumhuriyeti"nin ulusal kısaltması olan "Tr" yi nitelemektedir.') !!}
</p>
<p class="mb-4">
{!! t('"r" harfini kapattığınızda Trunçgil\'in kurucusu olan Ümit Tunç\'un soy ismi "Tunç" kelimesi oluşmaktadır. "gil" tabiri Türkçe\'de aile, ekosistem kavramını, Osmanlıca\'da su ile bulanmış toprak anlamını taşıyan "kil" tabirini ortaya çıkartmaktadır. Kelimenin toplamına baktığımızda okunuş itibariyle "turunçgil" turuncuyu yani dinamizmi simgelemektedir. Aynı zamanda İngilizce\'de budamak, kesmek anlamına gelen "truncate" kelimesini de çağrıştırmaktadır. Detaylı olarak bu kelimelerin logo üzerindeki anlamlarını açıklayalım.') !!}
</p>
</div>
<div class="space-y-8">
<div>
<h4 class="mb-3">{!! t('TR: Önce Türkiye, Öncü Türkiye') !!}</h4>
<p>
{!! t('Yaptığımız ve yapacağımız bütün işlerin güzel yurdumuz olan Türkiye\'ye adadığımızı, baştan taahhüt etmekteyiz.') !!}
</p>
</div>
<div>
<h4 class="mb-3">{!! t('Tunç: Dayanıklılık ve Güç') !!}</h4>
<p>
{!! t('Ayakkabı tamiri yapan atamızın çekiç ve örs aletleri tunçtan yapılmıştı. 1934\'de yayınlanan soy ismi kanununda bu sebeple Tunç soyadını almışız. Tunç madeninin kullanım alanları çok dayanıklı araç ve gereçlerin yapımına sebep olmuştur. Dayanıklı araç ve gereçlerin dışında nispeten çok ince emek isteyen mücevher, takı ve süs aksesuarlarında da kullanılmıştır. Güçlü silahlar, değerli eşyalar ve süs eşyaları yapımında tunç madeninden oldukça faydalanılmıştır.') !!}
</p>
<p class="mt-4">
{!! t('Bundan dolayıdır ki yapacağımız tüm işler tunç madeni kadar dayanıklı, tunç kadar ince emek isteyen işlerden oluşmasıdır.') !!}
</p>
</div>
<div>
<h4 class="mb-3">{!! t('Gil: Aile, ekosistem / kil yarı mamulü') !!}</h4>
<p>
{!! t('Toplumun en küçük birimi olan sosyal yapıyı niteleyen aile kavramını bütünsel yapılanma ve yapmış olduğumuz tüm ürünlerin bir ailenin ferdi olarak nitelendirdiğimizi belirtmek isteriz.') !!}
</p>
<p class="mt-4">
{!! t('Osmanlıcadaki "gil" kelimesinin anlamı, sulanmış toprak olan "kil" hamur gibi işlenen ve bir ürün ortaya çıkartmak için kullanılan yarı mamulünü niteler. Dolayısıyla "gil", sistemde değişikliğe gidebilecek olduğumuzu, yapılan bir işi farklı bir işe kolay evirebileceğimizi nitelemektedir.') !!}
</p>
</div>
<div>
<h4 class="mb-3">{!! t('Truncate: Verimlilik için budamak') !!}</h4>
<p>
{!! t('Transact SQL dilinde de kullanılan "Truncate" deyimi budamak, kesmek anlamına gelmektedir. Budama aynı zamanda botanikte de bitkinin daha verimli olabilmesini, daha sağlıklı gelişebilmesini sağlamak amacıyla yapılan, fazla veya istenmeyen dalların kesilmesini sağlayan bir eylemdir.') !!}
</p>
<p class="mt-4">
{!! t('Dolayısıyla "truncate" bizim nezdimizde yalın kodu, basitliğin en güzel gelişmişlik olduğunu betimlemektedir.') !!}
</p>
</div>
</div>
<div class="mt-15">
<h2 class="display-6 mb-8 text-center">{!! t('Logo Varyasyonlarımız') !!}</h2>
@php
$data = $page->data ?? [];
$logos = [
['label' => 'Logo 1', 'file' => $data['logo_1'] ?? null],
['label' => 'Logo 2', 'file' => $data['logo_2'] ?? null],
['label' => 'Logo 3', 'file' => $data['logo_3'] ?? null],
];
@endphp
<div class="row g-8">
@foreach($logos as $logo)
@if($logo['file'])
<div class="col-md-4">
<div class="card shadow-sm h-100 hover-shadow transition-all duration-300">
<div class="card-body p-6 text-center flex flex-col justify-between">
<div>
<div class="bg-gray-100/50 border border-gray-100 rounded-lg p-6 mb-4 flex items-center justify-center min-h-[120px] relative overflow-hidden transition-colors">
<!-- Decorative Elements -->
<div class="absolute top-0 right-0 -mt-2 -mr-2 w-12 h-12 bg-primary/5 rounded-full blur-xl"></div>
<div class="absolute bottom-0 left-0 -mb-2 -ml-2 w-14 h-14 bg-blue-500/5 rounded-full blur-xl"></div>
<img src="{{ asset('storage/' . $logo['file']) }}" class="img-fluid relative z-10 drop-shadow-sm group-hover:scale-105 transition-transform duration-300" style="max-height: 80px;" alt="{{ $logo['label'] }}">
</div>
<h5 class="mb-1 font-bold text-dark">{!! t($logo['label']) !!}</h5>
</div>
<div class="flex gap-2 justify-center mt-3 scale-90 origin-top">
<a href="{{ asset('storage/' . $logo['file']) }}" download class="btn btn-soft-primary btn-sm rounded-pill px-4">
<i class="uil uil-download-alt me-1 text-xs"></i> {!! t('İndir') !!}
</a>
<a href="{{ route('logo.preview', ['path' => $logo['file'], 'bg' => 'f8f9fa']) }}" target="_blank" class="btn btn-soft-primary btn-sm rounded-pill px-4">
<i class="uil uil-external-link-alt me-1 text-xs"></i> {!! t('Görüntüle') !!}
</a>
</div>
</div>
</div>
</div>
@endif
@endforeach
</div>
<div class="alert alert-info border-0 shadow-sm mt-12 bg-gray-100">
<div class="flex items-start gap-4">
<i class="uil uil-info-circle text-primary text-xl mt-1"></i>
<div>
<h5 class="mb-2">{!! t('Logoların Kullanımı Hakkında') !!}</h5>
<p class="text-sm mb-0">
{!! t('Trunçgil logoları, markanın bütünlüğünü korumak adına oranları bozulmadan ve renk paletine sadık kalınarak kullanılmalıdır. SVG formatındaki dosyalar yüksek kalitede baskı için uygundur.') !!}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
@endsection
@@ -3,12 +3,12 @@
@section('content') @section('content')
{{-- Unified Hero & Testimonials Section --}} {{-- Unified Hero & Testimonials Section --}}
<section class="wrapper image-wrapper bg-image bg-overlay bg-overlay-400" data-image-src="{{ asset('assets/img/photos/bg18.png') }}"> <section id="testimonials-hero" class="wrapper image-wrapper bg-image bg-overlay bg-overlay-500" data-image-src="{{ asset('assets/img/photos/bg1.jpg') }}">
{{-- Inline style override to ensure background image works if JS fails --}} {{-- Inline style scoped to this ID --}}
<style> <style>
.wrapper.bg-image[data-image-src] { #testimonials-hero.bg-image[data-image-src] {
background-image: url("{{ asset('assets/img/photos/bg18.png') }}"); background-image: url("{{ asset('assets/img/photos/bg1.jpg') }}");
} }
</style> </style>
@@ -30,20 +30,34 @@
<div class="swiper-container dots-closer dots-light dots-light-75" data-margin="30" data-dots="true" data-items-xl="3" data-items-md="2" data-items-xs="1"> <div class="swiper-container dots-closer dots-light dots-light-75" data-margin="30" data-dots="true" data-items-xl="3" data-items-md="2" data-items-xs="1">
<div class="swiper"> <div class="swiper">
<div class="swiper-wrapper"> <div class="swiper-wrapper">
@php
$testimonials = $page ? $page->testimonials()->where('is_active', true)->orderBy('sort_order')->get() : collect([]);
@endphp
{{-- Müşteri 1: Stellar Construction --}} @forelse($testimonials as $testimonial)
<div class="swiper-slide"> <div class="swiper-slide">
<div class="item-inner"> <div class="item-inner">
<div class="card border-0 h-full" style="background-color: rgba(255, 255, 255, 0.85); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.5); box-shadow: 0 10px 30px rgba(0,0,0,0.05);"> <div class="card border-0 h-full" style="background-color: rgba(255, 255, 255, 0.85); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.5); box-shadow: 0 10px 30px rgba(0,0,0,0.05);">
<div class="card-body flex-[1_1_auto] p-[40px]"> <div class="card-body flex-[1_1_auto] p-[40px]">
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(0,0,0,0.1)] five !mb-4" style="color: #fcc032;"></span> <span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(0,0,0,0.1)] five !mb-4" style="color: #fcc032;">
@for($i=0; $i<$testimonial->rating; $i++)
<i class="uil uil-star"></i>
@endfor
</span>
<blockquote class="!text-[1rem] !leading-[1.7] font-medium m-[0_0_1rem] !mb-0 text-[#1e293b]"> <blockquote class="!text-[1rem] !leading-[1.7] font-medium m-[0_0_1rem] !mb-0 text-[#1e293b]">
<p>{!! t('Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.') !!}</p> <p>{!! $testimonial->content !!}</p>
<div class="flex items-center text-left mt-6"> <div class="flex items-center text-left mt-6">
@if($testimonial->avatar)
<div class="avatar w-12 h-12 !mr-4">
<img src="{{ asset('storage/' . $testimonial->avatar) }}" class="!rounded-[50%] w-full h-full object-cover" alt="{{ $testimonial->name }}">
</div>
@endif
<div class="info p-0"> <div class="info p-0">
<h5 class="!mb-0 text-[#1e293b] !font-bold !text-[1.05rem]">Kerem Can Azak</h5> <h5 class="!mb-0 text-[#1e293b] !font-bold !text-[1.05rem]">{{ $testimonial->name }}</h5>
<p class="!mb-0 !text-[0.85rem] text-[#1e293b] opacity-70">Stellar Construction</p> @if($testimonial->position)
<p class="!mb-0 !text-[0.85rem] text-[#1e293b] opacity-70">{{ $testimonial->position }}</p>
@endif
</div> </div>
</div> </div>
</blockquote> </blockquote>
@@ -51,47 +65,15 @@
</div> </div>
</div> </div>
</div> </div>
@empty
{{-- Müşteri 2: Dijimind Akademi --}}
<div class="swiper-slide"> <div class="swiper-slide">
<div class="item-inner"> <div class="item-inner">
<div class="card border-0 h-full" style="background-color: rgba(255, 255, 255, 0.85); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.5); box-shadow: 0 10px 30px rgba(0,0,0,0.05);"> <div class="text-center text-white opacity-50">
<div class="card-body flex-[1_1_auto] p-[40px]"> <p>{{ t('Henüz bir müşteri görüşü eklenmemiş.') }}</p>
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(0,0,0,0.1)] five !mb-4" style="color: #fcc032;"></span>
<blockquote class="!text-[1rem] !leading-[1.7] font-medium m-[0_0_1rem] !mb-0 text-[#1e293b]">
<p>{!! t('Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.') !!}</p>
<div class="flex items-center text-left mt-6">
<div class="info p-0">
<h5 class="!mb-0 text-[#1e293b] !font-bold !text-[1.05rem]">Servet Demir</h5>
<p class="!mb-0 !text-[0.85rem] text-[#1e293b] opacity-70">Dijimind Akademi</p>
</div>
</div>
</blockquote>
</div>
</div> </div>
</div> </div>
</div> </div>
@endforelse
{{-- Müşteri 3: Rhapsode Akademik Yayınevi --}}
<div class="swiper-slide">
<div class="item-inner">
<div class="card border-0 h-full" style="background-color: rgba(255, 255, 255, 0.85); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.5); box-shadow: 0 10px 30px rgba(0,0,0,0.05);">
<div class="card-body flex-[1_1_auto] p-[40px]">
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(0,0,0,0.1)] five !mb-4" style="color: #fcc032;"></span>
<blockquote class="!text-[1rem] !leading-[1.7] font-medium m-[0_0_1rem] !mb-0 text-[#1e293b]">
<p>{!! t('Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.') !!}</p>
<div class="flex items-center text-left mt-6">
<div class="info p-0">
<h5 class="!mb-0 text-[#1e293b] !font-bold !text-[1.05rem]">A. Cezmi Savaş</h5>
<p class="!mb-0 !text-[0.85rem] text-[#1e293b] opacity-70">Rhapsode Akademik Yayınevi</p>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div> </div>
<!--/.swiper-wrapper --> <!--/.swiper-wrapper -->
</div> </div>
+12 -4
View File
@@ -30,10 +30,18 @@
@endif @endif
@endforeach @endforeach
@else @else
{{-- Hiç blok yoksa placeholder göster --}} {{-- Hiç blok yoksa standart content'i göster --}}
<div class="container py-24 text-center"> <div class="container py-24">
<h2 class="!text-[2rem] !mb-4">Bu sayfa henüz içerik eklenmemiş</h2> @if($page && $page->translate('content'))
<p>Admin panelinden bu sayfaya bloklar ekleyebilirsiniz.</p> <div class="prose max-w-none">
{!! $page->translate('content') !!}
</div>
@else
<div class="text-center">
<h2 class="!text-[2rem] !mb-4">{{ t('Bu sayfa henüz içerik bulunmuyor') }}</h2>
<p>{{ t('Admin panelinden bu sayfaya içerik veya bloklar ekleyebilirsiniz.') }}</p>
</div>
@endif
</div> </div>
@endif @endif
@endsection @endsection
@@ -19,45 +19,36 @@
<div class="swiper-container dots-start dots-closer !mb-6 relative z-10 swiper-container-0" data-margin="30" data-dots="true"> <div class="swiper-container dots-start dots-closer !mb-6 relative z-10 swiper-container-0" data-margin="30" data-dots="true">
<div class="swiper swiper-initialized swiper-horizontal swiper-pointer-events swiper-backface-hidden"> <div class="swiper swiper-initialized swiper-horizontal swiper-pointer-events swiper-backface-hidden">
<div class="swiper-wrapper"> <div class="swiper-wrapper">
@php
$homePageTestimonials = $page ? $page->testimonials()->where('is_active', true)->orderBy('sort_order')->get() : collect([]);
// If home page has no testimonials, maybe fetch from 'musteri-gorusleri' page as fallback
if ($homePageTestimonials->isEmpty()) {
$tPage = \App\Models\Page::where('slug', 'musteri-gorusleri')->first();
if ($tPage) {
$homePageTestimonials = $tPage->testimonials()->where('is_active', true)->orderBy('sort_order')->take(5)->get();
}
}
@endphp
@forelse($homePageTestimonials as $testimonial)
<div class="swiper-slide"> <div class="swiper-slide">
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(38,43,50,0.1)] after:inline-block after:not-italic after:font-normal after:absolute after:!text-[#fcc032] after:content-['\2605\2605\2605\2605\2605'] after:overflow-hidden after:left-0 after:top-0 before:inline-block before:not-italic before:font-normal before:absolute before:!text-[#fcc032] before:content-['\2605\2605\2605\2605\2605'] before:overflow-hidden before:left-0 before:top-0 five !mb-3"></span> <span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(38,43,50,0.1)] after:inline-block after:not-italic after:font-normal after:absolute after:!text-[#fcc032] after:content-['\2605\2605\2605\2605\2605'] after:overflow-hidden after:left-0 after:top-0 before:inline-block before:not-italic before:font-normal before:absolute before:!text-[#fcc032] before:content-['\2605\2605\2605\2605\2605'] before:overflow-hidden before:left-0 before:top-0 five !mb-3"></span>
<blockquote class="pl-0 text-[1.05rem] !mb-0 border-0 !leading-[1.7] font-medium m-[0_0_1rem]"> <blockquote class="pl-0 text-[1.05rem] !mb-0 border-0 !leading-[1.7] font-medium m-[0_0_1rem]">
<p>"{!! t('Dijital dönüşüm yolculuğumuzda yanımızda oldukları için mutluyuz. Profesyonel yaklaşımları ve çözüm odaklı çalışmaları ile projelerimize değer kattılar.') !!}"</p> <p>"{!! $testimonial->content !!}"</p>
<div class="flex items-center text-left"> <div class="flex items-center text-left">
<div class="info !pl-0"> <div class="info !pl-0">
<h5 class="!mb-1 text-[.95rem] !leading-[1.5]">Kerem Can Azak</h5> <h5 class="!mb-1 text-[.95rem] !leading-[1.5]">{{ $testimonial->name }}</h5>
<p class="!mb-0 text-[.85rem]">Stellar Construction</p> <p class="!mb-0 text-[.85rem]">{{ $testimonial->position }}</p>
</div> </div>
</div> </div>
</blockquote> </blockquote>
</div> </div>
<!--/.swiper-slide --> @empty
<div class="swiper-slide"> <div class="swiper-slide">
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(38,43,50,0.1)] after:inline-block after:not-italic after:font-normal after:absolute after:!text-[#fcc032] after:content-['\2605\2605\2605\2605\2605'] after:overflow-hidden after:left-0 after:top-0 before:inline-block before:not-italic before:font-normal before:absolute before:!text-[#fcc032] before:content-['\2605\2605\2605\2605\2605'] before:overflow-hidden before:left-0 before:top-0 five !mb-3"></span> <p class="text-center opacity-50">{{ t('Müşteri görüşleri yakında burada olacak.') }}</p>
<blockquote class="pl-0 text-[1.05rem] !mb-0 border-0 !leading-[1.7] font-medium m-[0_0_1rem]">
<p>"{!! t('Eğitim teknolojileri alanındaki vizyoner bakış açıları ve teknik altyapı konusundaki uzmanlıkları sayesinde hedeflediğimiz kitleye çok daha etkili bir şekilde ulaştık.') !!}"</p>
<div class="flex items-center text-left">
<div class="info !pl-0">
<h5 class="!mb-1 text-[.95rem] !leading-[1.5]">Servet Demir</h5>
<p class="!mb-0 text-[.85rem]">Dijimind Akademi</p>
</div>
</div>
</blockquote>
</div> </div>
<!--/.swiper-slide --> @endforelse
<div class="swiper-slide">
<span class="ratings inline-block relative w-20 h-[0.8rem] text-[0.9rem] leading-none before:text-[rgba(38,43,50,0.1)] after:inline-block after:not-italic after:font-normal after:absolute after:!text-[#fcc032] after:content-['\2605\2605\2605\2605\2605'] after:overflow-hidden after:left-0 after:top-0 before:inline-block before:not-italic before:font-normal before:absolute before:!text-[#fcc032] before:content-['\2605\2605\2605\2605\2605'] before:overflow-hidden before:left-0 before:top-0 five !mb-3"></span>
<blockquote class="pl-0 text-[1.05rem] !mb-0 border-0 !leading-[1.7] font-medium m-[0_0_1rem]">
<p>"{!! t('Akademik yayıncılık süreçlerimizi dijitalleştirirken sundukları yenilikçi çözümler ve hızlı destekleri için teşekkür ederiz. Güvenilir bir iş ortağı.') !!}"</p>
<div class="flex items-center text-left">
<div class="info !pl-0">
<h5 class="!mb-1 text-[.95rem] !leading-[1.5]">A. Cezmi Savaş</h5>
<p class="!mb-0 text-[.85rem]">Rhapsode Akademik Yayınevi</p>
</div>
</div>
</blockquote>
</div>
<!--/.swiper-slide -->
</div> </div>
<!--/.swiper-wrapper --> <!--/.swiper-wrapper -->
<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span></div> <span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span></div>
+24 -2
View File
@@ -12,6 +12,7 @@ Route::redirect('/index', '/', 301);
Route::redirect('/index.php', '/', 301); Route::redirect('/index.php', '/', 301);
Route::redirect('/index.html', '/', 301); Route::redirect('/index.html', '/', 301);
// Debug Route - Veritabanı kontrolü (Sadece super_admin)
Route::get('/debug-homepage', function () { Route::get('/debug-homepage', function () {
$page = Page::with(['headerTemplate', 'footerTemplate']) $page = Page::with(['headerTemplate', 'footerTemplate'])
->where('is_homepage', true) ->where('is_homepage', true)
@@ -57,7 +58,7 @@ Route::get('/debug-homepage', function () {
'data' => $page->sections_data, 'data' => $page->sections_data,
], ],
]); ]);
}); })->middleware(['auth', \App\Http\Middleware\SuperAdminMiddleware::class]);
// Language Switch // Language Switch
Route::get('/lang/{locale}', function ($locale) { Route::get('/lang/{locale}', function ($locale) {
@@ -87,7 +88,7 @@ Route::any('/admin/template-preview', [TemplatePreviewController::class, 'previe
->name('template.preview'); ->name('template.preview');
// Site Translations API (DevExtreme DataGrid için) // Site Translations API (DevExtreme DataGrid için)
Route::prefix('admin/api')->middleware(['auth'])->group(function () { Route::prefix('admin/api')->middleware(['auth', \App\Http\Middleware\SuperAdminMiddleware::class])->group(function () {
Route::get('/site-translations', [SiteTranslationController::class, 'index'])->name('api.site-translations.index'); Route::get('/site-translations', [SiteTranslationController::class, 'index'])->name('api.site-translations.index');
Route::post('/site-translations', [SiteTranslationController::class, 'store'])->name('api.site-translations.store'); Route::post('/site-translations', [SiteTranslationController::class, 'store'])->name('api.site-translations.store');
Route::put('/site-translations/{id}', [SiteTranslationController::class, 'update'])->name('api.site-translations.update'); Route::put('/site-translations/{id}', [SiteTranslationController::class, 'update'])->name('api.site-translations.update');
@@ -99,5 +100,26 @@ Route::prefix('admin/api')->middleware(['auth'])->group(function () {
// Products & Services // Products & Services
Route::get('/urun-hizmet/{slug}', [\App\Http\Controllers\ProductController::class, 'show'])->name('products.show'); Route::get('/urun-hizmet/{slug}', [\App\Http\Controllers\ProductController::class, 'show'])->name('products.show');
// Logo Preview
Route::get('/logo-preview', function (Illuminate\Http\Request $request) {
$path = $request->query('path');
$bg = $request->query('bg', 'ffffff');
if (!$path) abort(404);
return "
<html>
<head>
<title>Logo Preview</title>
<style>
body { margin: 0; padding: 0; display: flex; align-items: center; justify-content: center; min-height: 100vh; background-color: #$bg; }
img { max-width: 90%; max-height: 90vh; }
</style>
</head>
<body>
<img src='" . asset('storage/' . $path) . "' />
</body>
</html>";
})->name('logo.preview');
// Pages (en sonda olmalı - catch-all) // Pages (en sonda olmalı - catch-all)
Route::get('/{slug}', [PageController::class, 'show'])->name('page.show'); Route::get('/{slug}', [PageController::class, 'show'])->name('page.show');